共计 11131 个字符,预计需要花费 28 分钟才能阅读完成。
基于 docker 环境下如何搭建 redis 主从集群,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
1 前言
笔者给大家介绍基于 docker 环境下搭建 Redis 主从复制集群,如何让 redis 主从集群在 docker 容器上面良好运行,容器下发生故障时又如何对 redis 主从进行切换操作。
2 Redis 主从复制特性
l 使用异步复制。
l 支持一主多从。一个 master 可以有多个 slave。
l Slave 可以接受来自其它 slaves 的连接。除了可以连接多个 slaves 到同一个 master 之外,slaves 也可以连接到其它的 slaves 以类似级联的方式。
l Redis 复制在 master 端是非阻塞的。这意味着,master 可以继续处理 (来自客户端的) 请求当 slave 在执行初次同步时。
l Redis 复制可以用于扩容,如使用多个 slaves 用于只读查询,也可以只是用于数据冗余。
l Redis 复制也可能用来避免让 master 把整个数据集写入硬盘。该技术需要先配置 master 的 redis.conf 文件,然后连接一个 slave,该 slave 必须被配置为不时地进行保存,或启用了 AOF。
3 Redis 容器化优势
1、节省 redis 主从安装与配置工作;
2、能够以秒级速度启动 redis 容器;
3、能够快速扩展 redis 从节点;
4、能快速进行 redis 主从切换;
5、可迁移性强。
4 Redis 主从复制架构
5 Redis 主从集群搭建 5.1 redis 节点信息
这里采用一主二从模式来测试
编号
节点名
IP 地址
用途
1
redis-master
192.168.56.108
Redis 主节点, 节点数据可写读
2
redis-slave01
192.168.56.109
Redis 从节点 1,节点数据可读不可写
3
redis-slave02
192.168.56.110
Redis 从节点 2,节点数据可读不可写
5.2 Redis 基础镜像封装
1、Redis 镜像 dockerfile 脚本
FROM jaymarco/centos:7.3
MAINTAINER jaymarco
ENV VERSION=3.2.5
ENV DOWN_URL=http://download.redis.io/releases/redis-${VERSION}.tar.gz \
TEMP_DIR=/tmp/redis \
DATA_DIR=/data/redis
RUN mkdir -p ${TEMP_DIR} ${DATA_DIR} \
yum install -y gcc gcc-c++ make cmake tar \
groupadd redis useradd -g redis -d ${DATA_DIR} -s /sbin/nologin redis \
curl -Lk ${DOWN_URL} |tar xz -C ${TEMP_DIR} –strip-components=1 \
cd ${TEMP_DIR} \
make -C ${TEMP_DIR} -j $(awk /processor/{i++}END{print i} /proc/cpuinfo) \
make -C ${TEMP_DIR} install \
rm -rf ${TEMP_DIR} \
/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
echo Asia/Shanghai /etc/timezone
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
VOLUME ${DATA_DIR}
WORKDIR ${DATA_DIR}
EXPOSE 6379/tcp
ENTRYPOINT [/entrypoint.sh]
2、Redis 初始化启动脚本
构建 dockerfile 时将操作系统参数进行优化。
#!/bin/bash
if ! which redis-server /dev/null 2 then
source /etc/profile.d/redis.sh
fi
set -e
sysctl -w net.core.somaxconn=1024 /dev/null 2 1
sysctl -w vm.overcommit_memory=1 /dev/null 2 1
echo never /sys/kernel/mm/transparent_hugepage/enabled
echo never /sys/kernel/mm/transparent_hugepage/defrag
# first arg is `-f` or `–some-option`
# or first arg is `something.conf`
if [${1#-} != $1 ] || [${1%.conf} != $1 ]; then
set — redis-server $@
fi
# allow the container to be started with `–user`
if [$1 = redis-server -a $(id -u) = 0 then
chown -R redis .
#exec gosu redis $0 $@
fi
if [$1 = redis-server then
doProtectedMode=1
configFile=
if [-f $2]; then
configFile= $2
if grep -q ^protected-mode $configFile then
doProtectedMode=
fi
fi
if [$doProtectedMode]; then
shift # redis-server
if [$configFile ]; then
shift
fi
set — –protected-mode no $@
if [ $configFile]; then
set — $configFile $@
fi
set — redis-server $@
fi
fi
exec $@
3、构建 redis 基础镜像
在 dockerfile 文件同级目录下进行对 redis 镜像封装,最后会生成一个 jaymarco/redis:3.2.5 的镜像文件。可参考下面命令构建 redis 镜像:
docker build–t jaymarco/redis: 3.2.5 .
4、redis 镜像导入其它节点
当 Redis 的 docker 镜像已经在其中一个节点封装好后需要将 redisr 的 docker 镜像同步到其它两台 redis 主机节点。
1、查看 redis 镜像拿到镜像 ID: 04fd033441e2。
2、使用 docker save 命令将 redis 镜像以文件形式保存到宿主机磁盘。
3、将 redis325.tar 文件远程拷贝到其他两个 redis 节点上面。
scp redis325.tar 192.168.56.109:/home
scp redis325.tar 192.168.56.110:/home
4、使用 docker load 命令将 redis325.tar 导入 docker。
通过以上操作已经完成 redis 镜像封装,并将镜像同步到其它节点,说明 redis 三个节点上面都存在 redis docker 镜像。
5.3 Redis 主从集群配置
关于 Redis 主从集群关键在于主从之间的 redis.conf 配置文件,它做了主从的参数设置与性能优化配置。前面我们已经将 redis 的软件以镜像方式安装在三台节点上面。接下来我们通过配置进行 redis 主从集群环境搭建。同时我们启动 redis 容器采用主机网络模式,分别将 redis 容器在三台虚拟主机上面运行。
5.3.1 master 主节点(192.168.56.108)
接下来对 redis-master 主节点进行配置。
1、redis 配置文件
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile
databases 8
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename appendonly.aof
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
masterauth JayRedisHaZi
requirepass JayRedisHaZi
2、启动 master redis 容器
docker run -d \
–privileged –name redis-master \
–network host \
-v /etc/redis.conf:/etc/redis.conf \
-v /etc/localtime:/etc/localtime \
jaymarco/redis:3.2.5
看下面主节点的 redis 容器成功启动
5.3.2 Slave 从节点 1(192.168.56.109)
接下来对 redis-slave01 从节点进行配置。
1、redis 配置文件
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile
databases 8
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename appendonly.aof
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
slaveof 192.168.56.108 6379
masterauth JayRedisHaZi
requirepass JayRedisHaZi
2 启动 master redis 容器
docker run -d \
–privileged –name redis-slave01 \
–network host \
-v /etc/redis.conf:/etc/redis.conf \
-v /etc/localtime:/etc/localtime \
jaymarco/redis:3.2.5
看下面主节点的 redis 容器成功启动
5.3.3 Slave 从节点 2(192.168.56.110)
接下来对 redis-slave02 从节点进行配置。
1、redis 配置文件
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile
databases 8
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename appendonly.aof
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
slaveof 192.168.56.108 6379
masterauth JayRedisHaZi
requirepass JayRedisHaZi
2 启动 master redis 容器
docker run -d \
–privileged –name redis-slave02 \
–network host \
-v /etc/redis.conf:/etc/redis.conf \
-v /etc/localtime:/etc/localtime \
jaymarco/redis:3.2.5
看下面主节点的 redis 容器成功启动
5.4 Redis 主从检查
通过下面命令检查 master 和 slave 主从同步状态
1、redis-master 状态日志
docker exec -it redis-master redis-cli -h 192.168.56.108 -a JayRedisHaZi info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.110,port=6379,state=online,offset=99,lag=0
slave1:ip=192.168.56.109,port=6379,state=online,offset=99,lag=1
master_repl_offset:113
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:112
2、redis-slave01 状态日志
docker exec -it redis-slave01 redis-cli -h 192.168.56.109 -a JayRedisHaZi info replication
# Replication
role:slave
master_host:192.168.56.108
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:253
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
3、redis-slave02 状态日志
docker exec -it redis-slave02 redis-cli -h 192.168.56.110 -a JayRedisHaZi info replication
# Replication
role:slave
master_host:192.168.56.108
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:281
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
6 Redis 主从同步测试 6.1 验证主从数据同步
1、redis master 主节点插入两个值
2、redis slave01 从节点 1 上面可以正常查看到数据
3、redis slave01 从节点 1 上面可以正常查看到数据
6.2 验证从节点只读不能写
redis 两台 slave 从节点验证写入数据失败, 提示只读模式。
7 Redis 主从切换
接下了做一个这样的主从切换模拟测试,将 redis master 主节点(192.168.56.108)的 redis 服务停个,并将 redis slave 从节点 1(192.168.56.109)切换成 redis master 主节点。也将原来的 master 主节点切换成 slave 从节点,最后再对主从进行验证。
7.1 主从切换
以下是主从切换和从主切换的操作步骤:
1、模拟主节点宕机(192.168.56.108 操作)
docker stop redis-master;
2、将 slave 节点 1 切换成 master 主节点(192.168.56.109 操作)
docker exec -it redis-slave01 redis-cli -h 192.168.56.109 -a JayRedisHaZi CONFIG SET slave-read-only no
docker exec -it redis-slave01 redis-cli -h 192.168.56.109 -a JayRedisHaZi SLAVEOF NO ONE
3、将 slave 节点 2 加入新的 master 节点(192.168.56.110 操作)
docker exec -it redis-slave02 redis-cli -h 192.168.56.110 -a JayRedisHaZi SLAVEOF 192.168.56.109 6379
4、将原来 master 主节点切换成 slave 从节点(192.168.56.108 操作)
docker exec -it redis redis-cli -h 192.168.56.108 -a JayRedisHaZi CONFIG SET slave-read-only no
docker exec -it redis redis-cli -h 192.168.56.108 -a JayRedisHaZi SLAVEOF NO ONE
7.2 主从切换检查
从下面状态数据来看主机 192.168.56.109 上面的 redis 容器从原来的 slave 节点变成了 master 节点, 而主机上面的 192.168.56.108 上面的 redis 容器从原来的 master 变成了 slave,主从之间发生了切换,最后切换成功。
1、主机 192.168.56.109
[root@dcos-redis01 redis]# docker exec -it redis-slave01 redis-cli -h 192.168.56.109 -a JayRedisHaZi info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.110,port=6379,state=online,offset=1601,lag=1
slave1:ip=192.168.56.108,port=6379,state=online,offset=1601,lag=1
master_repl_offset:1601
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1600
2、主机 192.168.56.108
[root@docker-build-env etc]# docker exec -it redis-master redis-cli -h 192.168.56.108 -a JayRedisHaZi info replication
# Replication
role:slave
master_host:192.168.56.109
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:1713
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
3、主机 192.168.56.110
[root@dcos-redis02 redis]# docker exec -it redis-slave02 redis-cli -h 192.168.56.110 -a JayRedisHaZi info replication
# Replication
role:slave
master_host:192.168.56.109
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:1755
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
7.3 验证主从数据同步
1、检查到 192.168.56.108 和 192.168.56.110 这两台 slave 节点是只读模式
2、master 节点 192.168.56.109 写数据,正常同步到两台 slave 节点。
关于基于 docker 环境下如何搭建 redis 主从集群问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。