Docker搭建redis-cluster集群

1. 前期准备

1.1 拉redis镜像

docker search redis
docker pull redis

1. 2 创建网卡

docker network create myredis --subnet 172.28.0.0/16

#查看创建的网卡
docker network inspect myredis

在这里插入图片描述

docker network rm myredis #删除网卡命令 多个中间 空格隔开
docker network --help #显示可带参数等

1.3 Redis配置脚本

for port in $(seq 6379 6384); \
do \
mkdir -p ~/redis/node-${port}/conf
touch ~/redis/node-${port}/conf/redis.conf
cat << EOF > ~/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.28.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

命令解释:

  • port:节点端口;
  • requirepass:设置密码,访问时需要验证
  • protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访- 问密码;关闭保护模式,外部网络可以直接访问;
  • daemonize:是否以守护线程的方式启动(后台启动),默认 no;
  • appendonly:是否开启 AOF 持久化模式,默认 no;
  • cluster-enabled:是否开启集群模式,默认 no;
  • cluster-config-file:集群节点信息文件;
  • cluster-node-timeout:集群节点连接超时时间;
  • cluster-announce-ip:集群节点 IP
     注意: 如果你想要你的redis集群可以供外网访问,这里直接填 服务器的IP 地址即可,如若为了安全,只是在服务器内部进行访问,这里还需要做一些修改。
  • cluster-announce-port:集群节点映射端口,用于客户端连接到节点
  • cluster-announce-bus-port:集群节点总线端口,用于节点之间进行通信

EOF(End of File)用法
<<EOF #开始
… #输入内容
EOF #结束

举例说明:
cat << EOF > 1.txt #向文件1.txt输入覆盖内容(也可以:cat > 1.txt <<EOF)
123
456
678
EOF

执行完毕后的目录结构:
在这里插入图片描述

2. 创建redis集群

2.1 批量式启动redis容器

for port in $(seq 6379 6384); \
do \
   docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
  --privileged=true -v /home/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  --privileged=true -v /home/redis/node-${port}/data:/data \
  --restart always --name redis-${port} --net myredis \
  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
done

# 查看是否启动成功
docker ps -a

去掉参数部分:

docker run -d redis redis-server /usr/local/etc/redis/redis.conf
#redis-server [options] [config file]:加载指定的配置文件

命令解释:

  • -d:后台运行,容器启动完成后打印容器
  • –privileged:是否让docker 应用容器 获取宿主机root权限(特殊权限-)
  • –sysctl参数来设置系统参数,通过这些参数来调整系统性能
  • -restart always:在容器退出时总是重启容器
  • –net myredis :使用我们创建的虚拟网卡
  • –name redis-${port}: 将容器命名为 redis-${port}

2.2 创建 redis cluster集群

进入容器

> docker exec -it redis-6379 /bin/sh

进入容器后,在容器中创建集群

> redis-cli --cluster create 172.28.0.11:6379 172.28.0.12:6380 172.28.0.13:6381 172.28.0.14:6382 172.28.0.15:6383 --cluster-replicas 1
  • redis-cli: Redis 命令行工具。
  • –cluster create: 创建 Redis 集群。
  • {ip}:{port}: 指定 Redis 节点地址和端口。
    –cluster-replicas 1: 指定每个 Redis 节点的副本数量。

2.3 验证redis集群

# 启动redis服务器
> redis-server

#连接到redis服务器
> redis-cli -h <host> -p <port>

# 启动redis集群客户端(-c表示集群)host也可不添加
/data# redis-cli -p[host]-c

# 查看集群信息
172.28.0.1:6379> cluster info


# 集群创建好之后,11,12,13为主节点,其余为从节点
172.28.0.1:6379> cluster nodes

在这里插入图片描述

验证 Redis 集群:

#缓存数据
172.28.0.1:6379> set name Stephen

-> Redirected to slot [5798] located at 172.28.0.12:6379
OK
#获取数据
172.28.0.1:6379> get name

-> Redirected to slot [5798] located at 172.28.0.16:6379
"stephen"

停止容器:

docker stop redis-6379

当主节点断开之后,会自动将从节点切换为主节点,比如这里将16切换为了主节点

2.4 批量停止容器

 for port in $(seq 6379 6384); 
 do 
 docker stop redis-${port}
 done

2.5 批量删除容器

 for port in $(seq 6379 6384); 
 do 
 docker rm redis-${port}
 done

3. 集群扩容

集群结构:
在这里插入图片描述

启动一个新的redis容器,并将其添加到myredis网络中:

docker run -d --name redis-6385 -p 6385:6385 --net myredis redis redis-server /usr/local/etc/redis/redis.conf

添加新节点到集群:

#1. 添加从节点 add-node --slave [新加入节点] [集群中任意节点]
redis-cli cluster add-node 172.28.0.1:6385 172.28.0.1:6379


# 2.为确定的master节点添加主节点 add-node --slave --master-id master节点id [新加入节点] [集群任意节点]
redis-cli cluster  add-node 172.28.0.1:6386 172.28.0.1:6379 --cluster-slave 
--cluster-master-id3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 

参数说明:
add-node: 后面的分别跟着新加入的slave和slave对应的master
cluster-slave:表示加入的是slave节点
–cluster-master-id:表示slave对应的master的node ID
redis-cli命令需要再redis容器中执行

哈希槽分配:
新的节点该节点还未分配 slots(哈希槽),所以暂时无法存储数据

redis-cli --cluster reshard 172.28.0.1:6379 --cluster-from fbc63acf974997e37a35b5ca1c71cc002ae1bb40,
fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-to 41eb57d0685f71aabef57908aef54189b22573b9 
--cluster-slots 2000

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

4. 集群缩容

移除从节点:

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

迁移主节点哈希槽:
 删除主节点6395,就没那么容易了。必须先将节点7上的哈希槽移动到其他主节点上,才可以删除它。需要迁出主节点的哈希槽。
 我们需要将7007节点的哈希槽迁移到7001,7002,7003节点上,仍然用上面用过的redis-cli --cluster reshard ...语法,迁移计划:500个slots给6379,700个slots给6380,剩余800个给6381 命令如下:

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

# 第二次迁移700到6380
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-slots 700 --cluster-yes

# 第三次迁移800到6391
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to 05e9c301a25041ca780f369974764636513e8767 --cluster-slots 800 --cluster-yes

删除主节点:

redis-cli --cluster del-node 172.28.0.1:6385:7007 41eb57d0685f71aabef57908aef54189b22573b9

4. 参考文章:

Docker 搭建 Redis Cluster集群 每一步都带有操作图、命令!!!
Docker搭建Redis Cluster集群及扩容和收容 _

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 00:42:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 00:42:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 00:42:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 00:42:02       20 阅读

热门阅读

  1. oracle dataguard 从库 MRP 进程的状态是 WAIT_FOR_GAP

    2024-06-08 00:42:02       9 阅读
  2. 如何评价GPT-4o?

    2024-06-08 00:42:02       10 阅读
  3. CEF编译打包(支持MP4播放,windows-x64版本)

    2024-06-08 00:42:02       9 阅读
  4. WebSocket和HTTP协议对比

    2024-06-08 00:42:02       12 阅读
  5. 【Git】(七)git push用法

    2024-06-08 00:42:02       10 阅读
  6. 中子介程三

    2024-06-08 00:42:02       8 阅读
  7. 智密腾讯云直播组建--客户端API简介

    2024-06-08 00:42:02       7 阅读
  8. 常见的api:Runtime Object

    2024-06-08 00:42:02       9 阅读
  9. MySQL查看和修改时区

    2024-06-08 00:42:02       9 阅读
  10. Spring的bean的生命周期

    2024-06-08 00:42:02       6 阅读
  11. C++中的智能指针

    2024-06-08 00:42:02       8 阅读
  12. LIMS系统在汽车第三方检测实验室的应用

    2024-06-08 00:42:02       12 阅读
  13. Pytorch常用函数用法归纳:创建tensor张量

    2024-06-08 00:42:02       6 阅读
  14. Pytorch中Tensor的类型对应表

    2024-06-08 00:42:02       10 阅读