共計(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)
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)是只讀模式
2、master 節(jié)點(diǎn) 192.168.56.109 寫數(shù)據(jù),正常同步到兩臺 slave 節(jié)點(diǎn)。
關(guān)于基于 docker 環(huán)境下如何搭建 redis 主從集群問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識。