CentOS

centos7下redis6主从配置

2022-02-26  本文已影响0人  前浪浪奔浪流

        单机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重写,恢复数据。

3、命令转播。

        当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态。

        runid:每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id ,40位字符组成,是一个随机的十六进制字符 。在第一个阶段,当slave来连master时,就会把自己的runid发送给master,master会保存,如果下次slaver与master再次通信时,master发现slaver的runid变了,master就会意识到数据不一致。

        master的复制积压缓冲区:当master收到一个命令时,master中的一个"命令传播程序"会把命令发送给每一个slaver,如果其中的某一条线路发生故障,该命令没有传播到slaver中,此时数据就不能同步。为了解决这个问题,引入缓冲区,master再发送命令的同时会把命令保存在缓冲区一份。

image

        master记录已发送的信息对应的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

上一篇下一篇

猜你喜欢

热点阅读