1.主从集群
Redis
有三种集群模式,分别是:主从模式、哨兵模式、Cluster
模式。Rdis
最开始使用主从模式做集群,若master
宕机需要手动配置slave
转为master
;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master
和slave
,若master
宕机可自动将slave
转为master
,但它也有一个问题,就是不能动态扩充;所以在3.x
提出cluster
集群模式。
1.1.主从模式介绍
主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master
)和从数据库(slave
)。
其中主从复制有如下特点:
- 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
- 复制的数据流是单向的,只能由主节点复制到从节点。
- 从数据库一般都是只读的,并且接收主数据库同步过来的数据
- 一个
master
可以拥有多个slave
,但是一个slave
只能对应一个master
slave
挂了不影响其他slave
的读和master
的读和写,重新启动后会将数据从master
同步过来master
挂了以后,不影响slave
的读,但redis
不再提供写服务,master
重启后redis
将重新对外提供写服务master
挂了以后,不会在slave
节点中重新选一个master
1.2.工作机制
当slave
启动后,主动向master
发送SYNC
命令。master
接收到SYNC
命令后在后台保存快照(RDB
持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave
。slave
接收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master
每次接收到的写命令都会同步发送给slave
,保证主从数据一致性。
2.Redis
主从集群搭建
2.1.集群结构
搭建的主从集群结构如图:
共包含三个节点,一个主节点,两个从节点。
这里我们会在同一台虚拟机中开启3个redis
实例,模拟主从集群,信息如下:
IP | PORT | 角色 |
---|---|---|
10.0.10.16 | 7001 | master |
10.0.10.16 | 7002 | slave |
10.0.10.16 | 7003 | slave |
2.2.准备实例和配置
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。
1)创建目录
我们创建三个文件夹,名字分别叫7001、7002、7003:
# 进入/home目录
cd /home
# 创建目录
mkdir 7001 7002 7003
如图:
2)恢复原始配置
修改redis-6.2.4/redis.conf
文件,将其中的持久化模式改为默认的RDB
模式,AOF
保持关闭状态。
# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000
# 关闭AOF
appendonly no
3)拷贝配置文件到每个实例目录
然后将redis-6.2.4/redis.conf
文件拷贝到三个目录中(在/home
目录执行下列命令):
# 方式一:逐个拷贝
cp redis-6.2.4/redis.conf 7001
cp redis-6.2.4/redis.conf 7002
cp redis-6.2.4/redis.conf 7003
# 方式二:管道组合命令,一键拷贝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf
4)修改每个实例的端口、工作目录
修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb
文件保存位置都修改为自己所在目录(在/home
目录执行下列命令):
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/home\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/home\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/home\/7003\//g' 7003/redis.conf
5)修改每个实例的声明IP
虚拟机本身有多个IP
,为了避免将来混乱,我们需要在redis.conf
文件中指定每一个实例的绑定ip
信息,格式如下:
# redis实例的声明 IP
replica-announce-ip 10.0.10.16
每个目录都要改,我们一键完成修改(在/home
目录执行下列命令):
# 逐一执行
sed -i '1a replica-announce-ip 10.0.10.16' 7001/redis.conf
sed -i '1a replica-announce-ip 10.0.10.16' 7002/redis.conf
sed -i '1a replica-announce-ip 10.0.10.16' 7003/redis.conf
# 或者一键修改
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 10.0.10.16' {}/redis.conf
2.3.启动
为了方便查看日志,我们打开3个ssh
窗口,分别启动3个redis
实例,启动命令:
# 第1个
redis-server 7001/redis.conf
# 第2个
redis-server 7002/redis.conf
# 第3个
redis-server 7003/redis.conf
启动后:
如果要一键停止,可以运行下面命令(如果有认证密码,该命令失效):
printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown
有认证密码命令:
printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown -a 123456
如果上述方式都没有成功停止redis
,则可以使用kill -9 PID
杀死redis
进程。
2.4.开启主从关系
现在三个实例还没有任何关系,要配置主从可以使用replicaof
或者slaveof
(5.0
以前)命令。
有临时和永久两种模式:
-
修改配置文件(永久生效)
- 在
redis.conf
中添加一行配置:replicaof <masterip> <masterport>
- 在
-
使用
redis-cli
客户端连接到redis
服务,执行replicaof
命令(重启后失效):replicaof <masterip> <masterport>
注意:在5.0
以后新增命令replicaof
,与salveof
效果一致。
如果master`有密码认证,需要开启:
masterauth <master-password>
7002、7003 修改如下配置:
replicaof 10.0.10.16 7001
masterauth 123456
然后连接 7001节点,查看集群状态:
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication
结果:
2.5.测试
执行下列操作以测试:
-
利用
redis-cli
连接7001,执行set test 'wo ai beijing tian an men.'
-
利用
redis-cli
连接7002,执行get test
,再执行set id 7002
-
利用
redis-cli
连接7003,执行get test
,再执行set id 7003
可以发现,只有在7001这个master
节点上可以执行写操作,7002和7003这两个slave
节点只能执行读操作。