设为首页 收藏本站
查看: 985|回复: 0

[经验分享] 利用redis-sentinel+consul实现redis高可用

[复制链接]

尚未签到

发表于 2018-11-5 11:58:06 | 显示全部楼层 |阅读模式
  在前文《利用redis-sentinel+keepalived实现redis高可用》详细描述了利用redis-sentinel+keepalived实现redis高可用的方案。本文中redis-sentinel的应用场景也是一样的,也是提供Redis单实例服务,当某Redis(master)服务意外停掉或该服务所在的主机发生宕机故障或网络故障时,另一台Redis服务会由slave自动成为master,提供Redis读写服务。redis-sentinel的配置可以参考前文,本文略去,只讨论consul代替keepalived。
  由于keepalived的应用场景有限,比如它的核心协议VRRP只能工作在局域网内,不能工作在局域网外(网间、广域网),而且在网络不受自己控制时基本不能用,除非设定好的VIP是供局域网使用。因此特别是在云计算环境中,使用云主机(例如阿里云ECS等)就不能用keepalived,因此只能寻找一个可替代keepalived的解决方案来替代它。Consul作为服务注册、服务发现的最佳选择,无疑可以很好的替代keepalived。
  前文是用的keepalived提供一个VIP为上层应用提供访问入口,本文是将keepalived替换成consul,利用consul的DNS Interface为上层应用提供Redis(master)的IP。
DSC0000.png

  前提条件:需要一个可用的consul集群,可以利用consul集群本身和配置文件注册服务,也可以用一台单独的主机注册,还可以用HTTP API向Consul注册。
  为了获取Redis(master)的IP而不是Redis(Slave)的IP,可以用脚本检查实现,与keepalived脚本中相似,只是返回值将1设定成2,因为consul中返回值0是没问题(passed),1是警告(warning),2是严重(critical)。
  下面是用一台单独的主机注册的例子。
  json配置文件如下:
{  
  "services": [
  
    {
  
      "id": "redisnode1",
  
      "name": "redis",
  
      "tags": [
  
        "master"
  
      ],
  
      "address": "192.168.1.241",
  
      "port": 6379,
  
      "checks": [
  
        {
  
          "script": "/usr/local/sbin/redis-cli -h 192.168.1.241 -p 6379 info | grep role:master || exit 2",
  
          "interval": "5s"
  
        }
  
      ]
  
    },
  
    {
  
      "id": "redisnode2",
  
      "name": "redis",
  
      "tags": [
  
        "master"
  
      ],
  
      "address": "192.168.1.242",
  
      "port": 6379,
  
      "checks": [
  
        {
  
          "script": "/usr/local/sbin/redis-cli -h 192.168.1.242 -p 6379 info | grep role:master || exit 2",
  
          "interval": "5s"
  
        }
  
      ]
  
    },
  
    {
  
      "id": "redisnode3",
  
      "name": "redis",
  
      "tags": [
  
        "master"
  
      ],
  
      "address": "192.168.1.243",
  
      "port": 6379,
  
      "checks": [
  
        {
  
          "script": "/usr/local/sbin/redis-cli -h 192.168.1.243 -p 6379 info | grep role:master || exit 2",
  
          "interval": "5s"
  
        }
  
      ]
  
    }
  
  ]
  
}
  注册是利用consul agent作为Client运行注册的,假设consul集群中某台Server的地址是192.168.1.245。
mkdir -p /usr/local/consul/data /usr/local/consul/config  
cat >/usr/local/consul/config/rediscluster.json&1 &

  注意:在consul json配置文件中,每个consul agent的service>  注意:上述命令行中使用的是与默认网关同网段IP(公网IP地址),要求此地址与consul集群地址之间能互相访问。在启动consul agent之前可以下面两行命令中的一行确定是否满足此条件:
consul info -rpc-addr=192.168.1.245:8400  
consul members -rpc-addr=192.168.1.245:8400
  在consul agent启动后,此时Redis的信息就会在consul中展示出来,包括UI、DNS Interface和HTTP API中都能查询到。使用Redis的应用应该将DNS指向consul集群的DNS地址,这样才能查询到Redis服务对应的IP。
  通过consul HTTP API中提供的“curl http://192.168.1.245:8500/v1/catalog/service/redis”方法只能列举出当前service:redis中有哪些节点,但无法区分这些节点中哪些是正常工作的节点,哪些是有问题的节点,但DNS Interface方法“dig @192.168.1.245 -p 53 redis.service.dc1.consul. ANY”可以准确的将可用的节点的IP找到,如下图所示。
DSC0001.png

DSC0002.png

  例如用redis-cli测试一下Redis集群。
DSC0003.png

  文中只是利用consul的DNS Interface获取到了Redis集群的master的IP,并没有获取到port,尽管可以通过“dig @192.168.1.245 -p 53 redis.service.consul SRV”可以获取到port,但对于上层应用来说并不是很好做,毕竟大部分应用的域名解析是不会查询SRV记录的。本文的consul是Consul v0.6.0,目前有更新的版本0.6.3可以使用,https://www.consul.io/downloads.html ,consul可能还有其他比较好用的方法更好的获取服务的IP和Port,以后使用的过程中也会再补充。更多关于consul的信息可以参考consul的官方网站:https://www.consul.io/。
  注意:可能存在的问题。如果Redis master发生故障,原先的slave会变成新的master,DNS缓存可能不会刷新,这个在发生故障处理时需要注意清空上层应用的DNS缓存。
  tag:Redis集群,Redis高可用,redis-sentinel,consul API,Redis主从复制
  --end--



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631089-1-1.html 上篇帖子: 安装php连接redis cluster扩展 下篇帖子: Redis数据库的使用场景介绍(避免误用Redis)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表