centos7下redis6主从配置
单机redis会有很多风险,比如机器故障,丢失数据;单台机器容量有限,不可能无限制增加内存;当读操作频率远远大于大于写操作频率时,单台节点负载过大。
解决方案:准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续 提供服务,实现Redis的高可用,同时实现数据冗余备份。
多台机器分为两个角色,一个为master,实现写数据,是提供数据的一方,另一个是角色slave,可以有多个,实现读数据,是接受数据的一方。把master中的数据复制到slave中。
主从复制的原理:当数据库启动后,slave会向master发送SYNC请求。master 会执行rdb持久化的同时会起一个buffer用来存执行rdb期间有客户端发来的命令。快照完成后,master会将rdb文件和buffer中的命令依次发送给slave。后续master再有接受到客户端的写命令,就会将命令同步给slave。
主从复制的流程:
1、建立连接。
slave主动连接master,slave发送指令“slaveof ip port”给目标服务器
master接受到指令,响应对方
slave保存master的ip和port
在slave端创建与master进行通信连接的socket
slave端周期性的向master发送"ping"命令,master回应“pong”
如果master设置有密码,slave需要验证
slave发送命令“replconf listen-ip <port>”告诉master的端口号,master接受并保存
在master节点设置密码的情况下
在master节点修改配置文件添加如下设置:
vim /etc/redis/6379.conf
requirepass password
在slave节点修改配置文件添加如下设置:
vim /etc/redis/6379.conf
replconf 192.168.100.161 6379
masterauth password
2、数据同步。
在slave初次连接master后,复制master中的所有数据到slave。具体步骤:
slave发送指令"psync2 runid offset",请求同步,初始时发送“psync2 ? -1”,因为master的rundi和offset都不知道。
master执行bgsave,再创建一个命令缓冲区(存放新的指令),记录当前的偏移量offset,生成rdb文件,通过socket通信把文件、runid和offset传递给slave;
slave清空原始数据,接受rdb,恢复文件,并保存runid和offset;
(以上三步是完成全量复制)
salve恢复完成后通知master,发送命令psync2 runid offset
master会判断对方的runid匹不匹配,offset是否在缓冲区中,只要有一个不满足就执行全量复制。如果校验通过,但是slaver发送的offset与master保存的offset不一致,master将缓冲区中的指令(可以理解为aof)和offset发送给slave
slave保存master的offset,执行aof重写,恢复数据。
-
数据同步阶段的注意事项:如果master数量很大,数据同步时应该错开高峰。
-
当master与slave全量复制的过程中有持续的命令进来,复制缓冲区有限(默认一兆),那么最前面的数据很可能丢失,master与slave进行部分同步时,发现有丢失,就会全量复制。
3、命令转播。
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态。
-
实时同步。 进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线 .
-
补充部分复制中的几个要素:
runid:每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id ,40位字符组成,是一个随机的十六进制字符 。在第一个阶段,当slave来连master时,就会把自己的runid发送给master,master会保存,如果下次slaver与master再次通信时,master发现slaver的runid变了,master就会意识到数据不一致。
master的复制积压缓冲区:当master收到一个命令时,master中的一个"命令传播程序"会把命令发送给每一个slaver,如果其中的某一条线路发生故障,该命令没有传播到slaver中,此时数据就不能同步。为了解决这个问题,引入缓冲区,master再发送命令的同时会把命令保存在缓冲区一份。
imagemaster记录已发送的信息对应的offset
slave记录已接收的信息对应的offset
- 双方的复制偏移量:
master复制偏移量:记录发送给所有slave的指令字节对应的位置(多个)
slave复制偏移量:记录slave接收master发送过来的指令字节对应的位置(一个)
验证主从服务:
redis-cli -p 6379 -a password info replication | head -n 5
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Replication
role:master
connected_slaves:2
slave0:ip=192.168.100.163,port=6379,state=online,offset=38430832,lag=0
slave1:ip=192.168.100.162,port=6379,state=online,offset=38430977,lag=0