Redis哨兵集群工作原理及架构部署#yyds干货盘点#

不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述Redis哨兵集群工作原理及架构部署#yyds干货盘点#相关的知识,希望能为你提供帮助。
Redis哨兵集群工作原理及架构部署@[TOC]
1.redis哨兵模式原理redis主从复制的不足: 当主库宕机后,slave无法自己变成主库,进行数据的写入,每次都需要人为配置将从库变为主库才能进行数据写入,当主库修复后还需要人为配置导入从库主机在配置主从复制
redis哨兵模式的优势: redis哨兵建立在主从之上,有一个监控功能,监控主库是否异常,当主库异常之后会自动将某一个slave变为主库,省掉了人为配置
redis哨兵模式原理: 哨兵模式建立在主从复制基础之上,会在每一个redis节点上打开一个sentinel监控,每个sentinel进程都有自己的端口号和IP,所有sentinel共享集群信息,集群中所有的sentinel都是可以通信的,当主库宕机后,主库上的sentinel就会向集群中的其他节点的sentinel发送信息说主库宕机了,需要在从库上选举master,这时每个节点上的sentinel会比较自己redis配置的ID号,比如slave1的ID号大,slave1就会选举为master作为主库,当故障的主库重新加入集群后,主库上的sentinel会向其他节点的sentinel询问谁是主库,这时slave1上的sentinel就会告诉主库上的sentinel说slave1是主库,重新加入集群的主库就会找slave1同步数据,如果重新加入的主库想再次成为主库,只需要执行提权命令就可以重新成为主库。
主从复制的时候程序配置redis地址的时候都是写死主库的地址,每次主库宕机都需要手动修改应用
有了哨兵模式后,在程序代码中配置不是redis地址,而是配置的所有哨兵的地址,形成一个地址池,即使集群中一个哨兵坏掉了,还有其他两个哨兵,每次需要找redis写入数据时,程序首先会找哨兵进程,哨兵之间信息共享,会立马告诉程序谁是主库,这时程序拿到哨兵告诉它的redis主库地址,就会去找主库存数据,因此即使主库坏了,也不需要修改程序代码
哨兵的配置文件在启动哨兵服务后,尽量不要去修改,因为哨兵会自动增加配置
哨兵集群个数建议是奇数,比如3/5/7
配置了哨兵后,当主库挂掉,哨兵选举了新库,会自动把配置文件修改为最新主库的地址
哨兵的选举规则: 首选判断slave-priority权重优先级,谁的高谁当选为master主库,如果都一致,那么久比较各个节点的id,谁的大谁当选
哨兵模式架构和主从复制架构对比

Redis哨兵集群工作原理及架构部署#yyds干货盘点#

文章图片

2.搭建redis哨兵集群 2.1.环境准备
IP 服务
192.168.81.210 redis+sentinel+master
192.168.81.220 redis+sentinel+slave
192.168.81.230 redis+sentinel+slave
配置哨兵集群步骤:
?1.在所有节点搭建redis
?2.配置主从复制,一主两从
?3.在所有节点配置sentinel,启动sentinel后,配置文件会自动增加
2.2.在所有机器上部署redis
192.168.81.210配置
1.创建redis部署路径 [root@redis-1 ~]# mkdir -p /data/redis_cluster/redis_6379/conf,pid,logs,data2.下载redis [root@redis-1 ~]# mkdir /data/soft [root@redis-1 ~]# cd /data/soft [root@redis-1 /data/soft]# wget https://repo.huaweicloud.com/redis/redis-3.2.9.tar.gz3.便于安装redis [root@redis-1 /data/soft]# tar xf redis-3.2.9.tar.gz -C /data/redis_cluster/ [root@redis-1 /data/soft]# cd /data/redis_cluster/ [root@redis-1 /data/redis_cluster]# ln -s redis-3.2.9/ redis [root@redis-1 /data/redis_cluster]# cd redis/src [root@redis-1 /data/redis_cluster/redis]# make & & make install4.准备配置文件 [root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf daemonize yes bind 192.168.81.210 127.0.0.1 port 6379 pidfile /data/redis_cluster/redis_6379/pid/redis_6379.pid logfile /data/redis_cluster/redis_6379/logs/redis_6379.log databases 16 dbfilename redis_6379.rdb dir /data/redis_cluster/redis_6379/data/ save 900 1 save 300 100 save 60 100005.启动redis [root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf

192.168.81.220配置
由于redis-1已经部署好了一套redis,我们可以直接复制过来使用
1.使用rsync将redis-1的redis目录拷贝过来你 [root@redis-1 ~]# rsync -avz /data root@192.168.81.220:/2.查看拷贝过来的目录文件 [root@redis-2 ~]# ls/data/redis_cluster/ redisredis-3.2.9redis_6379 [root@redis-2 ~]# ls/data/redis_cluster/redis_6379/ confdatalogspid3.编译安装redis,使系统能使用redis命令 直接执行make install即可,因为编译步骤在redis-1已经做了 [root@redis-2 ~]# cd /data/redis_cluster/redis-3.2.9/ [root@redis-2 /data/redis_cluster/redis-3.2.9]# make install4.修改redis配置文件 [root@redis-2 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf bind 192.168.81.220 127.0.0.15.启动redis [root@redis-2 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf

192.168.81.230配置
由于redis-1已经部署好了一套redis,我们可以直接复制过来使用
1.使用rsync将redis-1的redis目录拷贝过来你 [root@redis-1 ~]# rsync -avz /data root@192.168.81.230:/2.查看拷贝过来的目录文件 [root@redis-3 ~]# ls/data/redis_cluster/ redisredis-3.2.9redis_6379 [root@redis-3 ~]# ls/data/redis_cluster/redis_6379/ confdatalogspid3.编译安装redis,使系统能使用redis命令 直接执行make install即可,因为编译步骤在redis-1已经做了 [root@redis-3 ~]# cd /data/redis_cluster/redis-3.2.9/ [root@redis-3 /data/redis_cluster/redis-3.2.9]# make install4.修改redis配置文件 [root@redis-3 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf bind 192.168.81.230 127.0.0.15.启动redis [root@redis-3 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf

2.3.三台redis部署完成
[root@redis-1 ~]# ps aux | grep redis root218600.10.5 1390209740 ?Ssl09:360:16 redis-server 192.168.81.210:6379 root252960.00.0 112724984 pts/0S+13:150:00 grep --color=auto redis[root@redis-1 ~]# ssh 192.168.81.220 "ps aux | grep redis" root476580.10.5 141068 10780 ?Ssl1月281:24 redis-server 192.168.81.220:6379 root632540.00.0 1131761588 ?Ss13:150:00 bash -c ps aux | grep redis root632710.00.0 112724968 ?S13:150:00 grep redis[root@redis-1 ~]# ssh 192.168.81.230 "ps aux | grep redis" root565840.10.7 1369727548 ?Ssl13:130:00 redis-server 192.168.81.230:6379 root566440.00.1 1131761588 ?Ss13:150:00 bash -c ps aux | grep redis root566610.00.0 112724968 ?S13:150:00 grep redis

2.4.配置redis主从
要在两台slave上同步主库配置
1.配置主从复制 [root@redis-2 ~]# redis-cli 127.0.0.1:6379> SLAVEOF 192.168.81.210 6379 OK[root@redis-3 ~]# redis-cli 127.0.0.1:6379> SLAVEOF 192.168.81.220 6379 OK2.主库新建一个key 127.0.0.1:6379> set name jiangxl OK3.从库查看是否复制 [root@redis-2 ~]# redis-cli 127.0.0.1:6379> get name "jiangxl" [root@redis-3 ~]# redis-cli 127.0.0.1:6379> get name "jiangxl"

2.5.部署哨兵进程sentinel
配置文件解释
sentinel monitor mymaster 192.168.81.210 6379 2//设置主节点信息,mymaster是主节点别名,就是随便起一个名字,然后填写主节点的ip地址,2表示当主节点挂掉后,有2个sentinel同意后才会选举新的master,一组哨兵集群,要把名称都写成一样的sentinel down-after-milliseconds mymaster 3000//主库宕机多少秒,从库在进行切换,因为有时因为网络波动,如果只要主库一宕机就切换主从,那么redis可能一直处于正在切换状态 sentinel parallel-syncs mymaster 1//允许几个节点同时向主库同步数据 sentinel failover-timeout mymaster 18000//故障转移超时时间,当从库同步主库的rdb文件,多长时间没有同步完就认为超时

三台redis服务器都要按如下配置,已经将配置文件中的bind写成了系统变量,在配合cat写入到文件,因此直接执行如下命令即可
1.创建哨兵服务配置路径 mkdir -p /data/redis_cluster/redis_26379/conf,data,pid,logs 2.写入哨兵配置文件 cat > /data/redis_cluster/redis_26379/conf/redis_26379.conf < < EOF bind $(ifconfig | awk NR==2print $2) port 26379 daemonize yes logfile /data/redis_cluster/redis_26379/logs/redis_26379.log dir /data/redis_cluster/redis_26379/data sentinel monitor mymaster 192.168.81.210 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 18000 EOF

配置完记得查看下配置文件bind一列是否是各自主机的ip地址
Redis哨兵集群工作原理及架构部署#yyds干货盘点#

文章图片

2.6.启动哨兵观察配置文件的变化
三台机器都这么操作启动哨兵
redis-sentinel /data/redis_cluster/redis_26379/conf/redis_26379.conf

观察哨兵启动前后配置文件的变化
启动前
Redis哨兵集群工作原理及架构部署#yyds干货盘点#

文章图片

启动后
Redis哨兵集群工作原理及架构部署#yyds干货盘点#

文章图片

每台哨兵主机都自动增加了一个myid的配置,这个就是当主库挂掉后,哨兵选举的依据,判断谁的myid大谁就当选为主库
每台哨兵主机还自动增加了sentinel known-sentinel这个配置,这个配置每个哨兵会记录集群中其他节点的id号,这样就能够实现信息共享,即使应用在询问哨兵进程谁是主库,这时由于每个哨兵进程都有其他节点的信息,因此就能里面告诉应用谁是主库
Redis哨兵集群工作原理及架构部署#yyds干货盘点#

文章图片

2.7.模拟主库故障验证应用是否可用
配置完哨兵后,每个节点上都有集群的信息共享,当主库挂掉后,哨兵进程确认主库下线了,哨兵根据各自的id大小选举新的主库,接替主库的工作,保证应用程序不受影响,当主库修复好后,在通过提权的方式先同步目前主库的数据,在让自身成为主库
1.关闭主库的redis服务,reids正常关闭,sentinel直接kill [root@redis-1 ~]# redis-cli shutdown [root@redis-1 ~]# pkill redis4.查看配置文件看看谁的myid大 redis-2的myid比较大 [root@redis-1 ~]# grep known-sentinel /data/redis_cluster/redis_26379/conf/redis_26379.conf sentinel known-sentinel mymaster 192.168.81.220 26379 df44bb3e9fdf8c635628b1ae724b2db7d3ef144c sentinel known-sentinel mymaster 192.168.81.230 26379 de282d14bb0a79df90603eb92243cd1f362dd46d2.测试redis-2是否可用写入数据 可以写入数据,redis-2被选为主库 [root@redis-1 ~]# redis-cli -h 192.168.81.220 set gzzy_test guzhangzhuanyi OK [root@redis-1 ~]#redis-cli -h 192.168.81.220 config get slaveof 1) "slaveof" 2) ""4.测试redis-3是否可用写入数据 写入数据失败,并且同步的是redis-2的数据,因此redis-2为主库 [root@redis-1 ~]# redis-cli -h 192.168.81.230 set kkkk111 vvv (error) READONLY You cant write against a read only slave. [root@redis-1 ~]# redis-cli -h 192.168.81.230 config get slaveof 1) "slaveof" 2) "192.168.81.220 6379"

Redis哨兵集群工作原理及架构部署#yyds干货盘点#

文章图片

2.8.主库挂掉其他节点配置文件的变化
主库挂掉后,其他两个节点选举出master后,配置文件也会填写为新master的地址
【Redis哨兵集群工作原理及架构部署#yyds干货盘点#】
Redis哨兵集群工作原理及架构部署#yyds干货盘点#

文章图片


    推荐阅读