Docker可以很方便的進(jìn)行服務(wù)部署和管理,下面我們通過(guò)docker來(lái)搭建Redis的單機(jī)模式、Redis主從復(fù)制、Redis哨兵模式、Redis-Cluster模式
一、在Docker上安裝單機(jī)版Redis
首先需要先在服務(wù)器上安裝docker Docker安裝教程 、Docker命令快速入門;
拉取鏡像
docker pull redis
啟動(dòng)Redis
docker run -d -v $PWD/data:/data --name redis -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes
啟動(dòng)命令說(shuō)明:
-
$PWD/data:/data: 映射redis的data目錄到當(dāng)前目錄下的data目錄 -
--requirepass: 是設(shè)置redis的密碼 -
--appendonly yes: 啟用持久化存儲(chǔ)
例如:
docker run -d -v /home/app/redis/data:/data --name redis -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes
如果需要使用配置文件,則需要做個(gè)文件映射;注意所在目錄下必須要有redis.conf這個(gè)文件,否則將啟動(dòng)失敗。
docker run -d -v /home/app/redis/data:/data -v /home/app/redis/conf:/usr/local/etc/redis --name redis -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf
redis的這個(gè)配置文件可以到官方的這個(gè)地址上去獲取 http://download.redis.io/redis-stable
啟動(dòng)成功連接失敗的問(wèn)題
- 如果是阿里云 或者是騰訊云 這些云服務(wù)器;那么還需要配置安全組,將redis的連接端口6379開(kāi)放,否則將無(wú)法連接。
- 服務(wù)器開(kāi)啟了防火墻;這種情況需要使用命令讓防火墻打開(kāi)端口;注意啟動(dòng)或關(guān)閉防火墻后docker也需要重啟才能生效;下面是常用命令:
# 查看防火墻狀態(tài)
systemctl status firewalld
# 禁用防火墻
systemctl disable firewalld
# 開(kāi)啟防火墻
systemctl start firewalld
# 關(guān)閉防火墻
systemctl stop firewalld
# 查看已開(kāi)啟的端口
firewall-cmd --zone=public --list-ports
# 添加端口
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
- 其他情況:?jiǎn)?dòng)有錯(cuò)誤,查看啟動(dòng)日志;redis綁定了端口,導(dǎo)致只有本地可以訪問(wèn);
二、在Docker上搭建Redis主從復(fù)制
Redis主從復(fù)制模式就是采用讀寫分離的模式,因?yàn)橥ǔWx取數(shù)據(jù)的時(shí)候比較多,寫入數(shù)據(jù)的時(shí)候少以此來(lái)提高性能;但是一旦主節(jié)點(diǎn)掛了,整個(gè)集群就只能提供讀取的服務(wù)了,因此缺乏高可用性。
搭建步驟和上面單機(jī)版的一樣,只是后面需要做相關(guān)的集群配置
啟動(dòng)容器
分別在3臺(tái)服務(wù)器上啟動(dòng)redis容器,端口號(hào)為6379
mkdir -p /home/app/redis-rw/data
docker run -d -v /home/app/redis-rw/data:/data --name redis-rw -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes --masterauth "123456"
在一臺(tái)服務(wù)器上做實(shí)驗(yàn)的注意點(diǎn)
需要讓容器間可以相互訪問(wèn),好像需要在防火墻上開(kāi)啟對(duì)應(yīng)的端口號(hào);但是不建議這樣搞,只是實(shí)驗(yàn)可以試哈,實(shí)際使用不要這樣弄(因?yàn)檫@樣的集群沒(méi)有意義)。
配置redis集群
通過(guò)docker交互命令登陸redis;為了方便這里直接用容器名稱(可以使用容器ID)
docker exec -it redis-rw redis-cli

如果redis設(shè)置了認(rèn)證密碼,則登陸進(jìn)去了使用
auth 密碼進(jìn)行認(rèn)證;然后使用info replication命令查看redis的信息,可以看到都是master節(jié)點(diǎn)
現(xiàn)在我們將redis-c1這個(gè)容器作為master節(jié)點(diǎn);因此我們分別登陸到其它的redis容器中執(zhí)行如下命令(下面的命令就相當(dāng)于在配置文件中添加相關(guān)配置):
# 這里是設(shè)置跟隨哪臺(tái)機(jī)器
SLAVEOF 192.168.56.102 6379
設(shè)置主節(jié)點(diǎn)訪問(wèn)密碼;由于我們?cè)趩?dòng)參數(shù)上已經(jīng)設(shè)置了--masterauth參數(shù),因此這里就不用再設(shè)置
# 由于我們?cè)O(shè)置了訪問(wèn)密碼,因此需要設(shè)置主節(jié)點(diǎn)的訪問(wèn)密碼;否則從節(jié)點(diǎn)將無(wú)法訪問(wèn)主節(jié)點(diǎn)信息
config set masterauth 123456
# 如果是使用配置文件來(lái)啟動(dòng),再加上下面的這條命令將其重新寫入配置文件中
config rewrite
# 如果修改或設(shè)置密碼可以使用這個(gè)命令
config set requirepass 密碼
如果設(shè)置redis密碼,就是必須設(shè)置masterauth的值;否則將出現(xiàn)這個(gè)錯(cuò)誤:
Master does not understand REPLCONF listening-port: -NOAUTH Authentication required.
三、在Docker上搭建Sentinel模式
文章參考:https://blog.csdn.net/miss1181248983/article/details/90056960
主從模式的弊端就是不具備高可用性,當(dāng)master掛掉以后,Redis將不能再對(duì)外提供寫入操作,因此sentinel應(yīng)運(yùn)而生。
Sentinel即哨兵,它主要是用來(lái)監(jiān)控redis主從節(jié)點(diǎn)的運(yùn)行狀態(tài),用于解決在master節(jié)點(diǎn)掛了后選舉出新的主節(jié)點(diǎn),保證整個(gè)集群可以繼續(xù)提供寫數(shù)據(jù)的能力。
Sentinel模式具有以下特點(diǎn):
- sentinel模式是建立在主從模式的基礎(chǔ)上,如果只有一個(gè)Redis節(jié)點(diǎn),sentinel就沒(méi)有任何意義;
- 當(dāng)master掛了以后,sentinel會(huì)在slave中選擇一個(gè)做為master,其他slave的會(huì)指向新的master;
- 當(dāng)master重新啟動(dòng)后,它將不再是master而是做為slave接收新的master的同步數(shù)據(jù);
- sentinel因?yàn)橐彩且粋€(gè)進(jìn)程有掛掉的可能,所以sentinel也會(huì)啟動(dòng)多個(gè)形成一個(gè)sentinel集群;
- 多sentinel配置的時(shí)候,sentinel之間也會(huì)自動(dòng)監(jiān)控;
- 當(dāng)主從模式配置密碼時(shí),sentinel也會(huì)同步將配置信息修改到配置文件中,不需要擔(dān)心;
- 一個(gè)sentinel或sentinel集群可以管理多個(gè)主從Redis,多個(gè)sentinel也可以監(jiān)控同一個(gè)redis;
- sentinel最好不要和Redis部署在同一臺(tái)機(jī)器,不然Redis的服務(wù)器掛了以后,sentinel也掛了;
Sentinel模式的工作機(jī)制:
- 每個(gè)sentinel以每秒鐘一次的頻率向它所知的master,slave以及其他sentinel實(shí)例發(fā)送一個(gè) PING 命令;
- 如果一個(gè)實(shí)例距離最后一次有效回復(fù) PING 命令的時(shí)間超過(guò)
down-after-milliseconds選項(xiàng)所指定的值, 則這個(gè)實(shí)例會(huì)被sentinel標(biāo)記為主觀下線; - 如果一個(gè)master被標(biāo)記為主觀下線,則正在監(jiān)視這個(gè)master的所有sentinel要以每秒一次的頻率確認(rèn)master的確進(jìn)入了主觀下線狀態(tài);
- 當(dāng)有足夠數(shù)量的sentinel(大于等于配置指定的值)在指定的時(shí)間范圍內(nèi)確認(rèn)master的確進(jìn)入了主觀下線狀態(tài), 則master會(huì)被標(biāo)記為客觀下線;
- 在一般情況下, 每個(gè)sentinel會(huì)以每 10 秒一次的頻率向它已知的所有master,slave發(fā)送 INFO 命令;
- 當(dāng)master被sentinel標(biāo)記為客觀下線時(shí),sentinel向下線的master的所有slave發(fā)送 INFO 命令的頻率會(huì)從 10 秒一次改為 1 秒一次;
- 若沒(méi)有足夠數(shù)量的sentinel同意master已經(jīng)下線,master的客觀下線狀態(tài)就會(huì)被移除;若master重新向sentinel的 PING 命令返回有效回復(fù),master的主觀下線狀態(tài)就會(huì)被移除;
當(dāng)使用sentinel模式的時(shí)候,客戶端就不要直接連接Redis,而是連接sentinel的ip和port,由sentinel來(lái)提供具體的可提供服務(wù)的Redis實(shí)現(xiàn),這樣當(dāng)master節(jié)點(diǎn)掛掉以后,sentinel就會(huì)感知并將新的master節(jié)點(diǎn)提供給使用者。
開(kāi)始部署Sentinel模式的Redis集群
現(xiàn)在準(zhǔn)備一個(gè)主從模式的集群,然后開(kāi)始搭建Sentinel服務(wù);為了保證高可用我們將Sentinel也是使用集群模式搭建,使用3臺(tái)服務(wù)器來(lái)搭建集群,在每臺(tái)機(jī)器上都部署一臺(tái)。
下載和修改sentinel配置文件
mkdir -p /home/app/redis/conf
cd /home/app/redis/conf
wget http://download.redis.io/redis-stable/sentinel.conf
修改sentinel.conf配置文件
# 配置主節(jié)點(diǎn)的信息
sentinel monitor mymaster 192.168.56.105 6379 2
# sentinel的訪問(wèn)地址
requirepass 123456
# 配置主節(jié)點(diǎn)的訪問(wèn)密碼
sentinel auth-pass mymaster 123456
啟動(dòng)Sentinel
docker run -d -v /home/app/redis-sentinel/data:/data -v /home/app/redis/conf:/usr/local/etc/redis --name redis-sentinel -p 26379:26379 redis redis-sentinel /usr/local/etc/redis/sentinel.conf --appendonly yes
啟動(dòng)成功后就可以直接通過(guò)Sentinel的端口進(jìn)行鏈接了,Sentinel會(huì)返回當(dāng)前主節(jié)點(diǎn)信息
四、在Docker上搭建Redis Cluster模式
我們使用Sentinel模式搭建的redis集群雖然解決了高可用的問(wèn)題,但是最終也只有一個(gè)主節(jié)點(diǎn);
當(dāng)業(yè)務(wù)量大的時(shí)候會(huì)產(chǎn)生如下問(wèn)題:
- 并發(fā)寫的請(qǐng)求增高;
- 數(shù)據(jù)量增大;此時(shí)需要考慮數(shù)據(jù)分片存儲(chǔ)了;
- 單個(gè)服務(wù)器的網(wǎng)卡上限達(dá)到瓶頸;
由此單個(gè)主從復(fù)制就無(wú)法滿足需求了,因此Redis Cluster模式登場(chǎng)了;
Redis Cluster是分布式架構(gòu):即Redis Cluster中有多個(gè)節(jié)點(diǎn)(主從復(fù)制節(jié)點(diǎn)),每個(gè)節(jié)點(diǎn)都負(fù)責(zé)進(jìn)行數(shù)據(jù)讀寫操作;每個(gè)節(jié)點(diǎn)之間會(huì)進(jìn)行通信。簡(jiǎn)單來(lái)說(shuō)就是多個(gè)主從復(fù)制節(jié)點(diǎn)集群提供服務(wù)。
集群要求
- Redis集群至少需要3個(gè)節(jié)點(diǎn),因?yàn)橥镀比蒎e(cuò)機(jī)制要求超過(guò)半數(shù)節(jié)點(diǎn)認(rèn)為某個(gè)節(jié)點(diǎn)掛了該節(jié)點(diǎn)才是掛了,所以2個(gè)節(jié)點(diǎn)無(wú)法構(gòu)成集群。
- 要保證集群的高可用,需要每個(gè)節(jié)點(diǎn)都有從節(jié)點(diǎn),也就是備份節(jié)點(diǎn),所以Redis集群至少需要6臺(tái)服務(wù)器。
部署集群
我們?cè)诿颗_(tái)機(jī)器上執(zhí)行如下命令來(lái)創(chuàng)建6個(gè)redis服務(wù)
docker run -d -v /home/app/redis-cluster/data:/data --name redis-cluster -p 6379:6379 -p 16379:16379 redis redis-server --requirepass "123456" --appendonly yes --masterauth "123456" --cluster-enabled yes
后面這個(gè)16379端口使用redis集群間進(jìn)行數(shù)據(jù)通訊的端口,它是在你設(shè)置的redis訪問(wèn)端口上+10000;
如果向使用配置文件實(shí)現(xiàn)可以修改redis.conf配置中集群相關(guān)配置即可,獲取redis.conf配置:
wget http://download.redis.io/redis-stable/redis.conf
在上面的命令需要加上配置文件路徑映射,下面是示例命令
docker run -d -v /home/app/redis-cluster/data:/data -v /home/app/redis/conf:/usr/local/etc/redis --name redis-c1 -p 6381:6379 -p 16379:16379 redis redis-server /usr/local/etc/redis/redis.conf
下面開(kāi)始集群的配置,直接使用redis-cli創(chuàng)建集群即可;
docker exec -it redis-cluster /bin/bash
redis-cli --cluster create 192.168.56.101:6379 192.168.56.102:6379 192.168.56.103:6379 192.168.56.104:6379 192.168.56.105:6379 192.168.56.106:6379 --cluster-replicas 1 -a 123456
參數(shù)最后加
-a是因?yàn)槲覀冊(cè)O(shè)置了密碼,因此需要加上訪問(wèn)密碼;之后輸入yes即可。
注意如果在一臺(tái)機(jī)器上搞的docker需要使用host模式的網(wǎng)絡(luò)連接類型才行,在創(chuàng)建的時(shí)候需要使用docker容器的IP;我們通過(guò)docker inspect 容器ID命令獲取容器的IP。