redis集群以及插槽
1. 集群(cluster)
1.1cluster的架构
- redis的节点之间有通信,互相通信
- 每一个client可以指定任意一个节点
- 所有的节点彼此互联(ping-pong机制),内部使用二进制协议传输速度和带宽
- 节点的fail是集群中超过半数的节点检测时效时才生效(当怀疑一个节点的数量操作半数才认为宕机,才失效)
- client与redis节点直连,不需要中间的proxy层(代理层),客户端不需要连接集群所有节点,连接集群中的任何一个节点可用。
- redis_cluster把所有物理节点映射[0-16383]slot插槽,cluster负责维护node<->slot<->value
1.2配置集群cluster
- 这里设置三个redis节点6379 6380 6381
- 他们分别的的配置文件是redis6379.conf redis6380.conf redis6381.conf
1.2.1 修改redis6379.conf
- 设置不同的端口 port (因为在一机子上面测试,部署集群,所以设置不同端口,但是集群一般在很多机器上,每一个机器就是一个节点,不需要设置不通的端口)
port 6379
- 记得设置集群密码,要设置,如果不弄会报错,所以还是设置吧
https://blog.csdn.net/qq_39135287/article/details/84189397
(引用别人的文章 终于在它哪里找到了我想要的 我的redis的5.x 这个老哥的版本是5.x的很全面)
- ==记得把
bind 127.0.0.1
==注释掉 坑。 - 开启集群
cluster-enabled yes
默认是注释了的
- 指定集群的配置文件
cluster-config-file "nodes-6379.conf"
(这个文件不需要去处理,只需要给他指定就可以,它自动管理的)
- 启动这个redis6379
./bin/redis-server redis6379.conf
,并查看进程ps -ef | grep redis
,会提示有cluster
- 6380 6381都如此设置,并关闭master的主从复制的内容
1.2.2 创建集群
- 以为redis-trib.rb是ruby语言写的,所以要安装ruby环境
yum-y install zlib ruby rubygems
gem install redis
解决gem install redis 问题的网址 参考别人的:
https://www.cnblogs.com/h--d/p/9507939.html
https://www.cnblogs.com/mnhy/p/7856480.html
https://www.cnblogs.com/zhong-11/articles/9884883.html
终于弄完了。。。。到这里用于把gem安装好了,全文替换:%s/old/new/g
遇到’/‘就用’/'来写,避免分隔符错误(虽然做了无用功,但是上面几个文章适合早期版本,3.x吧,5.x以上还是用前面的那个同志的)
创建集群终于开始了
- 进去redis安装包下的src目录
- 执行命令
./redis-cli --cluster create 192.168.91.132:6379 192.168.91.132:6380 192.168.91.132:6381 --cluster-replicas 0 -a 123456
redis5.0以上使用redis-cli
注意不能使用127.0.0.1否则客户端jedis无法连接。--replicas 0
表示从库的数量为0,-a 123456
因为我们设置了集群密码,所以要使用密码来访问,不然会报下面的错误
https://blog.csdn.net/weixin_37882382/article/details/83538367 - 最后成功了?不二话 上图
1.2.3 一些命令的学习
./redis-cli --cluster help
可以查看帮助命令 现在的我不大看的懂 嗯 加油吧
1.2.4 集群的测试
- 建立连接
./bin/redis-cli -p 6379 -a 123456
- “yes”不是“y” 没有分配slot,错误如下
(error) CLUSTERDOWN Hash slot not served
(error) MOVED 7638 192.168.91.132:6380
quit
退出,在之前重新建立连接./bin/redis-cli -c -p 6379 -a 123456
-c
之间计算出来key的插槽值应该存放在6380中,但是我们进入的是6379,为了方便,我们需要设置-c,它的主要作用是根据计算的插槽进行重定向到满足key的节点中去。redirected
1.3 ip地址变更后的种种问题 node xxx is not empty ...
(回家一趟,ip地址改变了 就很伤脑壳,再次打开就有了这个错误。但是之前是有是生成的appendonly.aof,nodesxx.conf 以及dump,所以的全部删除,加上每一个node几面要flushdb``cluster reset
重新启动redis-server 才能解决问题)
- 删除
appendonly.aof``dump.db``nodes-xxx.conf
flushdb``cluster reset
- 重新启动
2.插槽
cluster nodes
可以查看节点的详细信息,包括节点id,ip port ,插槽的范围
- 如果插槽数找不到对应的节点,那么这些插槽数就的key就不能使用
2.1 插槽与节点
计算key的插槽值:
- key的有效部分使用CRC16算法计算哈希值,再将哈希值对16384(16384=总的可以容纳的插槽总数/总的节点数)取余,得到插槽值
有效部分?
- 如果key中包括
{
符号,且在{
符号后面存在}
符号,并且{
和}
之间至少存在一个字符,则有效部分是指{
和}
之间的部分 key=lala{hello}_lala 有效部分hello - 如果上面为false,则整个key都有效部分 lala{hello_lala 有效部分 lala{hello_lala
2.2 新增集群结点
- 添加新增结点6382的conf文件,并修改相应的参数
- 将6382启动(此时在
cluster nodes
中并没有出现,只是启动了服务器) ./redis-cli --cluster add-node 192.168.91.135:6382 192.168.91.135:6379
:将结点6382加入到有6379的集群中·(此时cluster nodes
出现6382结点,但是并没有插槽值的范围,它只是将结点加入到集群中,并没有给他分配插槽的范围)
- 给6382分配插槽
./redis-cli --cluster reshard 192.168.91.135:6382 -a 123456
通过done的方式分配 在source node #1:id 可以写多个 通过done结束
- 分配的结果
2.3 删除集群结点
- 将这个节点上的1所有插槽值转移到其他节点上(保证完整性)
a) 通过./redis-cli --cluster reshard 192.168.91.135:6382 -a 123456
的(与分配相似)的方式来转移插槽节点数量
- 第一步操作只是将插槽的数量全部移除6382,但是6382节点还在集群中
cluster nodes
还是可以查看到,所以删除集群中的节点
./redis-cli --cluster del-node ip:port id -a password
2.4 集群结点宕机–故障转移
这里假设让6381节点宕机··kill -9 3074
- 6381节点宕机之后,但是
cluster nodes
里面6381依旧存在 但是fail
失效,因为集群结点相互监督,只要超过半数以上认为它失效,便故障(这时候,只要有一个结点宕机,整个集群就不能工作)
2.4.1 集群故障机制
- 集群中的每一个节点会定期的向其他节点发送
ping
命令,并且通过没有收到回复判断目标节点是否下线 - 集群中的每一秒会随机选择5个结点,并选择其中最久没有响应的节点放ping命令
- 如果一定时间内没有响应,则判断该目标节点为疑似下线
- 当集群中的节点超过半数认为该目标几点疑似下线,那么该节点会被标记为下载
-** 当集群中任何一个节点下线,就会导致插槽区空挡,不完整,则该集群不可用**
2.4.2 解决故障
a) 在redis集群中可以使用主从模式实现某一个节点的高可用
b)当该节点(master)宕机后,集群会将该节点的从库(slave)转成(master)继续完成集群服务
查看前面的主从复制
主从复制,宕机