目录
不知道 redis-cli 工具怎么来的,redis.conf 原配置文件怎么来的,可以参考:
https://blog.csdn.net/yang_zzu/article/details/107522999
因为 grokzen/redis-cluster 镜像,里面是没有 redis.conf 文件的。
本来想着多开几台虚拟机进行搭建,但是电脑不支持,要想搭建集群最少要有三个主节点,每个主节点还要有备用节点,这一算最少要开6台虚拟机,才能比较形成完成的实验,开6台电脑有点吃不消,只能在一台虚拟机上面进行多节点部署。
cluster-enabled yes 开启集群
cluster-config-file nodes-6378.conf 该节点的配置文件(集群自动生成的文件)
cluster-node-timeout 15000 节点超时时间,超过这个时间该节点不可用,毫秒
luster-replica-validity-factor 10 较大的副本有效性因子可能会使数据太旧的副本无法转移到主服务器,而太小的值可能会使集群根本无法选择副本。
cluster-migration-barrier 1 迁移障碍为1意味着一个副本只有在其主副本至少有1个工作副本时才会迁移(默认值为1)
cluster-require-full-coverage yes 主节点宕机,此时没有从节点进行恢复,no表示,当一个插槽节点不工作,则该槽位停止接收查询操作,集群仍然正常工作,如果为yes,则任意一个槽位不可用则整个集群不可用
cluster-replica-no-failover no no表示,禁止主服务器转移
脚本内容:
#!/usr/bin/bash
#redis-cluster集群搭建
#启动容器
#启动docker服务
echo '启动docker服务...............'
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
restartdocker=`systemctl start docker.service`
if [ $? -eq 0 ];then
echo 'docker服务启动成功........................'
else
echo 'docker服务启动失败!!!!!!!!!!!!'
exit 1
fi
#开启防火墙
echo '启动firewalld服务...............'
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
restartfirewalld=`systemctl restart firewalld.service`
if [ $? -eq 0 ];then
echo 'firewalld服务启动成功......................'
else
echo 'firewalld服务启动失败!!!!!!!!!!!!'
exit 1
fi
#停止、删除之前存在的容器
redis7000=`docker ps -a | grep redis7000 | awk '{print $1}'`
if [ ! -n "$redis7000" ];then
echo "容器id为:$redis7000"
else
echo "容器id为:$redis7000"
echo "正在清除之前的redis7000容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7000`
if [ $? -eq 0 ];then
echo "redis7000容器停止成功..................."
zookeeperRm=`docker rm $redis7000`
if [ $? -eq 0 ];then
echo "redis7000容器清除成功..................."
else
echo "redis7000容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7000容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
redis7001=`docker ps -a | grep redis7001 | awk '{print $1}'`
if [ ! -n "$redis7001" ];then
echo "容器id为:$redis7001"
else
echo "容器id为:$redis7001"
echo "正在清除之前的redis7001容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7001`
if [ $? -eq 0 ];then
echo "redis7001容器停止成功..................."
zookeeperRm=`docker rm $redis7001`
if [ $? -eq 0 ];then
echo "redis7001容器清除成功..................."
else
echo "redis7001容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7001容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
redis7002=`docker ps -a | grep redis7002 | awk '{print $1}'`
if [ ! -n "$redis7002" ];then
echo "容器id为:$redis7002"
else
echo "容器id为:$redis7002"
echo "正在清除之前的redis7002容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7002`
if [ $? -eq 0 ];then
echo "redis7002容器停止成功..................."
zookeeperRm=`docker rm $redis7002`
if [ $? -eq 0 ];then
echo "redis7002容器清除成功..................."
else
echo "redis7002容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7002容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
redis7003=`docker ps -a | grep redis7003 | awk '{print $1}'`
if [ ! -n "$redis7003" ];then
echo "容器id为:$redis7003"
else
echo "容器id为:$redis7003"
echo "正在清除之前的redis7003容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7003`
if [ $? -eq 0 ];then
echo "redis7003容器停止成功..................."
zookeeperRm=`docker rm $redis7003`
if [ $? -eq 0 ];then
echo "redis7003容器清除成功..................."
else
echo "redis7003容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7003容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
redis7004=`docker ps -a | grep redis7004 | awk '{print $1}'`
if [ ! -n "$redis7004" ];then
echo "容器id为:$redis7004"
else
echo "容器id为:$redis7004"
echo "正在清除之前的redis7004容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7004`
if [ $? -eq 0 ];then
echo "redis7004容器停止成功..................."
zookeeperRm=`docker rm $redis7004`
if [ $? -eq 0 ];then
echo "redis7004容器清除成功..................."
else
echo "redis7004容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7004容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
redis7005=`docker ps -a | grep redis7005 | awk '{print $1}'`
if [ ! -n "$redis7005" ];then
echo "容器id为:$redis7005"
else
echo "容器id为:$redis7005"
echo "正在清除之前的redis7005容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7005`
if [ $? -eq 0 ];then
echo "redis7005容器停止成功..................."
zookeeperRm=`docker rm $redis7005`
if [ $? -eq 0 ];then
echo "redis7005容器清除成功..................."
else
echo "redis7005容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7005容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
redis7006=`docker ps -a | grep redis7006 | awk '{print $1}'`
if [ ! -n "$redis7006" ];then
echo "容器id为:$redis7006"
else
echo "容器id为:$redis7006"
echo "正在清除之前的redis7006容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7006`
if [ $? -eq 0 ];then
echo "redis7006容器停止成功..................."
zookeeperRm=`docker rm $redis7006`
if [ $? -eq 0 ];then
echo "redis7006容器清除成功..................."
else
echo "redis7006容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7006容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
redis7007=`docker ps -a | grep redis7007 | awk '{print $1}'`
if [ ! -n "$redis7007" ];then
echo "容器id为:$redis7007"
else
echo "容器id为:$redis7007"
echo "正在清除之前的redis7007容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $redis7007`
if [ $? -eq 0 ];then
echo "redis7007容器停止成功..................."
zookeeperRm=`docker rm $redis7007`
if [ $? -eq 0 ];then
echo "redis7007容器清除成功..................."
else
echo "redis7007容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "redis7007容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
#容器停完之后,会产生 xxx.rdb 持久化文件,应该在这里进行,文件夹的创建和删除操作
#创建文件夹,删除之前目录中存在的数据
if [ ! -d /redis/rediscluster/data7000 ];then
mkdir -p /redis/rediscluster/data7000
if [ $? -eq 0 ];then
echo '7000 创建成功.......'
else
echo '7000 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7000/*
if [ $? -eq 0 ];then
echo '7000 data删除成功.......'
else
echo '7000 data删除失败!!!'
exit 1
fi
fi
if [ ! -d /redis/rediscluster/data7001 ];then
mkdir -p /redis/rediscluster/data7001
if [ $? -eq 0 ];then
echo '7001 创建成功.......'
else
echo '7001 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7001/*
if [ $? -eq 0 ];then
echo '7001 data删除成功.......'
else
echo '7001 data删除失败!!!'
exit 1
fi
fi
if [ ! -d /redis/rediscluster/data7002 ];then
mkdir -p /redis/rediscluster/data7002
if [ $? -eq 0 ];then
echo '7002 创建成功.......'
else
echo '7002 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7002/*
if [ $? -eq 0 ];then
echo '7002 data删除成功.......'
else
echo '7002 data删除失败!!!'
exit 1
fi
fi
if [ ! -d /redis/rediscluster/data7003 ];then
mkdir -p /redis/rediscluster/data7003
if [ $? -eq 0 ];then
echo '7003 创建成功.......'
else
echo '7003 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7003/*
if [ $? -eq 0 ];then
echo '7003 data删除成功.......'
else
echo '7003 data删除失败!!!'
exit 1
fi
fi
if [ ! -d /redis/rediscluster/data7004 ];then
mkdir -p /redis/rediscluster/data7004
if [ $? -eq 0 ];then
echo '7004 创建成功.......'
else
echo '7004 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7004/*
if [ $? -eq 0 ];then
echo '7004 data删除成功.......'
else
echo '7004 data删除失败!!!'
exit 1
fi
fi
if [ ! -d /redis/rediscluster/data7005 ];then
mkdir -p /redis/rediscluster/data7005
if [ $? -eq 0 ];then
echo '7005 创建成功.......'
else
echo '7005 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7005/*
if [ $? -eq 0 ];then
echo '7005 data删除成功.......'
else
echo '7005 data删除失败!!!'
exit 1
fi
fi
if [ ! -d /redis/rediscluster/data7006 ];then
mkdir -p /redis/rediscluster/data7006
if [ $? -eq 0 ];then
echo '7006 创建成功.......'
else
echo '7006 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7006/*
if [ $? -eq 0 ];then
echo '7006 data删除成功.......'
else
echo '7006 data删除失败!!!'
exit 1
fi
fi
if [ ! -d /redis/rediscluster/data7007 ];then
mkdir -p /redis/rediscluster/data7007
if [ $? -eq 0 ];then
echo '7007 创建成功.......'
else
echo '7007 失败!!!'
exit 1
fi
else
rm -rf /redis/rediscluster/data7007/*
if [ $? -eq 0 ];then
echo '7007 data删除成功.......'
else
echo '7007 data删除失败!!!'
exit 1
fi
fi
#配置文件,因为使用的是 docker 文件夹的映射,所以不用在配置文件中修改 data 文件夹的路径
#将 redis.conf 文件中 port 6378 端口,换成不同的 redis 节点的端口(如果没有改过端口默认是6379)
sed 's/6378/7000/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7000.conf
if [ $? -eq 0 ];then
echo 'redis-7000.conf 创建成功.......'
else
echo 'redis-7000.conf 失败!!!'
exit 1
fi
sed 's/6378/7001/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7001.conf
if [ $? -eq 0 ];then
echo 'redis-7001.conf 创建成功.......'
else
echo 'redis-7001.conf 失败!!!'
exit 1
fi
sed 's/6378/7002/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7002.conf
if [ $? -eq 0 ];then
echo 'redis-7002.conf 创建成功.......'
else
echo 'redis-7002.conf 失败!!!'
exit 1
fi
sed 's/6378/7003/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7003.conf
if [ $? -eq 0 ];then
echo 'redis-7003.conf 创建成功.......'
else
echo 'redis-7003.conf 失败!!!'
exit 1
fi
sed 's/6378/7004/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7004.conf
if [ $? -eq 0 ];then
echo 'redis-7004.conf 创建成功.......'
else
echo 'redis-7004.conf 失败!!!'
exit 1
fi
sed 's/6378/7005/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7005.conf
if [ $? -eq 0 ];then
echo 'redis-7005.conf 创建成功.......'
else
echo 'redis-7005.conf 失败!!!'
exit 1
fi
sed 's/6378/7006/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7006.conf
if [ $? -eq 0 ];then
echo 'redis-7006.conf 创建成功.......'
else
echo 'redis-7006.conf 失败!!!'
exit 1
fi
sed 's/6378/7007/g' /redis/rediscluster/redis.conf > /redis/rediscluster/redis-7007.conf
if [ $? -eq 0 ];then
echo 'redis-7007.conf 创建成功.......'
else
echo 'redis-7007.conf 失败!!!'
exit 1
fi
########## 创建网桥,同一个宿主机,容器直接通信需要使用网桥 ##################
#lsbridge=`docker network ls | grep redisbridge`
#if [ $? -eq 0 ];then
# echo 'redisbridge 已经存在..........'
#else
# redisbridge=`docker network create --driver bridge redisbridge`
# if [ $? -eq 0 ];then
# echo '网桥创建成功.................'
# else
# echo '网桥创建失败!!!!!'
# exit 1
# fi
#fi
##########创建容器#############
docker7000=`docker run -i -t -d --net host --name redis7000 -v /redis/rediscluster/redis-7000.conf:/redis/redis.conf -v /redis/rediscluster/data7000:/data -p 7000:7000 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7000服务启动成功.................'
else
echo 'redis7000服务启动失败!!!!!'
exit 1
fi
docker7001=`docker run -i -t -d --net host --name redis7001 -v /redis/rediscluster/redis-7001.conf:/redis/redis.conf -v /redis/rediscluster/data7001:/data -p 7001:7001 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7001服务启动成功.................'
else
echo 'redis7001服务启动失败!!!!!'
exit 1
fi
docker7002=`docker run -i -t -d --net host --name redis7002 -v /redis/rediscluster/redis-7002.conf:/redis/redis.conf -v /redis/rediscluster/data7002:/data -p 7002:7002 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7002服务启动成功.................'
else
echo 'redis7002服务启动失败!!!!!'
exit 1
fi
docker7003=`docker run -i -t -d --net host --name redis7003 -v /redis/rediscluster/redis-7003.conf:/redis/redis.conf -v /redis/rediscluster/data7003:/data -p 7003:7003 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7003服务启动成功.................'
else
echo 'redis7003服务启动失败!!!!!'
exit 1
fi
docker7004=`docker run -i -t -d --net host --name redis7004 -v /redis/rediscluster/redis-7004.conf:/redis/redis.conf -v /redis/rediscluster/data7004:/data -p 7004:7004 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7004服务启动成功.................'
else
echo 'redis7004服务启动失败!!!!!'
exit 1
fi
docker7005=`docker run -i -t -d --net host --name redis7005 -v /redis/rediscluster/redis-7005.conf:/redis/redis.conf -v /redis/rediscluster/data7005:/data -p 7005:7005 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7005服务启动成功.................'
else
echo 'redis7005服务启动失败!!!!!'
exit 1
fi
docker7006=`docker run -i -t -d --net host --name redis7006 -v /redis/rediscluster/redis-7006.conf:/redis/redis.conf -v /redis/rediscluster/data7006:/data -p 7006:7006 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7006服务启动成功.................'
else
echo 'redis7006服务启动失败!!!!!'
exit 1
fi
docker7007=`docker run -i -t -d --net host --name redis7007 -v /redis/rediscluster/redis-7007.conf:/redis/redis.conf -v /redis/rediscluster/data7007:/data -p 7007:7007 grokzen/redis-cluster redis-server /redis/redis.conf`
if [ $? -eq 0 ];then
echo 'redis7007服务启动成功.................'
else
echo 'redis7007服务启动失败!!!!!'
exit 1
fi
echo '-----------------脚本执行成功--------------------'
如果开启了密码验证:则需要在配置文件中开启 masterauth xxxxxx
xxxxxx 表示的是 requirepass xxxxxx 这设置的密码
一般情况下,部署的时候用的都是一个 redis.conf 文件,部署在不同的服务器上面。所以密码都是一样的
修改权限:
chmod 700 redis-success.sh
执行脚本:
改为 host 的连接方式,则会出现警告提示,使用主机网络模式时丢弃已发布的端口,不影响
执行完后,会在每个节点的 data 目录下生成 节点的配置文件。
进入到容器里面:
有密码验证的进行密码验证,没有的话跳过验证
(error) CLUSTERDOWN Hash slot not served
在进行插入的时候,提示的错误信息是,没有给该节点分配 槽位,无法进行内容的添加
语法错误: 未预期的文件结尾
我的文件总行数为412 行,报的413行的错误,这种很可能是,行尾结束符的编码方式的问题:
解决方式:
1. 在 linux 系统中,使用vim 手动创建一个 xxxx.sh 文件,内容就敲几下回车就行
2.将文件拷贝到 windows 系统上
3. 将之前有问题的代码全部拷贝到 xxxx.sh 文件中
4.保存,然后再上传到 linux 服务器就可以了
显示行尾符号
如果xx.sh 文件是在windows 系统上面 创建的,则行尾回车 显示的 CRLE ,这种在linux 系统是不识别的。
在 linux 系统上面创建的 xxx.sh 文件的行尾回车显示符为 LE
cluster集群配置(分配槽位);
查看,当前正在运行的有关redis 的进程
ps -ef | grep redis
分配主从节点与槽位:
redis-cli --cluster create 192.168.44.171:7000 192.168.44.171:7001 192.168.44.171:7002 192.168.44.171:7003 192.168.44.171:7004 192.168.44.171:7005 --cluster-replicas 1 -a foobared
redis-cli --cluster create
192.168.44.171:7000 192.168.44.171:7001 192.168.44.171:7002 192.168.44.171:7003 192.168.44.171:7004 192.168.44.171:7005 表示 ip:端口号(端口号指的是宿主机的端口号)
--cluster-replicas 1 表示每个主节点有且只有一个从节点(主从节点的比为 1:1),如果为2则主从节点的比为1:2
-a foobared 表示密码验证
一直在哪里等待着,使用同一个 bridge 也无法进行连接。
后面看到说的是 如果是 rediscluster 则需要将容器的 连接方式改为 host
则在分配槽位的时候,很短的时间就结束了。
官方 文档说明,在这里搞了半天才知道需要使用 host 模式
使用普通的方式连接,如果插入的 key 的 hash 值与 16384 取余,如果值位于 7000 这个节点(前面运算的大小,位于分配给7000这个节点的槽位之间)则正常插入,否则会提示到那个节点进行插入操作。。
使用 -c 则会自动进行重定向,移动到相应的节点上面
redis-cli -c -p 7000
集群里面某个节点有值,则无法正常的分配槽位,在创建集群之前要保证容器的data 映射文件夹为空。
如果之前有分配过槽位,如果再次创建容器(并且data 文件夹的映射还没有变),则在容器创建好之后,集群就会根据这个配置文件进行节点槽位的分配。所以应该将之前映射到宿主机的data 目录的内容清空,由于在停止容器的时候,redis 会自动的进行rdb 的持久化操作,所以需要在容器关闭后,再删除data 目录的内容。在脚本里面已经调整过执行顺序。
进行远程连接的话需要关闭防火墙:(或者在防火墙中开通端口)
有密码的话输入密码,没有密码的话不用输入:
添加节点:
docker 容器的id
这个是rediscluster 集群的id
不指定主节点的节点id ,则加入的节点默认为主节点
redis-cli --cluster add-node 192.168.44.171:7006 192.168.44.171:7000 -a foobared
redis-cli --cluster add-node
192.168.44.171:7006 需要新增的节点 ip:端口
192.168.44.171:7000 集群中存在的任意节点的ip:端口
-a foobared 密码
给新增的主节点分配槽位:
redis-cli --cluster reshard 192.168.44.171:7000 -a foobared
Source node #1: 53cfc381aadf7ced70aeeaf22d34bc7f5eccdab2
source node #2: 91a492a0ea87962671026122e5fa6da163e23f51
表示从 节点53cfc381aadf7ced70aeeaf22d34bc7f5eccdab2 ,节点91a492a0ea87962671026122e5fa6da163e23f51,平均拿出 4096 个槽位给新的节点。
Source node#1: all 表示从所有现存的主节点平均拿出 4096 个节点分配给 新的主节点(输入的节点id那个节点)
添加从节点:
redis-cli --cluster add-node 192.168.44.171:7007 192.168.44.171:7000 -a foobared --cluster-slave --cluster-master-id 7a2a9c431830616935a1a31c98a4906d25bcc7d9
redis-cli --cluster add-node
192.168.44.171:7007 新增的节点 ip:端口
192.168.44.171:7000 集群中任意一个节点ip:端口
-a foobared 密码
--cluster-slave 表示添加的是从节点
--cluster-master-id 7a2a9c431830616935a1a31c98a4906d25bcc7d9 该从节点的主节点id
主节点宕机(主从切换):
cluster-require-full-coverage yes 和这个配置相关:
yes: 主节点宕机,整个集群都不可用,
no:主节点宕机,其余节点仍然可以使用
将某个主节点的容器关闭,就可以了。
启动容器
cluster-require-full-coverage no 的时候:
其他的槽位节点仍然可用,宕机的那个槽位节点不可用。
进行了主从切换,切换时间为:
cluster-node-timeout 15000 默认为15秒,
可能是我电脑性能的问题,在15秒后查看了一下,没有成功的切换。大概是过了23的时间切换成功。
当7000 节点恢复后,立即变为7004的从节点
删除主节点:
1. 先删除从节点
2.移除主节点的槽位
3.删除主节点
删除从节点:
redis-cli --cluster del-node 192.168.44.171:7000 725fe631701f39f1aa8ca8bdcda86b85d412db1a -a foobared
redis-cli --cluster
del-node 删除命令
192.168.44.171:7000 集群中任意一个 ip:端口
725fe631701f39f1aa8ca8bdcda86b85d412db1a 要删除的节点id
-a foobared 密码
7006主节点 的 从节点 7004 消失
移除主节点的槽位:
redis-cli --cluster reshard 192.168.44.171:7000 -a foobared
redis-cli --cluster reshard
192.168.44.171:7000 集群任意节点的 ip:端口
-a foobared 密码认证
该节点的槽位已经删除
删除主节点:
和删除从节点的语法一样,没有任何改变
redis-cli --cluster del-node 192.168.44.171:7000 b079af6c2d924a68f1029b6d1bd774dc6a16dbc1 -a foobared
redis-cli --cluster del-node
192.168.44.171:7000 集群任意节点 ip:端口
b079af6c2d924a68f1029b6d1bd774dc6a16dbc1 要删除的节点的id
-a foobared 密码认证
从节点自动迁移:
如果某个主节点的从节点宕机,则会自动给该主节点迁移一个从节点,保证集群的高可用性
1. 给某个主节点,或几个主节点,分配冗余的 从节点
2.当集群中某个从节点宕机,其他主节点上冗余的从节点自动的迁移到该主节点上
在移除节点后,会将容器也进行关闭,在此使用该节点的时候需要将容器打开
在将容器删除之后,删除宿主机文件映射的 data 文件夹内的所有文件,再进行容器的创建,否则,在容器创建完之后,该容器会根据data 目录里面的配置文件进行集群的配置,同时加载持久化文件加载数据。
给某个主节点分配冗余节点,和正常的添加从节点没有什么区别
redis-cli --cluster add-node 192.168.44.171:7004 192.168.44.171:7000 -a foobared --cluster-slave --cluster-master-id 4245cbd4e4f60a9fe606b2f2f0c552926608fb2e
redis-cli --cluster add-node
192.168.44.171:7004 新增节点的ip:端口
192.168.44.171:7000 集群任意节点 ip:端口
-a foobared 密码
--cluster-slave 说明新加入节点为从节点
--cluster-master-id 4245cbd4e4f60a9fe606b2f2f0c552926608fb2e 该从节点要添加到那个主节点id
7000 主节点,有两个从节点 ,该槽位节点正常工作。
模拟 7007 宕机,7007 的主节点为 7002
在7007 当宕机后,从 7000 的从节点抽出一个冗余节点7005 ,代替 7007 这个从节点
如果 7007 节点恢复了,则此时 7002 就有两个 从节点,即有一个冗余节点。
集群操作的命令汇总:
-- 查看集群信息
CLUSTER NODES
-- 集群分配槽位
redis-cli --cluster create 192.168.44.171:7000 192.168.44.171:7001 192.168.44.171:7002 192.168.44.171:7003 192.168.44.171:7004 192.168.44.171:7005 --cluster-replicas 1 -a foobared
-- 添加主节点
redis-cli --cluster add-node 192.168.44.171:7006 192.168.44.171:7000 -a foobared
-- 分配槽位
redis-cli --cluster reshard 192.168.44.171:7000 -a foobared
-- 添加从节点
redis-cli --cluster add-node 192.168.44.171:7007 192.168.44.171:7000 -a foobared --cluster-slave --cluster-master-id 7a2a9c431830616935a1a31c98a4906d25bcc7d9
-- 删除从节点
redis-cli --cluster del-node 192.168.44.171:7000 725fe631701f39f1aa8ca8bdcda86b85d412db1a -a foobared
-- 移除槽位
redis-cli --cluster reshard 192.168.44.171:7000 -a foobared
-- 删除主节点
redis-cli --cluster del-node 192.168.44.171:7000 b079af6c2d924a68f1029b6d1bd774dc6a16dbc1 -a foobared