溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于docker環境下如何搭建redis主從集群

發布時間:2021-11-18 16:37:45 來源:億速云 閱讀:153 作者:柒染 欄目:云計算

基于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>&1; 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的鏡像文件??蓞⒖枷旅婷顦嫿╮edis鏡像:

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主從集群問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女