基於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={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的映象檔案。可參考下面命令構建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節點。
有需要的朋友可以關注我的公眾號,文章每日一更
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2699919/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Docker環境搭建redis叢集(主從模式)DockerRedis模式
- 基於Dokcer搭建Redis叢集(主從叢集)Redis
- Mac 環境下 Redis 叢集的搭建MacRedis
- 基於 Docker 的 MongoDB 主從叢集DockerMongoDB
- Redis主從同步叢集搭建Redis主從同步
- Docker構建redis叢集環境DockerRedis
- 基於docker 搭建redis環境—redis單機版DockerRedis
- Redis叢集環境搭建實踐Redis
- 12. Redis叢集環境搭建Redis
- Redis叢集搭建 三主三從Redis
- Redis叢集搭建(三主三從)Redis
- CentOS 7.9 環境下搭建k8s叢集(一主兩從)CentOSK8S
- Docker搭建Redis叢集DockerRedis
- PC基於Linux的叢集環境搭建?Linux
- Redis搭建主從複製、哨兵叢集Redis
- 從 0 開始使用 Docker 快速搭建 Hadoop 叢集環境DockerHadoop
- 基於Docker搭建LNMP環境DockerLNMP
- 【環境搭建】RocketMQ叢集搭建MQ
- 生產環境的redis高可用叢集搭建Redis
- Docker Compose搭建MySQL主從複製叢集DockerMySql
- Zookeeper 叢集環境搭建
- 基於ECS快速搭建Docker環境Docker
- Docker Redis 5.0 叢集(cluster)搭建DockerRedis
- Docker LNMP Redis 環境搭建DockerLNMPRedis
- Docker環境下秒建Redis叢集,連SpringBoot也整上了!DockerRedisSpring Boot
- 雲主機centos7搭建基於docker的hadoop叢集CentOSDockerHadoop
- docker 配置 Mysql主從叢集DockerMySql
- redis主從叢集搭建及容災部署(哨兵sentinel)Redis
- linux系統——Redis叢集搭建(主從+哨兵模式)LinuxRedis模式
- 基於 Redis3.2.4 叢集搭建說明RedisS3
- linux虛擬機器環境快速搭建redis5.x版本的主從叢集總結Linux虛擬機Redis
- Redis多例項及主從複製環境搭建Redis
- Docker 容器搭建及 Redis 叢集原理DockerRedis
- es 5.5.3叢集環境搭建
- hadoop叢集環境搭建Hadoop
- Glassfish叢集環境的搭建
- Docker Swarms 跨主機叢集搭建DockerSwarm
- 如何基於Jupyter notebook搭建Spark叢集開發環境Spark開發環境