一、3主3从的集群配置:
1.1.集群规划
- 1.分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
- 2.每组是一主一从,一共3组,来模拟分片集群,这里我们会在同一台虚拟机中开启2个redis实例,实现一主一从,信息如下:
IP | PORT | 角色 |
---|---|---|
192.168.111.175 | 6381 | master |
192.168.111.175 | 6382 | slave |
192.168.111.172 | 6383 | master |
192.168.11.172 | 6384 | slave |
192.168.111.174 | 6385 | master |
192.168.111.174 | 6386 | slave |
1.2.新建6个实例
- 1.在3台服务器上新建目录:mkdir -p /myredis/cluster
- 2.在192.168.111.172服务器上,
在/myredis/cluster目录
下,新建配置文件,命名为redisCluster6381.conf 和 命名为redisCluster6382.conf
- 4.在192.168.111.174服务器上,
在/myredis/cluster目录
下,新建配置文件,命名为redisCluster6383.conf 和 命名为redisCluster6384.conf - 5.在192.168.111.175服务器上,
在/myredis/cluster目录
下,新建配置文件,命名为redisCluster6385.conf 和 命名为redisCluster6386.conf
1.3.启动6台实例:
- 1.在192.168.111.175服务器上启动81和82实例:
- 2.在192.168.111.172服务器上启动83和84实例:
- 3.192.168.111.174服务器上启动85和86实例:
1.4.创建集群环境:
- 1.虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
- 2.我们需要执行命令来创建集群,
在Redis5.0之前创建集群比较麻烦
,5.0之后集群管理命令都集成到了redis-cli中 - 3.命令格式如下:
redis-cli --cluster
或者./redis-trib.rb
:代表集群操作命令create
:代表是创建集群--replicas 1
或者--cluster-replicas 1
:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)
得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
sh
redis-cli --cluster create --cluster-replicas 1 192.168.111.175:6381 192.168.111.175:6382 192.168.111.172:6383 192.168.111.172:6384 192.168.111.174:6384 192.168.172.174:6385
-
4.上面的命令运行后的样子:
-
5.这里输入yes,则集群开始创建:
1.5.集群测试:
a.查看集群状态:
- 1.方式1:以6381为切入点,查看集群的状态,命令是
info replication
- 方式2:以6381为切入点,查看集群的状态,命令是
cluster nodes
二、3主3从的Redis集群读写:
2.1.对6381新增两个key来分析:
- 1.尝试连接6381节点,存储key时,发现有的key可以存储,有的不可以:
2.2.为何报错:
- 一定要注意槽位的范围区间 ,需要路由到位
2.3.如何解决:
- 1.集群操作时,需要给
redis-cli
加上-c
参数才可以:
三、主从容错切换迁移案例:
四、主从扩容案例:
二、集群伸缩:
4.1.获取redis集群操作环境下的命令
- 1.
redis-cli --cluster
提供了很多操作集群的命令,可以通过下面方式查看:
- 2.比如,添加节点的命令:
4.2.集群伸长:
a.需求分析:
- 1.需求:向集群中
添加一个新的master节点,并向其中存储 num = 10
- 2.这里需要两个新的功能:
- 添加一个节点到集群中
- 将部分插槽分配到新插槽
- 3.添加过程:
- 启动一个新的redis实例,端口为7004
- 添加7004到之前的集群,并作为一个master节点
- 给7004节点分配插槽,使得num这个key可以存储到7004实例
b.创建新的redis实例
- 1.创建一个文件夹:
sh
mkdir 7004
- 2.拷贝配置文件:
sh
cp redis.conf /7004
- 3.修改配置文件:
sh
sed -i /s/6379/7004/g 7004/redis.conf
- 4.启动
sh
redis-server 7004/redis.conf
c.添加新节点到集群:
- 1.添加节点的语法如下:
执行命令:
sh
redis-cli --cluster add-node 192.168.150.101:7004 192.168.150.101:7001
- 2.通过命令查看集群状态:
sh
redis-cli -p 7001 cluster nodes
- 3.如图,7004加入了集群,并且默认是一个master节点,
但是,可以看到7004节点的插槽数量为0,因此没有任何数据可以存储到7004上
d.转移插槽
- 1.我们要将num存储到7004节点,因此需要先看看num的插槽是多少:
如上图所示,num的插槽为2765.
- 2.我们可以
将0~3000的插槽从7001转移到7004
,命令格式如下:
- 3.具体命令如下:
建立连接:
结果是:
询问要移动多少个插槽,我们计划是3000个:
新的问题来了:那个node来接收这些插槽??
显然是7004,那么7004节点的id是多少呢?
复制这个id,然后拷贝到刚才的控制台后:
- 这里询问,你的插槽是从哪里移动过来的?
- all:代表全部,也就是三个节点各转移一部分
- 具体的id:目标节点的id
- done:没有了
- 这里我们要从7001获取,因此填写7001的id,填完后,点击done,这样插槽转移就准备好了:
- 确认要转移吗?输入yes:
- 然后,通过命令查看结果:
4.3集群缩短:
a.需求介绍:
- 1.集群初识状态是这样的:
- 其中7001、7002、7003都是master,我们计划让7002宕机。
b.自动故障转移
- 1.当集群中有一个master宕机会发生什么呢?直接停止一个redis实例,例如7002:
sh
redis-cli -p 7002 shutdown
- 2.宕机过程:
- 首先是该实例与其它实例失去连接
- 然后是疑似宕机:
- 3.最后是确定下线,自动提升一个slave为新的master:
- 4.当7002再次启动,就会变为一个slave节点了:
c.手动故障转移
- 1.手动故障的情况适用于数据迁移等情况
- 2.利用
cluster failover
命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。 - 3.在slave节点上执行此命令,执行后,这个slave节点对应的主节点就会下线,当前slave节点就会变成master节点
- 4.其流程如下:
- 5.这种failover命令可以指定三种模式:
缺省
:默认的流程,如图1~6歩force
:省略了对offset的一致性校验,第3和第4步就没了takeover
:直接执行第5歩,忽略数据一致性、忽略master状态和其它master的意见
d.案例需求:
- 1.在7002这个slave节点执行手动故障转移,重新夺回master地位
- 2.步骤如下:
- 利用redis-cli连接7002这个节点
- 执行cluster failover命令
- 3.如图:
- 4.效果: