- 創(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);



