docker redis 1主2從+3哨兵

  • 創(chuàng)建:redis.conf
# 為了方便,所有密碼可以都設(shè)置相同的
requirepass yourPassword
# 為了方便,所有密碼可以都設(shè)置相同的            
masterauth masterPassword           
#關(guān)閉保護(hù)模式
protected-mode no
#開啟后,Redis會(huì)把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件,每次啟動(dòng)時(shí)Redis都會(huì)先把這個(gè)文件的數(shù)據(jù)讀入內(nèi)存里
appendonly yes
  • 在/data/redis-data路經(jīng)下創(chuàng)建三個(gè)文件夾,node1,node2,node3 并且把redis.conf分別復(fù)制到三個(gè)文件夾中各一份。

  • 運(yùn)行主節(jié)點(diǎn)容器(主)

docker run --name redis1 -v /data/redis-data/node1/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 -p 26379:26379  redis redis-server /usr/local/etc/redis/redis.conf
  • 生成容器后運(yùn)行:
docker inspect 容器id
image.png
  • node2和node3文件夾內(nèi)配置修改文件redis.conf
# 為了方便,所有密碼可以都設(shè)置相同的
requirepass yourPassword      
# 為了方便,所有密碼可以都設(shè)置相同的      
masterauth masterPassword           
#關(guān)閉保護(hù)模式
protected-mode no
#主容器獲得
replicaof 172.18.0.2 6379
appendonly yes
  • (從)運(yùn)行從節(jié)點(diǎn)倆容器
docker run --name redis2 -v /data/redis-data/node2/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6380:6379 -p 26380:26380  redis redis-server /usr/local/etc/redis/redis.conf
docker run --name redis3 -v /data/redis-data/node3/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6381:6379 -p 26381:26381  redis redis-server /usr/local/etc/redis/redis.conf
  • 分別進(jìn)入三臺(tái)容器運(yùn)行:
docker exec -it redis1 bash
redis-cli
info Replication
image.png
  • 我們會(huì)看到每臺(tái)服務(wù)器都是主節(jié)點(diǎn),這時(shí)候,我們要在第二個(gè)容器和三個(gè)容器內(nèi)修改一下
#第二臺(tái)
docker exec -it redis2 bash
redis-cli
SLAVEOF 172.18.0.2 6379
image.png
#第三臺(tái)
docker exec -it redis3 bash
redis-cli
SLAVEOF 172.18.0.2 6379
image.png
  • 這時(shí)候我們?cè)诨氐降谝慌_(tái)容器看看,出現(xiàn)了兩臺(tái)叢節(jié)點(diǎn)
docker exec -it redis1 bash
redis-cli
info Replication
image.png
  • 測(cè)試一下 在主節(jié)點(diǎn)設(shè)置,從節(jié)點(diǎn)是否同步。從節(jié)點(diǎn)只有讀的權(quán)限,沒(méi)有寫的權(quán)限


    image.png

sentinel 配置[redis哨兵]

  • 在node1,node2,node3文件夾下分別創(chuàng)建sentinel.conf文件
#node1/sentinel.conf  [port:指定哨兵監(jiān)聽端口,dir:#sentinel工作目錄,logfile:#日志文件,sentinel monitor nameL#啟動(dòng)哨兵(名稱:name) 監(jiān)聽master,daemonize:#后臺(tái)運(yùn)行]
port 26379 
dir "/data"
logfile "26379.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****開始redis.conf配置的密碼
sentinel failover-timeout nameh 180000
daemonize yes
#node2/sentinel.conf  [port:指定哨兵監(jiān)聽端口,dir:#sentinel工作目錄,logfile:#日志文件,sentinel monitor nameL#啟動(dòng)哨兵(名稱:name) 監(jiān)聽master,daemonize:#后臺(tái)運(yùn)行]
port 26380
dir "/data"
logfile "26380.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****開始redis.conf配置的密碼
sentinel failover-timeout nameh 180000
daemonize yes
#node3/sentinel.conf  [port:指定哨兵監(jiān)聽端口,dir:#sentinel工作目錄,logfile:#日志文件,sentinel monitor nameL#啟動(dòng)哨兵(名稱:name) 監(jiān)聽master,daemonize:#后臺(tái)運(yùn)行]
port 26381
dir "/data"
logfile "26381.log"
sentinel monitor nameh 172.18.0.2 6379 2
sentinel auth-pass nameh ****開始redis.conf配置的密碼
sentinel failover-timeout nameh 180000
daemonize yes
  • 然后分別把不同的sentinel.conf 拷貝到相對(duì)應(yīng)的容器內(nèi)
docker cp /data/redis-data/node1/sentinel.conf 容器ID:/data
docker cp /data/redis-data/node2/sentinel.conf 容器ID:/data
docker cp /data/redis-data/node3/sentinel.conf 容器ID:/data
  • 分別進(jìn)入容器內(nèi)/data 路徑下,看是否有sentinel.conf 文件 如果存在就啟動(dòng):
    redis-sentinel sentinel.conf

  • 如果想開是否啟動(dòng)成功可以

apt-get update

apt-get install procps

ps -ef
image.png
  • 再測(cè)試一下, 停止主節(jié)點(diǎn)容器看其他節(jié)點(diǎn)容器會(huì)頂替主節(jié)點(diǎn)嗎?先停掉第一臺(tái),等30秒。


    image.png
  • 第二臺(tái)容器已經(jīng)顯示主節(jié)點(diǎn)掛掉了,稍等一下再看看。


    image.png
  • 第二臺(tái)選擇又提示主節(jié)點(diǎn)啟動(dòng)了,目前第二臺(tái)還是從節(jié)點(diǎn),那應(yīng)該是隨機(jī)把第三臺(tái)變成了主節(jié)點(diǎn)。去看下。


    image.png
  • 第三臺(tái)顯示成為主節(jié)點(diǎn)。到此結(jié)束。

PHP 鏈接哨兵

參考文檔:https://segmentfault.com/a/1190000011185598

image.png

#前提是php安裝了redis擴(kuò)展
$redis = new Redis();  
//連接sentinel服務(wù) host為ip,port為端口
$redis->connect("host", "port");
//獲取主庫(kù)列表及其狀態(tài)信息
$result = $redis->rawCommand('SENTINEL', 'masters');
print_r($result);

//根據(jù)所配置的主庫(kù)redis名稱獲取對(duì)應(yīng)的信息
//master_name應(yīng)該由運(yùn)維告知(也可以由上一步的信息中獲取)
$result1 = $redis->rawCommand('SENTINEL', 'master', $master_name);
print_r($result1);

//根據(jù)所配置的主庫(kù)redis名稱獲取其對(duì)應(yīng)從庫(kù)列表及其信息
$result2 = $redis->rawCommand('SENTINEL', 'slaves', $master_name);
print_r($result2);

//獲取特定名稱的redis主庫(kù)地址
$result3 = $redis->rawCommand('SENTINEL', 'get-master-addr-by-name', $master_name);
print_r($result3);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容