支撑

支撑-分布式

名词 #

Alb        automaticLoopBack 自动回环,虚拟接口
sdn        software defined network 软件定义网络

Serverless #

knative
    # google开源,serverless标准化方案,基于kubernetes和istio
    模块
        build
        serving
        eventing

ServiceMesh #

Service Fabric #

# 微软

Istio #

#google IBM, lyft开源,基于envoy
组成
    数据面板
    控制面板

Knative #

介绍
    管理kubernetes, Istio
模块
    build
    serve
        config
        route
    event

Traefik #

# go实现,多后台如kubernetes, swarm, marathon, mesos

Linkerd #

# buoyant出品

Conduit #

# 面向kubernetes轻量化mesh

Fingle #

# twitter出品

Envoy #

# lyft出品

Nginmesh #

# nginx推出

PaaS #

# platform as a service

CloudStack #

# 托管在apache的开源、高可用、高扩展性的云计算平台
# 支持主流hypervisors
# 一个开源云计算解决方案,可以加速iaaS的部署、管理、配置

CloudFoundry #

# pivotal开源, 根据应用模板,动态生成很多tomcat, mysql, nosql, 动态控制这些实例的启停。

OpenStack #

# 云操作系统,管理虚拟资源

Container Orchestration #

特性 dubbo spring cloud kubernetes
配置管理 - config kubernetes configMap
服务发现 zookeeper eureka, consul, zookeeper kubernetes services
负载均衡 自带 ribbon kubernetes services
网关 - zuul kubernetes services
分布式追踪 - spring cloud sleuth open tracing
容错 不完善 hystrix kubernetes health check
通信方式 rpc http, message
安全模块 - spring cloud security -
分布式日志 ELK EFK
任务管理 spring batch kubernetes jobs

Kubernetes #

# google开源的,borg的发展,在docker技术上,管理容器化应用
特点
    不限语言
    无侵入, 服务只写业务
    适合微服务                       # 调整服务副本数, 横向扩容
    无缝迁移到公有云                  # cluster ip实现不改配置迁移
    自动化资源管理
        服务发现,用dns解析服务名
        内嵌负载均衡
        部署实施
        治理
        监控
        故障发现、自我修复
        透明服务注册、发现
        服务滚动升级、在线扩容, 根据负载自动扩容缩容
        可扩展资源自动调度、多粒度资源配额
    多层安全防护、准入
    多租户
    完善的工具

    pod运行容器
    etcd保存所有状态
架构
    cluster
        master
            api server              # 对外http rest接口, 管理资源对象(pod, RC, service)增删改查
            controller manager      # 管理控制器, node, pod, endpoint, namespace, serviceAccount, resourceQuota自动化管理
            scheduler               # 接收controller manager命令执行pod调度
            etcd                    # 配置
        node                        # 一master多node
            特点
                node宕机,pod调度到其它节点
            pod                     # 一node几百个pod, 基本操作单元,代表一个运行进程,内部封装一个(或多个紧密相关的)容器。
                特点
                    pod内通信高效,放密切相关服务进程
                    可以判断一组相关容器的状态(用pause)
                    pause解决共享ip、容器通信、共享文件的问题
                    pod间通信用虚拟二层协议(flannel, openvswitch)实现
                    普通pod在etcd存储,再调度到某node实例化,静态pod在node中存储,在node实例化
                    对pod可进行资源(cpu,内存)限额
                label               # 标签,用标签选择器选择。key和value由用户指定,可附加到node, pod, service, rc等
                pause容器            # 根容器,共享网络栈、挂载卷
            docker/rocket           # 容器
            kubelet                 # master监视pod, 创建、修改、监控、删除
            kube-proxy              # 代理pod接口
            fluentd                 # 日志收集、存储、查询
            kube-dns                # 服务dns解析
概念
    service                         # 服务网关
        特点
            唯一名字
            唯一虚拟ip(cluster ip, service ip, vip)                  # 可多端口,每端口有名字
            提供远程服务              # 目前socket
            应用到一组pod
    event                           # 探针检测失败记录,用于排查故障
    rc                              # replication controller
        副本数
        筛选标签
        pod模板
        改变pod镜像版本,滚动升级
    replica set                     # 1.2 rc升级, 支持基于集合的标签选择。被deployment使用
    deployment                      # pod编排, rc升级
        特点
            查看pod部署进度
    HPA                             # horizontal pod autoscaler, 自动扩容缩容
        指标
            cpu utilization percentage                              # 1分钟内利用率平均值
            应用自定义指标(tps, qps)
    volume
        emptyDir
        hostPath
        gcePersistentDisk
        awsElasticBlockStore
        NFS
        persistent volume
        namespace
        annotation
动作
    扩容
        创建rc自动创建pod, 调度到合适的node
            pod定义
            副本数
            监控label                # 筛选pod得到数量
命令
    kubectl
        --help                      # 帮助, 各命令之后都可加
        version
        cluster-info
        logs
            kubectl logs --tail=1000 appID1
                # 查看日志
        run
        exec
            kubectl exec -it appID1 /bin/sh
                # 交互命令进入app
        create
            -f mysql-rc.yaml        # 创建rc
            -f mysql-svc.yaml       # 创建service
        set 
            image
        get
            rc                      # 查看rc
            pods
            pod
                -o
                    wide            # 显示详情,有node name
                o->
                kubectl get pod -l app=app1 -o wide
                    # 查看pod app状态
            services
            svc                     # 查看service, 包含cluster ip
            nodes
            endpoints               # service pod的ip:端口
            deployments
        describe                    # 详情
            node
            pods
            deployments
        expose
        label
        delete
        scale                       # pod扩容或缩容
            --replicas=2
        autoscale                   # 创建hpa对象
            deployment
        rolling-update              # pod滚动升级
        rollout
            status
            undo
        apply                       # 应用配置
            -f
        proxy
    kubelet
    kube-apiserver
    kube-proxy
    kube-scheduler
    kubeadm
    kube-controller-manager
    hyperkube
    apiextensions-apiserver
    mounter
镜像
    kube-apiserver
    kube-controller-manager
    kube-scheduler
    kube-proxy
    pause
    etcd
    coredns
配置
    用yaml或json定义
    pod
        kind: Pod                   # 表明是Pod
        metadata:
            name: myweb             # pod名
            labels:
                name: myweb         # 标签

Spring Cloud #

Mesos #

# twitter, apache开源的分布式资源管理框架, 两级调度器

Dubbo #

介绍
    阿里开源,分布式服务框架,rpc方案,soa治理
功能
    远程通讯    # 多协议,多种长连接nio框架封装
    集群容错    # 负载均衡,容错,地址路由,动态配置
    自动发现    # 注册中心
节点
    容器(container)
    提供者(provider)
    消费者(consumer)
    注册中心(registry)
    监控中心(monitor)
    调用关系
        容器启动提供者
        提供者注册
        消费者订阅
        注册中心返回地址列表, 长连接更新
        消费者软负载均衡挑选列表中提供者
        提供者和消费者累计调用次数和时间,定时发送到监控中心
容错机制
    failover    # 默认,失败自动切换
    failfast    # 立即报错,用于幂等写操作
    failsafe    # 忽略
    failback    # 定时重发
    forking     # 并行多个取最快(any)
    broadcast   # 逐个多个,异常退出
连接方式
    广播      # 不需要中心节点,适用开发测试, 地址段224.0.0.0 - 239.255.255.255
        服务端配置 applicationContext-service.xml
            <dubbo:application name=”taotao-manager-service” />
            <dubbo:registry address=”multicast://224.5.6.7:1234” />
            <dubbo:protocol name=”dubbo” port=”20880” />
            <dubbo:service interface=”com.taotao.manager.service.TestService” ref=”testServiceImpl” />
        客户端配置 springMVC.xml
            <dubbp:application name=”taotao-manager-web” />
            <dubbo:registry address=”multicast://224.5.6.7:1234” />
            <dubbo:service interface=”com.taotao.manager.service.TestService” id=”testService”
            timeout=”10000000” />
    直连
        服务端配置
            <dubbo:application name=”taotao-manager-service” />
            <dubbo:registry address=”N/A” />
            <dubbo:protocol name=”dubbo” port=”20880” />
            <dubbo:service interface=”com.taotao.manager.service.TestService” ref=”testServiceImpl” /> applicationContext-service.xml
        客户端配置 springMVC.xml
            <dubbp:application name=”taotao-manager-web” />
            <dubbo:service interface=”com.taotao.manager.service.TestService” id=”testService”
            timeout=”10000000” />
注册中心
    zookeeper

Dubbox #

介绍
    当当网扩展Dubbo

Netflix OSS #

orleans #

# .NET

HSF #

# high-speed service framework, 阿里出品, socket直连
特点
    不增加中间点(稳定,高度可伸缩)
结构
    注册服务信息,推送服务地址
    基于osgi
组件
    服务提供者
    消费者
    地址服务器
    配置服务器               # 分布式配置
    规则服务(diamond)       # 设置(黑白名单,认证,权重,限流)与推送

NScale #

# 可扩展容器,用node.js和docker实现

Armada #

# python微服务

SOA #

# 面向服务架构 service oriented architecture

EAI #

# Enterprise Application Integration 建立底层结构将异构应用集成

ESB #

# Enterprise Service Bus 企业服务总线, 是连接中枢

RPC #

# 远程过程调用 remote procedure call

Thrift #

CXF #

常识
    自己内部整合spring(但是不耦合)
支持的协议
    soap1.1/1.2
    post/http
    restful
    http
使用
    导入cxf包
    方法1      # 不支持注解
        String address="http://localhost:8888/hello";
            ServerFactoryBean factoryBean=new ServerFactoryBean();
            factoryBean.setAddress(address);
            factoryBean.setServiceBean(new MyWS());
            factoryBean.create();
    方法2      # 支持注解,wsdl文件中类型不再单独schema文件
        ServerFactoryBean factoryBean = new JaxWsServerFactoryBean      # java and xml web service
    日志    # 记录握手信息(访问wsdl文件)
            ## 看日志记录得到 soap
        serverFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
        serverFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
整合spring
    o-> cxf2.4.4.jar/schemas/jaxws.xsd中找到命名空间"http://cxf.apache.org/jaxws"
    o-> 配置applicationContext.xml,加入cxf的命名空间http://cxf.apache.org/jaxws,schema地址为http://cxf.apache.org/schemas/jaxws.xsd。
        并且在eclipse中配置schema约束文件的路径
            # 该xsd约束文件的url地址用的是包地址,不规范
    o-> applicationContext.xml中配置
        <bean id="studentService" class="test.spring.StudentServiceImpl"/>
            # 用于:自身调用,被spring引用
        <jaxws:server serviceClass="test.spring.StudentService" address="/student">
            # address配置服务的名称即可(web.xml的servlet中配置了服务的实际访问地址)
            ## serviceClass配置的才是真正的服务,既然它是接口,那么webService注解也应该写在接口上
            <jaxws:serviceBean>
                <ref bean="studentService"/>
            <jaxws:inInterceptors>
                <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
            <jaxws:outInterceptors>
                <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
    o-> web.xml中配置servlet
         <servlet>
              <servlet-name>springWS
              <servlet-class>org.apache.cxf.transport.servlet.CXFServlet        # 在cxf-2.4.4.jar包中
              <load-on-startup>1
         <servlet-mapping>
              <servlet-name>springWS
              <url-pattern>/ws/*
    o-> web.xml中配置spring监听器

GRPC #

Protobuf #

# 通信协议
命令
    protoc -I. -I-I$GOPATH/src  --go_out=plugins=grpc:. *
        # -I import目录
    protoc --grpc-gateway_out=.
插件
    安装
        # go build 出protoc-gen-go后,放入go/bin下
    protoc-gen-go
        # 编译proto文件
    protoc-gen-grpc-gateway
        # http服务

RMI #

# java远程调用 remote method invocation

Hessian #

# 是caucho公司的开源协议,基于http

Burlap #

# caucho公房的开源协议,基于http

HttpInvoker #

# spring提供的协议,必须用spring

Web Service #

# soap通讯

粘合层 #

治理(服务发现) #

Zookeeper #

介绍
    google chubby的开源实现。用于服务发现
    保证CP
    分布式, hadoop中hbase的组件
    fast paxos算法        # paxos存在活锁问题, fast paxos通过选举产生leader, 只有leader才能提交proposer
功能
    配置维护
    域名服务
    分布式同步
    组服务
    分布式独享锁、选举、队列
流程
    选举leader        # 多种算法, leader有最高执行ID
    同步数据
    大多数机器得到响应follow leader
exhibitor
    # supervisor for zk

Eureka #

# Netflix,保证AP

Consul #

# Apache,保证CA

Etcd #

# kubernetes用,保证CP

路由控制 #

负载均衡策略
    随机、轮询、调用延迟判断、一致性哈希、粘滞连接
本地路由优先策略
    优先JVM(injvm),优先相同物理机(innative)
配置方式
    统一注册表、本地配置、动态下发

配置 #

Spring Cloud Config #

Diamond #

# 淘宝

Archaius #

# netflix

Disconf #

# 百度

QConf #

# 360

任务 #

Elastic-Job #

# 当当网

Azkaban #

# linkedin

Spring Cloud Task #

跟踪 #

zipkin #

# twitter

Opentracing #

Hydra #

# 京东

Spring Cloud Sleuth #

监控 #

Spy.js #

# webstorm用的监控工具

Alinode #

# 朴灵写的运行时性能管理工具

OneAPM #

# 监控node性能
功能
    接口响应时间
    数据库方法时间
    外部服务时间
    单请求的耗时比

容错 #

Hystrix #

功能
    服务线程隔离、信号量隔离
    降级: 超时、资源不足
    熔断: 自动降级、快速恢复
    请求缓存、请求合并

代理 #

Gearman #

# 分布式计算, 把工作委派给其他机器

Hazelcast #

# 基于内存的数据网格,用于分布式计算

Twemproxy #

redis/memcache分片代理

高可用 #

# high-availability linux
目标
    reliability: 可靠性
    availability: 可用性
    serviceability: 可服务性
        ras: remote access service(远程服务访问)
术语
    节点(node): 唯一主节点,多个备用节点
    资源(resource): 是节点可控制的实体,主节点发生故障时,可以被其它节点接管
        例如:
            磁盘分区
            文件系统
            ip地址
            应用程序服务
            nfs文件系统
    事件(event): 集群中可能发生的事件
        例如:
            系统故障
            网络连通故障
            网卡故障
            应用程序故障
    动作(action): 事件发生时ha的响应方式
        例如: 用shell 脚本对资源进行转移

心跳 #

HeartBeat #

2.0模块
    heartbeat: 节点间通信检测模块
    ha-logd: 集群事件日志服务
    CCM(Consensus CLuster Membership): 集群成员一致性管理模块
    LRM(Local Resource Manager): 本地资源管理模块
    Stonith Daemon: 使出现问题的节点从集群资源中脱离
    CRM(Cluster Resource management): 集群资源管理模块
    Cluster policy engine: 集群策略引擎
            用于实现节点与资源之间的管理与依赖关系
    Cluster transition  engine: 集群转移引擎

3.0拆分之后的组成部分
    Heartbeat: 负责节点之间的通信
    Cluster Glue: 中间层,关联Heartbeat 与 Pacemaker,包含LRM 与 stonith
    Resource Agent: 控制服务启停,监控服务状态脚本集合,被LRM调用
    Pacemaker: 也就是曾经的CRM,包含了更多的功能
        管理接口:
            crm shell
            一个使用ajax web 的web窗口
            hb_gui图形工具
            DRBD-MC, 一个基于java的工具

版本差异
    与1.x相比,2.1.x版本变化
        保留原来所有功能
        自动监控资源
        对各资源组进行独立监控
        同时监控系统负载
            自动切换到负载低的node上

Keepalived #

vrrp
    # virtual router redundancy protocol 虚拟路由器冗余协议
    # 解决静态路由出现的闪单点故障问题,它能够保证网络的不间断.稳定运行

负载 #

# load balance
方法
        dns轮循

        java nio
        erlang语言
        linux epoll
        bsd kqueue
        消息队列、事件通知
        c/c++下ace, boost.asio, libev(libevent)
        服务器mina, jetty, node.js, netty
        java协程框架 quasar kilim

Haproxy #

监控页面
        /status

Tengine #

# 淘宝基于nginx修改,添加了功能
监控
    /upstream_status

OpenResty #

# 淘宝改的nginx, lua工具
安装
    yum install -y gcc gcc-c++ kernel-devel readline-devel pcre-devel openssl-devel openssl zlib zlib-devel pcre-devel
    wget openresty-1.9.15.1.tar.gz
    ./configure --prefix=/opt/openresty --with-pcre-jit --with-ipv6 --without-http_redis2_module --with-http_iconv_module -j2
    make && make install
    ln -s /opt/openresty/nginx/sbin/nginx /usr/sbin
    /opt/openresty/nginx/conf/nginx.conf

Varnish #

# 反向代理, http缓存

Traffic Server #

# apache 缓存

Squid #

配置文件
    /etc/squid/squid.conf
代理类型
    普通代理
    透明代理
    反向代理
缓存
    动态资源
    静态资源
参考资料
    squid 透明代理详解
配置
    # squid.conf
    http_port 3128                                                # squid服务端口
    icp_port 3130                                                # udp端口,用来接收和发送ICP消息
    cache_dir ufs /var/spool/squid                                # 缓存目录, 写入方式有aufs与ufs两种,aufs使用大量线程异步进行磁盘i/o操作
    cache_access_log /var/log/squid/access.log
    cache_log /var/log/squid/cache.log
    cache_store_log /var/log/squid/store.log
    pid_filename /var/run/squid.pid                        # 日志文件位置

    #auth_param basic children 5
    #auth_param basic realm Squid proxy-caching web server
    #auth_param basic credentialsttl 2 hours                 # 关闭认证,认证一般不需要

    cache_effective_user squid
    cache_effective_group squid
    cache_mgr youraccount@your.e.mail                        # 设置squid用户及用户组、管理员账号

    cache_mem 128 MB                                        # 运行内存配置

    cache_swap_low 90
    cache_swap_high 95
    maximum_object_size 4096 KB                        # 与磁盘容量相关的配置,90、95为百分比,磁盘大时4096 KB可以改成32768 KB

    maximum_object_size_in_memory 8 KB                # 内存缓存资料大小

    以下为定义acl(访问控制列表)
            # 语法为:acl<acl> <acl名称> <acl类型> <配置的内容>
    acl All src 0/0
    acl Manager proto cache_object  acl Localhost src 127.0.0.1/32
    acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535
    acl SSL_ports 443 563
    acl CONNECT method CONNECT
    acl MyNetwork src 192.168.0.0/16

    以下为利用前面定义的acl,定义访问控制规则
    http_access allow Manager Localhost
    http_access deny Manager
    http_access deny !Safe_ports
    http_access deny CONNECT SSL_ports
    http_access allow MyNetwork
    http_access deny All

    例子: 禁止访问sina
    acl sina dstdomain .sina.com.cn .sina.com
    http_access deny sina
    或
    acl sina dst 58.63.236.26 58.63.236.27 58.63.236.28 58.63.236.29 58.63.236.30 58.63.236.31 58.63.236.32 58.63.236.33 58.63.236.34 58.63.236.35 58.63.236.36 58.63.236.37 58.63.236.38 58.63.236.39 58.63.236.49 58.63.236.50
    http_access deny sina
    或
    acl sina dst www.sina.com.cn
    http_access deny sina

    例子: 禁止来自某些ip的访问
    acl zhang src 192.168.63.6/32
    http_access deny zhang

    例子: 禁止在某些时段访问
    acl Working_hours MTWHF 08:00-17:00
    http_access allow Working_hours
    http_access deny !Working_hours

    例子: 禁止某个代理客户建立过多连接
    acl OverConnLimit maxconn
    http_access deny OverConnLimit

    定义与其它代理服务器的关系,语法: <cache_peer> <主机名称> <类别> <http_port> <icp_port> <其它参数>
    cache_peer 192.168.60.6 parent 4480 7 no-query default

    #设置与其它代理服务器的关系: <cache_peer_access> <上层 Proxy > <allow|deny> <acl名称>
    #cache_peer_access 192.168.60.6 allow aclxxx
    #cache_peer_access 192.168.60.6 deny !aclxxx
    coredump_dir /var/spool/squid                                        # 崩溃存储目录
使用
    step1 检查配置文件
        squid -k parse
    step2  初始化cache 目录
        squid -z(X)                                # X会显示过程
    step3 启动squid
        service squid start
        或
        /usr/local/squid/sbin/squid -sD
    停止squid
        squid -k shutdown
    重新载入配置
        squid -k reconfigure
    滚动日志
        squid -k rotate
案例
    透明代理
        step1 检查配置文件
            squid -k parse
        step2  初始化cache 目录
            squid -z(X)                                # X会显示过程
        step3 启动squid
            service squid start
            或
            /usr/local/squid/sbin/squid -sD
        停止squid
            squid -k shutdown
        重新载入配置
            squid -k reconfigure
        滚动日志
            squid -k rotate
    代理
        squid.conf
            http_port 3128
            http_access allow all
            或
            http_port 3128
            http_access deny all前面添加
            acl 192.168.0.42 src 192.168.0.0/24
            http_access allow 192.168.0.42                        # 192.168.0.42为允许的ip

LVS #

介绍
    第四层开始负载(可以建立到三层负载)

    第四层负载
        socket进必须连lvs

模式
    tun
        # lvs负载均衡器将请求包发给物理服务器,后者将应答包直接发给用户
    net
        # 请求和应答都经过lvs
    dr
        # 不要隧道结构的tun
使用
    DR模式 centos6
    yum install-y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel
    modprobe -l |grep ipvs
        # 检查内核是否集成
    echo "1" > /proc/sys/net/ipv4/ip_forward
        # 开启路由转发
    安装ipvsadm
        http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
    安装keepalived
        http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
        ./configure --prefix=/usr/local/keepalived

        cp  /usr/local/keepalived/etc/rc.d/init.d/keepalived        /etc/init.d/
        cp /usr/local/keepalived/etc/sysconfig/keepalived        /etc/sysconfig/
        mkdir /etc/keepalived/
        cp /usr/local/keepalived/etc/keepalived/keepalived.conf        /etc/keepalived/
        cp /usr/local/keepalived/sbin/keepalived        /usr/sbin/

        o-> 配置文件/etc/keepalived/keepalived.conf
        ! Configuration File forkeepalived
        global_defs {
        notification_email {
        test@sina.com    #故障接受联系人
        }
        notification_email_from admin@test.com  #故障发送人
        smtp_server 127.0.0.1  #本机发送邮件
        smtp_connect_timeout 30
        router_id LVS_MASTER  #BACKUP上修改为LVS_BACKUP
        }
        vrrp_instance VI_1 {
        state MASTER    #BACKUP上修改为BACKUP
        interface eth0
        virtual_router_id 51  #虚拟路由标识,主从相同
        priority 100  #BACKUP上修改为90
        advert_int 1
        authentication {
        auth_type PASS
        auth_pass 1111  #主从认证密码必须一致
        }
        virtual_ipaddress {    #Web虚拟IP(VTP)
        172.0.0.10
        }
        }
        virtual_server 172.0.0.10 80 { #定义虚拟IP和端口
        delay_loop 6    #检查真实服务器时间,单位秒
        lb_algo rr      #设置负载调度算法,rr为轮训
        lb_kind DR      #设置LVS负载均衡DR模式
        persistence_timeout 50 #同一IP的连接60秒内被分配到同一台真实服务器
        protocol TCP    #使用TCP协议检查realserver状态
        real_server 172.0.0.13 80 {  #第一个web服务器
        weight 3          #节点权重值
        TCP_CHECK {      #健康检查方式
        connect_timeout 3 #连接超时
        nb_get_retry 3    #重试次数
        delay_before_retry 3  #重试间隔/S
        }
        }
        real_server 172.0.0.14 80 {  #第二个web服务器
        weight 3
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
            }
        }
        }

        service keepalived restart

    启动脚本 /etc/init.d/real.sh
        #description : start realserver
        VIP=172.0.0.10
        . /etc/init.d/functions
        case "$1" in
        start)
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        echo "LVS RealServer Start OK"
        ;;
        stop)
        /sbin/ifconfig lo:0 down
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        echo "LVS RealServer Stoped OK"
        ;;
        *)
        echo "Usage: $0 {start|stop}"
        exit 1
        esac

    o-> 开机启动
        chmod +x /etc/init.d/real.sh
        /etc/init.d/real.sh start
        echo "/etc/init.d/real.sh start" >> /etc/rc.local
    o-> 测试
        service httpd start
        echo "1" > /var/www/html/index.html
        service iptables stop
        setenforce 0
            # 关闭selinux
    o-> 其他命令
        ipvsadm -ln
            # 集群中服务器ip信息
        ip addr
            # 显示VIP当前绑定的服务器
        tail -f /var/log/messages
            # 日志

数据库 #

读写分离 #

MySQL主从复制
Haproxy + 多Slave
DRBD + Heartbeat + MySQL
MySQL Cluster

分片 #

问题
    事务
    Join
    迁移
    扩容
    ID生成
    分页
方案
    事务补偿        # 数据对账:基于日志对比、同步标准数据源
    分区            # MySQL机制分文件存储,客户端无感知
    分表            # 客户端管理分表路由
    分库
        为什么 
            单库无法承接连接数时分库,MySQL单库5千万条,Oracle单库一亿条
        策略
            数值范围
            取模
            日期
框架
    Sharding-JDBC
    TSharding
代理
    Atlas
    MyCAT
    Vitess

分布式文件系统 #

HDFS            # 批量读写,高吞吐量,不适合小文件
FastDFS         # 轻量级,适合小文件

一致性 #

CAP
    一致性
        强一致性、弱一致性(秒级),最终一致性
    可用性
    分区容错性(网络故障)
BASE
    Basically Available(基本可用),Soft state(软状态),Eventually consistent(最终一致性)
幂等性

分布式锁 #

算法
    PAXOS
    Zab
        # Zookeeper使用
    Raft
        # 三角色:Leader(领袖),Follower(群众),Candidtate(候选人)
    Gossip
        # Cassandra使用
实现方式
    数据库
        有单点问题
    缓存
        非阻塞性能好
        有锁不释放问题
        实现
            RedLock setnx
            Memcached add
    Zookeeper
        有序临时节点,集群透明解决单点问题,锁被释放,锁可重入
        性能不如缓存,吞吐量随集群规模变大而下降

一致性哈希 #

扩容映射

分布式事务 #

分类
    两阶段提交、多阶段提交
    TCC事务

Atomikos #

ID生成器 #

Snowflake算法           # Twitter
    41位时间戳+10位机器标识(比如IP,服务器名称等)+12位序列号(本地计数器)
MySQL自增ID + "REPLACE INTO XXX:SELECT LAST_INSERT_ID();"
    # Flicker
MongoDB ObjectId
    不能自增
UUID
    无序,过长,影响检索性能

支撑-原理

主机 #

cpu #

介绍
    单cpu串行工作,前任务完成,后任务才开始                             # 串行不适合图形处理(多点,线,面要同时乘投影矩阵)
    cpu把大量空间和电量分配给控制器和缓存,不能集成太多计算单元
    cpu内存通过cpu总线连接, cpu总线与pci总线通过主桥(北桥)连接
        gpu在pci总线上
        控制逻辑在cpu中运行, 生成渲染数据, 到内存, 再到显存显卡计算。
        内存到显存数据传输最花费时间。
原理
    处理单元(processing unit)
        算术逻辑单元(arithmetic logic unit)
        处理寄存器(processor register)
    控制单元(control unit)
        指令寄存器(instruction register)
        程序计数器(program counter)
    指令集架构(ISA, instruction set architecture)                   # 机器码易兼容, 软件易编程, 易升级cpu
        精简指令集RISC(reduced instruction set computing)
        复杂指令集CISC(complex instruction set computer)
    时钟频率(clock speed)
    生产
        生产线散热决定生存率,决定cpu型号
    多级缓存
        L1, L2, L3, L4
    虚拟化
        虚拟机监视器(VMM, virtual machine monitors)
分类
    指令流的重数分类
        SI(single instruction stream)单指令流
        MI(multiple instruction stream)多指令流
    操作数流的重数分类
        SD(single data stream)单数据流
        MD(multiple data stream)多数据流
    SISD 串行计算机
    SIMD 阵列机(多处理单元)
    MISD 很少
    MIMD
        多处理机
        多计算机
硬件并行
    位级(bit-level): 32位, 64位计算机
    指令级(instruction-level)              # 处理器内部并行度很高
        流水线
            指令分步骤(指令流), 每步专门部件处理
            多指令流并行, 部件不空闲等待单指令流结束
            六级流水线步骤
                取指(FI), 译码(DI), 计算操作数地址(CO), 取操作数(FO), 执行指令(EI), 写操作数(WO)
        多发射(超标量)
            一时钟周期处理多指令
        超线程
            模拟多个逻辑线程
        乱序执行
        猜测执行
    数据级
        向量体系结构、图形处理器
        单指令多数据(SIMD)架构
    线程级                                 # 紧耦合硬件模型中开发数据级或任务级并行,线程间有交互
    请求级                                 # OS或程序耦合任务间并行
程序并行
    数据级(DLP, data-level parallel)
    任务级(TLP, task-level parallel)       # 多处理器, 超线程, 虽只有4个核,但可用核返回8
        内存
            共享内存模型
            分布式内存模型
        进程: 独有内存
        线程: 共享进程内存(地址空间、文件描述符)
            一个进程下的轻量进程
            POSIX线程api是对已有unix进程模型扩展, 与进程多方面类似
                自己的信号掩码
                cpu affinity(倾向在某cpu尽量长时间运行)
                cgroups

进程调度 #

等级
    高级调度(High-Level Scheduling)
        作业调度, 后备作业调入内存运行
    低级调度(Low-Level Scheduling)
        进程调度, 就绪队列中某进程获得cpu
    中级调度(Intermediate-Level Scheduling)
        虚拟存储器引入, 内外存对换区进行进程对换

方式
    非剥夺方式
        处理机分配给某进程后一直运行下去,直到阻塞时,才分配处理机到另一个进程
    剥夺方式
        进程运行时,系统基于某种原则,剥夺分配给它的处理机.
        采用算法
            先进先出算法
                批处理系统用. 总把处理机分配给最先进队的进程, 将一直执行下去,直到阻塞
            短进程优先(SCBF  Shortest CPU Burst First)
                批处理系统用. 从就绪队列中选出下一个cpu执行期最短的进程,分配处理机
            轮转法
                分时系统中,都采用时间片轮转法

gpu #

介绍
    gpu控制单元少, 计算单元多
    显卡在pci总线上
原理
    数据级并行
        单条指令并行应用于数据集(SIMD)
    CUDA(compute unified device architecutre)                       # nvidia推出的通用并行计算架构
        多网格(grid)组织,每网格多(512-1536)线程块
        线程块线程相同指令地址, 通过共享存储器(shared memory)和栅栏(barrier)块内通信
            不同块不通信,粗粒度并行
            同块通信,细粒度并行

内存 #

原理
    虚拟内存(virtual memory)
    页表(page table)
        控制寄存器(control register)
            CR3保存页目录表内存基地址
        4级页表(PML4)
        转换检测缓冲区(TLB, translation lookaside buffer)
dma
    # direct memory access 不依赖cpu的内存存取
栈
    申请方式: 系统自动分配
    申请响应: 栈剩余空间小于申请空间, 报overflow
    申请大小限制: 栈是向低地址扩展的连续内存,线顶地址和最大容量是系统编译时预设的,windows下为2M(或1M), 申请超过剩余空间报overflow
    申请效率: 系统分配,速度快
    存储内容: 函数调用时,函数调用语句的下一条指令的地址进栈,然后是参数(C中由右向左), 然后是局部变量。调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向开始保存的函数下一指令,继续运行
    数据结构: 满足后进先出的数据结构
堆
    申请方式: 程序手动申请
    申请响应: os有记录空闲内存地址的链表,申请时遍历链表,寻找第一个空间大于申请空间的堆结点,该结点从空闲结点删除,节点分配给程序。自动将多余部分重新放入空闲链表
    申请大小限制:堆是向高地址扩展的不连续内存,系统用链表存储空闲内存地址。受限于有效虚拟内存
    申请效率: 慢,容易产生内存碎片
    存储内容: 堆头部一个字节存放堆的大小。内容由程序员安排
    数据结构: 满足优先队列的数据结构(第1个元素有最高优先权)

网络 #

ABR(area border router):区域边界路由器
子网隔离

状态 #

介绍
    cookie的弊端
        数据在客户端可以被修改,所以不能存重要数据
        cookie中字段太多会影响传输效率
请求头
    set-cookie
        # 规定cookie的格式为name = value
响应
    path
        # cookie发送的相对路径
    expires和maxAge
        # expires是UTC时间, maxAge是cookie多久后过期
        ## 不设置这两个时产生的是session cookie, 它是transient的,用户关闭浏览器时清除。一般用来保存session_id
    secure
        # true时, cookie在HTTP中是无效的, 在HTTPS中才有效
    httpOnly
        # 通知浏览器不允许脚本操作document.cookie。一般都应设置为true, 可以避免被xss攻击拿到cookie
签名( 信息摘要算法)
    原user='alsotang'
    现user=sha1('my_secret' + 'alsotang') === 'xxxx...xxx'

session #

介绍
    session通过cookie中存放session_id来实现
    可以存放在
        1. 内存
        2. cookie本身
            # 不用担心集群的状态共享问题,安全性可以遵照最佳实践来,也是有保证的,最大的弊端在于增大了数据量传输。有受到回放攻击的危险
        3. redis或memcached等缓存
            # 常用
        4. 数据库中

OSI分层 #

物理层
数据链路层
网络层
传输层
会话层
表示层
应用层

数据链路层 #

分层
    数据链路层分为两层
        llc上层子层                # Logical Link Control 逻辑链路控制。
        mac下层子层                # Media Access Control 介质访问控制层

帧(frame)传输
    网络驱动程序成型帧,  网卡发送到网线上,到达目的机器,以网络驱动程序解析
协议
    以太网
    令牌环
    HDLC
    帧中继
    ISDN
    ATM
    IEEE 802.11
    FDDI
    PPP
mac
    Media Access Control
        mac帧结构

"" 单位 字节 帧类型/长度(TYPE/LEN): 该字段的值大于1500时,表示上层数据使用的协议类型。例如0x0806表示ARP请求或应答,0x0800表示IP协议。 该字段的值小于1500时表示以太网数据的长度,上层携带LLC-PDU。 帧校验FCS: 以太网采用32位CRC冗余校验。 llc Logical Link Control llc-pdu结构 "" ""

...