本文介绍如何快速使用Docker搭建Redis主从复制环境,线上环境更加推荐直接部署,这里会搭建一主两从,全部搭建在一台主机,会使用Redis6.0版本,分别使用端口号 主节点(6379)、从节点(6380、6381)。
Redis主从复制作用和优缺点
docker pull redis:6.0.20
mkdir -p /home/docker/redis6379/conf
mkdir -p /home/docker/redis6379/data
vi /home/docker/redis6379/conf/redis.conf
将以下配置写入配置文件
# 服务端口 默认6379
prot 6379
# 关闭保护模式,允许远程连接
protected-mode no
# 密码
requirepass 123456
mkdir -p /home/docker/redis6380/conf
mkdir -p /home/docker/redis6380/data
vi /home/docker/redis6380/conf/redis.conf
将以下配置写入配置文件
# 服务端口 默认6379
prot 6380
# 关闭保护模式,允许远程连接
protected-mode no
# 密码
requirepass 123456
# 主节点密码
masterauth 123456
# 配置主从复制 从节点默认只读
## redis5.0后新版本配置
replicaof 172.16.8.186 6379
## redis5.0之前配置,新版本Redis也还可以用,我部署时确定6.0版本还是可用的
# slaveof 172.16.8.186 6379
mkdir -p /home/docker/redis6381/conf
mkdir -p /home/docker/redis6381/data
vi /home/docker/redis6381/conf/redis.conf
将以下配置写入配置文件
# 服务端口 默认6381
prot 6381
# 关闭保护模式,允许远程连接
protected-mode no
# 密码
requirepass 123456
# 主节点密码
masterauth 123456
# 配置主从复制 从节点默认只读
## redis5.0后新版本配置
replicaof 172.16.8.186 6379
## redis5.0之前配置,新版本Redis也还可以用,我部署时确定6.0版本还是可用的
# slaveof 172.16.8.186 6379
docker run -d \
-p 6379:6379 \
--name redis6379 \
--restart always \
--privileged=true \
-v /home/docker/redis6379/conf/redis.conf:/etc/redis/redis.conf \
-v /home/docker/redis6379/data:/data \
redis:6.0.20 \
redis-server /etc/redis/redis.conf
docker run -d \
-p 6380:6380 \
--name redis6380 \
--restart always \
--privileged=true \
-v /home/docker/redis6380/conf/redis.conf:/etc/redis/redis.conf \
-v /home/docker/redis6380/data:/data \
redis:6.0.20 \
redis-server /etc/redis/redis.conf
docker run -d \
-p 6381:6381 \
--name redis6381 \
--restart always \
--privileged=true \
-v /home/docker/redis6381/conf/redis.conf:/etc/redis/redis.conf \
-v /home/docker/redis6381/data:/data \
redis:6.0.20 \
redis-server /etc/redis/redis.conf
-d:后台运行
-p 63xx:63xx:指定宿主机端口与容器端口映射关系
–name redis63xx:创建的容器名称
–restart=always:容器开机自启
–privileged=true:获取宿主机root权限
-v /home/docker/redis63xx/conf/redis.conf:/etc/redis/redis.conf:映射配置文件目录,宿主机:容器
-v /home/docker/redis63xx/data:/data:映射数据目录,宿主机:容器
redis:6.0.20:使用的镜像
redis-server /etc/redis/redis.conf:指定配置文件启动redis-server进程
# redis6379:容器名称、 redis-cli:redis自带客户端命令、 -a 123456:指定redis密码登录
docker exec -it redis6379 redis-cli -a 123456
127.0.0.1:6379> info replication
# redis6380:容器名称、 redis-cli:redis自带客户端命令、-p 6380:指定redis端口、 -a 123456:指定redis密码登录
docker exec -it redis6380 redis-cli -p 6380 -a 123456
127.0.0.1:6380> info replication
# redis6381:容器名称、 redis-cli:redis自带客户端命令、-p 6381:指定redis端口、 -a 123456:指定redis密码登录
docker exec -it redis6381 redis-cli -p 6381 -a 123456
127.0.0.1:6381> info replication
127.0.0.1:6379> set names kerwin
127.0.0.1:6380> get names
127.0.0.1:6381> get names
127.0.0.1:6380> set names kerwin2
如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个PSYNC命令给master请求复制数据。
master收到PSYNC命令后,会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,持久化期间,master会继续接收客户端的请求,它会把这些可能修改数据集的请求缓存在内存中。当持久化进行完毕以后,master会把这份rdb文件数据集发送给slave,slave会把接收到的数据进行持久化生成rdb,然后再加载到内存中。然后,master再将之前缓存在内存中的命令发送给slave。当master与slave之间的连接由于某些原因而断开时,slave能够自动重连Master,如果master收到了多个slave并发连接请求,它只会进行一次持久化,而不是一个连接一次,然后再把这一份持久化的数据发送给多个并发连接的slave。
主从复制风暴问题是因为多个从节点同时复制主节点导致主节点压力过大,可以让新节点复制从节点数据,类似数结构,可以分担主节点同步压力。
实际操作只需要将主从复制的配置调整成从节点即可。
# 配置主从复制 从节点默认只读
## redis5.0后新版本配置
replicaof 172.16.8.186 6381