Redis主从复制
一、什么是主从复制?
为当主机性能更新后,根据配置和策略,自动同步到备份机的机制。其中主机处理写操作,从机处理读操作。
这样做使得读写分离,大大提高了性能,也有容灾快速恢复的优点。
此时开启了多个Redis服务器,但是相对于主机来说,从机的配置文件是不完全相同的,因此需要拷贝多个redis.conf文件,并且修改其中的配置。
我们坚持配从不配主的原则,根据不同的需求对从机对应的配置文件做相应的修改。
二、配从不配主
1)拷贝多个redis.conf 文件include
2)开启daemonize yes
3)Pid文件名字pidfile
4)指定端口号port。不能相同
5)Log日志文件名字不能相同
6)dump.rdb的名字不能相同dbfilename
7)Appendonly,关掉AOF或者换AOF备份文件的名字。
建议主机的配置文件设置: appendonly yes,从机设置为no,当然也可以根据情况而定。
简单的“一主二仆”模式
首先:我启动了三个窗口用于测试:
由启动Redis服务的命令:redis-server 配置文件路径 可以知道:redis服务是根据配置文件的内容进行启动的,也就是说,配置文件不同,启动的redis服务也不同。
可以通过执行表多个: redis-server 配置文件路径1 redis-server 配置文件路径2 redis-server 配置文件路径3.......启动多个redis服务。
并且配置文件可以使用include来进行依赖,不相同的配置单独制定进行覆盖,没必要将初始redis.conf完全拷贝。但实际建议作为主机的配置文件可以选择完全拷贝。
我这里选择了拷贝一份作为主机的配置文件:
修改了作为主机的配置文件的内容
创建从机的配置文件并修改对应配置:
顺带一提:如果将appendonly设置为no ,那么对应的APPendfilename 文件就不会创建,你不妨测试一下。
配置完成后,启动三台Redis服务器,注意启动前先关闭所有redis-Server进程,我这里设置了redisMaster和初始redis占用统一端口号,更加需要检查并且关闭原来那个redis-server。
info replication:查看主从关系
slaveof ip port:建立主从关系
值得注意的是:当一台Redis服务器被设置为从机后,他就不能使用set命令了,但是被设置成主机,他不仅可以set,亦可以get。
当把主机shutdown以后,从机依旧认之前设置的主机为老大,并且可以获取到主机设置的值:实际上,这些值并不是从主机获取的,而是在本机获取的,主机设值以后给从机备份了一份。但是当小弟shutdown以后,再次重启就不会认之前的主子了,这也好理解,毕竟上次认主子的时候,是在上次主机开启后的命令,和这次没有关系。
如果想设置永久的主从关系,就得在配置文件中进行配置:
配置以后重启,从机就默认配置锁指向的进程为自己的主机。
顺带一提:几台服务器没有建立主从关系之前,一台机器set了key-value对,当他成为主机后,这部分值依旧会被复制到从机中。
三、复制原理
每次从机连通后,都会给主机发送sync指令,主机收到指令后进行持久化操作,将数据存入RDB文件,持久化完成以后,主机把此RDB文件发送给从机。从机接收到RDB文件后,进行全盘加载。再此之后每次的主机写操作,都会立刻把指令发送给从机,从机执行相同的命令。
以上面一主二仆的模式为例,如果一台主机的从机过多,势必会给主机造成IO压力。你可能已经想到了,那能不能给从机再设置从机呢?问题就是这么解决的。
Master ---> Slave1 --> Slave2
当然,如果节点太多,你也可以设计成树状结构。
同样,你可以在命令行中临时指定,也可以在配置文件中永久指定。这里不再赘述。
这样做很多好处:
1)当主机宕机后,其直接从机可以通过指令:slaveof no one,成为主机,之前提过,作为主机时,不能使用set,但是他大哥死了,他做了老大就可以set了。如果此时他的大哥复活了,就会发现老虎不在山猴子称大王,他曾经的小弟已经接替他掌管门派了,除非小弟重启,或在再次通过命令称他他哥,否则它是做不会大哥的。
2)上面是认为的在主机宕机后制定从机为主机,但是在日常生产中,通常都是有后台监控主机是否发生故障,如果发生故障就根据投票数自动的将从机转换为主机。我们称这种机制为哨兵模式。
3)哨兵模式
测试模板:一主二仆模式
问:在配置哨兵的情况下主机挂掉以后,两个同级的从机谁做老大?----指定优先级
配置哨兵模式:
①、在主机配置文件同级目录下创建文件sentinel.conf
文件内容为:sentinel monitor mymaster 192.168.188.100 6379 1 ,mymaster是给主机气的别名。这个1 的意思为,当有一台从机ping主机时没有返回PONG就
认为主机宕机了,需要根据规则提升某一从机为主机
daemonize yes 指定后台运行,其这里没有指定,因为要做测试看他把谁提升为主机的细节。
②、不指定优先级:由该进程早主机中的run_id决定,由于每次启动run_id不同,所以可以算是随机提升一个从机当主机。
并且让之前的同级变成了他的从机
这种改变时永久性的,你可以打开他们的配置文件看一看,已经被改写:
并且此时哨兵的配置文件也发生了改动
你可以手动的改回去。
③、指定优先级:有两种方式
测试前提,把哨兵模式工作时改动的配置文件改为之前的一主二仆模式
a)选择偏移量大的做主机:就是说谁那里存有原来主机的数据最多,谁就被提升为主机,这基本决定于那一台主机最早做主机的从机
参与赋值的主从机都会维护吱声赋值偏移量。主机在处理完写入命令后,命令的字节长度做leijiajil,tongji在信息info replication的master_erpl_offset指标中。
从机每秒钟上报自身的赋值偏移量给主机,因此主机也会保存从机的赋值偏移量。从机再接收主机发送的命令后,也会累加记录自身的偏移量,统计在info
replication中的slave_repl_offset指标中。
b)选择优先级最靠前的做主机:在从机的配置文件中可以指定 slave-priorty n,n越小,优先级越高。