在上一篇博客中详细讲解了单台redis的配置与安装,不过后面留了一个redis的主从的梗,这一篇就讲解如何配置redis主从并且讲解如何使用sentinel来配置redis主从发生故障时能自动切换并选举。
关于redis主从复制功能:
其实可以将redis主从复制的功能想象为mariadb的主从复制那样,主服务器可读可写,而从服务器只读。不过redis的主从特性要比mariadb要强的多,比如一个master下的salve可以再在slave下面再有slave(就是slave下还能挂载slave)而且主从同步时master以非阻塞的方式同步数据给slave,大大提高性能。不过在一般的架构中主从同步一般都是一个master两个slave,当然两节点也是OK的!
如何配置redis主从:
配置redis主从其实方便到极点了,只要在slave端的配置文件中找到slaveof字段加上master端的主机地址和端口,如果有认证的话写好密码就能完成主从同步了。下面有拓扑图还有详细的配置过程:
首先配置redis master我就不再进行重复的说明了,不了解配置redis的可以看上一篇!
接下来就是配置slave了(同理slave01 & slave02):
vim redis.conf #首先找到REPLICATION字段后下面都是slave的配置选项 slaveof 172.16.1.20 6379 #配置主节点信息并将这台redis作为从 masterauth <master-password> #如果master做了密码认证这里输入密码 slave-read-only yes #从服务器是否只能只读?这个必须的否则不乱套了? repl-diskless-sync no #不采用无磁盘方式进行复制,也就是说主服务器主要复制RDB file的磁盘数据给slave。 #那么如果启动yes选项则表示启用无磁盘进行复制,直接从内存中取走数据交给slave内存,不过会增加一些带宽 #其实在局域网里面同步都无所谓,无磁盘复制方法不会对磁盘进行资源消耗。 repl-diskless-sync-delay 5 #如果使用无磁盘方式进行主从复制那么这里的选项就是复制的延迟时间,默认为5秒 repl-timeout 60 #设置无磁盘复制的超时时间 repl-disable-tcp-nodelay no #是否启用TCP_NODELAY,当然默认时不启用,如果启用则会使用少量的TCP协议包传输到slave端 #但是这样做传输变得很慢但是节约带宽。一般redis都是在局域网所以这个选项还是保持默认即可。 slave-priority 100 #slave的成为master的优先级, #当master宕机时sentinel会进行选举这回就是看的优先级,数字越小优先级越高
当上面的设置设置完毕后,从服务器的配置就算完成了。接下来看看同步的效果,首先登陆172.16.1.20插入数据:
redis-cli -h 172.16.1.20 172.16.1.20:6379> SET HELLO world OK
随后登陆从服务器172.16.1.30查看结果:
redis-cli -h 172.16.1.30 172.16.1.30:6379> GET HELLO "world"
至此那么主从复制就算完毕了,不过如果不放心可以上slave02上去看看!
关于监控主从架构sentinel:
sentinel(哨兵)是一个redis的进程专门用于监控主从架构,用于管理多个redis服务实现高可用。sentinel可以使用使用流言协议、投票协议来决定是否进行故障转移。
sentinel的作用:
①监控主从节点
②通知
③自动故障转移
sentinel判断master下线:
①主观下线:一个sentinel实例判断出某节点下线。
②客观下线:多个sentinel节点协商后判断出某主节点下线。
配置sentinel:
在编译安装的时候redis已经给了关于sentinel的配置文件,只需稍稍配置就能运行sentinel实例下面给出配置文件语法:
vim /YOU/REDIS/PATH/sentinel.conf bind 0.0.0.0 #这就不用说了吧?监听地址 logfile "/opt/redis/logs/sentinel.log" #sentinel的log放置位置 daemonize yes #运行在守护进程模式,否则会直接展示在终端上 #上面两项都是sentinel配置文件没有的请自行添加 port 26379 #监听端口,默认为26379 dir "/tmp" #sentinel工作文件放置位置,默认在/tmp下面。 sentinel monitor test 172.16.1.20 6379 2 #填写主节点相关信息。 #其中test代表监控节点名字,可以自定义不过后面的所有节点名字都得与这个相同 #172.16.1.20 这就不用说了吧?主节点连接地址 #6379 主节点的监听端口 #2 法定票数,默认为2表示让主节点下线需要2个sentinel同意才能让主节点下线上线等操作, #这就是客观下线。如果填1表示主观下线,只要有一个sentinel节点决定就能让主节点下线上线等操作。 #现在贴出基本的语法请自行查看:sentinel monitor <master-name> <ip> <redis-port> <quorum> sentinel down-after-milliseconds test 30000 #确认主节点丢失的超时时间,默认为30秒,这里以毫秒结算。 sentinel parallel-syncs test 1 #允许多少从节点在主服务器宕机之后能够成为新的主节点并且能同步数据。 #默认为1个节点,当然一般情况下时不需要进行修改的。 sentinel failover-timeout test 180000 #故障转移的超时时间,默认单位为毫秒,并且默认设置是3分钟。
设置完成之后就可以启动sentinel了,启动方法有两种:
①redis-sentinel /PATH/CONFIG #只用sentinel专用的启动命令并指明配置文件即刻启动。
②redis-server /PATH/CONFIG –sentinel #使用启动redis的命令和sentinel的配置文件后面跟上–sentinel表示启动sentinel程序
启动以后查看一下26379端口是否监听?如果监听了那么就算启动成功了,接下来看看sentinel.conf的配置文件看看配置是否更改?因为启动后配置文件会自动更改会更规范。随后连接sentinel查看主节点的相关信息:
①SENTINEL masters #获取主节点的详细信息
②SENTINEL slaves <master-name> #跟上sentinel配置文件的主节点名来显示所有从节点信息,我这里是test所以应该写成SENTINEL slaves test即可。
③SENTINEL get-master-addr-by-name <master-name> #跟上sentinel配置文件的主节点名显示主节点的地址和端口。
④SENTINEL reset #清除状态,重置所有站点!
⑤SENTINEL failover <master-name> #跟上sentinel配置文件的主节点名强制将主节点下线并选出新的主节点(测试使用,慎用!)
如果需要测试主从节点是如何交替的,可以先使用tailf查看sentinel的日志随后直接使用SENTINEL failover test 让test主节点名的master redis强制下线看看是如何选举的!
结语:
使用sentinel可以保证redis主从集群的高可用性,但是接下来还有一个问题没有解决那就是如果master redis宕机以后由其他从节点进行接收master但是这样会发生IP地址更换甚至端口更换,那么如果客户端程序写的只有原来master redis的地址和端口现在master由其他slave代替了,那么如何通讯以及插入和查询数据呢?不过关于这个我下一篇文章来说。
Comments