目录
实验环境:由于Codis是基于redis二次开发的,现有的redis环境做Codis部署时会产生不兼容及报错。因此把所有节点的mysql服务和redis服务都关闭,重新部署Codis环境。通过Redis-cluster实现redis集群
1、实验环境的搭建
Codis的实验需要大量集群,以下实验都在server1中进行。
在</root/redis-6.2.4/utils/create-cluster>中,有一个自动创建集群的脚本。按以下方法执行后默认创建6个节点,并自动分为三个“一主一从”的集群结构。
./create-cluster start #自动创建6个节点
./create-cluster create #自动设置master和slave
2、redis集群的查看
作为客户端使用:
redis-cli -c -p 30001 #-c表示集群模式(cluster),-p表示端口
作为管理员管理集群:
redis-cli --cluster help #查询redis集群命令的帮助
redis-cli --cluster check 127.0.0.1:30001 #检查集群
这里引入hash槽的概念,总共16384个hash槽,三个小集群平分这么多哈希槽。这意味着随便连接哪个集群都可以免密访问。
另外,hash槽是集群完整性的标志,三个小集群平分哈希槽,如果其中某一个小集群的master和slave都挂掉了,那么将导致哈希槽不完整,整个大的集群都无法使用。
3、redis集群的使用——无中心化
无中心化的意思是,不管连接哪个节点做操作的时候,都能成功。
随便进入哪个节点,向其中写入数据,这里以30001端口为例,在写入数据后,已经重定向到30002端口了。
进入30005端口,访问数据,仍然会重定向到30002端口
故障测试:
当集群中某一节点出现故障(shutdown)时。以30002节点为例,原本是30006的master,但是30002节点挂掉以后,,这组集群中的master会自动转移到30006
重启<./create-cluster start>以后,节点30002已经变成了30006的一个slave。
4、redis集群中节点的追加
脚本文件中默认为6个节点,在脚本中把6改称8,就会产生8个节点
测试:启动<create-cluster>
但是,新增的两个节点并不在集群里边,也就是说30001-30006可以互相联通,30007和30008两个节点与其他节点不通。因此需要将这两个节点添加进集群中,具体操作步骤如下:
redis-cli --cluster add-node 127.0.0.1:30007 127.0.0.1:30001
#增加节点, 本机接口, 目标集群的接口
<--cluster-slave>参数不添加时表示新增的节点作为master,参数添加时表示新增的节点作为slave。
将30008节点作为30007节点的slave,命令的最后指定master30007的ID
redis-cli --cluster add-node 127.0.0.1:30008 127.0.0.1:30001 --cluster-slave --cluster-master-id d7aed15e5d3bb42be1271c058d365cfa785dd0cb
但是30007和30008两个节点虽然添加进了集群,但并没有分配到hash槽,因此下一步需要向这两个节点分配hash槽。
分配hash槽:
redis-cli --cluster reshard 127.0.0.1:30001 #从30001节点开始重新分配hash槽
下边这些参数表示:(1)要分配多少hash槽。(2)被分配hash槽的节点ID。(3)all表示从左右节点中分配hash槽(也可以某一节点的ID表示从该节点中分配hash槽)
分配完成后,可以看到30007节点总共是3000个hash槽,分别从其他三组小集群中划分出来的。
5、redis-cluster节点的删除
./create-cluster stop #停止redis-cluster
./create-cluster clean #清除redis-cluster
停止并清除redis-cluster后,目录下的所有节点有关的文件都不存在了。