Redis实战篇------搭建主从复制
1.Redis主从
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
1.1.主从集群结构
下图就是一个简单的 Redis 主从集群结构:
如图所示,集群中有一个 master 节点、两个 slave 节点(现在叫replica)。当我们通过 Redis 的 Java 客户端访问主从集群时,应该做好路由:
- 如果是写操作,应该访问 master 节点,master 会自动将数据同步给两个 slave 节点
- 如果是读操作,建议访问各个 slave 节点,从而分担并发压力
1.2.搭建主从集群
我们会在同一个虚拟机中利用3个Docker容器来搭建主从集群,容器信息如下:
容器名 | Value | ip : 端口 |
---|---|---|
r1 | master | 192.168.xx.xxx:7001 |
r2 | slave | 192.168.xx.xxx:7002 |
r3 | slave | 192.168.xx.xxx:7003 |
1.2.1.启动多个Redis实例
我们利用 docker 进行部署
docker-compose 如下
不会使用 docker 可以查看以下文章:
docker-compose.yaml
文件如下:
yaml
version: "3.2"
services:
r1:
image: redis
container_name: r1
network_mode: "host"
entrypoint: ["redis-server", "--port", "7001"]
r2:
image: redis
container_name: r2
network_mode: "host"
entrypoint: ["redis-server", "--port", "7002"]
r3:
image: redis
container_name: r3
network_mode: "host"
entrypoint: ["redis-server", "--port", "7003"]
上传至 /root/redis
目录下:
执行命令,搭建集群:
bash
docker compose up -d
查看 docker
容器,可以看到都正常启动了
查看端口映射:
1.2.2.建立集群
虽然我们启动了3个 Redis 实例,但是它们并没有形成主从关系。我们需要通过命令来配置主从关系:
bash
# Redis5.0以前
slaveof <masterip> <masterport>
# Redis5.0以后
replicaof <masterip> <masterport>
有临时和永久两种模式:
- 永久生效:在
redis.conf
文件中利用slaveof
命令指定master节点 - 临时生效:直接利用
redis-cli
控制台输入slaveof
命令,指定master
节点
我们测试临时模式,首先连接 r2
,让其以 r1
为master
bash
# 连接r2
docker exec -it r2 redis-cli -p 7002
# 认r1主,也就是7001
slaveof 192.168.xx.xxx 7001
使用info replication
命令查看 r2
状态,可以看到他的 master 已经是 7001
有个小问题,那么我们还没连接的时候,他的身份是什么呢?
这里我们连接 r3
查看他的状态中的 role
没错,他是他自己的主人!
然后连接 r3
,让他变成 r1
的 slave
。。。
bash
# 连接r3
docker exec -it r3 redis-cli -p 7003
# 认r1主,也就是7001
slaveof 192.168.xx.xxx 7001
然后连接 r1
,查看集群状态:
bash
# 连接r1
docker exec -it r1 redis-cli -p 7001
# 查看集群状态
info replication
可以看到,当前节点 r1:7001
的角色是 master
,有两个slave与其连接:
- slave0:
port
是7002
,也就是r2
节点 - slave1:
port
是7003
,也就是r3
节点
1.2.3.测试
依次在 r1
、 r2
、r3
节点上执行下面命令:
bash
set num 123
get num
结果如下:
那么我们可以在从节点 set
吗?
显然是不行的 ~
至此,我们就部署了简单的 Redis 的主从复制 ~
参考:
https://www.bilibili.com/video/BV1S142197x7?p=142&vd_source=f586bbf89de5904ba5a05a8c1d18f1c4