服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的。比如说一个数据集群中,可以
服务发现
/usr/local/server.json
{
"datacenter": "dc1",
"data_dir": "/usr/local/",
"log_level": "INFO",
"server": true,
"bootstrap_expect": 3,
"bind_addr": "172.18.0.11",
"client_addr": "0.0.0.0",
"start_join": ["172.18.0.11","172.18.0.12","172.18.0.13"],
"ui":true
}
依次登录三个容器中,以server模式启动consul服务client.json
{
"data_dir": "usr/local/consuldata",
"enable_script_checks": true,
"bind_addr": "172.18.0.21",
"retry_join": ["172.18.0.11","172.18.0.12","172.18.0.13"],
"retry_interval": "30s",
"rejoin_after_leave": true,
"start_join": ["172.18.0.11","172.18.0.12","172.18.0.13"]
}
分别启动三个client节点的consul服务,以client的模式运行,启动后,正常情况下会自动加入到consul的服务端集群中。
./consul agent -config-dir=/usr/local/consuldata > /usr/local/consuldata/consul.log &
./consul members --http-addr 172.18.0.11:8500
consul客户端代理服务注册这里是使用 w-master-redis-8888.service.consul名字作为三个redis集群节点的服务代理。
{
"services":
[
{
"name": "w-master-redis-8888",
"tags": [
"master"
],
"address": "172.18.0.21",
"port": 8888,
"checks": [
{
"args":["sh","-c","/usr/local/consuldata/check_redis_master.sh 172.18.0.21 8888 ******"],
"shell":"/bin/bash",
"interval": "15s"
}
]
}
]
}
redis-slave-8888.json
{
"services":
[
{
"name": "r-slave-redis-8888",
"tags": [
"master"
],
"address": "172.18.0.21",
"port": 8888,
"checks": [
{
"args":["sh","-c","/usr/local/consuldata/check_redis_slave.sh 172.18.0.21 8888 ******"],
"Shell":"/bin/bash",
"interval": "15s"
}
]
}
]
}
Consul client节点的Redis主节点(写节点)服务检查脚本check_redis_master.sh
以下脚本来源于https://www.cnblogs.com/Gomysql/p/8010552.html,做了简单的修改,在节点的身份判断逻辑上需要加强。
#!/bin/bash
host=$1
myport=$2
auth=$3
if [ ! -n "$auth" ]
then
auth=""""
fi
comm="/usr/local/redis_instance/redis8888/bin/redis-cli -h $host -p $myport -a $auth "
role=`echo "INFO Replication"|$comm |grep -Ec "role:master"`
echo "INFO Replication"|$comm
if [ $role -ne 1 ]
then
exit 2
fi
Consul client节点的Redis从节点服务检查脚本check_redis_slave.sh
#!/bin/bash
host=$1
myport=$2
auth=$3
if [ ! -n "$auth" ]
then
auth=""""
fi
comm="/usr/local/redis_instance/redis8888/bin/redis-cli -h $host -p $myport -a $auth "
role=`echo "INFO Replication"|$comm |grep -Ec "role:slave"`
echo $role
echo "INFO Replication"|$comm
if [ $role -ne 1 ]
then
exit 2
fi
Consul服务发现
redis集群配置成功后,重新加载代理服务,consul reload,一切正常的话,consul服务端就可以解析配置的服务了。
如下注册了两个服务,分别是r-slave-redis-8888,w-master-redis-8888,分别代表Redis集群的读写节点。
可以看到,成功地解析了 w-master-redis-8888.service.consul这个服务,映射到172.18.0.21,172.18.0.22,172.18.0.23三个节点。
r-slave-redis-8888.service.consul服务的解析,指向了三个从节点,172.18.0.24,172.18.0.25,172.18.0.26
故障转移之后的服务发现:模拟主节点故障,对172.18.0.21节点手动故障转移,现在172.18.0.21与172.18.0.24角色交换
Redis集群故障转以后的服务发现解析结果 对于w-master-redis-8888.service.consul这个服务,成功解析到172.18.0.24,172.18.0.22,172.18.0.23三个主节点
Redis集群故障转以后的服务发现解析结果 对于w-master-redis-8888.service.consul这个服务,成功解析到172.18.0.24,172.18.0.22,172.18.0.23三个主节点
遇到的问题:
1,cosnul服务端集群的时候,clustercenter一开始自定义了一个名称myconsule_datacenter,导致client节点死活加不进来,按照默认的dc1就没有问题
目前还不理解这个datacenter的命名规则是什么?
2,容器节点中的shell脚本要授予可执行权限chmod +x check_XXX.sh
3,其他异常问题,一定要看日志,搜索一下基本上都有结果。
以下纯粹是Redis集群的问题,与Consul没有直接关系,仅作为本测试中遇到的问题。
4,容器节点的Redis集群时,需要移除bind_ip的127.0.0.1节点,直接配置docker创建容器时候的IP,创建集群的时候会一致等待,waiting for the cluster to join
这一点redis-cli --cluster做的很扯淡,明明找不到节点,还要死等,不人为终止的话,他会一直waiting
5,Redis集群时候,因为主从都是相对的,需要相互识别对方,主从节点都要指定“masterauth”和“requirepass”,且密码一致,否则执行cluster failover提示成功,但故障转移不成功
6,遇到一个灵异的问题(之前单机多实例的时候也遇到过),在启动容器上的Redis服务的时候,如果使用绝对路径启动,在创建集群的时候会出现从节点无法添加到集群中去的情况,停止服务,以相对路径方式重启之后就没有这个问题
总的来说consul这个中间件使用起来还算是比较简单,配置也很清爽,不像某些中间件令人作呕的配置结构(mycat???)
这里没有配置多数据中心模式,仅配置了单数据中心模式,作为一款服务发现的中间件,是完全没有问题的,尤其是作为MySQL集群不支持多IP连接驱动的数据库连接。
参考:
--结束END--
本文标题: 基于Docker的Consul集群实现服务发现
本文链接: https://lsjlt.com/news/3441.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0