【Docker】基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
各个工具介绍
(1)Docker:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux机器上,也可以实现虚拟化,docker是集群世界中的“进程”。通过docker我们可以非常方便的管理服务以及服务之间的依赖。
(2)etcd:是一个高可用的集中配置管理和协作平台,功能和zookeeper很相似,两者的优劣势比较可以参考网上相关文档。分布式系统相关的配置信息可以集中的存储在etcd中统一管理。
(3)confd:一个轻量级的配置管理工具,后端支持etcd、consul、vault、environment variables、Redis、zookeeper等,当后端的数据发生变化时,confd会根据模板重新生成服务的配置文件,并reload。
(4)haproxy:提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机。
原理
通过docker启动nginx服务,并且把docker实例的相关信息注册到etcd中,confd监控到etcd的数据发生变化,重新生成haproxy的配置文件,并且reload haproxy。
当前端服务的负载升高时,可以发起新的docker实例,confd会把该实例添加到haproxy中。当负载降低时,可以kill 一些docker实例,confd会从haproxy中移除该实例。由于confd需要修改haproxy的配置文件,因此一般confd和haproxy运行在同一台服务器上。
本文的所有服务都运行在一台ubuntu主机上。
实施步骤:
(1)安装docker
curl -fsSL https://get.docker.com/gpg | sudo apt-key add -
curl -fsSL https://get.docker.com/ | sh
可以运行一个helloworld实例来测试docker是否安装成功
docker run hello-world #docker首先会下载hello-world镜像到本地,然后运行。
我们运行一个nginx实例,并测试nginx是否工作
docker run -d -P nginx #-P让docker将nginx的80、443端口映射到主机的一个随机端口上,-d以detatch模式运行
以上命令会返回创建的docker实例的id
根据返回的docker id,可以查询该实例的详细信息,包括具体映射的端口。
docker inspect cf04729a1b16232f72cab0bb89396b0acf20f36a9a38a2fa1d36f55c4baffb00|grep \"Ports\" -A 20
可以看到如下类似的输出:
"Ports": {
"443/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "32768"
}
],
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "32769"
}
]
}
启用docker远程访问,
编辑/etc/default/docker, 设置DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://0.0.0.0:5555"
(2)安装etcd
curl -L https://github.com/coreos/etcd/releases/download/v3.0.0-beta.0/etcd-v3.0.0-beta.0-linux-amd64.tar.gz -o etcd-v3.0.0-beta.0-linux-amd64.tar.gz
tar xzvf etcd-v3.0.0-beta.0-linux-amd64.tar.gz
cd etcd-v3.0.0-beta.0-linux-amd64
运行etcd
./etcd #etcd支持分布式集群的搭建,这里简单的采用单机版运行。关于集群的搭建,可以参考官网相关文档或者网上文章。
etcd提供了一个工具“etcdctl”来同etcd交互,
例如:
./etcdctl set mykey "this is awesome" #设置mykey的内容为“this is awesome”
./etcdctl get mykey #获取mykey对应的值
更多操作参考 ./etcdctl -h
(3)安装confd
confd基于Go语言开发,因此首先安装go语言。
confd的源码托管在github上,地址为:https://github.com/kelseyhightower/confd
安装参见github上的文档
由于haproxy的配置文件由confd生成,我们配置一下confd。
创建相关目录
mkdir -p /etc/confd/{conf.d,templates}
编辑资源文件 /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"
配置模板文件/etc/confd/templates/haproxy.cfg.tmpl
global
defaults
timeout client 30s
timeout server 30s
timeout connect 30s
frontend MyFrontend
mode http
bind *:80
default_backend TransparentBack_http
stats enable
# CHANGE: Your stats credentials
# stats auth admin:admin
stats uri /haproxy_stats
backend TransparentBack_http
mode http
{{range gets "/app/servers/*"}} #获取所有以/app/servers/开头的key,
server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2 #base获取路径的最后一段
{{end}}
stats enable
stats uri /admin-status
stats auth admin:123456
stats admin if TRUE
运行confd
confd -backend etcd -interval 10 -node http://127.0.0.1:4001
查看/etc/haproxy/haproxy.conf,发现confd已经根据模板和etcd中的数据生成了一份haproxy的配置文件。
(4)安装haproxy
apt-get install haproxy
haproxy默认通过init.d脚本无法启动,编辑/etc/default/haproxy,将ENABLED设置为1
启动haproxy
/etc/init.d/haproxy start
重新加载配置
/etc/init.d/haproxy reload
(5)发起docker实例的脚本
安装docker的Python api
pip install --no-use-wheel docker-py
安装etcd的python lib
pip install --no-use-wheel python-etcd
- #!/usr/local/Python/bin/python
- # coding:utf8
- import docker
- import etcd
- import sys
- Server_ip="192.168.252.138"
- Image="nginx"
- idict={}
- rinfo={}
- Etcd_ip="127.0.0.1"
- Port=""
- Name=""
- try:
- c = docker.Client(base_url='tcp://'+Server_ip+':5555', version='1.18')
- except Exception,e:
- print "Connection docker server error:"+str(e)
- sys.exit()
- try:
- rinfo=c.create_container(image=Image,volumes=['/usr/share/nginx/html'],ports=[80])
- containerId=rinfo['Id']
- except Exception,e:
- print "Create docker container error:"+str(e)
- sys.exit()
- try:
- #/usr/share/nginx/html为nginx的文档根目录,这里将其映射到host的/root/htmldoc目录
- c.start(container=containerId, binds={'/root/htmldoc':{'bind': '/usr/share/nginx/html'}}, port_bindings={80:None}, publish_all_ports=True)
- except Exception,e:
- print "Start docker container error:"+str(e)
- sys.exit()
- try:
- idict=c.inspect_container(containerId)
- Name=idict["Name"][1:]
- skey='80/tcp'
- for _key in idict["NetworkSettings"]["Ports"].keys():
- if _key==skey:
- Port=idict["NetworkSettings"]["Ports"][skey][0]["HostPort"]
- except Exception,e:
- print "Get docker container inspect error:"+str(e)
- sys.exit()
- #更新docker实例的相关信息到etcd中
- if Name != "" and Port != "":
- try:
- client = etcd.Client(host=Etcd_ip, port=4001)
- client.write('/app/servers/'+Name, Server_ip+":"+str(Port))
- print Name+" container run success!"
- except Exception,e:
- print "set etcd key error:"+str(e)
- else:
- print "Get container name or port error."
(6)杀死docker实例的脚本
- #!/usr/local/Python/bin/python
- #coding:utf8
- import docker
- import etcd
- import sys
- Etcd_ip="127.0.0.1"
- Server_ip="127.0.0.1"
- if len(sys.argv) != 2:
- print "usage: delete_docker_instance.py containername"
- exit(0)
- try:
- c = docker.Client(base_url='tcp://'+Server_ip+':5555',version='1.18',timeout=10)
- c.stop(sys.argv[1])
- except Exception,e:
- print str(e)
- sys.exit()
- try:
- client = etcd.Client(host=Etcd_ip, port=4001)
- client.delete('/app/servers/'+sys.argv[1])
- print sys.argv[1]+" container stop success!"
- except Exception,e:
- print str(e)
参考资料:
spring-boot 和 docker 集成:http://www.open-open.com/lib/view/open1450684294167.html
http://www.jianshu.com/p/bc85a54f98ff
http://blog.csdn.net/weiyuanke/article/details/51425304
【Docker】基于docker+etcd+confd + haproxy构建高可用、自发现的web服务的更多相关文章
- 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...
- Docker 搭建pxc集群 + haproxy + keepalived 高可用(二)
上一节我们有了两个分片的pxc集群,这一节我们接着安装haproxy和keepalived的实现集群的高可用 一.先下载haproxy的镜像 [root@localhost ~]# docker pu ...
- Docker 搭建pxc集群 + haproxy + keepalived 高可用(一)
一.首先需要安装好docker,安装方法可以参考之前一篇博文Centos7安装docker [root@localhost ~]# systemctl start docker [root@local ...
- 【线上测试之后的应用】基于MySQL+MHA+Haproxy构建高可用负载均衡数据库集群(详解)
这里我们先介绍一下MHA是什么,其次就是它的应用与测试,同时为了大家呈现了数据备份案例,最后总结了使用情况以及注意事项和解决办法 一.MHA 概述 MHA(Master High Availabili ...
- keepalived+haproxy构建高可用负载均衡
一.环境介绍 我用的是centos6.7,内核版本为2.6.32-573.el6.x86_64,keepalived版本为keepalived-1.2.22,haproxy版本为haproxy-1.6 ...
- .net core下简单构建高可用服务集群
一说到集群服务相信对普通开发者来说肯定想到很复杂的事情,如zeekeeper ,反向代理服务网关等一系列的搭建和配置等等:总得来说需要有一定经验和规划的团队才能应用起来.在这文章里你能看到在.net ...
- 用HAProxy和KeepAlived构建高可用的反向代理
用HAProxy和KeepAlived构建高可用的反向代理 用HAProxy和KeepAlived构建高可用的反向代理 前言对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求 ...
- 用HAProxy和KeepAlived构建高可用的反向代理系统
对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求,这时候需要多台服务器对大量的请求进行分流处理,即负载均衡.而如果实现负载均衡,必须在网站的入口部署服务器(不只是一台)对这些请 ...
- (七) Docker 部署 MySql8.0 一主一从 高可用集群
参考并感谢 官方文档 https://hub.docker.com/_/mysql y0ngb1n https://www.jianshu.com/p/0439206e1f28 vito0319 ht ...
随机推荐
- modernizr.js的介绍和使用
原文链接:https://www.cnblogs.com/-simon/p/5907053.html Modernizr帮助我们检测浏览器是否实现了某个feature,如果实现了那么开发人员就可以充分 ...
- HTML5前端
Web前端介绍 angular2html 1.HTML (常用标签 网页的基本结构) 2.CSS (常用样式 网页的显示效果) 3.JavaScript (用户交互效果 动态效果) 4.jQuery ...
- 某gov的逻辑漏洞
首先找一个号 在企业信息里面查看到大量的企业名称和组织机构代码 随后去找回密码那 可以看到是直接显示了用户名和密码 随后去登录 可以看到大量的工程信息个企业注册信息
- 小程序swiper 快速滑动闪屏
bindchange: function(e){ if(e.detail.source == "touch") { this.setData({ current: current ...
- wamp经典安装
1,根据综述 本机 注意,现在apache2.2不能和5.5php, 2.4apache和5.5php就可以 window10 64位 vc14 apache 2.4.23 注意,虚拟 ...
- 使用jquery dataTable
jQuery 的插件 dataTables 是一个优秀的表格插件,提供了针对表格的排序.浏览器分页.服务器分页.筛选.格式化等功能.dataTables 的网站上也提供了大量的演示和详细的文档进行说明 ...
- linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享
首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式: mount [-t vfstype] [-o options ...
- 【xshell】xshell设置快捷键 设置Ctrl+C Ctrl+V快捷键为复制粘贴
在使用xshell的时候,总是不能顺手的进行复制粘贴的操作. 那能不能设置xhsell的快捷键呢? 点击工具--->选项---> 选择 键盘和鼠标 选项卡--->点击编辑----&g ...
- DevExpress Components16.2.6 Source Code 编译
DevExpress 是一个比较有名的界面控件套件,提供了一系列优秀的界面控件.这篇文章将展示如何在拥有源代码的情况下,对 DevExpress 的程序集进行重新编译. 特别提示:重编译后,已安装好的 ...
- cocos2d-x 3.0 事件处理
參考文章: star特530的CSDN博客:http://blog.csdn.net/star530/article/details/18325493 https://github.com/chuko ...