用docker搭建一个高可用可扩展的服务支撑系统怎么做

大哥大姐们,请讲解下,用docker搭建一个高可用可扩展的服务支撑系统怎么做
最新回答
小面包

2024-11-08 01:54:44

一种方案为Haproxy+etcd+confd,采用松散式的组织结构,但各个组件之间的通讯是非常严密的,且扩展性更强,定制也更加灵活。

一、架构优势

约定由Haproxy+etcd+confd+Docker构建的基础服务平台简称“HECD” 架构,整合了多种开源组件,看似松散的结构,事实上已经是一个有机的整体,它们互相联系、互相作用,是Docker生态圈中最理想的组合之一,具有以下优势:

  • 自动、实时发现及无感知服务刷新; 

  • 支持任意多台Docker主宿机; 

  • 支持多种APP接入且打散至不分主宿机; 

  • 采用Etcd存储信息,集群支持可靠性高; 

  • 采用Confd配置引擎,支持各类接入层,如Nginx; 

  • 支持负载均衡、故障迁移; 

  • 具备资源弹性,伸缩自如(通过生成、销毁容器实现); 

  • 二、架构说明
  • 在HECD架构中,首先管理员操作Docker Client,除了提交容器(Container)启动与停止指令外,还通过REST-API方式向Etcd(K/V)存储组件注册容器信息,包括容器名称、主宿机IP、映射端口等。Confd配置组件会定时查询Etcd组件获取最新的容器信息,根据定义好的配置模板生成Haproxy配置文件Haproxy.cfg,并且自动reload haproxy服务。用户在访问业务服务时,完全没有感知后端APP的上线、下线、切换及迁移,达到了自动发现、高可用的目的。详细架构图见图1-1。



    图1-1 平台架构图

    为了方便大家理解各组件间的关系,通过图1-2进行架构流程梳理,首先管理员通过Shell或API操作容器,下一步将容器信息注册到Etcd组件,Confd组件会定时查询Etcd,获取已经注册到Etcd中容器信息,最后通过Confd的模板引擎生成Haproxy配置,整个流程结束。


    图1-2架构流程图

    了解架构流程后,我们逐一对流程中各组件进行详细介绍。

    1、Etcd介绍

    Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。

  • 简单:支持 curl 方式的用户 API (HTTP+JSON) 

  • 安全:可选 SSL 客户端证书认证 

  • 快速:单实例可达每秒 1000 次写操作 

  • 可靠:使用 Raft 实现分布式

  • 2、Confd介绍

    Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。

    3、Haproxy介绍

    HAProxy是提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。(来源百科) 

    三、架构部署

    平台环境基于Centos6.5+Docker1.2构建,其中Etcd的版本为etcd version 0.5.0-alpha,Confd版本为confd 0.6.2,Haproxy版本为HA-Proxy version 1.4.24。下面对平台的运行环境、安装部署、组件说明等进行详细说明,环境设备角色表如下:




    1、组件安装

    1.1 Docker安装

    SSH终端登录192.168.1.22服务器,执行以下命令:

  • # yum -y install docker-io   

  • # service docker start   

  • # chkconfig docker on  
  • 1.2 Haproxy、confd安装

    SSH终端登录192.168.1.20服务器,执行以下命令:

  • 1、haproxy   

  • # yum –y install haproxy   

  • 2、confd   

  • # wget https://github.com/kelseyhightower/confd/releases/download/v0.6.3/confd-0.6.3-linux-amd64  

  • # mv confd /usr/local/bin/confd   

  • # chmod +x /usr/local/bin/confd   

  • # /usr/local/bin/confd -version   

  • confd 0.6.2  
  • 1.3 Etcd安装   

    SSH终端登录192.168.1.21服务器,执行以下命令: 

  • # yum -y install golang   

  • # mkdir -p /home/install && cd /home/install   

  • # git clone https://github.com/coreos/etcd  

  • # cd etcd   

  • # ./build   

  • # cp bin/etcd /bin/etcd   

  • # /bin/etcd -version   

  • etcd version 0.5.0-alpha  
  • 2、组件配置   
  • 2.1 Etcd配置

    由于etcd是一个轻量级的K/V存储平台,启动时指定相关参数即可,无需配置。 

  • # /bin/etcd -peer-addr 192.168.1.21:7001 -addr 192.168.1.21:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001 &  

  • 由于etcd具备多机支持,参数“-peer-addr”指定与其它节点通讯的地址;参数“-addr”指定服务监听地址;参数“-data-dir”为指定数据存储目录。    
  • 由于etcd是通过REST-API方式进行交互,常见操作如下:   

    1) 设置(set) key操作  

  • # curl -L http://192.168.1.21:4001/v2/keys/mykey-XPUT -d value="this is awesome"   

  • {"action":"set","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}} 
  • 2) 获取(get) key信息
  • # curl -L http://192.168.1.21:4001/v2/keys/mykey  

  • {"action":"get","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}}  
  • 3) 删除key信息 

  • # curl -L http://192.168.1.21:4001/v2/keys/mykey-XDELETE         {"action":"delete","node":{"key":"/mykey","modifiedIndex":29,"createdIndex":28},"prevNode":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}}   更多操作API见https://github.com/coreos/etcd/blob/master/Documentation/api.md。 
  • 2.2 Confd+Haproxy配置  

    由于Haproxy的配置文件是由Confd组件生成,要求Confd务必要与haproxy安装在同一台主机上,Confd的配置有两种,一种为Confd资源配置文件,默认路径为“/etc/confd/conf.d”目录,另一种为配置模板文件,默认路径为“/etc/confd/templates”。具体配置如下:    

    创建配置文件目录 

  • # mkdir -p /etc/confd/{conf.d,templates}

  • (1)配置资源文件   
  • 详细见以下配置文件,其中“src”为指定模板文件名称(默认到路径/etc/confd/templates中查找);“dest”指定生成的Haproxy配置文件路径;“keys”指定关联Etcd中key的URI列表;“reload_cmd”指定服务重载的命令,本例中配置成haproxy的reload命令。    

    【/etc/confd/conf.d/ haproxy.toml】 

  • [template]  

  • src = "haproxy.cfg.tmpl"  

  • dest = "/etc/haproxy/haproxy.cfg"  

  • keys = [  

  •  "/app/servers",  

  • ]  

  • reload_cmd = "/etc/init.d/haproxy reload"  

  • (2)配置模板文件  
  • Confd模板引擎采用了Go语言的文本模板,更多见http://golang.org/pkg/text/template/,具备简单的逻辑语法,包括循环体、处理函数等,本示例的模板文件如下,通过range循环输出Key及Value信息。   

    【/etc/confd/templates/haproxy.cfg.tmpl】 

  • global  

  •        log 127.0.0.1 local3  

  •        maxconn 5000  

  •        uid 99  

  •        gid 99  

  •        daemon  

  •  

  • defaults  

  •        log 127.0.0.1 local3  

  •        mode http  

  •        option dontlognull  

  •        retries 3  

  •        option redispatch  

  •        maxconn 2000  

  •        contimeout  5000  

  •        clitimeout  50000  

  •        srvtimeout  50000  

  •  

  • listen frontend 0.0.0.0:80  

  •        mode http  

  •        balance roundrobin  

  •        maxconn 2000  

  •        option forwardfor  

  •        {{range gets "/app/servers/*"}}  

  •        server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2  

  •        {{end}}  

  •  

  •        stats enable  

  •        stats uri /admin-status  

  •        stats auth admin:123456  

  •        stats admin if TRUE  

  • (3)模板引擎说明  
  • 本小节详细说明Confd模板引擎基础语法与示例,下面为示例用到的KEY信息。 

  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/backstabbing_rosalind-d value="192.168.1.22:49156"   

  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/cocky_morse-d value="192.168.1.22:49158"   

  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/goofy_goldstine-d value="192.168.1.22:49160"   

  • # curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/prickly_blackwell-d value="192.168.1.22:49162"1、base   
  • 作为path.Base函数的别名,获取路径最后一段。 
    {{ with get "/app/servers/prickly_blackwell"}}
    server {{base .Key}} {{.Value}} check 
    {{end}}

  • prickly_blackwell 192.168.1.22:49162

  • 2、get

    返回一对匹配的KV,找不到则返回错误。   

    {{with get "/app/servers/prickly_blackwell"}}
    key: {{.Key}}
    value: {{.Value}} 
    {{end}}

  • /app/servers/prickly_blackwell 192.168.1.22:49162  

  • 3、gets  
  • {{range gets "/app/servers/*"}}
    {{.Key}} {{.Value}}
    {{end}} 

  • /app/servers/backstabbing_rosalind 192.168.1.22:49156  

  • /app/servers/cocky_morse 192.168.1.22:49158  

  • /app/servers/goofy_goldstine 192.168.1.22:49160  

  • app/servers/prickly_blackwell 192.168.1.22:49162

  • 4、getv
  • 返回一个匹配key的字符串型Value,找不到则返回错误。  

    {{getv "/app/servers/cocky_morse"}}

  • 192.168.1.22:49158  

  • 5、getvs
  • 返回所有匹配key的字符串型Value,找不到则返回错误。

    {{range getvs "/app/servers/*"}}
    value: {{.}}
    {{end}} 

  • value: 192.168.1.22:49156  

  • value: 192.168.1.22:49158  

  • value: 192.168.1.22:49160  

  • value: 192.168.1.22:49162  

  • 6、split
  • 对输入的字符串做split处理,即将字符串按指定分隔符拆分成数组。
    {{ $url := split (getv "/app/servers/cocky_morse") ":" }}
    host: {{index $url 0}}
    port: {{index $url 1}}

  • host: 192.168.1.22  

  • port: 49158  

  • 7、ls
  • 返回所有的字符串型子key,找不到则返回错误。 
    {{range ls "/app/servers/"}}
    subkey: {{.}} 
    {{end}}

  • subkey: backstabbing_rosalind  

  • subkey: cocky_morse  

  • subkey: goofy_goldstine  

  • subkey: prickly_blackwell  

  • 8、lsdir
  • 返回所有的字符串型子目录,找不到则返回一个空列表。 
    {{range lsdir "/app/"}}
    subdir: {{.}} 
    {{end}}

  • subdir: servers

  • (4)启动confd及haproxy服务
  • 下面为启动Confd服务命令行,参数“interval”为指定探测etcd的频率,单位为秒,参数“-node”为指定etcd监听服务主地址,以便获取容器信息。 

  • # /usr/local/bin/confd -verbose -interval 10 -node '192.168.1.21:4001' -confdir /etc/confd > /var/log/confd.log &  

  • # /etc/init.d/haproxy start  

追问
谢谢,那还有没有其他的途径。这样搭建可以做到如图所示的结果吗?