宣告:主從複製跟叢集是有區別的,而現在講的是主從複製
分別建立redis、redis-sentinel資料夾
cd redis
mkdir master slave1 slave2 #分別建立master、slave1、slave2資料夾
cd master
mkdir config data #分別建立config、data資料夾
可以到redis官網下載redis.conf檔案,並把該配置檔案複製到master、slave1、slave2資料夾中的config檔案裡去
開始建立redis的docker-compose檔案
cd redis
touch docker-compose.yml
####以下是docker-composer.yml的內容#####
version: '3'
services:
master:
image: redis:latest
container_name: redis_master #master節點
volumes:
- ./master/config/redis.conf:/etc/redis/redis.conf
- ./master/data:/data
command: /bin/bash -c "redis-server /etc/redis/redis.conf" #這句話就是要載入這個路徑下的配置
environment:
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
ports:
- "6379:6379"
slave1:
image: redis:latest
container_name: redis_slave_1 #slave1節點
volumes:
- ./slave1/config/redis.conf:/etc/redis/redis.conf
- ./slave1/data:/data
command: /bin/bash -c "redis-server /etc/redis/redis.conf"
environment:
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
ports:
- "6380:6379"
slave2:
image: redis:latest
container_name: redis_slave_2 #slave2節點
volumes:
- ./slave2/config/redis.conf:/etc/redis/redis.conf
- ./slave2/data:/data
command: /bin/bash -c "redis-server /etc/redis/redis.conf"
environment:
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
ports:
- "6381:6379"
修改每一個redis.conf配置檔案
找到以下程式碼的位置,並修改
bind 0.0.0.0 #這個一定要設定0.0.0.0,不然別的機器訪問不了
protected-mode yes #建議配置主從最好有密碼,畢竟線上配置都是設定密碼的,何不完整學習呢
requirepass 123456 #設定密碼
以上的配置3個redis.conf配置一致,以下就只需要配置從節點的配置檔案即可
replica-read-only yes #這個配置後面會說到
slaveof 172.16.0.08 6379 #配置主節點的ip ,埠
masterauth 123456 #因為主節點設定了密碼,必須設定這個,否者連不上主節點
啟動redis主從節點
cd redis
docker-compose up -d #啟動
如圖啟動成功
進入主節點的容器,可以檢視相關資訊
docker exec -it 容器id bash
#進入容器後
redis-cli -p 6379
auth 123456 #這步是輸入密碼,就是配置檔案的密碼
info replication #這個命令可以查replication的相關資訊
可以看到當前容器的角色是什麼,role:master
如果是主節點,可以看到當前連線了幾個從節點,connected_slaves:2
有這兩個資訊就表示已經主從複製成功
這個是從節點的資訊
就此主從複製已經完成,可以用rdm測試一下結果,測試時只能在主節點寫入,然後從節點會同步資料,如果在從節點寫入,會報這個錯誤 “READONLY You can’t write against a read only replica.”,這是因為在從節點配置檔案中配置了replica-read-only yes,從節點只能讀不能寫
配置哨兵
cd redis-sentinel
mkdir sentinel1 sentinel2 sentinel3 #建立3個資料夾
touch sentinel.conf
vim sentinel.conf
#寫下一下配置
##這是哨兵的預設埠
port 26379
dir /tmp
##監聽master主節點,myredismaster可以隨便改成你喜歡的名字,ip 埠 只有的2是指明當有多少個sentinel認為一個master失效時,master才算真正失效,我這裡有3臺哨兵,當有2臺確認失效就切換主從
sentinel monitor myredismaster 172.16.0.8 6379 2
##主從密碼要一直,這是切換主從用到的密碼
sentinel auth-pass myredismaster 123456
##這個配置項指定了需要多少失效時間,一個master才會被這個sentinel主觀地認為是不可用的。 單位是毫秒,預設為30秒
sentinel down-after-milliseconds myredismaster 30000
##這個配置項指定了在發生failover主備切換時最多可以有多少個slave同時對新的master進行 同步,可以通過將這個值設為 1 來保證每次只有一個slave 處於不能處理命令請求的狀態。
sentinel parallel-syncs myredismaster 1
sentinel failover-timeout myredismaster 180000
sentinel deny-scripts-reconfig yes
配置成功後,把sentinel.conf配置複製到sentinel1、sentinel2、sentinel3中
配置redis-sentinel的docker-compose.yml
version: '3'
services:
sentinel1:
image: redis:latest
container_name: redis_sentinel_1
ports:
- "26379:26379"
volumes:
- ./sentinel1/sentinel.conf:/usr/local/etc/redis/sentinel.conf
command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"
sentinel2:
image: redis:latest
container_name: redis_sentinel_2
ports:
- "26380:26379"
volumes:
- ./sentinel2/sentinel.conf:/usr/local/etc/redis/sentinel.conf
command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"
sentinel3:
image: redis:latest
container_name: redis_sentinel_3
ports:
- "26381:26379"
volumes:
- ./sentinel3/sentinel.conf:/usr/local/etc/redis/sentinel.conf
command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"
cd redis-sentinel
docker-compose up -d #啟動哨兵
啟動成功輸入sentinel master myredismaster
可返回圖上資訊
注意:手動關閉了redis-master容器後,他不會立刻切換到從分支,因為配置檔案了30秒才會被sentinel主觀認為失效,我就是以為會立刻切換,一直沒切換我以為配置不成功,白忙活了好久,隔了一段時間再檢視才發現成功了,提醒讀者避坑
本作品採用《CC 協議》,轉載必須註明作者和本文連結