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集群及扩容和收容 _