您好,登錄后才能下訂單哦!
Docker Compose怎么搭建 Redis Cluster集群環境,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
下面使用 Docker Compose 再帶大家搭建一遍,其目的主要是為了讓大家感受 Docker Compose 所帶來的便捷之處。
按照 Redis 官網:https://redis.io/topics/cluster-tutorial 的提示,為了使 Docker 與 Redis Cluster 兼容,您需要使用 Docker 的 host
網絡模式。
host
網絡模式需要在創建容器時通過參數 --net host
或者 --network host
指定,host
網絡模式可以讓容器共享宿主機網絡棧,容器將不會虛擬出自己的網卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口。
關于 Docker 網絡模式更多的內容請閱讀《Docker 網絡模式詳解及容器間網絡通信》。
為了讓環境更加真實,本文使用多機環境:
192.168.10.10
192.168.10.11
每臺機器所使用的基礎設施環境如下:
CentOS 7.8.2003
Docker version 19.03.12
整體搭建步驟主要分為以下幾步:
下載 Redis 鏡像(其實這步可以省略,因為創建容器時,如果本地鏡像不存在,就會去遠程拉取);
編寫 Redis 配置文件;
編寫 Docker Compose 模板文件;
創建并啟動所有服務容器;
創建 Redis Cluster 集群。
分別在 192.168.10.10
和 192.168.10.11
兩臺機器上執行以下操作。
# 創建目錄 mkdir -p /usr/local/docker-redis/redis-cluster # 切換至指定目錄 cd /usr/local/docker-redis/redis-cluster/ # 編寫 redis-cluster.tmpl 文件 vi redis-cluster.tmpl
192.168.10.10
機器的 redis-cluster.tmpl
文件內容如下:
port ${PORT} requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.10 cluster-announce-port ${PORT} cluster-announce-bus-port 1${PORT}
192.168.10.11
機器的 redis-cluster.tmpl
文件內容如下:
port ${PORT} requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.11 cluster-announce-port ${PORT} cluster-announce-bus-port 1${PORT}
port
:節點端口;
requirepass
:添加訪問認證;
masterauth
:如果主節點開啟了訪問認證,從節點訪問主節點需要認證;
protected-mode
:保護模式,默認值 yes,即開啟。開啟保護模式以后,需配置 bind ip
或者設置訪問密碼;關閉保護模式,外部網絡可以直接訪問;
daemonize
:是否以守護線程的方式啟動(后臺啟動),默認 no;
appendonly
:是否開啟 AOF 持久化模式,默認 no;
cluster-enabled
:是否開啟集群模式,默認 no;
cluster-config-file
:集群節點信息文件;
cluster-node-timeout
:集群節點連接超時時間;
cluster-announce-ip
:集群節點 IP,填寫宿主機的 IP;
cluster-announce-port
:集群節點映射端口;
cluster-announce-bus-port
:集群節點總線端口。
每個 Redis 集群節點都需要打開兩個 TCP 連接。一個用于為客戶端提供服務的正常 Redis TCP 端口,例如 6379。還有一個基于 6379 端口加 10000 的端口,比如 16379。
第二個端口用于集群總線,這是一個使用二進制協議的節點到節點通信通道。節點使用集群總線進行故障檢測、配置更新、故障轉移授權等等。客戶端永遠不要嘗試與集群總線端口通信,與正常的 Redis 命令端口通信即可,但是請確保防火墻中的這兩個端口都已經打開,否則 Redis 集群節點將無法通信。
在 192.168.10.10
機器的 redis-cluster
目錄下執行以下命令:
for port in `seq 6371 6373`; do \ mkdir -p ${port}/conf \ && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \ && mkdir -p ${port}/data;\ done
在 192.168.10.11
機器的 redis-cluster
目錄下執行以下命令:
for port in `seq 6374 6376`; do \ mkdir -p ${port}/conf \ && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \ && mkdir -p ${port}/data;\ done
上面兩段 shell for 語句,意思就是循環創建 6371 ~ 6376 相關的目錄及文件。
在 192.168.10.10
機器執行查看命令結果如下,如果沒有 tree
命令先安裝 yum install -y tree
。
在 192.168.10.11
機器執行查看命令結果如下。
以下內容為每個節點的配置文件詳細信息。
============================== 192.168.10.10 ============================== [root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{1..3}/conf/redis.conf port 6371 requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.10 cluster-announce-port 6371 cluster-announce-bus-port 16371 port 6372 requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.10 cluster-announce-port 6372 cluster-announce-bus-port 16372 port 6373 requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.10 cluster-announce-port 6373 cluster-announce-bus-port 16373 ============================== 192.168.10.10 ============================== ============================== 192.168.10.11 ============================== [root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{4..6}/conf/redis.conf port 6374 requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.11 cluster-announce-port 6374 cluster-announce-bus-port 16374 port 6375 requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.11 cluster-announce-port 6375 cluster-announce-bus-port 16375 port 6376 requirepass 1234 masterauth 1234 protected-mode no daemonize no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 192.168.10.11 cluster-announce-port 6376 cluster-announce-bus-port 16376 ============================== 192.168.10.11 ==============================
在 192.168.10.10
機器的 /usr/local/docker-redis
目錄下創建 docker-compose.yml
文件并編輯。
# 描述 Compose 文件的版本信息 version: "3.8" # 定義服務,可以多個 services: redis-6371: # 服務名稱 image: redis # 創建容器時所需的鏡像 container_name: redis-6371 # 容器名稱 restart: always # 容器總是重新啟動 network_mode: "host" # host 網絡模式 volumes: # 數據卷,目錄掛載 - /usr/local/docker-redis/redis-cluster/6371/conf/redis.conf:/usr/local/etc/redis/redis.conf - /usr/local/docker-redis/redis-cluster/6371/data:/data command: redis-server /usr/local/etc/redis/redis.conf # 覆蓋容器啟動后默認執行的命令 redis-6372: image: redis container_name: redis-6372 network_mode: "host" volumes: - /usr/local/docker-redis/redis-cluster/6372/conf/redis.conf:/usr/local/etc/redis/redis.conf - /usr/local/docker-redis/redis-cluster/6372/data:/data command: redis-server /usr/local/etc/redis/redis.conf redis-6373: image: redis container_name: redis-6373 network_mode: "host" volumes: - /usr/local/docker-redis/redis-cluster/6373/conf/redis.conf:/usr/local/etc/redis/redis.conf - /usr/local/docker-redis/redis-cluster/6373/data:/data command: redis-server /usr/local/etc/redis/redis.conf
在 192.168.10.11
機器的 /usr/local/docker-redis
目錄下創建 docker-compose.yml
文件并編輯。
# 描述 Compose 文件的版本信息 version: "3.8" # 定義服務,可以多個 services: redis-6374: # 服務名稱 image: redis # 創建容器時所需的鏡像 container_name: redis-6374 # 容器名稱 restart: always # 容器總是重新啟動 network_mode: "host" # host 網絡模式 volumes: # 數據卷,目錄掛載 - /usr/local/docker-redis/redis-cluster/6374/conf/redis.conf:/usr/local/etc/redis/redis.conf - /usr/local/docker-redis/redis-cluster/6374/data:/data command: redis-server /usr/local/etc/redis/redis.conf # 覆蓋容器啟動后默認執行的命令 redis-6375: image: redis container_name: redis-6375 network_mode: "host" volumes: - /usr/local/docker-redis/redis-cluster/6375/conf/redis.conf:/usr/local/etc/redis/redis.conf - /usr/local/docker-redis/redis-cluster/6375/data:/data command: redis-server /usr/local/etc/redis/redis.conf redis-6376: image: redis container_name: redis-6376 network_mode: "host" volumes: - /usr/local/docker-redis/redis-cluster/6376/conf/redis.conf:/usr/local/etc/redis/redis.conf - /usr/local/docker-redis/redis-cluster/6376/data:/data command: redis-server /usr/local/etc/redis/redis.conf
分別在 192.168.10.10
和 192.168.10.11
機器的 /usr/local/docker-redis
目錄下執行以下命令:
docker-compose up -d
請先確保你的兩臺機器可以互相通信,然后隨便進入一個容器節點,并進入 /usr/local/bin/
目錄:
# 進入容器 docker exec -it redis-6371 bash # 切換至指定目錄 cd /usr/local/bin/
接下來我們就可以通過以下命令實現 Redis Cluster 集群的創建。
redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1
出現選擇提示信息,輸入 yes,結果如下所示:
集群創建成功如下:
以下內容是創建集群時返回的詳細信息,也就是上兩幅圖中的所有內容。
root@localhost:/usr/local/bin# redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.10.11:6376 to 192.168.10.10:6371 Adding replica 192.168.10.10:6373 to 192.168.10.11:6374 Adding replica 192.168.10.11:6375 to 192.168.10.10:6372 M: 04444afa3ca66de6af4a182984c79d4d140293d7 192.168.10.10:6371 slots:[0-5460] (5461 slots) master M: fb76ada83a70ea8d367f22f8a6436d427f12022c 192.168.10.10:6372 slots:[10923-16383] (5461 slots) master S: 20f6913a4b08afe3b4092a4f6c70fddd9506f2fa 192.168.10.10:6373 replicates c130120ffbd7c4e442ac9fc9870e977dc801cb54 M: c130120ffbd7c4e442ac9fc9870e977dc801cb54 192.168.10.11:6374 slots:[5461-10922] (5462 slots) master S: d4d5f7fd94fcd2239e82e481f0529380b288ff51 192.168.10.11:6375 replicates fb76ada83a70ea8d367f22f8a6436d427f12022c S: e08b8f629e2dfa474a836910634052d83c77d06a 192.168.10.11:6376 replicates 04444afa3ca66de6af4a182984c79d4d140293d7 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join . >>> Performing Cluster Check (using node 192.168.10.10:6371) M: 04444afa3ca66de6af4a182984c79d4d140293d7 192.168.10.10:6371 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 20f6913a4b08afe3b4092a4f6c70fddd9506f2fa 192.168.10.10:6373 slots: (0 slots) slave replicates c130120ffbd7c4e442ac9fc9870e977dc801cb54 S: d4d5f7fd94fcd2239e82e481f0529380b288ff51 192.168.10.11:6375 slots: (0 slots) slave replicates fb76ada83a70ea8d367f22f8a6436d427f12022c M: fb76ada83a70ea8d367f22f8a6436d427f12022c 192.168.10.10:6372 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: c130120ffbd7c4e442ac9fc9870e977dc801cb54 192.168.10.11:6374 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: e08b8f629e2dfa474a836910634052d83c77d06a 192.168.10.11:6376 slots: (0 slots) slave replicates 04444afa3ca66de6af4a182984c79d4d140293d7 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
至此一個高可用的 Redis Cluster 集群搭建完成,如下圖所示,該集群中包含 6 個 Redis 節點,3 主 3 從。三個主節點會分配槽,處理客戶端的命令請求,而從節點可用在主節點故障后,頂替主節點。
我們先進入容器,然后通過一些集群常用的命令查看一下集群的狀態。
# 進入容器 docker exec -it redis-6371 bash # 切換至指定目錄 cd /usr/local/bin/
redis-cli -a 1234 --cluster check 192.168.10.11:6375
# 連接至集群某個節點 redis-cli -c -a 1234 -h 192.168.10.11 -p 6376 # 查看集群信息 cluster info # 查看集群結點信息 cluster nodes
在 6371 節點中執行寫入和讀取,命令如下:
# 進入容器并連接至集群某個節點 docker exec -it redis-6371 /usr/local/bin/redis-cli -c -a 1234 -h 192.168.10.10 -p 6371 # 寫入數據 set name mrhelloworld set aaa 111 set bbb 222 # 讀取數據 get name get aaa get bbb
別著急,讓我來解釋一下上圖中的操作過程:
首先進入容器并連接至集群某個節點;
然后執行第一個 set 命令 set name mrhelloworld
,name
鍵根據哈希函數運算以后得到的值為 [5798]
。當前集群環境的槽分配情況為:[0-5460] 6371節點
,[5461-10922] 6374節點
,[10923-16383] 6372節點
,所以該鍵的存儲就被分配到了 6374 節點上;
再來看第二個 set 命令 set aaa
,這里大家可能會有一些疑問,為什么看不到 aaa
鍵根據哈希函數運算以后得到的值?因為剛才重定向至 6374 節點插入了數據,此時如果還有數據插入,正好鍵根據哈希函數運算以后得到的值也還在該節點的范圍內,那么直接插入數據即可;
接著是第三個 set 命令 set bbb
,bbb
鍵根據哈希函數運算以后得到的值為 [5287]
,所以該鍵的存儲就被分配到了 6371 節點上;
然后是讀取操作,第四個命令 get name
,name
鍵根據哈希函數運算以后得到的值為 [5798]
,被重定向至 6374 節點讀取;
第五個命令 get aaa
,aaa
鍵根據哈希函數運算以后得到的值也在 6374 節點,直接讀取;
第六個命令 get bbb
,bbb
鍵根據哈希函數運算以后得到的值為 [5287]
,被重定向至 6371 節點讀取。
通過以上操作我們得知 name
鍵的存儲被分配到了 6374 節點,如果直接連接 6374 節點并獲取該值會怎么樣?沒錯,不需要重定向節點,因為數據就在該節點,所以直接讀取返回。
最后來一波客戶端連接操作,隨便哪個節點,看看可否通過外部訪問 Redis Cluster 集群。
看完上述內容,你們掌握Docker Compose怎么搭建 Redis Cluster集群環境的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。