Redis之sentinel哨兵集群怎么部署
本文小编为大家详细介绍“Redis之sentinel哨兵集群怎么部署”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis之sentinel哨兵集群怎么部署”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、Redis sentinel哨兵集群概述(1)Redis哨兵概述*Sentinel 哨兵:这是一个分布式系统,该进程是用于监控Redis集群中Master主服务器的工作状态,在Master主服务器发生故障时,可以实现Master和Slave服务器的秒级切换,保证系统有一个Master主服务器,提供了Redis集群的高可用,在Reids2.6.版本时被加入,到2.8版本之后得到了稳定
Redis哨兵和Redis主从的区别:
(2)Redis哨兵的工作机制Redis哨兵:主服务器出现故障后,会有一个从服务器代替主服务器
Redis主从:主服务器出现故障后,从服务器不会做任何事
哨兵只需要部署在master主服务器上即可
工作进程:
监控(Monitoring):哨兵通过流言协议(gossip protocols)会不断检查集群中每一台服务器是否运作正常
提醒(Notification):当哨兵监控的某个redis服务器出现问题时,哨兵可以通过API(应用程序接口)向管理员或者其他应用程序发送通知
(3)哨兵的三个定时监控任务自动故障转移(Automatic failover):在集群中如果有一个Master主服务器出现故障时,哨兵会通过投票协议(Agreement Protocols)开始一次自动故障迁移操作,他会选择一台数据较完整的Slave从服务器升级为主服务器,当客户端试图连接失效的Master主服务器时,集群也会向客户端返回新的Master主服务器的地址,使得集群可以使用现在的Master替换掉失效的Master。
Master和Slave切换后,Master的redis主配置文件、Slave的redis主配置文件和哨兵的配置文件的内容都会发生相应的改变,即原来的Master的redis主配置文件会多一行Slave服务器的配置,之后哨兵的监控目标就会改变到现在的Master主服务器上
每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取Redis数据节点的信息
作用:
通过向主节点执行info命令,获取从节点的信息,这也是为什么Sentinel节点不需要显式配置监控从节点。当有新的从节点加入时都可以立刻感知出来,当节点不可达或者故障转移后,可以通过info命令实时更新节点拓扑信息。
每隔1秒,每个Sentinel节点会向主节点、从节点、发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达如果主节点挂掉,那么sentinel,就会从剩余的从节点选择一个数据比较完整来做主节点
二、部署Redis哨兵系统(1)实验环境安装步骤相同,主机名、ip不同,下面只写Master配置
[root@Centos7~]#hostnamectlset-hostnamemaster[root@Centos7~]#su[root@master~]#systemctlstopfirewalld[root@master~]#setenforce0setenforce:SELinuxisdisabled[root@master~]#mount/dev/cdrom/mnt/mount:/dev/sr0写保护,将以只读方式挂载mount:/dev/sr0已经挂载或/mnt忙/dev/sr0已经挂载到/mnt上[root@master~]#ll总用量1928-rw-------.1rootroot12641月1218:27anaconda-ks.cfg-rw-r--r--1rootroot19663376月901:16redis-5.0.4.tar.gz[root@master~]#tarxfredis-5.0.4.tar.gz[root@master~]#cdredis-5.0.4[root@masterredis-5.0.4]#make[root@masterredis-5.0.4]#mkdir-p/usr/local/redis[root@masterredis-5.0.4]#cp/root/redis-5.0.4/src/redis-server/usr/local/redis/[root@masterredis-5.0.4]#cp/root/redis-5.0.4/src/redis-cli/usr/local/redis/[root@masterredis-5.0.4]#cp/root/redis-5.0.4/redis.conf/usr/local/redis/[root@masterredis-5.0.4]#vim/usr/local/redis/redis.conf#修改。。。。。。68#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~69bind192.168.100.202#修改为本机地址,如果为127.0.0.1就只能本机访问70。。。。。。87#areexplicitlylistedusingthe"bind"directive.88protected-modeno#关闭redis的保护模式,如果为yes的话其他客户端就无法连接到此服务器89。。。。。。135#NotethatRediswillwriteapidfilein/var/run/redis.pidwhendaemonized.136daemonizeyes#开启redis的后台守护程序,即在redis开启之后是放在后台运行的137。。。。。。262#Notethatyoumustspecifyadirectoryhere,notafilename.263dir/usr/local/redis/rdb264。。。。。。506#507requirepass123123#去掉注释,修改redis的密码为123123508#保存退出[root@slave2redis-5.0.4]#mkdir/usr/local/redis/rdb[root@masterredis-5.0.4]#vim/etc/init.d/redis#!/bin/sh#chkconfig:23458090#description:StartandStopredis#PATH=/usr/local/bin:/sbin:/usr/bin:/binREDISPORT=6379EXEC=/usr/local/redis/redis-serverREDIS_CLI=/usr/local/redis/redis-cliPIDFILE=/var/run/redis_6379.pidCONF="/usr/local/redis/redis.conf"AUTH="123123"LISTEN_IP=$(netstat-utpln|grepredis-server|awk'{print$4}'|awk-F':''{print$1}')case"$1"instart)if[-f$PIDFILE]thenecho"$PIDFILEexists,processisalreadyrunningorcrashed"elseecho"StartingRedisserver..."$EXEC$CONFfiif["$?"="0"]thenecho"Redisisrunning..."fi;;stop)if[!-f$PIDFILE]thenecho"$PIDFILEdoesnotexist,processisnotrunning"elsePID=$(cat$PIDFILE)echo"Stopping..."$REDIS_CLI-h$LISTEN_IP-p$REDISPORT-a$AUTHSHUTDOWNwhile[-x${PIDFILE}]doecho"WaitingforRedistoshutdown..."sleep1doneecho"Redisstopped"fi;;restart|force-reload)${0}stop${0}start;;*)echo"Usage:/etc/init.d/redis{start|stop|restart|force-reload}">&2exit1esac[root@masterredis-5.0.4]#chkconfig--addredis[root@masterredis-5.0.4]#chmod755/etc/init.d/redis[root@masterredis-5.0.4]#ln-s/usr/local/redis/*/usr/local/bin/[root@masterredis-5.0.4]#/etc/init.d/redisstartStartingRedisserver...5233:C09Jun202101:25:53.069#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo5233:C09Jun202101:25:53.069#Redisversion=5.0.4,bits=64,commit=00000000,modified=0,pid=5233,juststarted5233:C09Jun202101:25:53.069#ConfigurationloadedRedisisrunning...[root@masterredis-5.0.4]#netstat-anpt|grep6379tcp00192.168.100.202:63790.0.0.0:*LISTEN5234/redis-server1
-做redis主从
******(1)Master配置[root@masterredis-5.0.4]#vim/usr/local/redis/redis.conf#修改。。。。。。292#293masterauth123123#配置主服务器密码,哨兵有一个问题,就是当主服务器坏掉,切换到从服务器时,原来的主服务器可以正常运行之后,再次加入集群是加不进去的,因为哨兵没有配置主服务器的密码,所以无法连接,所以在使用哨兵集群时,要把每台的主服务器密码都配置上,每台redis的密码最好都一样294。。。。。。456#457min-replicas-to-write1#设置slave服务器的数量,当slave服务器少于这个数量时,Master主服务器会停止接收客户端的一切写请求458min-replicas-max-lag10#设置主服务器和从服务器之间同步数据的超时时间,当超过此时间时,master主服务器会停止客户端的一切写操作,单位为秒459#。。。。。。[root@masterredis-5.0.4]#/etc/init.d/redisrestart#重启redisStopping...Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.RedisstoppedStartingRedisserver...5291:C09Jun202102:04:39.132#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo5291:C09Jun202102:04:39.132#Redisversion=5.0.4,bits=64,commit=00000000,modified=0,pid=5291,juststarted5291:C09Jun202102:04:39.132#ConfigurationloadedRedisisrunning...******(2)Slave1配置[root@slave1redis-5.0.4]#vim/usr/local/redis/redis.conf。。。。。。285#286replicaof192.168.100.2026379#在从服务器上指定主服务器的ip和端口287。。。。。。292#293masterauth123123#指定主服务器上redis的密码294。。。。。。#保存退出[root@slaveredis-5.0.4]#/etc/init.d/redisrestart#重启服务Stopping...Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.RedisstoppedStartingRedisserver...5304:C09Jun202102:11:32.241#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo5304:C09Jun202102:11:32.241#Redisversion=5.0.4,bits=64,commit=00000000,modified=0,pid=5304,juststarted5304:C09Jun202102:11:32.241#ConfigurationloadedRedisisrunning...******(3)Slave2配置[root@slave2redis-5.0.4]#vim/usr/local/redis/redis.conf。。。。。。286replicaof192.168.100.2046379287288#Ifthemasterispasswordprotected(usingthe"requirepass"configuration289#directivebelow)itispossibletotellthereplicatoauthenticatebefore290#startingthereplicationsynchronizationprocess,otherwisethemasterwill291#refusethereplicarequest.292#293masterauth123123294。。。。。。#保存退出[root@slave2redis-5.0.4]#/etc/init.d/redisrestartStopping...Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.RedisstoppedStartingRedisserver...5253:C09Jun202117:50:25.680#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo5253:C09Jun202117:50:25.680#Redisversion=5.0.4,bits=64,commit=00000000,modified=0,pid=5253,juststarted5253:C09Jun202117:50:25.680#ConfigurationloadedRedisisrunning...******(3)验证主从是否成功[root@master~]#redis-cli-h192.168.100.202-a123123Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.192.168.100.202:6379>setaaabbbOK192.168.100.202:6379>setbbbcccOK192.168.100.202:6379>keys*1)"aaa"2)"bbb"[root@slave1~]#redis-cli-h192.168.100.203-a123123Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.192.168.100.203:6379>keys*1)"bbb"2)"aaa"192.168.100.203:6379>settttfff(error)READONLYYoucan'twriteagainstareadonlyreplica.#从服务器无法写入数据[root@slave2redis-5.0.4]#redis-cli-h192.168.100.204-a123123Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.192.168.100.204:6379>keys*1)"aaa"2)"bbb"192.168.100.204:6379>setgggaaa(error)READONLYYoucan'twriteagainstareadonlyreplica.#主从配置完成
-配置哨兵
******(1)在master上配置sentinel哨兵[root@master~]#cpredis-5.0.4/src/redis-sentinel/usr/local/redis/#复制哨兵启动脚本[root@master~]#cpredis-5.0.4/sentinel.conf/usr/local/redis/#复制哨兵配置文件[root@master~]#mkdir-p/var/redis/data#创建日志文件存放位置[root@master~]#vim/usr/local/redis/sentinel.conf#修改哨兵配置文件。。。。。。21port26379#指定端口默认为263792223#BydefaultRedisSentineldoesnotrunasadaemon.Use'yes'ifyouneedit.24#NotethatRediswillwriteapidfilein/var/run/redis-sentinel.pidwhen25#daemonized.26daemonizeyes#yes为放在后台运行,使用no放在前台运行可以看到主从切换时候的信息27。。。。。。64#unmountingfilesystems.65dir/var/redis/data#指定日志存放位置,就是刚才创建的路径66。。。。。。83#ThevalidcharsetisA-z0-9andthethreecharacters".-_".84sentinelmonitormymaster192.168.100.20263791#指定用户为mymaster,ip为202,端口为6379,1表示当有一台master出现故障时,就进行切换8586#sentinela。。。。。。112#Defaultis30seconds.113sentineldown-after-millisecondsmymaster3000#指定master的失效时间,单位为毫秒3000为3秒,表示master超过3秒没响应就判定为故障114。。。。。。145#Defaultis3minutes.146sentinelfailover-timeoutmymaster180000#切换操作完成的超时时间,单位为毫秒180000为180秒,在主从切换超过这个时间就判定为切换失败147148#SCRIPTSEXE。。。。。。102#103sentinelauth-passmymaster123123#连接master和slave的密码104sentinelconfig-epochmymaster1#切换后最多有多少节点可以于新的master进行同步数据105#保存退出[root@master~]#/usr/local/redis/redis-sentinel/usr/local/redis/sentinel.conf#启动哨兵1118:X09Jun202118:09:29.027#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo1118:X09Jun202118:09:29.027#Redisversion=5.0.4,bits=64,commit=00000000,modified=0,pid=1118,juststarted1118:X09Jun202118:09:29.027#Configurationloaded[root@master~]#netstat-anpt|grep26379tcp000.0.0.0:263790.0.0.0:*LISTEN1119/redis-sentineltcp600:::26379:::*LISTEN1119/redis-sentinel[root@master~]#kill-91119#先关闭哨兵[root@master~]#netstat-anpt|grep26379[root@master~]#sed-i'26s/yes/no/g'/usr/local/redis/sentinel.conf#修改为前台启动[root@master~]#/usr/local/redis/redis-sentinel/usr/local/redis/sentinel.conf#再次开启哨兵,稍等一段时间会有提示1129:X09Jun202118:11:02.585#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo1129:X09Jun202118:11:02.585#Redisversion=5.0.4,bits=64,commit=00000000,modified=0,pid=1129,juststarted1129:X09Jun202118:11:02.585#Configurationloaded1129:X09Jun202118:11:02.586*Increasedmaximumnumberofopenfilesto10032(itwasoriginallysetto1024)._.__.-``__''-.__.-```.`_.''-._Redis5.0.4(00000000/0)64bit.-``.-"."\/_.,_''-._(',.-`|`,)Runninginsentinelmode|`-._`-...-`__...-.``-._|'`_.-'|Port:26379|`-._`._/_.-'|PID:1129`-._`-._`-./_.-'_.-'|`-._`-._`-.__.-'_.-'_.-'||`-._`-.__.-'_.-'|http://redis.io`-._`-._`-.__.-'_.-'_.-'|`-._`-._`-.__.-'_.-'_.-'||`-._`-.__.-'_.-'|`-._`-._`-.__.-'_.-'_.-'`-._`-.__.-'_.-'`-.__.-'`-.__.-'1129:X09Jun202118:11:02.586#WARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/somaxconnissettothelowervalueof128.1129:X09Jun202118:11:02.586#SentinelIDisfce7776020cf12792fd239f6f9d34f2d3fdef98c1129:X09Jun202118:11:02.586#+monitormastermymaster192.168.100.2026379quorum11129:X09Jun202118:18:04.434*+rebootslave192.168.100.204:6379192.168.100.2046379@mymaster192.168.100.2026379#看到新增两条消息,从服务器增加了203和204主服务器时2021129:X09Jun202118:18:14.478*+rebootslave192.168.100.203:6379192.168.100.2036379@mymaster192.168.100.2026379#哨兵配置完成
-测试哨兵的故障切换
******(1)把master服务器在开启一个终端,在新开启的终端中关闭redis,测试是否可以主从切换[root@master~]#/etc/init.d/redisstopStopping...Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.Redisstopped******(2)切换到开启哨兵的终端,查看新弹出的信息1129:X09Jun202118:20:36.588#+failover-endmastermymaster192.168.100.20263791129:X09Jun202118:20:36.588#+switch-mastermymaster192.168.100.2026379192.168.100.20363791129:X09Jun202118:20:36.588*+slaveslave192.168.100.204:6379192.168.100.2046379@mymaster192.168.100.2036379#发现主服务器变成了2031129:X09Jun202118:20:36.588*+slaveslave192.168.100.202:6379192.168.100.2026379@mymaster192.168.100.20363791129:X09Jun202118:20:39.607#+sdownslave192.168.100.202:6379192.168.100.2026379@mymaster192.168.100.2036379‘******(3)在203上测试主从复制是否可以正常同步[root@slave1~]#redis-cli-h192.168.100.203-a123123Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.192.168.100.203:6379>keys*1)"aaa"2)"bbb"192.168.100.203:6379>setyyyaaaOK192.168.100.203:6379>keys*1)"yyy"2)"aaa"3)"bbb"[root@slave2redis-5.0.4]#redis-cli-h192.168.100.204-a123123Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.192.168.100.204:6379>keys*#发现同步成功1)"yyy"2)"bbb"3)"aaa"******(4)此时重新开启202的redis,并且查看哨兵的提示消息[root@master~]#/etc/init.d/redisstartStartingRedisserver...1167:C09Jun202118:23:39.756#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo1167:C09Jun202118:23:39.756#Redisversion=5.0.4,bits=64,commit=00000000,modified=0,pid=1167,juststarted1167:C09Jun202118:23:39.756#ConfigurationloadedRedisisrunning...1129:X09Jun202118:23:50.324*+convert-to-slaveslave192.168.100.202:6379192.168.100.2026379@mymaster192.168.100.2036379#提示增加了一台slave******(5)在202的新终端上查看redis的数据是否成功同步[root@master~]#redis-cli-h192.168.100.202-a123123Warning:Usingapasswordwith'-a'or'-u'optiononthecommandlineinterfacemaynotbesafe.192.168.100.202:6379>keys*#发现已经成功同步1)"bbb"2)"aaa"3)"yyy"#测试故障切换缓存,发现在master主机出现故障然后重新连接到集群后,master角色不会进行转移
-哨兵日志分析
#把哨兵放在前台运行时,日志信息会直接输出到终端上,放到后台运行时,日志会写到指定的路径中+reset-master<instancedetails>#当master被重置时.+slave<instancedetails>#当检测到一个slave并添加进slave列表时.+failover-state-reconf-slaves<instancedetails>#Failover状态变为reconf-slaves状态时+failover-detected<instancedetails>#当failover发生时+slave-reconf-sent<instancedetails>#sentinel发送SLAVEOF命令把它重新配置时+slave-reconf-inprog<instancedetails>#slave被重新配置为另外一个master的slave,但数据复制还未发生时。+slave-reconf-done<instancedetails>#slave被重新配置为另外一个master的slave并且数据复制已经与master同步时。-dup-sentinel<instancedetails>#删除指定master上的冗余sentinel时,当一个sentinel重新启动时,可能会发生这个事件+sentinel<instancedetails>#当master增加了一个sentinel时。+sdown<instancedetails>#进入SDOWN状态时;-sdown<instancedetails>#离开SDOWN状态时。+odown<instancedetails>#进入ODOWN状态时。-odown<instancedetails>#离开ODOWN状态时。+new-epoch<instancedetails>#当前配置版本被更新时。+try-failover<instancedetails>#达到failover条件,正等待其他sentinel的选举。+elected-leader<instancedetails>#被选举为去执行failover的时候。+failover-state-select-slave<instancedetails>#开始要选择一个slave当选新master时。no-good-slave<instancedetails>#没有合适的slave来担当新masterselected-slave<instancedetails>#找到了一个适合的slave来担当新masterfailover-state-send-slaveof-noone<instancedetails>#当把选择为新master的slave的身份进行切换的时候。failover-end-for-timeout<instancedetails>#failover由于超时而失败时。failover-end<instancedetails>#failover成功完成时。switch-master<mastername><oldip><oldport><newip><newport>#当master的地址发生变化时。通常这是客户端最感兴趣的消息了。+tilt#进入Tilt模式。-tilt#退出Tilt模式。
读到这里,这篇“Redis之sentinel哨兵集群怎么部署”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。