redis-cluster集群搭建

目录

脚本内容:

 修改权限:

语法错误: 未预期的文件结尾

cluster集群配置(分配槽位);

添加节点:

给新增的主节点分配槽位:

添加从节点:

 主节点宕机(主从切换):

删除主节点:

删除从节点:

移除主节点的槽位:

删除主节点:

从节点自动迁移:

集群操作的命令汇总:



不知道 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

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值