docker搭建一主多从redis

  • 1 redis集群简介
  • 1.1 主从复制特点
  • 1.2 redis复制原理
  • 2 docker搭建主从节点
  • 2.1 创建挂载目录
  • 2.2 编辑redis配置文件
  • 2.3 docker创建自定义网络
  • 2.4 docker运行主节点
  • 2.5 docker运行从节点
  • 3 状态检查
  • 3.1 查看主节点状态
  • 3.2 容器运行状态


1 redis集群简介

1.1 主从复制特点

(1)主数据库可以进行读写操作,当写操作导致数据变化时自动同步给从库。
(2)复制的数据流是单向的,只能由主节点复制到从节点。
(3)从数据库一般只读,并接收主数据库同步过来的数据。
(4)主从为一对多关系,一个master节点可以有多个slave节点,单一个slave节点只能有一个master节点。
(5)master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务。
(6)未设置哨兵机制时,master挂了以后,不会在slave节点中重新选一个master。

1.2 redis复制原理

redis 的复制分为两部分操作同步(SYNC)命令传播(command propagate) (1)同步(SYNC):主服务器收到SYNC命令后,生成RDB快照文件,然后发送给从服务器。
(2)命令传播(command propagate):主服务器生成快照文件时,同时将后续命令缓存起来,然后将缓存命令发送到从服务器,从服务器通过载入缓存命令来达到主从数据一致。
(3)两者同时存在的原因:当进行同步操作,从服务器向主服务器发送SYNC命令时,主服务器生成RDB快照文件过程中仍会收到客户端的数据修改请求,这部分数据如果不能传达给从服务器,那么就会出现主从数据不一致。这时候就出现了命令传播,主服务器收到从服务器的SYNC命令后,生成RDB快照文件同时,将此段时间内收到的命令缓存起来,然后使用命令传播的操作发送从服务器。

2 docker搭建主从节点

docker网络使用自定义网络进行容器间访问,可以容器重启后也可以固定IP不变

2.1 创建挂载目录

# 创建主节点数据和配置文件挂在目录
mawenjun@ForDream:~$ sudo mkdir -p /redis/redis-master/data
mawenjun@ForDream:~$ sudo mkdir -p /redis/redis-master/conf
# 创建从节点数据和配置文件挂在目录
mawenjun@ForDream:~$ sudo mkdir -p /redis/redis-slave/data
mawenjun@ForDream:~$ sudo mkdir -p /redis/redis-slave/conf
# 创建主节点配置文件并填入内容
mawenjun@ForDream:~$ sudo vi /redis/redis-master/conf/redis.conf

# 创建主节点配置文件并填入内容
mawenjun@ForDream:~$ sudo vi /redis/redis-slave/conf/redis.conf

2.2 编辑redis配置文件

主节点配置文件如下

# 限制可访问ip,此处未限制
bind 0.0.0.0

# 关闭保护模式
protected-mode no

#端口
port 6380

#主节点登录密码,可以不设置
requirepass 123456

# 加入主节点集群的密码
masterauth 123456

#用于哨兵机制选取主节点,设置优先级,值越低优先级越高
slave-priority 90

#不开启AOF,主节点不开启,从节点开启
appendonly no

#关闭rdb,主节点不开启
save ""

从节点配置文件如下

# bind 0.0.0.0

# 关闭保护模式
protected-mode no

#端口
port 6381

# **注意 与主节点的requirepass参数一致
masterauth 123456

# **注意 为自定义网络中设置的IP
replicaof 172.0.0.5 6380

#设置优先级,值越低优先级越高
slave-priority 90


# 开启AOF持久化功能
appendonly yes

# AOF文件的名称
appendfilename "appendonly.aof"

# 配置AOF持久化的fsync策略
# 使用everysec可以实现性能和数据安全性的平衡,每秒fsync一次
appendfsync everysec

# AOF文件自动重写的触发条件
# 设置为100,表示当AOF文件大小是上一次重写后的AOF文件大小的100%时,触发重写
auto-aof-rewrite-percentage 100

# 设置触发AOF重写的最小文件大小
# 避免AOF文件很小的时候触发重写,减少不必要的重写操作
auto-aof-rewrite-min-size 64mb

# 配置在启动加载AOF文件时对不完整文件的处理
# 设置为yes,允许加载不完整的AOF文件,提高数据恢复的灵活性
aof-load-truncated yes

# 启用增量式fsync,减少磁盘I/O操作
aof-rewrite-incremental-fsync yes

# 配置文件的目录,AOF文件会存储在这个目录下
dir /data

# 日志级别,info表示记录大部分有用的信息,适合生产环境
loglevel warning

# 配置文件修改后,不重启Redis服务也可以加载新的配置
# config yes

#rdb
save 900 1
save 300 10
save 60 10000

# The filename where to dump the DB
dbfilename dump.rdb

# Note that you must specify a directory here, not a file name.
dir /data

注意:
(1)从节点配置中的masterauth主节点中requirepass一致;
(2)从节点中的repicaof <masterIP> <masterPort> 的IP是docker自定义网络中主节点的IP;
(3)# 关闭保护模式 protected-mode no (4)节点IP查看命令: docker inspect 容器名称 | grep IPA

mawenjun@ForDream:~$ sudo docker inspect redis-slave | grep IPA

2.3 docker创建自定义网络

# docker network create 网段 name
sudo docker network create  --subnet=172.0.0.1/16 redis-net

2.4 docker运行主节点

sudo docker run -d -p 6380:6380  \
--name redis-master \
--restart=always \
--network redis-net --ip 172.0.0.5 \
-v /redis/redis-master/data/:/data \
-v /redis/redis-master/conf/redis.conf:/etc/redis/redis.conf \
redis \
redis-server /etc/redis/redis.conf

参数解释

-d: 后台运行容器,并返回容器ID;
--name: 为创建的容器命名
--restart: 容器退出之后docker重启策略
--network: 指定网络模式(这里指定刚才创建的自定义网络模式)
--ip: 固定ip(否则重启之后ip可能会变)
--p: 端口映射,格式为:主机(宿主)端口:容器端口
-v: 卷挂载
-redis 镜像名称(默认为lates)
redis-server /etc/redis/redis.conf:容器启动后运行的指令,redis按照指定配置文件启动

2.5 docker运行从节点

sudo docker run -d -p 6381:6381  \
--name redis-slave \
--restart=always \
--network redis-net --ip 172.0.0.6 \
-v /redis/redis-slave/data/:/data \
-v /redis/redis-slave/conf/redis.conf:/etc/redis/redis.conf \
redis \
redis-server /etc/redis/redis.conf

3 状态检查

3.1 查看主节点状态

(1)进入主节点容器内:
sudo docker exec -it redis-slave /bin/bash (2)登入redis-cli:
redis-cli -h localhost -p 6380 -a 123456 (-a requirepass)
(3)主节点信息:
info-replication (4)结果如下:

mawenjun@ForDream:~$ sudo docker exec -it redis-master /bin/bash
[sudo] password for mawenjun:
root@d9c1a4a6b219:/data# redis-cli -h localhost -p 6380 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
localhost:6380> INFO replication
# Replication
role:master
connected_slaves:1 # 从节点信息
slave0:ip=172.0.0.6,port=6381,state=online,offset=9060,lag=0
master_failover_state:no-failover
master_replid:2e9d34063ef14f7bbeca85c6ee1acb460b5e3d43
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:9060
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:9060
localhost:6380>

3.2 容器运行状态

排查容器运行状态的指令:
sudo docker logs 容器名称

简介部分转载自: