ps:部落格用與記錄個人學習過程中遇到的一些問題以及解決方案。若有表述不當之處還請見諒。
publicisworldwide/redis-cluster 映象,這個映象是redis專門的集群映象,但在這裡最好做一點小小的改變。後面會貼上dockerfile
inem0o/redis-trib 映象,該映象用於管理redis集群。但也貌似有些小問題。後面有本人委曲求全的適應方案嘿。
自定義映象
run apt-get updatepublicisworldwide/redis-cluster為了保持其輕量,需要我們自己去update(對於一些不需要的服務則可以不用 類似nginx)
update目的是為了使用其中redis-cli工具。
第4行**是更新了原映象源,為了很快的速度。當前使用了中科大的映象源,如果你在build的過程中發現404可以換其他映象源,例如阿里雲,清華大學等。
關於redis集群應該注意的事情這裡不在重複,示例採用3主3從的形式。(後面會貼上完整的compose**)
首先redis集群應該和服務分離,當服務關閉調整時redis集群應該還是啟動狀態。
既然需要分離,那麼redis的網路應該是開放式,compose檔案應該是redis網路新增attachable屬性並賦值為true
連線redis集群的服務相對應使用連線redis網路的時候也應該標示是外來網路,即external屬性為true
跑集群的伺服器應該開啟redis埠,redis埠+10000埠。例如redis1,埠7001,那應該開啟7001,17001。
compose相容volumes的nfs連線,但這裡不做展示
本次展示每個容器分別乙個資料夾,埠7001~7006,資料夾名同樣。
下面**使用的映象 redis-cluster是使用第一步build的映象( docker build -t 別名 dockerfile路徑)起的別名
version: "3.2"
services:
redis1:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7001/data:/data
environment:
- redis_port=7001
ports:
- "7001:7001"
- "17001:17001"
redis2:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7002/data:/data
environment:
- redis_port=7002
ports:
- "7002:7002"
- "17002:17002"
redis3:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7003/data:/data
environment:
- redis_port=7003
ports:
- "7003:7003"
- "17003:17003"
redis4:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7004/data:/data
environment:
- redis_port=7004
ports:
- "7004:7004"
- "17004:17004"
redis5:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7005/data:/data
environment:
- redis_port=7005
ports:
- "7005:7005"
- "17005:17005"
redis6:
image: redis-cluster
networks:
redis-net:
volumes:
- ./data/7006/data:/data
environment:
- redis_port=7006
ports:
- "7006:7006"
- "17006:17006"
networks:
redis-net:
attachable: true
確認6個容器均正常執行之後,我們下一步對容器進行集群關聯。
docker run --rm -it --network redis_redis-net inem0o/redis-trib create --replicas 1 容器1ip:port 容器2ip:port..........
執行inem0o/redis-trib映象 加入redis集群網路建立集群
這裡出現第乙個坑(也是基礎不紮實)
原本我使用127.0.0.1或者本機ip等ip均不能使集群順利建立。卡在 『等待加入』 階段,後來通過查詢資料了解應該使用網路內ip。
即:
docker network inspect redis_redis-net
會出現json格式的配置,其中「containers」內容是我們需要的,裡面ip位址才是我們在建立集群時候應該輸入的ip位址。
逐一複製貼上入上述docker run**中可以實現集群。這裡貼個小指令碼以用來獲取ip和埠
# -*- coding: utf-8 -*-
# coding:utf-8
import os
import json
import re
def cluster():
"""構建redis集群
:return:
"""os.system('docker network inspect redis_redis-net > data.json')
with open('data.json', 'r') as fp:
# 獲取網路資料
data = json.loads(fp.read())
if len(data) == 0:
print("[!] service isn't up...")
return
info = data[0]
containers = info.get('containers', {})
# 構建命令
# code = "docker run --rm -it --network redis_redis-net inem0o/redis-trib create --replicas 1 "
code = ""
for _, v in containers.items():
try:
num = re.findall('redis(\w)\.', v['name'])[0]
code += " {}:700{}".format(
v['ipv4address'].split('/')[0], num)
except:
pass
# os.system(code)
print(code)
os.system('rm -rf data.json')
if __name__ == '__main__':
cluster()
裡面有注釋的地方因為實際業務上集群不會跑在同一伺服器上,所以獲取的其實只是本機部分集群網路的節點資訊而言,需要每個伺服器都跑一次以獲取全部ip和埠 (暫時沒有想到更方便的方法,如果有朋友知道其他解決方法希望不吝賜教嘻)
通過上述三個部分操作可以啟動乙個redis集群。下面是一些管理方面的分享。
inem0o/redis-trib映象也有管理功能(還請help一下) ,但我發現在集群執行一段時間時候這個管理映象就會出現連線不上但情況(但此時但redis集群還是很正常的)於是我放棄使用他來做管理,只做集群關聯。
沒有小結,
Swarm 搭建Docker集群
docker自誕生以來,其容器特性以及映象特性給devops愛好者帶來了諸多方便。然而在很長的一段時間內,docker只能在單host上執行,其跨host的部署 執行與管理能力頗受外界詬病。跨host能力的薄弱,直接導致docker容器與host的緊耦合,這種情況下,docker容器的靈活性很難令人...
Docker系列之swarm集群搭建
學習docker很久了,今天分享一下docker的swarm集群的搭建過程很簡單 首先第一步是 每台機器上面都要安裝docker 本人使用的是centos7作業系統,使用3太虛擬機器,3太虛擬機器必須網路互通 廢話 docker早在1.12版本就已經支援原生的swarm集群搭建了不用再用第三方etc...
Docker系列之swarm集群搭建
學習docker很久了,今天分享一下docker的swarm集群的搭建過程很簡單 首先第一步是 每台機器上面都要安裝docker 本人使用的是centos7作業系統,使用3太虛擬機器,3太虛擬機器必須網路互通 廢話 docker早在1.12版本就已經支援原生的swarm集群搭建了不用再用第三方etc...