一、環(huán)境說(shuō)明:
宿主機(jī):Win10
虛擬機(jī)工具:VMware Workstation 15
系統(tǒng)及版本:Ubuntu16.04
Docker版本:18.09.3
Redis image版本:5.0.4
涉及到的虛擬主機(jī):(部署三個(gè)節(jié)點(diǎn)六個(gè)服務(wù))
192.168.1.101 redis-9001 和 redis-9002
192.168.1.102 redis-9003 和 redis-9004
192.168.1.103 redis-9005 和 redis-9006
二涩赢、創(chuàng)建本地目錄及所需配置文件(所有節(jié)點(diǎn))
# 創(chuàng)建本地目錄
mkdir -p /docker/redis
# 在?/docker/redis下創(chuàng)建配置文件redis-cluster.tmpl仅仆,內(nèi)容如下:
# 開(kāi)放的端口
port ${PORT}
# 關(guān)閉保護(hù)模式
protected-mode no
# 開(kāi)啟集群
cluster-enabled yes
# 集群配置文件(集群自己管理)
cluster-config-file nodes.conf
# 集群連接超時(shí)時(shí)間
cluster-node-timeout 15000
# 本機(jī)服務(wù)器地址
cluster-announce-ip 192.168.1.101
# 集群端口
cluster-announce-port ${PORT}
# 集群交互端口
cluster-announce-bus-port 1${PORT}
# 開(kāi)啟aof日志
appendonly yes
# 日志文件地址
logfile "./redis.log"
# 進(jìn)入/docker/redis目錄,生成conf硝烂、data文件夾和配置信息
# 說(shuō)明:每個(gè)節(jié)點(diǎn)生產(chǎn)2個(gè)文件夾共6個(gè),從9001到9006,每個(gè)文件夾下包含data和conf文件夾闹伪,同時(shí)conf里面有已經(jīng)指定端口和ip的redis.conf配置文件
# 第一個(gè)節(jié)點(diǎn)(192.168.1.101):
for port in `seq 9001 9002`; do \
? mkdir -p ./${port}/conf \
? && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
? && mkdir -p ./${port}/data; \
done
第二個(gè)節(jié)點(diǎn)(192.168.1.102):
for port in `seq 9003 9004`; do \
? mkdir -p ./${port}/conf \
? && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
? && mkdir -p ./${port}/data; \
done
第三個(gè)節(jié)點(diǎn)(192.168.1.103):
for port in `seq 9005 9006`; do \
? mkdir -p ./${port}/conf \
? && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
? && mkdir -p ./${port}/data; \
done
三、解決啟動(dòng)容器可能引起的警告問(wèn)題(所有節(jié)點(diǎn)執(zhí)行)
sysctl vm.overcommit_memory=1
sysctl -p 生效
echo never > /sys/kernel/mm/transparent_hugepage/enabled
并將這句指令添加到/etc/rc.local保證重啟后依然生效
四壮池、創(chuàng)建容器
# 所有節(jié)點(diǎn)創(chuàng)建自定義network(因?yàn)槊總€(gè)節(jié)點(diǎn)有兩個(gè)redis容器偏瓤,所以需要?jiǎng)?chuàng)建自定網(wǎng)絡(luò),如果每個(gè)主機(jī)只有一個(gè)redis容器則直接在創(chuàng)建容器時(shí)指定--net host即可)
docker network create redis-net
# 創(chuàng)建redis容器
# 第一個(gè)節(jié)點(diǎn)(192.168.1.101):
for port in `seq 9001 9002`; do \
? docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
? -v /docker/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf:rw \
? -v /docker/redis/${port}/data:/data:rw \
? --restart always --name redis-${port} --net redis-net \
? --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
# 第二個(gè)節(jié)點(diǎn)(192.168.1.102):
for port in `seq 9003 9004`; do \
? docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
? -v /docker/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf:rw \
? -v /docker/redis/${port}/data:/data:rw \
? --restart always --name redis-${port} --net redis-net \
? --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
# 第三個(gè)節(jié)點(diǎn)(192.168.1.103):
for port in `seq 9005 9006`; do \
? docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
? -v /docker/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf:rw \
? -v /docker/redis/${port}/data:/data:rw \
? --restart always --name redis-${port} --net redis-net \
? --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
# 至此椰憋,容器創(chuàng)建成功
五厅克、啟動(dòng)集群
docker run -it --link redis-9001:redis --net redis-net --rm redis redis-cli --cluster create 192.168.1.101:9001 192.168.1.101:9002 192.168.1.102:9003 192.168.1.102:9004 192.168.1.103:9005 192.168.1.103:9006 --cluster-replicas 1
# 出現(xiàn)如下信息表示啟動(dòng)成功:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
六、測(cè)試集群
# 進(jìn)入容器
docker exec -it redis容器編號(hào) bash
# 進(jìn)入指定端口操作redis
redis-cli -p 9001
# 說(shuō)明:
1橙依、redis-cli -p 9001 -c 可以進(jìn)入指定端口并且自動(dòng)重定向操作redis:如果key-value值不存在9001對(duì)應(yīng)的redis上证舟,那么加上-c那個(gè)可以重定向取到值
2、如果要在slave容器上讀取數(shù)據(jù)窗骑,需要加上readonly指令
# 查看整個(gè)集群部署狀況
redis-cli --cluster check 192.168.1.101:9001
# 查看某個(gè)節(jié)點(diǎn)集群狀態(tài)
redis-cli -p 9001
cluster info
集群管理參看博客
https://blog.51cto.com/8370646/2309693
查看整個(gè)集群部署狀況
redis-cli --cluster check 192.168.1.101:9001
查看某個(gè)節(jié)點(diǎn)集群狀態(tài)
redis-cli -p 9002
cluster info
七女责、注意點(diǎn):
如果一直Waiting for the cluster to join ......
大部分是端口問(wèn)題,除了開(kāi)放集群的端口還要開(kāi)放集群端口+10000端口來(lái)保證集群之間的通信
iptables -F 清除防火墻規(guī)則创译,測(cè)試使用抵知,生產(chǎn)謹(jǐn)慎謹(jǐn)慎(詳細(xì)根據(jù)自己業(yè)務(wù)配置)
redis集群管理參考博客?https://blog.51cto.com/8370646/2309693