Docker搭建Redis4.0主从集群(不使用Ruby脚本,无哨兵)

前言

生产服务器没法下载ruby,因此我只能这么干啊。

环境背景

操作平台:腾讯云
操作系统:CentOS Linux release 7.7.1908 (Core)
内核版本:5.4.13-1.el7.elrepo.x86_64
Docker版本信息:19.03.5

拉取镜像

docker pull docker:4.0

创建网卡

docker network create redis-net

创建redis集群环境

我的文件是放在/opt/docker/redis-cluster/目录下,这里酌情修改为自己的目录。
sudo mkdir /opt/docker/redis-cluster/
创建模版文件:vim redis-cluster.tmpl
将以下内容粘贴到你的redis-cluster.tmpl模版文件中注意:修改127.0.0.1为你的可访问的ip地址(内网访问可以用内网ip,外网访问要用外网IP)

port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 127.0.0.1 #注意这儿一定是你的外网IP
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes

生成配置文件和数据存放目录(直接执行一下命令):

for port in `seq 7001 7006`; do \
  mkdir -p ./${port}/conf \
  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
  && mkdir -p ./${port}/data; \
done

这一段的意思就是:创建7001-7006目录以及下面的conf和data目录,并将redis-cluster.tmpl中的${port}替换为7001-7006分别复制到各自的conf下的redis.conf中。

创建Redis4.0容器

创建7001-7006一共6个容器(直接执行命令):

for port in `seq 7001 7006`; do \
  docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
  --name="redis-${port}"\
  -v /opt/docker/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v /opt/docker/redis-cluster/${port}/data:/data \
  --restart always --name redis-${port} --net redis-net \
  --sysctl net.core.somaxconn=1024 redis:4.0 redis-server /usr/local/etc/redis/redis.conf; \
done

经过这一步目前我们已经有了6台独立的redis容器

连接redis容器到集群

打开reids-cli客户端:docker exec -it redis-7001 redis-cli -p 7001
在redis-cli中关联各个容器:cluster meet 127.0.0.1 7001,cluster meet 127.0.0.1 7002,cluster meet 127.0.0.1 7003,cluster meet 127.0.0.1 7004,cluster meet 127.0.0.1 7005,cluster meet 127.0.0.1 7006注意:这儿的127.0.0.1替换成你的外网IP
查看关联信息:cluster nodes注意:第一列是容器id,下面会用到
退出redis-cli:exit

主从配置

我的配置是7001、7002、7003是master,7004、7005、7006是slave
将7004配置为7001的从节点:docker exec -it redis-7004 redis-cli -p 7004 cluster replicate 7001的容器id(一长串字符串),
将7005配置为7002的从节点:docker exec -it redis-7005 redis-cli -p 7005 cluster replicate 7002的容器id(一长串字符串),
将7006配置为7003的从节点:docker exec -it redis-7006 redis-cli -p 7006 cluster replicate 7003的容器id(一长串字符串)
打开reids-cli客户端:docker exec -it redis-7001 redis-cli -p 7001 ,之后执行cluster nodes查看主从分配情况。

主节点分配Redis槽点

给7001分配槽点:docker exec -it redis-7001 redis-cli -p 7001 cluster addslots {0..5461},
给7002分配槽点:docker exec -it redis-7002 redis-cli -p 7002 cluster addslots {5462..10922},
给7003分配槽点:docker exec -it redis-7003 redis-cli -p 7003 cluster addslots {10923..16383}
注意1:不管你有几个主节点,一定要完全分配16383个槽点,不能多也不能少。加节点的话,就必须重复切分部分槽点到新节点上。
注意2:一定要在外面执行这个cluster addslots {a..b}命令,在客户端执行的话只能分配单独的节点,不能分配连续的节点。会报错: ERR Invalid or out of range slot

结尾

到此为止,集群已经搭建完毕!你可以使用客户端去访问了。
别忘了把你的服务器端口7001-7006开放了

posted @ 2020-01-21 18:14  神奇小宝  阅读(474)  评论(0编辑  收藏  举报