一、简介
一个Redis服务可以有多个该服务的复制品,这个Redis服务称为Master,其它复制称为Slaves。
如图中所示,我们将一台Redis服务器作主库(Matser),其他三台作为从库(Slave),主库只负责写数据,每次有数据更新都将更新的数据同步到它所有的从库,而从库只负责读数据。这样一来,就有了两个好处:
(1) 读写分离,不仅可以提高服务器的负载能力,并且可以根据读请求的规模自由增加或者减少从库的数量。
(2)数据被复制成了了好几份,就算有一台机器出现故障,也可以使用其他机器的数据快速恢复。
需要注意的是:在Redis主从模式中,一台主库可以拥有多个从库,但是一个从库只能隶属于一个主库。
二、 Redis主从复制配置
在Redis中,要实现主从复制架构非常简单,只需要在从数据库的配置文件中加上如下命令即可(笔者是在同一台机器上实现主从复制的):
1.把redis的原始配置文件复制两份,原始的配置文件作为Master的配置文件,另外两个作为Slave的配置文件
2、Master的配置文件与默认文件相比我只修改了3个地方。
#系统默认是no, Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启动守护线程。
daemonize yes
#绑定的主机地址,默认只能本机访问,我把这个注释掉了
#bind 127.0.0.1
#非保护模式,这是 是redis3.2 之后加入的新特性,如果不设置为no,则无法进行主从复制
protected-mode no
3.两个Slave的配置文件需要修改以下几个地方
Slave1
daemonize yes
#bind 127.0.0.1
#这条配置原始的redis配置文件中没有,需要添加。slaveof master地址 master端口号
slaveof 192.168.25.140 6379
#Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis_6380.pid
port 6380
#日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile "6380.log"
#指定本地数据库文件名,默认值为dump.rdb
dbfilename dump6380.rdb
Slave2
daemonize yes
#bind 127.0.0.1
slaveof 192.168.25.140 6379
pidfile /var/run/redis_6381.pid
port 6381
logfile "6381.log"
dbfilename dump6381.rdb
4.启动服务器
5.启动服务器
Master
Slave1
Slave2
我们可以用info replication这个命令看看个个节点的状态
Master
Slave1
Slave2
以上就表示主从复制成功
当然你也可以使用slaveof no one这个命令变成Master
使用slaveof 192.168.25.140 6379变成Slave
三、解决redis主机设置了密码的无法实现主从复制的情况
如果你的Master设置了密码,则Slave配置文件中的masterauth 后面必须写你Master的密码,不然主从复制不成功。
Master
daemonize yes
#bind 127.0.0.1
protected-mode no
#设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass 123456
Slave1
daemonize yes
#bind 127.0.0.1
slaveof 192.168.25.140 6379
pidfile /var/run/redis_6380.pid
port 6380
logfile "6380.log"
dbfilename dump6380.rdb
#主redis服务器密码
masterauth 123456
Slave2
daemonize yes
#bind 127.0.0.1
slaveof 192.168.25.140 6379
pidfile /var/run/redis_6381.pid
port 6381
logfile "6381.log"
dbfilename dump_6381.rdb
masterauth 123456
四、哨兵模式搭建
1.哨兵作用:
1、通过发送命令,让Redis服务返回监测其运行状态,包括主服务和从服务器
2、当哨兵监测到主服务master宕机,会自动将slave切换成master,然后通过发布,订阅模式,通知其他从服务器,修改配置文件,让他们切换主机。
2.搭建流程
(1) Master配置文件相较原始配置文件需要修改以下地方
daemonize yes
#bind 127.0.0.1
protected-mode no
requirepass 123456
#放开注释masterauth 并设置密码为123456(此处设置连接主机的密码,如果这台机器是主机,此处配置无用,但是哨兵模式中,主机切换到其他机器上这台机器就是从机,如果此处不设置masterauth将连不上主机)
masterauth 123456
(2)Slave配置文件相较原始配置文件需要修改以下地方
Slave1
daemonize yes
#bind 127.0.0.1
slaveof 192.168.25.140 6379
pidfile /var/run/redis_6380.pid
port 6380
logfile "6380.log"
dbfilename dump6380.rdb
masterauth 123456
protected-mode no
requirepass 123456
Slave2
daemonize yes
#bind 127.0.0.1
slaveof 192.168.25.140 6379
pidfile /var/run/redis_6381.pid
port 6381
logfile "6381.log"
dbfilename dump6381.rdb
masterauth 123456
protected-mode no
requirepass 123456
(4)重启redis服务。
(5)在redis的解压目录把sentinel.conf文件复制到你的redis目录,一共复制三分,我的是sentienl26379.conf、sentienl26380.conf、sentienl26381.conf。
(6)sentienl26379.conf、sentienl26380.conf、sentienl26381.conf相较原始文件修改了以下地方
sentienl26379.conf
protected-mode no
pidfile /var/run/redis-sentinel26379.pid
#Sentinel monitor <name> <ip> <port> <quorum> name :redis主服务名称,可以自行命名,但是在一个sentinel网络中,一个redis主服务只能有一个名称;ip和port :redis主服务的IP地址和端口号;quorum :表示要将这个主服务器判断为失效并下线至少需要2个sentinel同意;
sentinel monitor mymaster 192.168.25.140 6379 2
#主机认证密码改为123456
sentinel auth-pass mymaster 123456
#如果当前sentinel与master直接的通讯中,在指定时间内没有响应或者响应错误代码,那么当前sentinel就认为master失效SDOWN,“主观”失效,默认为30秒
sentinel down-after-milliseconds mymaster 10000
#当failover失败后,每隔1分钟就会进行一次master失败迁移,默认是3分钟
sentinel failover-timeout mymaster 60000
sentienl26380.conf
protected-mode no
pidfile /var/run/redis-sentinel26380.pid
#默认的哨兵端口号为26379
port 26380
sentinel monitor mymaster 192.168.25.140 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
sentienl26381.conf
protected-mode no
pidfile /var/run/redis-sentinel26381.pid
port 26381
sentinel monitor mymaster 192.168.25.140 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
(7)启动哨兵
sentienl26379.conf
sentienl26380.conf
sentienl26381.conf
(8)我们强行停止其中的一个master,模拟其中一个master服务器突然宕机的情况:
然后我们可以看到sentinel从发现一个master宕机,到投票确认,再到从slaves中选出新的master的整个过程:
我们可以看到端口号为6381的redis服务被重新选举为新的master,原来的master被重新设置为slave,状态为未启动。
然后我们重新启动端口号为6379的redis服务可以发现,原来的master会自动成为一个slave:
以上,就是redis的主从复制相关的问题,如果大家觉得这篇文章对您有帮助的化,请帮笔者点个赞,小小的赞就是对我最大的肯定,谢谢啦!