基于 consul + upsync 的动态upstream管理

基于 consul + upsync 的动态upstream管理

upsync介绍

upsync是微博开源的基于nginx的动态流量管理方案. github地址: https://github.com/weibocom/nginx-upsync-module.

nginx-upsync-module,它的功能是拉取 consul 的后端 server 的列表,并更新 Nginx 的路由信息。此模块不依赖于任何第三方模块。 consul 作为 Nginx 的 db,利用 consul 的 KV 服务,每个 Nginx work 进程独立的去拉取各个 upstream 的配置,并更新各自的路由。

upsync arch

consul简介

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. consul是分布式的, 高可用的, 可横向扩展的. 它具备以下特性:

  • 服务发现: consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务. 一些外部的服务通过consul很容易的找到它所依赖的服务.

  • 健康检测: consul的client提供了健康检查的机制, 可以通过用来避免流量被转发到有故障的服务上.

  • Key/Value存储: 应用程序可以根据自己的需要使用Consul提供的Key/Value存储. Consul提供了简单易用的HTTP接口, 结合其他工具可以实现动态配置, 功能标记, 领袖选举等等功能.

  • 多数据中心: Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域.

consul架构

  • consul cluster由部署和运行了consul agent的节点组成. 在cluster中有两种角色: server 和 client.

  • server 和 client 的角色和consul cluster上运行的应用服务无关, 是基于consul层面的一种角色划分.

  • consul server: 用于维护consul cluster的状态信息. 官方文档中给出的建议是: 至少要运行3个或者3个以上的consul server. 多个server之中需要选举一个leader, 这个选举过程consul基于raft协议实现. 多个server节点上的consul数据信息保持强一致性.

  • consul client: 只维护自身的状态, 并上报请求给server.

consul arch

consul的安装和启动

启动两台consul server:

consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -client 0.0.0.0 -bind=192.168.100.123 -ui-dir /root/consul_ui -node=server01 -dc=upstream
consul agent -server -data-dir /tmp/consul -client 0.0.0.0 -bind=192.168.100.125 -node=server02 -dc=upstream

一台 consul client:

consul agent -data-dir /tmp/consul -client 0.0.0.0 -bind=192.168.100.127 -node=client01 -dc=upstream
  • 查看集群成员:
[root@ruby-100-123 ~]# consul members
Node      Address               Status  Type    Build  Protocol  DC
client01  192.168.100.127:8301  alive   client  0.7.3  2         upstream
server01  192.168.100.123:8301  alive   server  0.7.3  2         upstream
server02  192.168.100.125:8301  alive   server  0.7.3  2         upstream

通过以上命令可以查看集群中的地址信息, 健康状态, 启动的角色, 版本信息等.

如果需要查看一些元数据的话, 可以通过加 -detailed 参数查看:

[root@ruby-100-123 ~]# consul members --detailed
Node      Address               Status  Tags
client01  192.168.100.127:8301  alive   build=0.7.3:'a90bb8f,dc=upstream,id=64ff71ab-465d-1d7e-22f6-9df6860c0293,role=node,vsn=2,vsn_max=3,vsn_min=2
server01  192.168.100.123:8301  alive   bootstrap=1,build=0.7.3:'a90bb8f,dc=upstream,id=7e1a3bed-2474-898f-275b-212d5fb8f646,port=8300,role=consul,vsn=2,vsn_max=3,vsn_min=2
server02  192.168.100.125:8301  alive   build=0.7.3:'a90bb8f,dc=upstream,id=ad7549e5-b1b6-7d52-a04f-1efd4e0fd58a,port=8300,role=consul,vsn=2,vsn_max=3,vsn_min=2

服务注册

服务注册有两种方式: 通过服务定义配置文件 和 通过HTTP接口. consul推荐使用第一种配置方式.

mkdir /etc/consul.d
echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' >/etc/consul.d/web.json

consul agent -server -data-dir /tmp/consul -client 0.0.0.0 -bind=192.168.100.125 -node=server02 -dc=upstream  -config-dir /etc/consul.d/

然后我们可以通过HTTP接口查询注册的服务:

-bash: Python: command not found
[root@ruby-2-1-source ~]# curl -s http://localhost:8500/v1/catalog/service/web | python -m json.tool
[
    {
        "Address": "192.168.100.125",
        "CreateIndex": 186121,
        "ID": "ad7549e5-b1b6-7d52-a04f-1efd4e0fd58a",
        "ModifyIndex": 186121,
        "Node": "server02",
        "NodeMeta": {},
        "ServiceAddress": "",
        "ServiceEnableTagOverride": false,
        "ServiceID": "web",
        "ServiceName": "web",
        "ServicePort": 80,
        "ServiceTags": [
            "rails"
        ],
        "TaggedAddresses": {
            "lan": "192.168.100.125",
            "wan": "192.168.100.125"
        }
    }
]

健康监测

同样地, 我们可以通过定义配置文件 或 HTTP接口来定义健康监测.

我们定义一个简单的ping检查, 每隔30s一次, 然后重新启动client.

echo '{"check": {"name": "ping", "script": "ping -c1 www.zhe800.com >/dev/null", "interval": "30s"}}' >/etc/consul.d/ping.json

consul agent -server -data-dir /tmp/consul -client 0.0.0.0 -bind=192.168.100.125 -node=server02 -dc=upstream  -config-dir /etc/consul.d/

定义完健康监测的配置之后, 我们可以通过HTTP接口来检查各个agent的运行状态.

curl -s http://localhost:8500/v1/health/state/any | python -m json.tool

Key/Value存储

consul 提供了一个简单易用的Key/Value存储系统, 并提供了相关的HTTP接口, 可以用来动态获取配置(我们的动态upstream项目就是这种应用)、进行服务协调、主节点选举等.

可以通过HTTP接口查看K/V系统中存储了哪些内容:

curl -v http://127.0.0.1:8500/v1/kv/?recurse

通过HTTP接口往K/V系统写入数据:

curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/key1/
curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/key1/key2?param1=test
curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/key1/key2/key3

写入数据之后, 可以通过上面的命令查看. 其value采用Base64加密.

另外, 也可以查看某个单个的key:

curl -s http://127.0.0.1:8500/v1/kv/key1 |python -m json.tool

WEB界面

URL: http://192.168.100.123:8500/ui

启动命令需要增加: -ui-dir 参数, 用于指前端相关的文件位置.

动态upsteams管理系统

动态upsteams管理系统
动态upsteams管理系统

结合zhe800自身的业务来说:

  1. 降低运维配置的复杂度:

原本的配置方式:

upstream test {
server 127.0.0.1:9601 weight=40 max_fails=10 fail_timeout=30s;
server 127.0.0.1:9602 weight=20 max_fails=10 fail_timeout=30s;
server 127.0.0.1:9603 weight=5 max_fails=10 fail_timeout=30s;
server 127.0.0.1:9604 weight=20 max_fails=10 fail_timeout=30s;
server 127.0.0.1:9605 weight=10 max_fails=10 fail_timeout=30s;
server 127.0.0.1:9606 weight=20 max_fails=10 fail_timeout=30s;
keepalive 166;
}

使用 upsync 之后的配置方式:

upstream test {
server 127.0.0.1:11111;
upsync 192.168.100.123:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;

}

  1. 便于动态扩容缩容

运维可以很方便的在后台增删服务器

  1. 基于upstreams后台提供的服务器列表信息, 结合ads可以实现上线更新时的无缝切换

系统提供了每个upstream对应的服务列表的API, 以及启动, 关闭相关服务的API. ads系统更新上线的时候, 通过调用相关的API, 完成无缝上线.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容