基于docker环境下如何搭建redis主从集群

64次阅读
没有评论

共计 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 主从复制架构

基于 docker 环境下如何搭建 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 节点是只读模式

基于 docker 环境下如何搭建 redis 主从集群基于 docker 环境下如何搭建 redis 主从集群

2、master 节点 192.168.56.109 写数据,正常同步到两台 slave 节点。

基于 docker 环境下如何搭建 redis 主从集群

基于 docker 环境下如何搭建 redis 主从集群

基于 docker 环境下如何搭建 redis 主从集群

关于基于 docker 环境下如何搭建 redis 主从集群问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计11131字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)