Docker實現Redis主從配置、哨兵模式

 

1 使用docker下載redis鏡像,默認下載最redis最新版本,目前版本號爲5.0.0,如果需要其他版本請登錄https://hub.docker.com/進行搜索

[root@localhost ~]#  docker pull redis

2 下載完畢後分別創建/home/docker/redis/data、redis-6379-data、redis-6380-data、redis-6381-data、sentinel-26379-data、sentinel-26380-data、sentinel-26381-data這十個文件夾

[root@localhost ~]# cd /home

[root@localhost home]# mkdir docker

[root@localhost home]# cd docker

[root@localhost docker]# mkdir redis

[root@localhost docker]# cd redis

[root@localhost redis]# mkdir redis-6379-data

[root@localhost redis]# mkdir redis-6380-data

[root@localhost redis]# mkdir redis-6381-data

[root@localhost redis]# mkdir sentinel-26379-data

[root@localhost redis]# mkdir sentinel-26380-data

[root@localhost redis]# mkdir sentinel-26381-data

3 再創建redis-6379.conf、redis-6380.conf、redis-6381.conf這三個自定義redis配置文件,用來配置redis,其中redis-6379.conf是master服務器配置文件,redis-6380.conf、redis-6381.conf 是slave服務器配置文件

[root@localhost redis]# touch redis-6379.conf

[root@localhost redis]# touch redis-6380.conf

[root@localhost redis]# touch redis-6381.conf

4 vi編輯自定義redis配置文件,複製下列代碼

4.1 redis-6379.conf文件複製:

port 6379

logfile "redis-6379.log"

dir /data

appendonly yes

appendfilename appendonly.aof

masterauth 123456

requirepass 123456

4.2 redis-6380.conf文件複製:

port 6380

logfile "redis-6380.log"

dir /data

appendonly yes

appendfilename appendonly.aof

slaveof 192.168.43.188 6379

masterauth 123456

requirepass 123456

4.2 redis-6381.conf文件複製:

port 6381

logfile "redis-6381.log"

dir /data

appendonly yes

appendfilename appendonly.aof

slaveof 192.168.43.188 6379

masterauth 123456

requirepass 123456

5 按Esc後,輸入wq保存退出
6 啓動三個redis容器

[root@localhost redis]# docker run -p 6379:6379 --net=host --restart=always --name redis-6379 -v /home/docker/redis/redis-6379.conf:/etc/redis/redis-6379.conf -v /home/docker/redis/redis-6379-data:/data -d redis redis-server /etc/redis/redis-6379.conf
[root@localhost redis]# docker run -p 6380:6380 --net=host --restart=always --name redis-6380 -v /home/docker/redis/redis-6380.conf:/etc/redis/redis-6380.conf -v /home/docker/redis/redis-6380-data:/data -d redis redis-server /etc/redis/redis-6380.conf
[root@localhost redis]# docker run -p 6381:6381 --net=host --restart=always --name redis-6381 -v /home/docker/redis/redis-6381.conf:/etc/redis/redis-6381.conf -v /home/docker/redis/redis-6381-data:/data -d redis redis-server /etc/redis/redis-6381.conf

6.1 以下爲啓動命令說明和注意事項,屬於延伸閱讀,有時間和興趣可以看一下,不屬於配置過程,執行配置請直接跳到步驟 7

6.1.1 命令參數:-v /home/docker/redis/redis-6379-data:/data 讓我們回顧一下,剛纔在自定義redis配置文件中還指定了dir/data,dir表示數據存儲目錄,現在回到該命令中來,該命令是將redis容器中,redis配置文件中指定的數據存儲目錄/data下文件的內容共享到宿主機/home/docker/redis/redis-6379-data目錄下

6.1.1.1 爲何必須掛載 /data 目錄?有狀態容器都有數據持久化需求,在容器的生命週期內,數據持久化是持續的,包括容器在被停止後,但當容器被刪除後,數據也隨之被刪除了,因此Docker 採用 volume (卷)的形式來向容器提供持久化存儲,如果不設置該命令,數據庫中的數據會默認保存在redis容器中的/data目錄下,這樣當執行 docker rm 容器id/容器name 命令,會丟失數據庫中的數據

7 啓動redis容器以後查看redis容器狀態

[root@localhost redis]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED              STATUS
19fb5e8cd1b0        redis               "docker-entrypoint..."   4 seconds ago       Up 2 seconds 

7.1 如果STATUS狀態是Up表示成功啓動容器,如果STATUS狀態是Exited (1) 或者 Restarting (1) 表示未能正常啓動,這時候我們需要查看redis容器日誌修改配置文件內容重新運行容器

[root@localhost redis]# docker logs redis-6379|less

7.2 查找出問題後停止redis容器

[root@localhost redis]# docker stop redis-6379

7.3 刪除redis容器

[root@localhost redis]# docker rm redis-6379

7.3 重新執行步驟 6

8 啓動redis容器後,分別觀察三個redis容器內部情況

[root@localhost redis]# docker exec -it redis-6379 /bin/bash

root@zhangqian527halbin:/data# redis-cli

127.0.0.1:6379> auth 123456

ok

127.0.0.1:6379> info replication

8.1 主機顯示

# Replication

role:master

connected_slaves:2

slave0:ip=172.17.0.1,port=6379,state=online,offset=707,lag=0

slave1:ip=172.17.0.1,port=6379,state=online,offset=707,lag=0

master_replid:db3135b2f4cba8e6c1eb4be290b9dbfc2ec3b6d0

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:707

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:707

8.2 兩臺從機顯示

role:slave

master_host:192.168.43.188

master_port:6379

master_link_status:up

master_last_io_seconds_ago:8

master_sync_in_progress:0

slave_repl_offset:833

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:db3135b2f4cba8e6c1eb4be290b9dbfc2ec3b6d0

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:833

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:833

8.3 看到主機role:master、connected_slaves:2,兩臺從機role:slave、master_host有地址,可以確認redis主從模式已經建立成功

9 使用RedisDesktopManager連接三個redis進行測試

9.1 右鍵redis-6379選擇Console,控制檯輸入redis命令

image.png

9.2 分別右鍵redis-6380、redis-6381選擇Reload後,可以看到這兩個redis自動同步了數據,說明redis主從模式配置成功

image.png

10 配置哨兵模式,主機上創建sentinel-26379.conf、sentinel-26380。c哨兵配置文件

[root@localhost redis]# touch sentinel-26379.conf

[root@localhost redis]# touch sentinel-26380.conf

[root@localhost redis]# touch sentinel-26381.conf

11 vi編輯自定義redis配置文件,複製下列代碼
複製後一定要對比原文,因爲編輯器帶格式,複製時容易落下部分內容,複製分後一定要對比原文!!!

4.1 sentinel-26379.conf文件複製:

port 26379

dir "/data"

logfile "sentinel-26379.log"

sentinel monitor mymaster 192.168.43.188 6379 2

sentinel down-after-milliseconds mymaster 10000

sentinel failover-timeout mymaster 60000

sentinel auth-pass mymaster 123456

4.2 sentinel-26380.conf文件複製:

port 26380

dir "/data"

logfile "sentinel-26380.log"

sentinel monitor mymaster 192.168.43.188 6379 2

sentinel down-after-milliseconds mymaster 10000

sentinel failover-timeout mymaster 60000

sentinel auth-pass mymaster 123456

4.3 sentinel-26381.conf文件複製:

port 26381

dir "/data"

logfile "sentinel-26381.log"

sentinel monitor mymaster 192.168.43.188 6379 2

sentinel down-after-milliseconds mymaster 10000

sentinel failover-timeout mymaster 60000

sentinel auth-pass mymaster 123456

12 啓動哨兵模式:

[root@local redis]# docker run -p 26379:26379 --restart=always --name sentinel-26379 -v/home/docker/redis/sentinel-26379.conf:/etc/redis/sentinel.conf -v /home/docker/redis/sentinel-26379-data:/data -d redis redis-sentinel /etc/redis/sentinel.conf

[root@local redis]# docker run -p 26380:26380 --restart=always --name sentinel-26380 -v/home/docker/redis/sentinel-26380.conf:/etc/redis/sentinel.conf -v /home/docker/redis/sentinel-26380-data:/data -d redis redis-sentinel /etc/redis/sentinel.conf

[root@local redis]# docker run -p 26381:26381 --restart=always --name sentinel-26381 -v/home/docker/redis/sentinel-26381.conf:/etc/redis/sentinel.conf -v /home/docker/redis/sentinel-26381-data:/data -d redis redis-sentinel /etc/redis/sentinel.conf

13 啓動哨兵模式以後查看哨兵容器狀態

[root@localhost redis]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED              STATUS
19fb5e8cd1b0        redis               "docker-entrypoint..."   4 seconds ago       Up 2 seconds 

13.1 如果STATUS狀態是Up表示成功啓動哨兵容器,如果不是請重新執行步驟 7.1

14 至此,哨兵模式已經建立起來,查看哨兵信息

[root@localhost redis]# docker exec -it sentinel-26379 /bin/bash

root@zhangqian527halbin:/data# redis-cli -p 26379

127.0.0.1:26379>  info sentinel

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=mymaster,status=ok,address=192.168.43.188:6379,slaves=2,sentinels=3

15 可以看到,現在端口號爲:6379的redis服務器是master服務器,這時我們關閉端口號爲6379的redis-6379容器測試哨兵配置是否生效

[root@localhost redis]# docker stop redis-6379

16 然後再查看哨兵信息,哨兵模式下,當master服務器宕機之後,哨兵自動會在從slave redis服務器裏面投票選舉一個master服務器來,這個master服務器也可以進行讀寫操作

[root@localhost redis]# docker exec -it sentinel-26379 /bin/bash

root@zhangqian527halbin:/data# redis-cli -p 26379

127.0.0.1:26379>  info sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=mymaster,status=ok,address=192.168.43.188:6380,slaves=2,sentinels=3

17 可以看到端口號爲:6380的redis服務器已經變成master服務器了,說明哨兵配置成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章