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

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

[复制链接]

尚未签到

发表于 2018-11-5 12:46:43 | 显示全部楼层 |阅读模式
目标、需求:
  为上层应用提供高可靠、低延迟、低(无限接近0)数据损失的Redis缓存服务
方案概述:
  采用同一网络内的三台主机(可以是物理主机、虚拟机或docker容器),要求三台主机之间都能相互访问,每一台主机上都安装redis-server、redis-sentinel和keepalived。
  redis-server负责提供Redis缓存服务,三台主机间的关系是master-slave-slave
  redis-sentinel负责提供Redis高可用,三台主机间的关系与redis-server相同
  keepalived负责提供VIP地址供上层应用使用,三台主机的关系是master-backup-backup,VIP始终在redis-server master上,保证对上层应用可写可读。
  三台主机的冗余度是1,也就是说当有一台主机宕机时另外两台中至少有一台主机可以提供Redis缓存服务
方案原理:
  redis-server提供单实例的Redis缓存服务,redis-sentinel能在一台主机挂掉时自动的将某一台可用主机上的redis-server由slave状态切换成master状态。
  keepalived通过vrrp_script检测当前主机上的redis-server是否以master状态运行,如果当前主机上的redis-server正在以master状态运行,则将vrrp_instance标记为存活状态,并分配VIP;如果当前主机上的redis-server正在以slave状态运行,则将vrrp_instance标记为错误状态。当某台主机宕机后,其他两台主机上的keepalived会将VIP切换到新的master(当前主机上的redis-server正在以master状态运行)上。
  由于keepalived的VIP切换有延迟(大约40ms),因此上层应用不能过分依赖Redis,例如大规模并发性的短时间内向Redis插入大量数据。
连接图
DSC0000.png

  如图所示,有三台主机,分别标识为Redis1、Redis2、Redis3,它们的角色和配置等信息如下:
主机标识Redis1Redis2Redis3IP地址192.168.1.241192.168.1.242192.168.1.243预设配置redis-server master  keepalived master
redis-server slave  keepalived backup
redis-server slave  keepalived backup
VIP配置步骤:
  步骤概述

  •   安装:安装redis-server、redis-sentinel、keepalived
  •   配置:配置Redis1、Redis2、Redis3,主要是编辑各个服务的配置文件
  •   启动:先启动redis-server、再启动redis-sentinel、最后自动keepalived
  •   验证:模拟一台主机宕机,主机网络中断,redis-server、redis-sentinel、keepalived三个服务任何一个发生故障的情况。
  (1)设定主机名(建议设定为fqdn格式)、同步时间、更改文件描述符最大打开数量、更改内核参数、配置编译环境、配置防火墙在此就不赘述了。
  (2)安装redis-server和redis-sentinel
  Redis的安装由于只是bin二进制可执行文件和data目录比较重要,因此简化安装如下
# http://download.redis.io/redis-stable.tar.gz  
wget -c http://download.redis.io/releases/redis-3.0.7.tar.gz
  
tar zxf redis-3.0.7.tar.gz
  
cd redis-3.0.7
  
make
  
cd
  
\cp redis-3.0.7/src/redis-benchmark /usr/local/sbin/
  
\cp redis-3.0.7/src/redis-check-aof /usr/local/sbin/
  
\cp redis-3.0.7/src/redis-check-dump /usr/local/sbin/
  
\cp redis-3.0.7/src/redis-cli /usr/local/sbin/
  
\cp redis-3.0.7/src/redis-sentinel /usr/local/sbin/
  
\cp redis-3.0.7/src/redis-server /usr/local/sbin/
  
mkdir /etc/redis
  
mkdir -p /data/redis-6379/
  (3)安装keepalived
# http://www.keepalived.org/documentation.html  
wget -c http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
  
tar zxf keepalived-1.2.19.tar.gz
  
cd keepalived-1.2.19
  
./configure --prefix=/usr/local/keepalived
  
make
  
make install
  
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
  
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
  
mkdir /etc/keepalived
  keepalived的配置文件在后面添加
  (4)Redis1上的redis-sentinel配置文件
cat >/etc/redis/sentinel.conf  概念参考:http://redis-cookbook.readthedocs.org/en/latest/z.html
  自增唯一id最常见的应用就是作为关系型数据库的主键,因为主键必须确保每个数据项都有唯一id。
  它也可以在不支持自增唯一id的数据库中(比如MongoDB)用来替代唯一id(uniqueidentifier,通常是一个哈希值)
  它也可以为用户提供更好的URL:比如将/topic/4e491e229f328b0cd900010d修改为/topic/10086。
  一个自增唯一id对象最重要的是保证值的唯一性,要做到这一点,自增id的自增incr操作必须是一个原子操作,它应该能在一个原子时间内完成以下两件事:
  增加id值,返回当前id值,并且它也没有减法decr和清零reset等操作,因为这些操作破坏了唯一性。
  get操作一般只用于内部检查,比如观察值是否溢出,但在一般情况下,自增唯一id对象应该只有一个incr操作。
  先测试一下主机健康状态下的自增唯一id
DSC0001.png

  发现各个redis-server中的自增唯一id是好用的。再测试一下某台主机故障状态下的自增唯一id。先根据ip addr找到VIP的主机位置,或者通过redis-cli info查看role找到redis-server master的主机,然后kill redis-server pid,再进行测试。
DSC0002.png

DSC0003.png

  由此发现redis-server中的自增唯一id仍然是好用的。
故障切换的步骤
  如果一台主机宕机,则主机启动后,先启动redis-server、再启动redis-sentinel、最后自动keepalived。
  如果多台主机宕机,则按照一台主机宕机的步骤做同样处理。
  如果一台主机的中的某台服务停止,则直接启动该服务即可。
参考
  Redis Documention http://redis.io/documentation
  Redis High Availability http://redis.io/topics/sentinel
  Redis Replication http://redis.io/topics/replication
  后续
  由于keepalived的应用场景有限,比如它的核心协议VRRP只能工作在局域网内,不能工作在局域网外(网间、广域网),而且在网络不受自己控制时基本不能用,除非设定好的VIP是供局域网使用。因此特别是在云计算环境中,使用云主机(例如阿里云ECS等)就不能用keepalived,因此只能寻找一个可替代keepalived的解决方案来替代它。Consul作为服务注册、服务发现的最佳选择,无疑可以很好的替代keepalived。第二种方案可以参考这篇文章《利用redis-sentinel+consul实现redis高可用》。
  tag:Redis集群,Redis高可用,redis-sentinel,keepalived配置,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-631140-1-1.html 上篇帖子: 使用Codis来部署Redis集群 下篇帖子: Infinispan 8 中新的 Redis 缓存存储实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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