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 容器名称
简介部分
转载自: