一、环境说明:
宿主机:Win10
虚拟机工具:VMware Workstation 15
系统及版本:Ubuntu16.04
Docker版本:18.09.3
Redis image版本:5.0.4
涉及到的虚拟主机:(部署三个节点六个服务)
192.168.1.101 redis-9001 和 redis-9002
192.168.1.102 redis-9003 和 redis-9004
192.168.1.103 redis-9005 和 redis-9006
二、创建本地目录及所需配置文件(所有节点)
# 创建本地目录
mkdir -p /docker/redis
# 在 /docker/redis下创建配置文件redis-cluster.tmpl,内容如下:
# 开放的端口
port ${PORT}
# 关闭保护模式
protected-mode no
# 开启集群
cluster-enabled yes
# 集群配置文件(集群自己管理)
cluster-config-file nodes.conf
# 集群连接超时时间
cluster-node-timeout 15000
# 本机服务器地址
cluster-announce-ip 192.168.1.101
# 集群端口
cluster-announce-port ${PORT}
# 集群交互端口
cluster-announce-bus-port 1${PORT}
# 开启aof日志
appendonly yes
# 日志文件地址
logfile "./redis.log"
# 进入/docker/redis目录,生成conf、data文件夹和配置信息
# 说明:每个节点生产2个文件夹共6个,从9001到9006,每个文件夹下包含data和conf文件夹,同时conf里面有已经指定端口和ip的redis.conf配置文件
# 第一个节点(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
第二个节点(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
第三个节点(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
三、解决启动容器可能引起的警告问题(所有节点执行)
sysctl vm.overcommit_memory=1
sysctl -p 生效
echo never > /sys/kernel/mm/transparent_hugepage/enabled
并将这句指令添加到/etc/rc.local保证重启后依然生效
四、创建容器
# 所有节点创建自定义network(因为每个节点有两个redis容器,所以需要创建自定网络,如果每个主机只有一个redis容器则直接在创建容器时指定--net host即可)
docker network create redis-net
# 创建redis容器
# 第一个节点(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
# 第二个节点(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
# 第三个节点(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
# 至此,容器创建成功
五、启动集群
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
# 出现如下信息表示启动成功:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
六、测试集群
# 进入容器
docker exec -it redis容器编号 bash
# 进入指定端口操作redis
redis-cli -p 9001
# 说明:
1、redis-cli -p 9001 -c 可以进入指定端口并且自动重定向操作redis:如果key-value值不存在9001对应的redis上,那么加上-c那个可以重定向取到值
2、如果要在slave容器上读取数据,需要加上readonly指令
# 查看整个集群部署状况
redis-cli --cluster check 192.168.1.101:9001
# 查看某个节点集群状态
redis-cli -p 9001
cluster info
集群管理参看博客
https://blog.51cto.com/8370646/2309693
查看整个集群部署状况
redis-cli --cluster check 192.168.1.101:9001
查看某个节点集群状态
redis-cli -p 9002
cluster info
七、注意点:
如果一直Waiting for the cluster to join ......
大部分是端口问题,除了开放集群的端口还要开放集群端口+10000端口来保证集群之间的通信
iptables -F 清除防火墙规则,测试使用,生产谨慎谨慎(详细根据自己业务配置)
redis集群管理参考博客 https://blog.51cto.com/8370646/2309693