久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

基于docker環(huán)境下如何搭建redis主從集群

169次閱讀
沒有評論

共計(jì) 11131 個(gè)字符,預(yù)計(jì)需要花費(fèi) 28 分鐘才能閱讀完成。

基于 docker 環(huán)境下如何搭建 redis 主從集群,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

1  前言

筆者給大家介紹基于 docker 環(huán)境下搭建 Redis 主從復(fù)制集群,如何讓 redis 主從集群在 docker 容器上面良好運(yùn)行,容器下發(fā)生故障時(shí)又如何對 redis 主從進(jìn)行切換操作。

2  Redis 主從復(fù)制特性

l  使用異步復(fù)制。

l  支持一主多從。一個(gè) master 可以有多個(gè) slave。

l  Slave 可以接受來自其它 slaves 的連接。除了可以連接多個(gè) slaves 到同一個(gè) master 之外,slaves 也可以連接到其它的 slaves 以類似級聯(lián)的方式。

l  Redis 復(fù)制在 master 端是非阻塞的。這意味著,master 可以繼續(xù)處理 (來自客戶端的) 請求當(dāng) slave 在執(zhí)行初次同步時(shí)。

l  Redis 復(fù)制可以用于擴(kuò)容,如使用多個(gè) slaves 用于只讀查詢,也可以只是用于數(shù)據(jù)冗余。

l  Redis 復(fù)制也可能用來避免讓 master 把整個(gè)數(shù)據(jù)集寫入硬盤。該技術(shù)需要先配置 master 的 redis.conf 文件,然后連接一個(gè) slave,該 slave 必須被配置為不時(shí)地進(jìn)行保存,或啟用了 AOF。

3  Redis 容器化優(yōu)勢

1、節(jié)省 redis 主從安裝與配置工作;

2、能夠以秒級速度啟動(dòng) redis 容器;

3、能夠快速擴(kuò)展 redis 從節(jié)點(diǎn);

4、能快速進(jìn)行 redis 主從切換;

5、可遷移性強(qiáng)。

4  Redis 主從復(fù)制架構(gòu)

基于 docker 環(huán)境下如何搭建 redis 主從集群

5  Redis 主從集群搭建 5.1  redis 節(jié)點(diǎn)信息

這里采用一主二從模式來測試

編號

節(jié)點(diǎn)名

IP 地址

用途

1

redis-master

192.168.56.108

Redis 主節(jié)點(diǎn), 節(jié)點(diǎn)數(shù)據(jù)可寫讀

2

redis-slave01

192.168.56.109

Redis 從節(jié)點(diǎn) 1,節(jié)點(diǎn)數(shù)據(jù)可讀不可寫

3

redis-slave02

192.168.56.110

Redis 從節(jié)點(diǎn) 2,節(jié)點(diǎn)數(shù)據(jù)可讀不可寫

5.2  Redis 基礎(chǔ)鏡像封裝

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 初始化啟動(dòng)腳本

構(gòu)建 dockerfile 時(shí)將操作系統(tǒng)參數(shù)進(jìn)行優(yōu)化。

#!/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、構(gòu)建 redis 基礎(chǔ)鏡像

在 dockerfile 文件同級目錄下進(jìn)行對 redis 鏡像封裝,最后會(huì)生成一個(gè) jaymarco/redis:3.2.5 的鏡像文件。可參考下面命令構(gòu)建 redis 鏡像:

docker   build
–t jaymarco/redis: 3.2.5 .

4、redis 鏡像導(dǎo)入其它節(jié)點(diǎn)

當(dāng) Redis 的 docker 鏡像已經(jīng)在其中一個(gè)節(jié)點(diǎn)封裝好后需要將 redisr 的 docker 鏡像同步到其它兩臺 redis 主機(jī)節(jié)點(diǎn)。

1、查看 redis 鏡像拿到鏡像 ID: 04fd033441e2。

2、使用 docker save 命令將 redis 鏡像以文件形式保存到宿主機(jī)磁盤。

3、將 redis325.tar 文件遠(yuǎn)程拷貝到其他兩個(gè) redis 節(jié)點(diǎn)上面。

scp redis325.tar    192.168.56.109:/home

scp redis325.tar    192.168.56.110:/home

4、使用 docker load 命令將 redis325.tar 導(dǎo)入 docker。

通過以上操作已經(jīng)完成 redis 鏡像封裝,并將鏡像同步到其它節(jié)點(diǎn),說明 redis 三個(gè)節(jié)點(diǎn)上面都存在 redis docker 鏡像。

5.3  Redis 主從集群配置

關(guān)于 Redis 主從集群關(guān)鍵在于主從之間的 redis.conf 配置文件,它做了主從的參數(shù)設(shè)置與性能優(yōu)化配置。前面我們已經(jīng)將 redis 的軟件以鏡像方式安裝在三臺節(jié)點(diǎn)上面。接下來我們通過配置進(jìn)行 redis 主從集群環(huán)境搭建。同時(shí)我們啟動(dòng) redis 容器采用主機(jī)網(wǎng)絡(luò)模式,分別將 redis 容器在三臺虛擬主機(jī)上面運(yùn)行。

5.3.1 master 主節(jié)點(diǎn)(192.168.56.108)

接下來對 redis-master 主節(jié)點(diǎn)進(jìn)行配置。

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、啟動(dòng) 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

看下面主節(jié)點(diǎn)的 redis 容器成功啟動(dòng)

5.3.2 Slave 從節(jié)點(diǎn) 1(192.168.56.109)

接下來對 redis-slave01 從節(jié)點(diǎn)進(jìn)行配置。

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 啟動(dòng) 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

看下面主節(jié)點(diǎn)的 redis 容器成功啟動(dòng)

5.3.3 Slave 從節(jié)點(diǎn) 2(192.168.56.110)

接下來對 redis-slave02 從節(jié)點(diǎn)進(jìn)行配置。

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 啟動(dòng) 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

看下面主節(jié)點(diǎn)的 redis 容器成功啟動(dòng)

5.4  Redis 主從檢查

通過下面命令檢查 master 和 slave 主從同步狀態(tài)

1、redis-master 狀態(tài)日志

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 狀態(tài)日志

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 狀態(tài)日志

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  驗(yàn)證主從數(shù)據(jù)同步

1、redis master 主節(jié)點(diǎn)插入兩個(gè)值

2、redis slave01 從節(jié)點(diǎn) 1 上面可以正常查看到數(shù)據(jù)

3、redis slave01 從節(jié)點(diǎn) 1 上面可以正常查看到數(shù)據(jù)

6.2  驗(yàn)證從節(jié)點(diǎn)只讀不能寫

redis 兩臺 slave 從節(jié)點(diǎn)驗(yàn)證寫入數(shù)據(jù)失敗, 提示只讀模式。

7  Redis 主從切換

接下了做一個(gè)這樣的主從切換模擬測試,將 redis master 主節(jié)點(diǎn)(192.168.56.108)的 redis 服務(wù)停個(gè),并將 redis slave 從節(jié)點(diǎn) 1(192.168.56.109)切換成 redis master 主節(jié)點(diǎn)。也將原來的 master 主節(jié)點(diǎn)切換成 slave 從節(jié)點(diǎn),最后再對主從進(jìn)行驗(yàn)證。

7.1  主從切換

以下是主從切換和從主切換的操作步驟:

1、模擬主節(jié)點(diǎn)宕機(jī)(192.168.56.108 操作)

docker   stop redis-master;

2、將 slave 節(jié)點(diǎn) 1 切換成 master 主節(jié)點(diǎn)(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 節(jié)點(diǎn) 2 加入新的 master 節(jié)點(diǎn)(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 主節(jié)點(diǎn)切換成 slave 從節(jié)點(diǎn)(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  主從切換檢查

從下面狀態(tài)數(shù)據(jù)來看主機(jī) 192.168.56.109 上面的 redis 容器從原來的 slave 節(jié)點(diǎn)變成了 master 節(jié)點(diǎn), 而主機(jī)上面的 192.168.56.108 上面的 redis 容器從原來的 master 變成了 slave,主從之間發(fā)生了切換,最后切換成功。

1、主機(jī) 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、主機(jī) 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、主機(jī) 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  驗(yàn)證主從數(shù)據(jù)同步

1、檢查到 192.168.56.108 和 192.168.56.110 這兩臺 slave 節(jié)點(diǎn)是只讀模式

基于 docker 環(huán)境下如何搭建 redis 主從集群基于 docker 環(huán)境下如何搭建 redis 主從集群

2、master 節(jié)點(diǎn) 192.168.56.109 寫數(shù)據(jù),正常同步到兩臺 slave 節(jié)點(diǎn)。

基于 docker 環(huán)境下如何搭建 redis 主從集群

基于 docker 環(huán)境下如何搭建 redis 主從集群

基于 docker 環(huán)境下如何搭建 redis 主從集群

關(guān)于基于 docker 環(huán)境下如何搭建 redis 主從集群問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-25發(fā)表,共計(jì)11131字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 内乡县| 怀集县| 鄂州市| 綦江县| 同德县| 广德县| 岱山县| 沈阳市| 奈曼旗| 新和县| 田东县| 武强县| 卢氏县| 镇原县| 绥中县| 溆浦县| 靖远县| 嘉鱼县| 秦安县| 卓尼县| 扬中市| 阳西县| 大渡口区| 视频| 江山市| 盘山县| 历史| 安多县| 金沙县| 潢川县| 阿城市| 邢台县| 台北县| 安康市| 自贡市| 乡宁县| 盐津县| 桐城市| 长顺县| 泰来县| 招远市|