Redis主从模式集群在CentOS上搭建的实践

13 篇文章 0 订阅
6 篇文章 0 订阅

-----前提安装好redis,操作版本为6.2.6-------

    master如果配置了requirepass参数,需要密码登陆

    slave就要配置masterauth来设置校验密码否则的话master会拒绝slave的访问请求。

一、设置主从模式

ip

端口

角色

192.168.154.129

7001

master

192.168.154.129

7002

slave

192.168.154.129

7003

slave

1、进入安装目录
cd /usr/local/redis/redis-6.2.6
2、创建集群文件夹

分别创建集群文件夹7001 7002 7003

mkdir 7001 7002 7003

3、拷贝redis.conf

拷贝redis.conf分别到7001 7002 7003目录下

cp redis.conf 7001
cp redis.conf 7002
cp redis.conf 7003

也可以一次性执行下面语句

echo 7001 7002 7003 |xargs -t -n 1 cp redis.conf

4、修改配置文件

分别修改配置文件的内容如下:(:set number 命令显示文件的序号)

daemonize yes
#允许外网访问
bind 0.0.0.0
#允许外部链接
protected-mode no
#开启RDB, 关闭AOF
# save ""
#save 3600 1
#save 300 100
#save 60 10000
# 关闭AOF
appendonly no
#设置密码
requirepass 123456
#主机密码
masterauth 123456

5、修改配置文件端口、工作目录

文件每个实例的端口、工作目录和每个实例的声明IP

5.1修改端口(分别为7001 7002 7003)

port 7001

5.2每个实例的声明IP,服务器或虚拟机的IP一个虚拟机可能会出现好几个IP,在集群时可能会出现其他虚拟机读取的数据不一致,所以指定一下比较好

 replica-announce-ip  192.168.154.129

5.3将rdb文件保存位置都修改为自己所在目录

dir /usr/local/redis/redis-6.2.6/7001/

#2、 端口7002 中的配置
port 7002
dir /usr/local/redis/redis-6.2.6/7002/
replica-announce-ip 192.168.154.129
#主机密码
masterauth 123456
#3、 端口7003 中的配置
port 7003
dir /usr/local/redis/redis-6.2.6/7003/
replica-announce-ip 192.168.154.129
#主机密码
masterauth 123456

6、启动服务

(因为设置了密码)

redis-server redis.conf

7、开启主从关系

7.1、通过手动执行命令设置主从(临时:重启后就失效

# 连接 7003,进入客户端

redis-cli -h 192.168.154.129 -p 7003 -a 123456

# 执行replicaof (主节点的Ip和端口)

replicaof 192.168.154.129 7001

#执行info replication命令查看主从关系

info replication

7.1.2、测试主从同步

在主机7001上执行,其他从机可以查询到

set hello world

7.2、通过配置文件(永久有效

在 7002与7003的配置文件redis.cof的最后一行分别添加如下:

slaveof 192.168.154.129 7001

注意:在5.0以后新增命令replicaof,与salveof效果一致。

#执行info replication命令查看主从关系

info replication

7.3、切换主节点

在7003上切换主节点为7002,执行以下语句:

slaveof 192.168.154.129 7002

此时,在7001上写数据会同步到7002,7002的数据再同步到7003上(在7002上写数据不会同步到7003上)

二、主从问题解答

  • 1、从机可以执行写命令吗?

不可以,若想可以的话,可以在配置文件中将replica-read-only设置为no;

replica-read-only no

不过,若在主服务器操作与从服务同一个key值,仍然会覆盖从服务上的相同的key

  • 二、从机切入点的问题

首次连接进行全量复制,后续跟随,master写,slave跟

  • 三、主机宕机后,从节点会自动上位吗?

从机不会自动上位;从机依然是从机,连接断了。原地待命等待主机复活

  • 四、主机宕机后,重启主机后,主从关系还在吗,从机能否顺利复制?

关系还在的,只是从机显示主机不在线,从机可以复制

三、Redis主从数据同步原理

1、主从第一次同步

主从第一次同步是全量同步

master如何判断slave是不是第一次来同步数据?

Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid

offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。

全量同步的流程:

1、从节点发送 psync 命令给主节点,由于是第一次进行复制,从节点没有主节点的复制偏移量,所以偏移量发送为 -1,也就是需要进行全量复制。

2、主节点根据命令,解析出要进行全量复制,返回 "fullresync" 响应,并返回主节点的runid和偏移量。

3、从节点接受主节点的响应信息并保存主节点信息.

4、主节点执行 bgsave命令 ,一定会重新生成一个新的 rdb 文件(因为已有的 rdb 文件和最新的数据可能存在较大差异),进行持久化.在创建RDB文件期间的命令将保存在缓冲区中(消耗master服务器大量的cpu、内存、磁盘I/O资源)

5、当主节点执行完bgsave后,向从节点发送 rdb 文件,从节点会将接收到的 rdb 文件保存到本地硬盘.

6、主节点将生成 rdb 到从节点接收完 rdb 文件期间执行的写命令,写入缓冲区,等从节点保存完 rdb 文件后,主节点再将缓冲区中的数据补发给从节点,从节点就会把补发的数据仍然按照二进制格式追加写入到 rdb 文件中,保证主从一致.

7、从节点清空自身的旧数据.

8、从节点加载 rdb 文件,将数据库状态更新至主节点执行bgsave时的数据库状态,保证和主节点数据一致.

如果从节点加载 rdb 文件完成后,并且开启了 aof,就会把刚刚加载数据过程中产生的 aof 日志通过 bgrewrite 操作,清楚冗余数据,并进行整理.

什么时候进行全量复制,什么时候进行部分复制呢?

全量复制:

首次和主节点进行数据同步时(判断 replication id 不一样)

在部分复制的时候,发现已经超出积压缓冲区的数据范围了(repl_baklog中的offset已经被覆盖时),也会进行全量复制.

部分复制:

从节点之前从主节点上复制过数据了,或者是有网络抖动或者从节点重启而丢失数据(slave节点断开又恢复,并且在repl_baklog中能找到offset时).

                                        

2、部分复制流程

1、当主从节点之间出现网络中断时,如果超过了 repl-timeout 时间,主节点就会认为从节点故障并中断复制连接。

2、主从连接中断期间,主节点会继续接受到 “写请求” 的命令,就会把这些命令滞留在积压缓冲区中(积压缓冲区就是内存中一个简单的队列,会记录最近一段时间修改的数据,总量是有限的,随着时间的推移,就会把之前的旧数据逐渐删除掉)。

3、当主从节点网络恢复以后,从节点会继续尝试连接主节点。

4、从节点将之前保存的 replication id(run_id) 和 偏移量offset 作为 psync 的参数发送给主节点,请求进行部分复制。

5、主节点接收到 psync 请求后,进行必要的验证,随后根据 offset 去积压缓冲区(repl_back_buffer)找合适的数据,并响应 continue 给从节点. (如果主节点的 “写请求” 过多,超出积压缓冲区的范围,就只能进行全量复制了)

主节点同步长连接,持续将积压缓冲区的数据发送给从节点,同时把写命令发送给从节点,保证一致性.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值