5分鐘教你實(shí)現(xiàn)用docker搭建Redis集群模式和哨兵模式
如果讓你為開發(fā)、測(cè)試環(huán)境分別搭一套哨兵和集群模式的redis,你最快需要多久,或許你需要一天?2小時(shí)?事實(shí)是可以更短。 是的,你已經(jīng)猜到了,用docker部署,真的只需要十幾分鐘。
一.準(zhǔn)備工作
拉取redis鏡像
運(yùn)行如下命令:
docker pull redis
該命令拉取的鏡像是官方鏡像,當(dāng)然你可以搜索其他的鏡像,這里不做深入
查看鏡像情況:
二.部署redis哨兵主從模式
什么是哨兵模式?--請(qǐng)自行百度
1、什么是docker compose?
Docker Compose 可以理解為將多個(gè)容器運(yùn)行的方式和配置固化下來!
就拿最簡單的例子來說吧,如果我們要為我們的應(yīng)用容器準(zhǔn)備一個(gè) MySQL 容器和一個(gè) Redis 容器,那么在每次啟動(dòng)時(shí),我們先要將 MySQL 容器和 Redis 容器啟動(dòng)起來,再將應(yīng)用容器運(yùn)行起來。這其中還不要忘了在創(chuàng)建應(yīng)用容器時(shí)將容器網(wǎng)絡(luò)連接到 MySQL 容器和 Redis 容器上,以便應(yīng)用連接上它們并進(jìn)行數(shù)據(jù)交換。
這還不夠,如果我們還對(duì)容器進(jìn)行了各種配置,我們最好還得將容器創(chuàng)建和配置的命令保存下來,以便下次可以直接使用。
針對(duì)這種情況,我們就不得不引出在我們開發(fā)中最常使用的多容器定義和運(yùn)行軟件,也就是 Docker Compose 了。
2、編寫reids主從docker-compose.yml
version: '3.7' services: master: image: redis container_name: redis-master restart: always command: redis-server --requirepass redispwd --appendonly yes ports: - 6379:6379 volumes: - ./data1:/data slave1: image: redis container_name: redis-slave-1 restart: always command: redis-server --slaveof redis-master 6379 --requirepass redispwd --masterauth redispwd --appendonly yes ports: - 6380:6379 volumes: - ./data2:/data slave2: image: redis container_name: redis-slave-2 restart: always command: redis-server --slaveof redis-master 6379 --requirepass redispwd --masterauth redispwd --appendonly yes ports: - 6381:6379 volumes: - ./data3:/data
名詞解釋:
3、啟動(dòng)主從redis
進(jìn)入redis對(duì)應(yīng)的docker-compose.yml的目錄,執(zhí)行命令:
docker-compose up -d
-d表示后臺(tái)運(yùn)行
使用命令docker ps命令查看啟動(dòng)結(jié)果:
出現(xiàn)截圖所示,表示運(yùn)行成功
4.編寫哨兵docker-compose.yml
version: '3.7' services: sentinel1: image: redis container_name: redis-sentinel-1 restart: always ports: - 26379:26379 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf sentinel2: image: redis container_name: redis-sentinel-2 restart: always ports: - 26380:26379 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf sentinel3: image: redis container_name: redis-sentinel-3 ports: - 26381:26379 command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf networks: default: external: name: redis_default
5.編寫哨兵sentinel.conf
# 自定義集群名,其中172.19.0.3 為 redis-master 的 ip,6379 為 redis-master 的端口,2 為最小投票數(shù)(因?yàn)橛?3 臺(tái) Sentinel 所以可以設(shè)置成 2) port 26379 dir /tmp sentinel monitor mymaster 172.19.0.3 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel auth-pass mymaster redispwd sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes
將上述文件分別拷貝3份分別命名為sentinel1.conf、sentinel2.conf、sentinel3.conf與docker-compose.yml中的配置文件對(duì)應(yīng),然后放置和哨兵的docker-compose.yml在同一目錄
6.啟動(dòng)哨兵
進(jìn)入哨兵docker-compose.yml所在目錄,執(zhí)行命令:
docker-compose up -d
查看容器,可以看到哨兵和主從redis都起來了
6.1哨兵啟動(dòng)日志
上述日志中可以看出,哨兵監(jiān)聽master和slave節(jié)點(diǎn)
6.2關(guān)掉master節(jié)點(diǎn)
通過命令停止redis的master節(jié)點(diǎn)
docker stop redis-master
通過上述日志,我們可以看到sdown,odown,他們是什么意思呢?
sdown是主觀宕機(jī),就一個(gè)哨兵如果自己覺得一個(gè)master宕機(jī)了,那么就是主觀宕機(jī)
odown是客觀宕機(jī),如果quorum數(shù)量的哨兵都覺得一個(gè)master宕機(jī)了,那么就是客觀宕機(jī)
然后就是開始選舉,從日志可以看出兩個(gè)哨兵選擇了同一個(gè)slave節(jié)點(diǎn),這時(shí)候滿足了我們配置最小投票數(shù),那么這臺(tái)slave就被選為新的master。
6.3重開master節(jié)點(diǎn)
上述日志表明哨兵檢測(cè)到原master重新啟動(dòng),將原master節(jié)點(diǎn)變成新master的從節(jié)點(diǎn)
三.部署redis集群模式
1、創(chuàng)建目錄和文件
├── docker-compose.yml ├── redis-6371 │ ├── conf │ │ └── redis.conf │ └── data ├── redis-6372 │ ├── conf │ │ └── redis.conf │ └── data ├── redis-6373 │ ├── conf │ │ └── redis.conf │ └── data ├── redis-6374 │ ├── conf │ │ └── redis.conf │ └── data ├── redis-6375 │ ├── conf │ │ └── redis.conf │ └── data └── redis-6376 ├── conf │ └── redis.conf └── data
2、redis.conf 配置文件
port 6371 cluster-enabled yes cluster-config-file nodes-6371.conf cluster-node-timeout 5000 appendonly yes protected-mode no requirepass 1234 masterauth 1234 cluster-announce-ip 10.12.12.10 # 這里是宿主機(jī)IP cluster-announce-port 6371 cluster-announce-bus-port 16371
每個(gè)節(jié)點(diǎn)的配置只需改變端口。
3、docker-compose 配置文件
version: "3" # 定義服務(wù),可以多個(gè) services: redis-6371: # 服務(wù)名稱 image: redis # 創(chuàng)建容器時(shí)所需的鏡像 container_name: redis-6371 # 容器名稱 restart: always # 容器總是重新啟動(dòng) volumes: # 數(shù)據(jù)卷,目錄掛載 - ./redis-6371/conf/redis.conf:/usr/local/etc/redis/redis.conf - ./redis-6371/data:/data ports: - 6371:6371 - 16371:16371 command: redis-server /usr/local/etc/redis/redis.conf redis-6372: image: redis container_name: redis-6372 volumes: - ./redis-6372/conf/redis.conf:/usr/local/etc/redis/redis.conf - ./redis-6372/data:/data ports: - 6372:6372 - 16372:16372 command: redis-server /usr/local/etc/redis/redis.conf redis-6373: image: redis container_name: redis-6373 volumes: - ./redis-6373/conf/redis.conf:/usr/local/etc/redis/redis.conf - ./redis-6373/data:/data ports: - 6373:6373 - 16373:16373 command: redis-server /usr/local/etc/redis/redis.conf redis-6374: image: redis container_name: redis-6374 restart: always volumes: - ./redis-6374/conf/redis.conf:/usr/local/etc/redis/redis.conf - ./redis-6374/data:/data ports: - 6374:6374 - 16374:16374 command: redis-server /usr/local/etc/redis/redis.conf redis-6375: image: redis container_name: redis-6375 volumes: - ./redis-6375/conf/redis.conf:/usr/local/etc/redis/redis.conf - ./redis-6375/data:/data ports: - 6375:6375 - 16375:16375 command: redis-server /usr/local/etc/redis/redis.conf redis-6376: image: redis container_name: redis-6376 volumes: - ./redis-6376/conf/redis.conf:/usr/local/etc/redis/redis.conf - ./redis-6376/data:/data ports: - 6376:6376 - 16376:16376 command: redis-server /usr/local/etc/redis/redis.conf
編寫完成后使用docker-compose up -d啟動(dòng)容器 ,這里沒有使用主機(jī)模式(host),而是使用 NAT 模式,因?yàn)橹鳈C(jī)模式可能導(dǎo)致外部客戶端無法連接。
4、進(jìn)入容器,創(chuàng)建集群
上面只是啟動(dòng)了 6 個(gè) Redis 實(shí)例,并沒有構(gòu)建成 Cluster 集群。
執(zhí)行docker exec -it redis-6371 bash進(jìn)入一個(gè) Redis 節(jié)點(diǎn)容器,隨便哪個(gè)都行。
繼續(xù)執(zhí)行以下命令創(chuàng)建集群:
# 集群創(chuàng)建命令 redis-cli -a 1234 --cluster create 10.35.30.39:6371 10.35.30.39:6372 10.35.30.39:6373 10.35.30.39:6374 10.35.30.39:6375 10.35.30.39:6376 --cluster-replicas 1 # 執(zhí)行過后會(huì)有以下輸出 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 10.35.30.39:6375 to 10.35.30.39:6371 Adding replica 10.35.30.39:6376 to 10.35.30.39:6372 Adding replica 10.35.30.39:6374 to 10.35.30.39:6373 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371 slots:[0-5460] (5461 slots) master M: 0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372 slots:[5461-10922] (5462 slots) master M: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373 slots:[10923-16383] (5461 slots) master S: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374 replicates fcb83b0097d2a0a87a76c0d782de12147bc86291 S: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375 replicates e9a35d6a9d203830556de89f06a3be2e2ab4eee1 S: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376 replicates 0c8755144fe6a200a46716371495b04f8ab9d4c8 Can I set the above configuration? (type 'yes' to accept): yes # 這里輸入 yes 并回車 確認(rèn)節(jié)點(diǎn) 主從身份 以及 哈希槽的分配 >>> 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 10.35.30.39:6371) M: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: 0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374 slots: (0 slots) slave replicates fcb83b0097d2a0a87a76c0d782de12147bc86291 M: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375 slots: (0 slots) slave replicates e9a35d6a9d203830556de89f06a3be2e2ab4eee1 S: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376 slots: (0 slots) slave replicates 0c8755144fe6a200a46716371495b04f8ab9d4c8 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
看到上面的輸出即為 Cluster 集群配置完成。且為 3 主 3 從。
總結(jié):
以上就是通過docker compose方式部署哨兵模式和集群模式的全過程,redis部署在docker中,適用于本地、開發(fā)、測(cè)試等環(huán)境,生產(chǎn)環(huán)境請(qǐng)慎用,除非你對(duì)docker有很強(qiáng)的掌控力。
到此這篇關(guān)于5分鐘教你實(shí)現(xiàn)用docker搭建Redis集群模式和哨兵模式的文章就介紹到這了,更多相關(guān)docker搭建Redis集群模式和哨兵模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于Docker搭建Redis一主兩從三哨兵的實(shí)現(xiàn)
- Docker配置redis哨兵模式的方法(多服務(wù)器上)
- 基于Docker實(shí)現(xiàn)Redis主從+哨兵搭建的示例實(shí)踐
- docker搭建redis主從哨兵集群的實(shí)現(xiàn)步驟
- docker搭建redis哨兵集群并且整合springboot的實(shí)現(xiàn)
- 使用Docker配置redis sentinel哨兵的方法步驟
- Docker下Redis集群(主從+哨兵)安裝配置的實(shí)現(xiàn)步驟
- 教你一分鐘搞定docker+redis哨兵模式
- 基于docker的redis主從及哨兵配置方式
- docker安裝Redis高可用實(shí)現(xiàn)一主二從三哨兵
相關(guān)文章
教你使用Docker?Compose一鍵部署前后端分離項(xiàng)目
Compose是一個(gè)定義和管理多容器的工具,使用Python語言編寫,下面這篇文章主要給大家介紹了關(guān)于如何使用Docker?Compose一鍵部署前后端分離項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-01-01Linux Docker安裝wordpress的方法詳解教程
這篇文章主要介紹了Linux Docker安裝wordpress的方法詳解教程的相關(guān)資料,需要的朋友可以參考下2016-10-10docker-compose安裝RabbitMQ及插件操作步驟
這篇文章主要為大家介紹了docker-compose安裝RabbitMQ及插件操作步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01