Docker搭建Redis Cluster集群及扩容和收容

上一篇文章讲解了Redis集群原理及搭建,由于工作中使用docker较多,本文主要讲解使用docker搭建集群及对集群的扩展收容。
环境:Centos7.6
Docker:20.10.12
Redis:6.2.6

1 集群配置

集群配置步骤

1、创建redis-cluster.tmpl配置Redis信息【端口、是否开启集群等】
2、创建redis.sh配置需要创建的redis信息
3、添加网络,redis集群使用该网络
4、执行redis.sh实现创建redis
5、执行redis-cli创建集群

1.1 安装docker

参考之前一篇文章《Docker安装及配置

1.2 脚本创建

创建目录

mkdir -p /usr/local/server/redis-cluster
cd /usr/local/server/redis-cluster
vi redis-cluster.tmpl

创建 redis-cluster.tmpl 配置Redis信息(类似redis.conf)

#端口
port ${PORT}
#非保护模式
protected-mode no
#启用集群模式
cluster-enabled yes
cluster-config-file nodes.conf
#超时时间
cluster-node-timeout 5000
#集群各节点IP地址
cluster-announce-ip 192.168.88.110
#集群节点映射端口
cluster-announce-port ${PORT}
#集群总线端口
cluster-announce-bus-port 1${PORT}
#开启aof持久化策略
appendonly yes
#后台运行
#daemonize yes
#进程号存储
pidfile /var/run/redis_${PORT}.pid
#集群加密
#masterauth 123456
#requirepass 123456

创建 redis.sh 配置需要创建的 Redis 集群

#!/bin/bash
#在/usr/local/server/redis-cluster下生成conf和data目标,并生成配置信息
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
#创建6个redis容器
for port in seq 7001 7006;
do
    docker run -d -it -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/server/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/server/redis-cluster/${port}/data:/data --privileged=true --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
done
#查找ip
for port in seq 7001 7006; do
echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis- net").IPAddress }}' "redis-${port}")":${port}" ";
done
#换行
echo -e "\n"
#输入信息
read -p "请把输入要启动的docker容器名称,默认redis-7001:" DOCKER_NAME #判断是否为空
if [ ! $DOCKER_NAME ];
    then DOCKER_NAME='redis-7001';
fi
#进入容器
docker exec -it redis-7001 /bin/bash

创建 stop.sh 脚本,用于停止Redis容器,并且移除对应容器:

#!/bin/bash
docker stop redis-7001 redis-7002 redis-7003 redis-7004 redis-7005 redis-7006
docker rm redis-7001 redis-7002 redis-7003 redis-7004 redis-7005 redis-7006
rm -rf 7001 7002 7003 7004 7005 7006

1.3 增加执行权限及配置docker网络

配置docker网络
docker network create redis-net
脚本授权:给 和 添加可执行权限:
chmod +x redis.sh
chmod +x stop.sh

查看docker给每个节点分配的IP信息

docker network inspect redis-net | grep -i -E "name|ipv4address"

Docker搭建Redis Cluster集群及扩容和收容

1.4 集群关联

执行脚本开始安装Redis节点,并进入到 /usr/local/bin 目录下执行 redis-cli 创建集群关联:
执行启动 ./redis.sh 集群

Docker搭建Redis Cluster集群及扩容和收容

关联集群

进入到任意一个安装好的redis节点的bin目录,里面有个脚本对象redis-cli,
docker exec -it redis-7001 bash
cd /usr/local/bin/
执行集群创建
./redis-cli --cluster create 172.18.0.2:7001 172.18.0.3:7002 172.18.0.4:7003 172.18.0.5:7004 172.18.0.6:7005 172.18.0.7:7006 --cluster-replicas 1

Docker搭建Redis Cluster集群及扩容和收容

1.5 验证

redis-cli -p 7001 -c
cluster nodes

Docker搭建Redis Cluster集群及扩容和收容

其他查看集群信息命令

查看 主节点信息
redis-cli -p 7001 cluster nodes|grep master
查看 从节点信息
redis-cli -p 7001 cluster nodes|grep slave
查看集群信息
redis-cli --cluster info ip:端口
redis-cli --cluster check ip:端口

2 集群扩容

上面我们搭建了集群情况如下

Docker搭建Redis Cluster集群及扩容和收容

目前共有6个节点,3对主从,其中7001分配了5416个哈希槽,7002分配了5462个哈希槽,7003分配了5461个哈希槽。随着业务增长,我们需要增加7007和7008 2台Redis,并添加到集群中。其中7007为主节点,7008为7007的从节点,并向主节点7001和7002获取2000个哈希槽。扩容后集群信息如下图:

Docker搭建Redis Cluster集群及扩容和收容

; 2.1 脚本准备

基于Docker安装Redis这里编写了一个脚本,安装脚本 redis-port.sh 如下:

#!/bin/bash
#在/usr/local/server/redis-cluster下生成conf和data目标,并生成配置信息
#换行
echo -e "\n"
#输入信息
read -p "请输入容器端口:" DOCKER_PORT
#输入端口赋值
port=$DOCKER_PORT;
echo -e "$port"

#创建配置文件
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf && mkdir -p ./${port}/data;

#创建redis容器
docker run -d -it -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/server/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/server/redis-cluster/${port}/data:/data --privileged=true --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
#查找ip
echo -n "启动$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis- net").IPAddress }}' "redis-${port}")":${port}" 成功!";
echo -e "\n"

添加执行权限

chmod +x redis-port.sh

执行 redis-port.sh 脚本,实现 7007,7008节点安装。

2.2 添加集群主节点

我们需要给集群节点添加一个主节点,我们需要将 7007 节点添加到 7001 节点所在的集群中,并且添加后作为主节点,添加命令行如下:

将192.168.88.110:7007节点添加到192.168.88.110:7001节点所在的集群中
redis-cli --cluster add-node 192.168.88.110:7007 192.168.88.110:7001

此时我们可以进入到集群节点之一查看此时的集群状态,我们进入到7002节点中输入cluster node查询,操作方法如下

进入容器
docker exec -it redis-7002 /bin/bash
进入到redis-cli脚本目录
cd /usr/local/bin
登录7002节点
./redis-cli -p 7002 -c
查询集群状态
cluster nodes

Docker搭建Redis Cluster集群及扩容和收容

哈希槽分配
从上面的集群节点信息我们可以看出一个问题,7007 节点没有分配哈希槽。因为之前3台Master已经瓜分了16384个哈希槽,所以再增加一个新节点是没有剩余哈希槽分配的,所以新增的 7007 节点没有分配到哈希槽。我们只能重新分配哈希槽,才能让新增节点分配到一定的哈希槽,重新分配哈希槽后,还要考虑之前其他Redis节点中的数据迁移。

重新分配Hash槽
我们将 7001,7002 中的 2000 个哈希槽挪给 7007 ,命令如下:

将7001集群中节点
   fbc63acf974997e37a35b5ca1c71cc002ae1bb40
   fa92c840b4a77463fb27b2b8183f144321a73f86
中的2000个哈希槽移动到 41eb57d0685f71aabef57908aef54189b22573b9中
redis-cli --cluster reshard 192.168.88.110:7001 --cluster-from fbc63acf974997e37a35b5ca1c71cc002ae1bb40,fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-to 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-slots 2000

参数说明:
–cluster-from:表示slot目前所在的节点的node ID,多个ID用逗号分隔
–cluster-to:表示需要新分配节点的node ID
–cluster-slots:分配的slot数量

将2000个哈希槽挪给7007后,我们查询下节点信息:

redis-cli -p 7001 cluster nodes|grep master

Docker搭建Redis Cluster集群及扩容和收容

2.3 添加集群从节点

我们需要往集群中给 7007 节点添加一个从节点 7008 ,添加从节点的主要目的是提高高可用,防止主节点宕机后该节点无法提供服务。添加从节点命令如下:

 将192.168.88.110:7008节点添加到192.168.88.110:7007对应的集群中,并且加入的节点为从节点,
 对应的主节点 id是41eb57d0685f71aabef57908aef54189b22573b9
redis-cli --cluster add-node 192.168.88.110:7008 192.168.88.110:7007 --cluster-slave --cluster-master-id 41eb57d0685f71aabef57908aef54189b22573b9

参数说明:
add-node: 后面的分别跟着新加入的slave和slave对应的master
cluster-slave:表示加入的是slave节点
–cluster-master-id:表示slave对应的master的node ID
执行命令后,效果如下:

2.4 验证

集群信息查看:

Docker搭建Redis Cluster集群及扩容和收容
数据查看
Docker搭建Redis Cluster集群及扩容和收容

; 3 集群缩容

在真实生产环境中,我们也会跟着我们的业务和环境执行缩容处理,比如双十一过后,流量没有那么大了,我们往往
会缩容处理,服务器开销。
Redis实现缩容,需要哈希槽重新分配,将需要移除的节点所分配的所有哈希槽值分配给其他需要运行工作的节点, 还需要移除该节点的从节点,然后再删除该节点。

3.1 移除从节点

移除 7007 的从节点 7008 ,命令如下:

del-node:删除节点,后面跟着slave节点的 ip:port 和node ID
redis-cli --cluster del-node 192.168.88.110:7008 7d6948bb8b6a5ff49f26aef2ebdb400bc3dc7062

3.2 迁移Master7007的Slot

我们需要将7007节点的哈希槽迁移到7001,7002,7003节点上,仍然用上面用过的 redis-cli --cluster reshard ...
语法,迁移计划:500个slots给7001,700个slots给7002,剩余800个给7003 命令如下:

将192.168.88.110:7007节点所在集群中41eb57d0685f71aabef57908aef54189b22573b9 节点的500个哈希槽迁移给 # fbc63acf974997e37a35b5ca1c71cc002ae1bb40节点,不回显需要迁移的slot,直接迁移。
第一次迁移500到7001
redis-cli --cluster reshard 192.168.88.110:7007 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to fbc63acf974997e37a35b5ca1c71cc002ae1bb40 --cluster-slots 500 --cluster-yes

第二次迁移700到7002
redis-cli --cluster reshard 192.168.88.110:7007 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-slots 700 --cluster-yes

第三次迁移800到7003
redis-cli --cluster reshard 192.168.88.110:7007 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to 05e9c301a25041ca780f369974764636513e8767 --cluster-slots 800 --cluster-yes

查看集群状态

Docker搭建Redis Cluster集群及扩容和收容

3.3 删除7007主节点

删除节点命令如下:

redis-cli --cluster del-node 192.168.88.110:7007 41eb57d0685f71aabef57908aef54189b22573b9

集群节点查看:

Docker搭建Redis Cluster集群及扩容和收容
到此集群的缩容完成

Original: https://www.cnblogs.com/dooor/p/docker-redis0227.html
Author: Dvomu
Title: Docker搭建Redis Cluster集群及扩容和收容

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606540/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CentOS-7配置fastDFS文件服务器和安装Nginx

    配置步骤实在是很繁琐,听我慢慢道来! 主要是配置管理(tracker)和存储(storage)返回地址样式 –> 域名/组名/磁盘名/目录名/文件名 &#8211…

    Linux 2023年5月27日
    085
  • Golang 实现 Redis(11): RDB 文件格式

    RDB 文件使用二进制方式存储 Redis 内存中的数据,具有体积小、加载快的优点。本文主要介绍 RDB 文件的结构和编码方式,并借此探讨二进制编解码和文件处理方式,希望对您有所帮…

    Linux 2023年5月28日
    0100
  • 每天一个 HTTP 状态码 201

    201 Created 表示请求成功,在服务器端创建了一个新资源… 201 Created 201 Created 表示客户端的请求已经成功完成,结果是创建了一个新资源…

    Linux 2023年6月7日
    0127
  • Python中import外部模块全局变量修改规则及踩坑

    最近碰到一个import外部文件全局变量修改后未符合预期效果的问题,简要描述如下: 有env.py, test.py, dal.py三个文件,env.py 中定义了DEBUG=Fa…

    Linux 2023年6月6日
    076
  • redis 开机启动安装

    先make把环境装上,然后可以选择用utils文件夹下的./install_server.sh命令进行开机启动安装 1、编写redis.conf配置文件 1)、 设置密码,打开re…

    Linux 2023年5月28日
    092
  • 函数的设计和使用

    1.函数的定义 将可能需要反复执行的代码封装为函数,并在需要该功能的地方进行调用,不仅可以实现代码复用,更重要的是可以保证代码的一致性,只需要修改函数代码则所有调用均受影响。 设计…

    Linux 2023年6月7日
    0172
  • 一面数据: Hadoop 迁移云上架构设计与实践

    背景 一面数据创立于 2014 年,是一家领先的数据智能解决方案提供商,通过解读来自电商平台和社交媒体渠道的海量数据,提供实时、全面的数据洞察。长期服务全球快消巨头(宝洁、联合利华…

    Linux 2023年6月14日
    0132
  • vue动画效果和vue组件——day03

    <div id="app"><br> <input type="button" value="&am…

    Linux 2023年6月7日
    089
  • 编译iPhone静态库的Makefile实例(与Shell脚本一起完成)

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cy568searchx/p/5735419.htmlA…

    Linux 2023年5月28日
    0113
  • 一名研究生的自我修养

    一、如何学习 研究生阶段是学习效率最高的阶段。第一是因为动机纯粹,以前上学这么多年大部分的学习动机只是为了成绩,这个学习动机其实会很大限制同学的主动学习意愿,往往是被动学习,为了成…

    Linux 2023年6月14日
    084
  • NO.2 Windows桌面图标-间距参数调整

    遇到如下问题: 桌面图标自动排序后间隔过大,且如图二这种指向图标能看到图标之间的间隔虚框,此方法可调整虚框的水平和垂直距离,即调整图标之间的间距。 测试电脑: 华为 mateboo…

    Linux 2023年6月7日
    0117
  • gnutls_handshake() failed

    原文链接:https://www.zhoubotong.site/post/75.html使用git clone https://github.com/xxx.git的时候,出现错…

    Linux 2023年6月6日
    0105
  • 数据库的灾备

    数据是企业重要的生产资料,关键数据的丢失可能会给企业致命一击,因为数据是计算机系统存在的原因和基础。数据往往是不可再生的,一旦发生数据丢失,企业就会陷入困境:客户资料、技术文件、财…

    Linux 2023年6月6日
    0110
  • CentOS安装Docker-ce并配置国内镜像

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0102
  • Redis 事务

    一、概述 和传统关系型数据库一样,Redis 同样是支持事务的。Redis 的事务可以通过 MULTI/EXEC/DISCARD/WATCH 等命令来实现。 二、事务的 ACID …

    Linux 2023年5月28日
    099
  • 详解IP地址、子网掩码、网络号、主机号、网络地址、主机地址

    详解IP地址、子网掩码、网络号、主机号、网络地址、主机地址 概念 IP地址:一般是指逻辑ip; 子网掩码:将IP划分为网络号和主机号的IP; 网络号/主机号:子网掩码转成二进制后,…

    Linux 2023年6月6日
    0124
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球