文章目錄
- 集群搭建
- 1. 創建目錄和配置
- 2. 編寫 docker-compose.yml
- 完整配置文件
- 3. 啟動容器
- 4. 構建集群
- 超時
集群搭建
基于 docker
在我們云服務器上搭建出一個 redis
集群出來
當前節點,主要是因為我們只有一個云服務器,搞分布式系統,就比較麻煩。實際工作中,一般是通過多個主機的方式,來搭建集群
- 此處我們使用
9
個docker
容器,來模擬9
臺服務器
此處我們創建
11
個redis
節點,其中前9
個用來演示集群的搭建,后2
個用來演示集群擴容
一定要記得,把以前啟動的 redis
容器給停掉
切換到對應目錄下后,輸入:
# 查看有哪些容器正在運行
docker ps -a # 關閉此目錄下的容器
docker-compose down
1. 創建目錄和配置
切換到 Cluster
目錄后
touch docker-compose.ymltouch generate.sh
- 在
Linux
上,以.sh
后綴結尾的文件,稱為“shell 腳本”- 使用
Linux
的時候,都是通過一些命令來進行操作的。使用命令操作,就非常適合把命令給寫到一個文件中,批量化執行 - 同時,還能加入:條件、循環、函數等機制。 因此,就可以基于這些來完成更復雜的工作了
- 使用
- 此處我們需要創建
11
個redis
節點,這些redis
的配置文件內容,大同小異,此時就可以使用腳本來批量生成(也可以不使用腳本,手動一個一個改)
shell
腳本:
for port in $(seq 1 9); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.10${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done# 注意 cluster-announce-ip 的值有變化.
for port in $(seq 10 11); \
do \
mkdir -p redis${port}/
touch redis${port}/redis.conf
cat << EOF > redis${port}/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.30.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done
for port in $(seq 1 9); \
:基于范圍的循環。類似與Java
的for each
seq
就是一個Linux
命令,后面倆參數就是從哪到哪,能生成[1, 9]
這個區間
do
和done
:在shell
腳本里面,{}
用來表示變量,不是表示代碼塊。對于for
來說,就是使用do
和done
來表示代碼塊開始和結束\
:是續行符,把下一行的內容和當前行,合并成一行。shell
默認情況下,要求把所有的代碼都寫到一行里,所以可以使用續行符來換行- 循環體里面:
mkdir -p redis${port}/
:創建目錄,名字為redis1 -> redis9
(shell
中拼接字符串是直接寫到一起,而不需要使用+
)${}
是取變量的值操作
touch redis${port}/redis. conf
:創建文件。在剛才的目錄基礎下,創建redis.conf
cat
:進行寫內容。將下面的內容,寫到剛剛創建的文件中去- 文件里面大多是一樣的,
cluster-announce-ip 172.30.0.10${port}
有點變化。我們通過變量來構造不同的ip
cluster-enabled yes
:開啟集群cluster-config-file nodes.conf
:里面包含了一些集群的配置信息,不用我們手動寫,而是redis
自動生成的(后續啟動這些節點之后,會配置一些redis
集群信息)cluster-node-timeout 5000
:多個節點之間進行交互,保持聯絡cluster-announce-ip 172.30.0.10${port}
:該redis
節點(自己)所在主機的ip
地址(當前是使用docker
容器模擬的主機,所以此處寫的是docker
容器的ip
)cluster-announce-port 6379
:redis
節點自身綁定的端口(容器內的端口),不同容器內部可以有相同端口,后續進行端口映射,再把這些容器內的端口映射到容器外的不同端口即可cluster-announce-bus-port 16379
:- 業務端口:用來進行業務數據通信。響應
redis
客戶端的請求 - 管理端口:為了完成一些管理上的任務來進行通信。如果某個分片中的
redis
主節點掛了,就需要讓從節點成為主節點,就需要通過剛才管理端口來完成對應的操作(Tomcat
里面,8080
是業務端口,8005
是管理端口)
- 業務端口:用來進行業務數據通信。響應
- 文件里面大多是一樣的,
- 這些配置項都不用記,用到時候去查即可
預期效果:得到 11
個目錄,每個目錄里面都有一個配置文件,配置文件中,ip
地址各不相同
執行命令:
通過命令:
bash generate.sh
隨后可以看到目錄里面:
2. 編寫 docker-compose.yml
version: '3.7'
networks:mynet:ipam:config:- subnet: 172.30.0.0/24services:redis1:image: 'redis:5.0.9'container_name: redis1restart: alwaysvolumes:- ./redis1/:/etc/redis/ports:- 6371:6379- 16371:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.101// 剩余10個容器,格式和這個一樣,將名字、端口號、ip地址遞增即可
networks
:此處為了后續創建靜態ip
,此時要先手動創建出網絡,同時給這個網段也分配ip
ip 地址 = 網絡號 + 主機號
。使用子網掩碼的方式來區分網絡號和主機號- 這里的
/24
就代表子網掩碼左邊24
位都是1
,右邊8
位是0
,255.255.255.0
,網絡號就是172.30.0
ip
是內網 ip- 配置的網絡號不能和當前主機上現有的其他網段沖突(每個人的主機上已有的網段,具體不一定一樣,
ifconfig
)
- 后面就是常規操作,配置容器
ports
:此處不進行端口映射,也是可以的,映射一下目的是為了在容器外面通過客戶端直接進行訪問- 靜態 ip 配置,網絡號部分要和前面的網段一致,主機號部分,可以隨便配置(
1-255
,保證不重復),按照之前在配置文件中寫的101-111
這11
臺主機
進行上述配置的時候,一定要保證前后一致性(第一步和第二部相關部分,端口號、ip 地址)
完整配置文件
version: '3.7'
networks:mynet:ipam:config:- subnet: 172.30.0.0/24services:redis1:image: 'redis:5.0.9'container_name: redis1restart: alwaysvolumes:- ./redis1/:/etc/redis/ports:- 6371:6379- 16371:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.101redis2:image: 'redis:5.0.9'container_name: redis2restart: alwaysvolumes:- ./redis2/:/etc/redis/ports:- 6372:6379- 16372:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.102redis3:image: 'redis:5.0.9'container_name: redis3restart: alwaysvolumes:- ./redis3/:/etc/redis/ports:- 6373:6379- 16373:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.103redis4:image: 'redis:5.0.9'container_name: redis4restart: alwaysvolumes:- ./redis4/:/etc/redis/ports:- 6374:6379- 16374:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.104redis5:image: 'redis:5.0.9'container_name: redis5restart: alwaysvolumes:- ./redis5/:/etc/redis/ports:- 6375:6379- 16375:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.105redis6:image: 'redis:5.0.9'container_name: redis6restart: alwaysvolumes:- ./redis6/:/etc/redis/ports:- 6376:6379- 16376:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.106redis7:image: 'redis:5.0.9'container_name: redis7restart: alwaysvolumes:- ./redis7/:/etc/redis/ports:- 6377:6379- 16377:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.107redis8:image: 'redis:5.0.9'container_name: redis8restart: alwaysvolumes:- ./redis8/:/etc/redis/ports:- 6378:6379- 16378:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.108redis9:image: 'redis:5.0.9'container_name: redis9restart: alwaysvolumes:- ./redis9/:/etc/redis/ports:- 6379:6379- 16379:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.109redis10:image: 'redis:5.0.9'container_name: redis10restart: alwaysvolumes:- ./redis10/:/etc/redis/ports:- 6380:6379- 16380:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.110redis11:image: 'redis:5.0.9'container_name: redis11restart: alwaysvolumes:- ./redis11/:/etc/redis/ports:- 6381:6379- 16381:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.111
3. 啟動容器
啟動之前,一定要把之前已經運行的 redis
相關東西都干掉!否則就可能因為端口沖突等原因,導致現在的啟動失敗
通過下面命令啟動
docker-compose up -d
4. 構建集群
此處把前
9
個主機構建成集群,3
主6
從,后2
個主機暫時不用
相關命令:
redis-cli --cluster create 172.30.0.101:6379 172.30.0.102:6379 172.30.0.103:6379 172.30.0.104:6379 172.30.0.105:6379 172.30.0.106:6379 172.30.0.107:6379 172.30.0.108:6379 172.30.0.109:6379 --cluster-replicas 2
--cluster create
:建立集群,后面填寫每個節點的 ip 和地址--cluster-replicas 2
:表示每個主節點要兩個從節點備份- 這個配置設置之后,
redis
就知道了,3
個節點是一伙的,一共3
個分片
- 這個配置設置之后,
redis
在構建集群的時候,誰是主節點,誰是從節點,誰和誰是一個分片,都是不固定的
- 本身從集群的角度來看,提供的這些節點之間本來就應該是等價的
命令執行完之后
- 分片信息、槽位信息、主從節點信息… 都給出了
- 最后需要手動輸入“
yes
”進行構建
超時
如果在輸入構建命令連接不上,超時,就需要進行一步處理
在進行構建集群操作之前,需要先讓這個命令在任意一個 redis
容器中進行
- 所有的
redis
容器都是在同一個局域網內,但是此時這個宿主機卻不在,想要進行后續操作,就必須要保證都在同一個局域網內 - 在容器內進行構建集群的操作,就能保證都是在同一個局域網內了
執行命令
docker exec -it ce /bin/bash
docker exec
:在一個已經運行中的docker
容器內執行命令-it
:-i
:表示以交互模式運行,讓能夠保持輸入流打開-t
:分配一個“偽終端”(TTY),這樣你可以像在普通終端中一樣與容器交互
ce
:容器的名字或容器 ID,表示要進入的容器bin/bash
:表示在容器內部啟動一個Bash shell
,通常用于容器內操作
在集群構建完畢之后,輸入 exit
就可以退出容器
- 生成每個
redis
節點的配置文件 - 使用
docker
創建出11
個redis
節點,并且啟動容器 - 使用
redis-cli
執行構建集群命令