[转帖]Redis高可用集群

redis,可用,集群 · 浏览次数 : 0

小编点评

**配置文件:client-reconfig.sh** ``` #!/bin/sh #节点都搞成nutcrackersentinel client-reconfig-script nutcracker /usr/local/redis-4.0.6/client-reconfig.sh # 查看当前twemproxy服务下配置nutcracker.yml lpha: listen: 0.0.0.0:22121 # hash: fnv1a_64 # distribution: ketama # auto_eject_hosts: true # redis: true # server_retry_timeout: 2000 # server_failure_limit: 1 # kill 掉nutcracker 进程 ,并重新启动killall nutcracker${twemproxy_cmd} # sleep 1ps -ef |grep \"${twemproxy_cmd}\" |grep -v grep # 测试 再次断掉其中一个哨兵集群的主节点,你会发现哨兵进程打印了如下通知信息: # 查看twemproxy配置文件,你发现文件中master节点已经变了 lpha: listen: 0.0.0.0:22121 hash: fnv1a_64 distribution: ketama auto_eject_hosts: true redis: true server_retry_timeout: 2000 server_failure_limit: 1 #说明已经在通知twemproxy已经重新选举了,更新了主节点ip和端口,达到了故障转移的效果! ```

正文

目录

 

1、 前言

2、初识TwemProxy

2.1 什么是TwemProxy

2.2 安装TwemProxy

2.3 配置TwemProxy

2.4 测试TwemProxy

3、初识Keepalived

3.1 什么Keepalived

3.2 安装keepalive

3.3 配置keepalive启动测试

3.4 启动测试

4 、高可用多哨兵集群

4.1 哨兵监控脚本配置

4.2 哨兵集群启动


 

1、 前言

本章节我们使用:Sentinel+Twemproxy+Keepalive+Redis搭建高可用集群

我们通过之前的学习发现了一个问题,哨兵模式虽然可以自动选举,但是选举的过程中会出现服务短暂不可用的问题,随意我们就在想,能不能使用通过多个集群的方式来实现负载均衡和故障转移呢?答案是可以的!

各元素职责:

Redis:缓存服务器

Sentinel:主要作用于redis的主从复制集群的master故障后从新选举新的master

Twemproxy:redis的负载均衡代理服务器,主要对redis的多主从复制集群进行负载均衡和数据分片

Keepalive:主要作用是对twemproxy进行容灾,实现twemproxy的高可用

矩阵图如下

名称192.168.223.128192.168.223.129192.168.223.130192.168.223.131192.168.223.132192.168.223.133
keepalived11     
keepalived2   1  
twemproxy11     
twemproxy2   1  
哨兵进程11     
哨兵进程2   1  
master11     
slave1-1 1    
slave1-2  1   
master2   1  
slave2-1    1 
slave2-2     1

架构图:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

2、初识TwemProxy

2.1 什么是TwemProxy

Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题。虽然使用Twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。不熟悉twemproxy的同学,如果玩过nginx反向代理或者mysql proxy,那么你肯定也懂twemproxy了。其实twemproxy不光实现了redis协议,还实现了memcached协议,什么意思?换句话说,twemproxy不光可以代理redis,还可以代理memcached

最简单的TwemProxy架构:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

复杂的TwemProxy架构:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

上面的架构通常只有一台Twemproxy在工作,另外一台处于备机,当一台挂掉以后,vip自动漂移,备机接替工作

2.2 安装TwemProxy

安装Twemproxy,安装之前先安装或者升级 autoconf版本(具体版本自己看着办) ;

  1. 查询当前版本
  2. rpm -qf /usr/bin/autoconf
  3. 卸载当前版本
  4. rpm -e --nodeps autoconf-2.64  
  5. 下载新版本
  6. wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.gz
  7. 解压安装
  8. tar zxvf autoconf-2.65.tar.gz
  9. cd autoconf-2.65
  10. ./configure --prefix=/usr
  11. make && make install
  12. 查看是否安装成功
  13. /usr/bin/autoconf -V
  1. #安装twemproxy
  2. #1.下载安装包
  3. git clone https://github.com/twitter/twemproxy.git
  4. cd twemproxy/
  5. CFLAGS="-ggdb3 -O0" autoreconf -fvi && ./configure --prefix=/usr/local/twemproxy --enable-debug=log
  6. #PS:如果最后一步报错如下,说明要先安装automake
  7. #Can't exec "aclocal": No such file or directory at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
  8. # autoreconf: failed to run aclocal: No such file or directory
  9. yum install automake
  10. #如果报错如下:
  11. #configure.ac:16: error: Autoconf version 2.65 or higher is required
  12. #请按照要求安装对应的autoconf版本
  13. #如果报错如下:
  14. configure.ac:36: error: possibly undefined macro: AC_PROG_LIBTOOL
  15.     If this token and others are legitimate, please use m4_pattern_allow.
  16.     See the Autoconf documentation.
  17.      
  18. #安装升级libtool
  19. yum install libtool -y
  20. #然后继续执行:
  21. CFLAGS="-ggdb3 -O0" autoreconf -fvi && ./configure --prefix=/usr/local/twemproxy --enable-debug=log
  22. #安装bin目录,如果你高兴,也可以直接使用src目录下的
  23. make & make test & make install

2.3 配置TwemProxy

  1. #编辑nutcracker.yml,设置哨兵进程信息
  2. vim /usr/local/twemproxy/sbin/nutcracker.yml
  3. alpha:
  4.  #twemproxy对外监听端口
  5. listen: 0.0.0.0:22121
  6.  #hash算法,有兴趣的自行百度研究,一般默认即可
  7. hash: fnv1a_64
  8.  #存在ketama一致性hash、modula直接取hash值和random3(跟hash无关,随机选择一个服务器),有兴趣的可以自行百度研究,一般默认即可
  9. distribution: ketama
  10.  #控制twemproxy是否应该根据server的连接状态重建群集。这个连接状态是由server_failure_limit 阀值来控制
  11. auto_eject_hosts: true
  12.  #识别到服务器的通讯协议是redis还是memcached
  13. redis: true
  14.  #单位是毫秒,控制服务器连接的时间间隔,在auto_eject_host被设置为true的时候产生作用
  15. server_retry_timeout: 2000
  16.  #控制连接服务器的次数,在auto_eject_host被设置为true的时候产生作用
  17. server_failure_limit: 1
  18.  #可以使用redis单机也可以使用哨兵主节点,我们先使用redis单机进行数据分片和负载均衡;最后的两个1标识权重
  19. servers:
  20.   - 192.168.223.128:6379:1
  21.   - 192.168.223.131:6379:1
  22. #启动:
  23. cd /usr/local/twemproxy/sbin/
  24. #调试启动
  25. ./nutcracker -c nutcracker.yml
  26. #以守护进程启动
  27. ./nutcracker -d -c nutcracker.yml

2.4 测试TwemProxy

1)、先启动 192.168.223.128:6379;192.168.223.131:6379 两台redis服务

2)、启动TwemProxy,命令如上所述

3)、使用redis客户端连接TwemProxy代理:

  1. #客户端登录,-h为twemproxy主机IP,-p为twemproxy主机port
  2. [root@ydt1 redis-4.0.6]# ./bin/redis-cli -h 192.168.223.128 -p 22121
  3. 127.0.0.1:22121> get a
  4. (nil)
  5. 127.0.0.1:22121> set name laohu
  6. OK
  7. 127.0.0.1:22121> get name
  8. "laohu"
  9. 127.0.0.1:22121> set age 18
  10. OK
  11. 127.0.0.1:22121> set length 20
  12. OK
  13. 127.0.0.1:22121> set sex boy
  14. OK
  15. 127.0.0.1:22121> get sex
  16. "boy"

大家分别登录启动的两台redis服务,可以看到数据均匀分布!

3、初识Keepalived

3.1 什么Keepalived

Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用,当然还可以用于其他场合。

Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。 VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议, VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个)

而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生, MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。

3.2 安装keepalive

  1. #下载安装基础依赖包
  2. yum install gcc
  3. yum -y install openssl-devel
  4. yum -y install libnl libnl-devel
  5. yum -y install libnfnetlink-devel
  6. yum -y install net-tools
  7. #方法一:
  8. yum -y install keepalived(如果你本地安装了mysql,可能会有环境冲突)
  9. #方法二:
  10. cd /usr/local
  11. wget http://www.keepalived.org/software/keepalived-2.0.19.tar.gz
  12. #解压文件
  13. tar -zxvf keepalived-2.0.19.tar.gz
  14. #编译
  15. cd keepalived-2.0.19/
  16. #--prefix 指定安装地址
  17. #/usr/local/keepalived/ 安装的目录,不要和解压文件一个目录,不然可能报错
  18. ./configure --prefix=/usr/local/keepalived/
  19. #编译并安装
  20. make && make install
  21. #运行前配置(加载到系统服务)
  22. cp /usr/local/keepalived-2.0.19/keepalived/etc/init.d/keepalived /etc/init.d/
  23. mkdir /etc/keepalived
  24. cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  25. cp /usr/local/keepalived-2.0.19/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  26. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
  27. #启动keepalive命令(后面配置好了再开)
  28. service keepalived start
  29. # 配置开机自启动(不建议开启)
  30. systemctl enable keepalived
  31. #查看服务启动情况
  32. ps -aux |grep keepalived

3.3 配置keepalive启动测试

1)、准备两台TwemProxy:192.168.223.128,192.168.223.131,配置跟之前一样,分别启动

2)、配置两台Keepalived服务,我们也姑且配置在192.168.223.128,192.168.223.131上:

192.168.223.128配置

  1. vim /etc/keepalived/keepalived.conf
  2. #就加入如下配置即可,其他的可以不要
  3. ----------------------------------------------------------
  4. ! Configuration File for keepalived
  5. global_defs {
  6.   #不与其他漂移节点重名即可,如果是漂移的同一个虚拟IP,需要保持一致
  7.   router_id redis_twemproxy
  8. }
  9. vrrp_instance TWEMPROXY {
  10.   state BACKUP        #两台都使用BACKUP,具体根据priority值来判断即可
  11.   interface eth0      #指定虚拟ip的网卡接口
  12.   virtual_router_id 55    #路由器标识,MASTER和BACKUP必须是一致的
  13.   priority 100            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
  14.   virtual_ipaddress {
  15.        192.168.223.136
  16.   }
  17. }
  18. #虚拟服务器信息,对外端口6379
  19. virtual_server 192.168.223.136 6379 {
  20.   delay_loop 3
  21.   lb_algo rr
  22.   lb_kind NAT
  23.   persistence_timeout 50
  24.   protocol TCP
  25. #真实服务器
  26.   real_server 192.168.223.128 22121 {
  27.       TCP_CHECK{
  28.           connect_timeout 3
  29.           retry 3
  30.           delay_before_retry 3
  31.       }
  32.   }
  33. }

192.168.223.131配置:

  1. vim /etc/keepalived/keepalived.conf
  2. #就加入如下配置即可,其他的可以不要
  3. ----------------------------------------------------------
  4. ! Configuration File for keepalived
  5. global_defs {
  6.   #不与其他漂移节点重名即可,如果是漂移的同一个虚拟IP,需要保持一致
  7.   router_id redis_twemproxy
  8. }
  9. vrrp_instance TWEMPROXY {
  10.   state BACKUP        #两台都使用BACKUP,具体根据priority值来判断即可
  11.   interface eth0      #指定虚拟ip的网卡接口
  12.   virtual_router_id 55    #路由器标识,MASTER和BACKUP必须是一致的
  13.   priority 99            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
  14.   virtual_ipaddress {
  15.        192.168.223.136
  16.   }
  17. }
  18. #虚拟服务器信息,对外端口6379
  19. virtual_server 192.168.223.136 6379 {
  20.   delay_loop 3
  21.   lb_algo rr
  22.   lb_kind NAT
  23.   persistence_timeout 50
  24.   protocol TCP
  25. #真实服务器
  26.   real_server 192.168.223.131 22121 {
  27.       TCP_CHECK{
  28.           connect_timeout 3
  29.           retry 3
  30.           delay_before_retry 3
  31.       }
  32.   }
  33. }
  1. ! Configuration File for keepalived
  2. global_defs {
  3.   router_id redis_twemproxy
  4. }
  5. vrrp_script chk_nutcraker {
  6.   script "</dev/tcp/127.0.0.1/22121" #监测nutcraker是否正常
  7.   interval 2
  8. }
  9. vrrp_instance TWEMPROXY {
  10.   state BACKUP
  11.   interface eth0
  12.   virtual_router_id 51
  13.   priority 88
  14.   track_script {
  15.       chk_nutcraker
  16.   }
  17.   virtual_ipaddress {
  18.       192.168.223.136
  19.   }
  20. }

 

3.4 启动测试

  1. #1、先启动 192.168.223.128:6379;192.168.223.131:6379 两台redis服务
  2. #2、启动两台TwemProxy 192.168.223.128:22121;192.168.223.131:22121
  3. #3、启动两台keepalived 192.168.223.128;192.168.223.131 漂移出来的VIP为:192.168.223.136:6379
  4. service keepalived start
  5. #4、开启虚拟IP及redis端口
  6. iptables -t nat -A PREROUTING -p tcp -d 192.168.223.136 --dport 6379 -j REDIRECT

现在你可以使用192.168.223.136:6379来进行redis访问!

4 、高可用多哨兵集群

4.1 哨兵监控脚本配置

其实我们抱着美好的愿望,希望twemproxy能够监听到我们哨兵集群的结构变化,很可惜,暂时还不支持!所以我们需要在redis目录新增如下脚本配置文件,用来通知twemproxy集群结构有变化!让其自动更新master节点并且重启负载均衡服务!----所以我们哨兵进程和twemproxy必须在同一个主机上!

vim /usr/local/redis-4.0.6/client-reconfig.sh (128,131节点都需要配置)

  1. #!/bin/sh
  2. ##sentinel 触发执行此脚本时,会默认传递几个参数过来
  3. #<master-name>|<role>|<state>|<from-ip>|<from-port>|<to-ip>|<to-port> ,如下:
  4. # nutcracker|observer|start|t192.168.223.128|6379|192.168.223.129|6379
  5. monitor_name="$1"   ##monitor master-group-name
  6. master_old_ip="$4"
  7. master_old_port="$5"
  8. master_new_ip="$6"
  9. master_new_port="$7"
  10. twemproxy_name=$(echo $monitor_name |awk -F'_' '{print $1"_"$2}')   ##注意
  11. ## 记住一个地方 master-group-name ,我这边的命名规则编辑nutcracker , 这里我就是为了获取编辑nutcracker , 因为twemproxy 的配置文件名用的是nutcracker.yml## 这里通过获取 master-group-name 来修改 twemproxy 的配置文件,这里定的一点规范而已
  12. twemproxy_bin="/usr/local/twemproxy/src/nutcracker"
  13. twemproxy_conf="/usr/local/twemproxy/conf/${twemproxy_name}.yml"
  14. twemproxy_cmd="${twemproxy_bin} -d -c ${twemproxy_conf}"
  15. ## 将新的master 端口和ip 替换掉 twemproxy 配置文件中旧的master 信息
  16. sed -i "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" ${twemproxy_conf}
  17. ## kill 掉nutcracker 进程 ,并重新启动
  18. killall nutcracker
  19. ${twemproxy_cmd}
  20. sleep 1
  21. ps -ef |grep "${twemproxy_cmd}" |grep -v grep

将监控脚本配置到sentinel.conf文件中:

  1. #节点都搞成nutcracker
  2. sentinel client-reconfig-script nutcracker /usr/local/redis-4.0.6/client-reconfig.sh

查看当前twemproxy服务下配置nutcracker.yml

  1. lpha:
  2. listen: 0.0.0.0:22121
  3. hash: fnv1a_64
  4. distribution: ketama
  5. auto_eject_hosts: true
  6. redis: true
  7. server_retry_timeout: 2000
  8. server_failure_limit: 1
  9.  #两个哨兵集群主节点
  10. servers:
  11.   - 192.168.223.128:6379:1
  12.   - 192.168.223.131:6379:1

4.2 哨兵集群启动

  1. #把两个主从复制所有的redis服务跑起来(六台),slaveof ip port配置略!
  2. ./bin/redis-server redis.conf
  3. #再启动128,131哨兵进程,哨兵启动需要使用redis-sentinel启动脚本启动
  4. ./bin/redis-sentinel sentinel.conf

参考以上矩阵图以及前面课件中哨兵集群的搭建:

 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

4.3 测试

再次断掉其中一个哨兵集群的主节点,你会发现哨兵进程打印了如下通知信息:

20210203235024950.png

查看twemproxy配置文件,你发现文件中master节点已经变了

  1. lpha:
  2. listen: 0.0.0.0:22121
  3. hash: fnv1a_64
  4. distribution: ketama
  5. auto_eject_hosts: true
  6. redis: true
  7. server_retry_timeout: 2000
  8. server_failure_limit: 1
  9.  #两个哨兵集群主节点
  10. servers:
  11.   - 192.168.223.129:6379:1
  12.   - 192.168.223.131:6379:1

#说明已经在通知twemproxy已经重新选举了,更新了主节点ip和端口,达到了故障转移的效果!

 

 

 

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览89043 人正在系统学习中

与[转帖]Redis高可用集群相似的内容:

[转帖]Redis高可用集群

目录 1、 前言 2、初识TwemProxy 2.1 什么是TwemProxy 2.2 安装TwemProxy 2.3 配置TwemProxy 2.4 测试TwemProxy 3、初识Keepalived 3.1 什么Keepalived 3.2 安装keepalive 3.3 配置keepaliv

[转帖]一致性哈希 和 Redis 集群分槽

前言 伴随着系统流量的增大,出现了应用集群。在 Redis 中为了保证 Redis 的高可用也为 Redis 搭建了集群对数据进行分槽存放。在 Mysql数据库要存储的量达到一个很高的地步的时候,我们会对数据库进行分库分表操作。OK,到这儿先假设我们不知道什么是集群、什么是分库分表,我们先来看一个数

[转帖]Redis的高并发及高可用,到底该如何保证?

https://zhuanlan.zhihu.com/p/404481762 一、redis如何通过读写分享来承载读请求QPS超过10万+ 1、redis高并发跟整个系统的高并发之间的关系 redis,你要搞高并发的话,不可避免,要把底层的缓存搞得很好 mysql,高并发,做到了,那么也是通过一系列

[转帖]redis主从+keepalived实现高可用技术(转)

https://www.jianshu.com/p/78f6dc30af7d redis主从+keepalived实现高可用技术keepalive+redis 主从高可用 Redis是我们当下比较流行使用的非关系数据库,可支持多样化的数据类型,多线程高并发支持,redis运行在内存拥有更快的读写。因

[转帖]Redis 7.0 三节点哨兵(Sentinel)高可用 环境搭建手册

2022-06-17 16:253480原创Redis 本文链接:https://www.cndba.cn/dave/article/108088 1 哨兵高可用架构说明 Redis 最早的高可用方案是主从复制,但这种方案存在一个问题,就是当主库宕机后,从库不会自动切成主库,需要人工干预。 所有在主

[转帖]删除数据后的Redis内存占用率为什么还是很高?

https://zhuanlan.zhihu.com/p/490569316 有时候Redis明明做了数据删除,数据量已经不大了,但是使用top命令的时候,还会发现Redis占用了很多内存? PS:关于 Redis的高并发及高可用,到底该如何保证?可以参考下这个帖子:httss://http://z

[转帖]Redis 可以禁用的高危命令

https://cloud.tencent.com/developer/article/2064127 高危命令禁用 redis一款高并发的内存K-V数据库,提供了好多命令,但是其中有部分对于生产环境来说比较危险,需要禁用掉。 keys 命令 keys 命令执行的时候是需要进行全库扫描的,因为red

[转帖]高性能 -Nginx 多进程高并发、低时延、高可靠机制在百万级缓存 (redis、memcache) 代理中间件中的应用

https://xie.infoq.cn/article/2ee961483c66a146709e7e861 关于作者 前滴滴出行技术专家,现任 OPPO 文档数据库 mongodb 负责人,负责 oppo 千万级峰值 TPS/十万亿级数据量文档数据库 mongodb 内核研发及运维工作,一直专注于

[转帖]Redis连接未释放,造成TCP连接数过多

https://segmentfault.com/a/1190000022704886 早上看到服务器告警通知,TCP连接数比较高,达到5000多,我设置的阈值是5000,正常TCP连接不会这么高,这样的一个阈值我可以提前知道有问题早点解决,不至于后面引起一系列问题,甚至拖垮服务器。 排查 登陆服务

[转帖]Redis学习四(运维指南).

阅读目录 一、上线规划 二、常见运维操作 三、测试方法 回到顶部 一、上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性。 redis 的运行机器 CPU 不求核数多,但求主频高,Cache大,因为 redis