Docker多机集群部署之Redis集群(redis-cluster)

一、环境说明:

宿主机: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

你可能感兴趣的:(Docker多机集群部署之Redis集群(redis-cluster))