Docker可以很方便的進行服務部署和管理,下面我們通過docker來搭建Redis的單機模式、Redis主從復制、Redis哨兵模式、Redis-Cluster模式
一、在Docker上安裝單機版Redis
首先需要先在服務器上安裝docker Docker安裝教程 、Docker命令快速入門;
拉取鏡像
docker pull redis
啟動Redis
docker run -d -v $PWD/data:/data --name redis -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes
啟動命令說明:
$PWD/data:/data
: 映射redis的data目錄到當前目錄下的data目錄--requirepass
: 是設置redis的密碼--appendonly yes
: 啟用持久化存儲
例如:
docker run -d -v /home/app/redis/data:/data --name redis -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes
如果需要使用配置文件,則需要做個文件映射;注意所在目錄下必須要有redis.conf這個文件,否則將啟動失敗。
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的這個配置文件可以到官方的這個地址上去獲取 http://download.redis.io/redis-stable
啟動成功連接失敗的問題
- 如果是阿里雲 或者是騰訊雲 這些雲服務器;那么還需要配置安全組,將redis的連接端口6379開放,否則將無法連接。
- 服務器開啟了防火牆;這種情況需要使用命令讓防火牆打開端口;注意啟動或關閉防火牆后docker也需要重啟才能生效;下面是常用命令:
# 查看防火牆狀態
systemctl status firewalld
# 禁用防火牆
systemctl disable firewalld
# 開啟防火牆
systemctl start firewalld
# 關閉防火牆
systemctl stop firewalld
# 查看已開啟的端口
firewall-cmd --zone=public --list-ports
# 添加端口
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
- 其他情況:啟動有錯誤,查看啟動日志;redis綁定了端口,導致只有本地可以訪問;
二、在Docker上搭建Redis主從復制
Redis主從復制模式就是采用讀寫分離的模式,因為通常讀取數據的時候比較多,寫入數據的時候少以此來提高性能;但是一旦主節點掛了,整個集群就只能提供讀取的服務了,因此缺乏高可用性。
搭建步驟和上面單機版的一樣,只是后面需要做相關的集群配置
啟動容器
分別在3台服務器上啟動redis容器,端口號為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"
在一台服務器上做實驗的注意點
需要讓容器間可以相互訪問,好像需要在防火牆上開啟對應的端口號;但是不建議這樣搞,只是實驗可以試哈,實際使用不要這樣弄(因為這樣的集群沒有意義)。
在一台機器上做的話,就像需要使用docker給容器分配的IP;通過如下命令查看容器的IP:
docker inspect 容器ID
里面的IPAddress就是容器的IP;我這里的是如下所示的
redis-c1 172.17.0.2
redis-c1 172.17.0.3
redis-c1 172.17.0.4
配置redis集群
通過docker交互命令登陸redis;為了方便這里直接用容器名稱(可以使用容器ID)
docker exec -it redis-rw redis-cli
如果redis設置了認證密碼,則登陸進去了使用
auth 密碼
進行認證;然后使用info replication
命令查看redis的信息,可以看到都是master節點
現在我們將其中一台服務器作為master節點;因此我們分別登陸到其它的redis容器中執行如下命令(下面的命令就相當於在配置文件中添加相關配置):
# 這里是設置跟隨哪台機器
SLAVEOF 192.168.56.102 6379
設置主節點訪問密碼;由於我們在啟動參數上已經設置了--masterauth
參數,因此這里就不用再設置
# 由於我們設置了訪問密碼,因此需要設置主節點的訪問密碼;否則從節點將無法訪問主節點信息
config set masterauth 123456
# 如果是使用配置文件來啟動,再加上下面的這條命令將其重新寫入配置文件中
config rewrite
# 如果修改或設置密碼可以使用這個命令
config set requirepass 密碼
如果設置redis密碼,就是必須設置masterauth的值;否則將出現這個錯誤:
Master does not understand REPLCONF listening-port: -NOAUTH Authentication required.
三、在Docker上搭建Sentinel模式
文章參考:https://blog.csdn.net/miss1181248983/article/details/90056960
主從模式的弊端就是不具備高可用性,當master掛掉以后,Redis將不能再對外提供寫入操作,因此sentinel應運而生。
Sentinel即哨兵,它主要是用來監控redis主從節點的運行狀態,用於解決在master節點掛了后選舉出新的主節點,保證整個集群可以繼續提供寫數據的能力。
Sentinel模式具有以下特點:
- sentinel模式是建立在主從模式的基礎上,如果只有一個Redis節點,sentinel就沒有任何意義;
- 當master掛了以后,sentinel會在slave中選擇一個做為master,其他slave的會指向新的master;
- 當master重新啟動后,它將不再是master而是做為slave接收新的master的同步數據;
- sentinel因為也是一個進程有掛掉的可能,所以sentinel也會啟動多個形成一個sentinel集群;
- 多sentinel配置的時候,sentinel之間也會自動監控;
- 當主從模式配置密碼時,sentinel也會同步將配置信息修改到配置文件中,不需要擔心;
- 一個sentinel或sentinel集群可以管理多個主從Redis,多個sentinel也可以監控同一個redis;
- sentinel最好不要和Redis部署在同一台機器,不然Redis的服務器掛了以后,sentinel也掛了;
Sentinel模式的工作機制:
- 每個sentinel以每秒鍾一次的頻率向它所知的master,slave以及其他sentinel實例發送一個 PING 命令;
- 如果一個實例距離最后一次有效回復 PING 命令的時間超過
down-after-milliseconds
選項所指定的值, 則這個實例會被sentinel標記為主觀下線; - 如果一個master被標記為主觀下線,則正在監視這個master的所有sentinel要以每秒一次的頻率確認master的確進入了主觀下線狀態;
- 當有足夠數量的sentinel(大於等於配置指定的值)在指定的時間范圍內確認master的確進入了主觀下線狀態, 則master會被標記為客觀下線;
- 在一般情況下, 每個sentinel會以每 10 秒一次的頻率向它已知的所有master,slave發送 INFO 命令;
- 當master被sentinel標記為客觀下線時,sentinel向下線的master的所有slave發送 INFO 命令的頻率會從 10 秒一次改為 1 秒一次;
- 若沒有足夠數量的sentinel同意master已經下線,master的客觀下線狀態就會被移除;若master重新向sentinel的 PING 命令返回有效回復,master的主觀下線狀態就會被移除;
當使用sentinel模式的時候,客戶端就不要直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉以后,sentinel就會感知並將新的master節點提供給使用者。
開始部署Sentinel模式的Redis集群
現在准備一個主從模式的集群,然后開始搭建Sentinel服務;為了保證高可用我們將Sentinel也是使用集群模式搭建,使用3台服務器來搭建集群,在每台機器上都部署一台。
下載和修改sentinel配置文件
mkdir -p /home/app/redis/conf
cd /home/app/redis/conf
wget http://download.redis.io/redis-stable/sentinel.conf
修改sentinel.conf
配置文件
# 配置主節點的信息
sentinel monitor mymaster 192.168.56.105 6379 2
# sentinel的訪問地址
requirepass 123456
# 配置主節點的訪問密碼
sentinel auth-pass mymaster 123456
啟動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
啟動成功后就可以直接通過Sentinel的端口進行鏈接了,Sentinel會返回當前主節點信息
四、在Docker上搭建Redis Cluster模式
我們使用Sentinel模式搭建的redis集群雖然解決了高可用的問題,但是最終也只有一個主節點;
當業務量大的時候會產生如下問題:
- 並發寫的請求增高;
- 數據量增大;此時需要考慮數據分片存儲了;
- 單個服務器的網卡上限達到瓶頸;
由此單個主從復制就無法滿足需求了,因此Redis Cluster模式登場了;
Redis Cluster是分布式架構:即Redis Cluster中有多個節點(主從復制節點),每個節點都負責進行數據讀寫操作;每個節點之間會進行通信。簡單來說就是多個主從復制節點集群提供服務。
集群要求
- Redis集群至少需要3個節點,因為投票容錯機制要求超過半數節點認為某個節點掛了該節點才是掛了,所以2個節點無法構成集群。
- 要保證集群的高可用,需要每個節點都有從節點,也就是備份節點,所以Redis集群至少需要6台服務器。
部署集群
我們在每台機器上執行如下命令來創建6個redis服務
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
后面這個16379端口使用redis集群間進行數據通訊的端口,它是在你設置的redis訪問端口上+10000;
如果向使用配置文件實現可以修改redis.conf配置中集群相關配置即可,獲取redis.conf配置:
wget http://download.redis.io/redis-stable/sentinel.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
下面開始集群的配置,直接使用redis-cli創建集群即可;
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
參數最后加
-a
是因為我們設置了密碼,因此需要加上訪問密碼;之后輸入yes即可。
注意如果在一台機器上搞的docker需要使用host模式的網絡連接類型才行,在創建的時候需要使用docker容器的IP;我們通過docker inspect 容器ID
命令獲取容器的IP。
關注微信訂閱號‘起岸星辰’獲取最新資訊