使用Apache Mesos和Consul实现服务的注册发现
为保证基于Docker应用程序和服务都具有高性能和可用性,设计出一种具有服务发现,高可用性和容错能力的解决方案非常重要。
我们使用Apache Mesos 和Mesosphere的 Marathon实现Docker的任务调度和应用部署,Mesos能够帮助完成高可用性 高容错性。
作为服务编排注册和发现, Consul 不仅能够作为一个key/value存储,而且能够支持错误侦测以及多数据中心支持。
注册定义是当有Docker容器启动或停止时,其他Docker容器应该能获知,使用Apache Consul实现注册或注销Docker容器的微服务名称以及发布端口。Consul-template 是一个独立的应用,能够查询Consul并且更新文件系统上的一个文件模板,正如你看到一样,使用Consul/Consul-template实现注册的捆绑能够帮助完成动态服务的注册和发现,以及配置文件的更新,我们可以使用这些工具与Haproxy联合一起为所有服务请求提供一个通用的代理网关。
安装步骤
假设 Consul为3个或5个服务器集群工作,每个服务器节点包括所有mesos 主从服务器和haproxy等都必须有一个Consul代理网关安装和运行。
安装Consul 服务器和代理节点的步骤:
wget https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip
unzip 0.4.1_linux_amd64.zip
cp consul /usr/local/bin
Consul服务器设置
我们配置3个vm作为Consul服务器集群. 按照Consul网站的 the server setup instructions 设置服务器集群创建领导人选举,如果一切正常,你应该能通过运行'consul members'看到所有服务器节点。
Consul节点设置
按照Consul网站的the agent setup instructions安装,键入'consul members' 应该可以看到所有服务节点,包括服务器节点。
设置Mesos主服务器
我们可以按照 Mesosphere Master Node Instructions指引安装和配置主节点,我们运行桑格主节点,设置2 quorum, 需要python egg来启动或停止脚步,除安装标准操作外,确保你还运行了下面指令:
curl -sSfL http://downloads.mesosphere.io/master/redhat/6/mesos-0.20.1-py2.6-linux-x86_64.egg –output /tmp/mesos.egg
easy_install –allow-hosts pypi.python.org /tmp/mesos.egg
一旦全部安装完成,键入命令启动:
start mesos-master
会出现:
[root@mesos-master-01 mesos-master]# ps -ef | grep master
root 8978 1 0 Oct29 ? 00:09:47 /usr/local/sbin/mesos-master --zk=zk://1.1.1.1:2181,
2.2.2.2:2181,3.3.3.3:2181/mesos --port=5050 --log_dir=/var/log/mesos
--hostname=1.1.1.1 --quorum=2 --work_dir=/var/lib/mesos
root 8990 8978 0 Oct29 ? 00:00:00 logger -p user.info -t mesos-master[8978]
root 8991 8978 0 Oct29 ? 00:00:00 logger -p user.err -t mesos-master[8978]
设置Mesos 从服务器
按照 Mesosphere Slave Node Instructions 安装从服务器,也需要安装python egg来运行启动脚本,运行以下命令:
curl -sSfL http://downloads.mesosphere.io/master/redhat/6/mesos-0.20.1-py2.6-linux-x86_64.egg –output /tmp/mesos.egg
easy_install –allow-hosts pypi.python.org /tmp/mesos.egg
一切安装正常后,运行:
start mesos-slave
你会看到:
ps -ef | grep slave
root 10749 3451 0 11:03 pts/0 00:00:00 grep slave
root 15229 1 0 Nov06 ? 00:25:01 /usr/local/sbin/mesos-slave
--master=zk://1.1.1.1:2181,2.2.2.2:2181,3.3.3.3:2181/mesos --log_dir=/var/log/mesos
--containerizers=docker,mesos
--executor_registration_timeout=5mins --hostname=172.25.1.35
root 15241 15229 0 Nov06 ? 00:00:00 logger -p user.info -t mesos-slave[15229]
root 15242 15229 0 Nov06 ? 00:00:00 logger -p user.err -t mesos-slave[15229]
一旦安装所有mesos所有组件,你就可以通过端口 5050看见从服务器激活了。
安装Docker
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6*.rpm
yum install -y docker-io
配置后台运行配置,确保/etc/sysconfig/docker有如下:
other_args="-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock"
启动Docker后台运行:service docker start
设置注册器
拉一个Docker image:
docker pull progrium/registrator
运行注册器容器 (确保Consul代理已经安装和运行)
docker run -d -v /var/run/docker.sock:/tmp/docker.sock -h $HOSTNAME progrium/registrator consul://localhost:8500
在注册器容器运行docker logs应该会看到:
2014/10/31 20:06:26 registrator: Using consul registry backend at consul://172.0.0.1:8500 2014/10/31 20:06:26 registrator: Listening for Docker events…
设置consul-template 和 haproxy
现在我们需要设置使用consul-template配置haproxy实例, 这样能在haproxy实现服务的动态注册和注销。
安装haproxy到你的vm, 然后安装consul-template. 确保Consul已经安装并且加入了集群. consul-template下载地址: https://github.com/hashicorp/consul-template/releases.
wget https://github.com/hashicorp/consul-template/releases/download/v0.2.0/
consul-template_0.2.0_linux_amd64.tar.gz
tar xvfz consul-template_0.2.0_linux_amd64.tar.gz cp consul-template /usr/local/bin
下面配置consul-template
首先创建一个模板配置文件,这个文件当启动consul-template时会被使用,创建文件在/data/cfg/consul/tmpl.json:
consul = "127.0.0.1:8500"
template {
source = "/etc/haproxy/haproxy.ctmpl"
destination = "/etc/haproxy/haproxy.cfg"
command = "service haproxy restart"
}
这个配置文件提供了所有consul-template需要的必备配置,使用它们consul-template能够实现haproxy配置,其中haproxy.cfg配置如下:
defaults REDIS
mode tcp
timeout connect 4s
timeout server 30s
timeout client 30s
listen http-in
bind *:80{{range service "web"}}
server {{.Node}} {{.Address}}:{{.Port}}{{end}}
listen http-in
bind *:4567{{range service "demoapp"}}
server {{.Node}} {{.Address}}:{{.Port}}{{end}}
frontend ft_redis
bind *:6379 name redis
default_backend bk_redis
backend bk_redis{{range service "redis"}}
server {{.Node}} {{.Address}}:{{.Port}}{{end}}
配置中有三个监听:一个是webapps监听在端口80, 一个是为sinatra webapps监听在端口 4567 ,一个redis监听端口是6379.
使用下面命令启动consul-template:
nohup consul-template -config /data/cfg/consul/tmpl.json > consul-template.out 2>&1 &
当名为 "web", "demoapp" "redis"的docker服务器启动后,节点的IP和端口信息将自动更新haproxy.cfg. Haproxy将会自动分发负载到后台docker服务,以随机分配的端口的方法,如果一个后台docker容器死机,它的节点IP和端口将被自动从haproxy.cfg移除。
视频和英文原文:Service Discovery & Orchestration With Mesos and Consul
使用Apache Mesos和Consul实现服务的注册发现的更多相关文章
- Apple使用Apache Mesos重建Siri后端服务
苹果公司宣布,将使用开源的集群管理软件Apache Mesos,作为该公司广受欢迎的.基于iOS的智能个人助理软件Siri的后端服务.Mesosphere的博客指出,苹果已经创建了一个命名为J.A.R ...
- 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现
首先安装consul环境,参照之前的文章:<服务注册发现consul之一:consul介绍及安装>中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...
- springcloud使用之服务的注册发现与消费
随着spring的发展我们发现spring提供了越来越多的项目来帮我们简化框架的搭建,使我们站在巨人的肩膀行走,让我们更关注于开发我们的逻辑.随着技术的更替,我们的新项目也逐渐使用了springboo ...
- SpringCloud服务的注册发现--------zookeeper实现服务与发现 + Ribbon实现客户端负载均衡
1,Eureka 闭源了,但是我们可以通过zookeeper实现注册中心的功能. zookeeper 是一个分布式协调工具,可以实现服务的注册和发现,配置中心,注册中心,消息中间件的功能 2,工具准备 ...
- SpringCloud服务的注册发现--------Eureka自我保护机制
1,Eureka 自我保护机制 Eureka注册中心,一些服务会注册到Eureka 服务器上,例如之前的member服务,order服务. 在网络不通的情况下,如果一个bmember 挂了,但是Eur ...
- SpringCloud服务的注册发现--------Eureka实现高可用
1,Eureka作为注册中心,掌管者服务治理的功能,十分重要,如果注册中心的服务一旦宕机,所有的服务就会挂了,为此,实现注册中心的集群(高可用)就显得十分必要了 2,Eureka 搭建集群 实现原理就 ...
- SpringCloud服务的注册发现--------Eureka
1,什么叫做服务的注册与发现 服务的注册与发现基于注册中心,注册中心本身是一个服务,也相当于一个载体,其他服务的注册需要注册到这个注册中心上. 注册:当服务器启动的时候,会将自己的服务器信息,通过别名 ...
- SpringCloud服务的注册发现--------consul实现服务与发现
1,consul也可以替代Eureka实现注册和发现的功能,即注册中心. 之前在linux环境通过consul + upsync + nginx 实现nginx 的动态负载均衡 https://www ...
- Nacos配置中心和服务的注册发现
在上一篇中,我们已经把Nacos的集群搭建好了,那么既然已经搭建好了,就要在咱们的项目中去使用.Nacos既可以做配置中心,也可以做注册中心.我们先来看看在项目中如何使用Nacos做配置中心. Nac ...
随机推荐
- 2017.7.12 Python的6种内建序列及操作
数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构. 在Python中,最基本的数据结构是序列(sequence).序列中的 ...
- Python下载与安装配置
最近想学习Python那就开始吧 首先就是下载安装了 Python最新源码,二进制文档,新闻资讯等可以在Python的官网查看到: Python官网:https://www.python.org/ 你 ...
- 【UOJ#21】【UR#1】缩进优化
我好弱啊,什么题都做不出来QAQ 原题: 小O是一个热爱短代码的选手.在缩代码方面,他是一位身经百战的老手.世界各地的OJ上,很多题的最短解答排行榜都有他的身影.这令他感到十分愉悦. 最近,他突然发现 ...
- LG2516 【[HAOI2010]最长公共子序列】
前言 感觉这几篇仅有的题解都没说清楚,并且有些还是错的,我再发一篇吧. 分析 首先lcs(最长公共子序列)肯定是板子.但这题要求我们不能光记lcs是怎么打的,因为没这部分分,并且另外一个方程的转移要用 ...
- 每天进步一点点-Java IO操作-Java Serializable(对象序列化)的理解和总结
往硬盘文件里写数据 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.在另一端,反序列化将从该流重 ...
- oracle之logminer日志分析
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; select sysdate from dual; 执行增删操作 alter sy ...
- 常用C语言time时间函数
常见的时间函数有time( ).ctime( ).gmtime( ).localtime( ).mktime( ).asctime( ).difftime( ).gettimeofday( ).set ...
- sofa graphql 2 rest api框架
sofa 是一个出发点不一样的工具,提供了从graphql 2 rest 的处理,一般现有的框架都在 关注的是rest 2 graphql (大部分还是基于swagger.open api 标准进行设 ...
- 原生js实现ajax用于简单的签到或登录
<script> function createStandardXHR() { try { return new window.XMLHttpRequest(); ...
- 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis
Redis 的 安装 是 复杂 的, 使用 是 复杂 的, Redis 的 功能 是 重型 的, Redis 本身的 技术实现 是 复杂 的 . Redis 是用 C 写的, C 语言 编写的代码需要 ...