Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 397, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

Reids集群的Redis Cluster模式

Redis集群(Redis Cluster)是Redis提供的一种分布式解决方案,它允许Redis数据在多个Redis节点之间进行分片(sharding),从而可以水平扩展以支持更大的数据量、更高的并发查询负载以及更高的可用性。
一、Redis Cluster特点:
1、哈希槽(Hash ):使用16384个哈希槽存储数据;每个节点都负责一部分哈希槽;当客户需要存储或检索数据时,使用CRC16算法对键进行哈希,根据结果确定使用哪个哈希槽。
2、数据分片:通过哈希槽分配给集群中的节点,每个节点只负责分配到哈希槽数据9、
3、高可用性和故障恢复:Redis集群主节点均有一个或多个备份节点;如主节点故障,集群自动将节点提升到主节点,以保证服务的连续性;集群会检测和自动处理故障节点。
4、客户端重定向:客户端访问不在其当前节点的哈希槽时,该节点会自动向客户端发送重定向命令,告诉客户端应连接哪个节点;客户端根据这个命令重新连接到正确的节点,并执行相应的操作。
5、一致保证性:Redis集群在CAP(
Consistency, Availability, Partition tolerance)中倾向于AP(可用性和分区容忍性);某情况下,如网络故障或节点故障,集群会暂时牺牲一致性。
6、使用场景:处理大量数据和高并发查询;需要高可用性和故障恢复能力的场景。
7、配置和部署:需配置多个Redis节点;可使用reids-cli获取其他集群管理工具
如(Redis Cluster Manager)来创建、配置和管理集群。
8、客户端支持:大多数Reids客户端支持并提供api与集群交互;客户端通常会自动处理哈希槽的映射、重定向和故障恢复等底层细节,使得开发象使用单个redis示例一样使用Reids集群。
9、其他:
不支持某些Redis命令(如跨多个键的操作)和配置(如持久化到磁盘的配置)
二、部署:
1、规模:
至少需要3个主节点来构成,因为集群使用了投票容错机制,要求超过半数节点认为某个节点挂了,该节点才被视为不可用;每个主节点都应该有一个或多个从节点(即备份节点)。因此,一个基本的Redis集群至少需要6台服务器(3主3从)。
2、
安装redis节点
redis配置文件详解
3、配置集群节点:修改Redis节点的配置文件,确保cluster-enabled yes:启用Redis集群模式;
                      分配不同的端口号给每个节点,确保它们不冲突(例如,使用1001-9001);
                       根据需要配置其他相关参数,如密码、内存限制等
4、启动redis:使用redis-server命令
5、使用reids-cli命令行工具,
Redis Cluster 在5.0之后取消了ruby脚本 redis-trib.rb的支持。
redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN   #创建集群
                 --cluster-replicas <arg>      #从节点个数
  check          host:port                     #检查集群
                 --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
  info           host:port                     #查看集群状态
  fix            host:port                     #修复集群
                 --cluster-search-multiple-owners #修复槽的重复分配问题
  reshard        host:port                     #指定集群的任意一节点进行迁移slot,重新分slots
                 --cluster-from <arg>          #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-to <arg>            #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-slots <arg>         #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
                 --cluster-yes                 #指定迁移时的确认输入
                 --cluster-timeout <arg>       #设置migrate命令的超时时间
                 --cluster-pipeline <arg>      #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
                 --cluster-replace             #是否直接replace到目标节点
  rebalance      host:port                                      #指定集群的任意一节点进行平衡集群节点slot数量 
                 --cluster-weight <node1=w1...nodeN=wN>         #指定集群节点的权重
                 --cluster-use-empty-masters                    #设置可以让没有分配slot的主节点参与,默认不允许
                 --cluster-timeout <arg>                        #设置migrate命令的超时时间
                 --cluster-simulate                             #模拟rebalance操作,不会真正执行迁移操作
                 --cluster-pipeline <arg>                       #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
                 --cluster-threshold <arg>                      #迁移的slot阈值超过threshold,执行rebalance操作
                 --cluster-replace                              #是否直接replace到目标节点
  add-node       new_host:new_port existing_host:existing_port  #添加节点,把新节点加入到指定的集群,默认添加主节点
                 --cluster-slave                                #新节点作为从节点,默认随机一个主节点
                 --cluster-master-id <arg>                      #给新节点指定主节点
  del-node       host:port node_id                              #删除给定的一个节点,成功后关闭该节点服务
  call           host:port command arg arg .. arg               #在集群的所有节点执行相关命令
  set-timeout    host:port milliseconds                         #设置cluster-node-timeout
  import         host:port                                      #将外部redis数据导入集群
                 --cluster-from <arg>                           #将指定实例的数据导入到集群
                 --cluster-copy                                 #migrate时指定copy
                 --cluster-replace                              #migrate时指定replace
① 创建集群主节点:
redis-cli --cluster create ip:port
② 创建集群主从节点:
redis-cli --cluster create ip:port ip1:port1 --cluster-replicas 1  --cluster-replicas 参数为数字,1表示每个主节点需要1个从节点。
③ 添加集群主节点:
redis-cli --cluster add-node ip:port
④ 添加集群从节点:把ip:port节点加入到ip_master:port_master,当做node_id为 117457eab5071954faab5e81c3170600d5192270 的从节点,如不指定 --cluster-master-id 会随机分配到任意一个主节点。
redis-cli --cluster add-node ip:port ip_master:port_master --cluster-slave --cluster-master-id 117457eab5071954faab5e81c3170600d519227
⑤ 删除节点:有slot分配的主节点不能直接删除。
redis-cli --cluster del-node 
:port
f6a6957421b80409106cb36be3c7ba41f3b603ff

注意:当被删除掉的节点重新起来之后不能自动加入集群,但其和主的复制还是正常的,也可以通过该节点看到集群信息(通过其他正常节点已经看不到该被del-node节点的信息)。

如果想要再次加入集群,则需要先在该节点执行cluster reset,再用add-node进行添加,进行增量同步复制。

⑥ 检查集群:任意连接一个集群节点,进行集群状态检查
redis-cli --cluster check 192.168.198.102:6384 --cluster-search-multiple-owners
⑦ 集群信息查看:说明:检查ke

redis-cli --cluster set-timeout 192.168.163.112:6382 10000

y、slots、从节点个数的分配情况

redis-cli --cluster info ip:port

⑧ 修复集群:修复集群和槽的重复分配问题

redis-cli --cluster fix ip:port --cluster-search-multiple-owners

⑨ 设置集群的超时时间 :连接到集群的任意一节点来设置集群的超时时间参数cluster-node-timeout

redis-cli --cluster set-timeout 192.168.163.132:6382 1000

⑩ 集群中执行相关命令:连接到集群的任意一节点来对整个集群的所有节点进行设置。

redis-cli --cluster call ip:6381 config set requirepass cc
redis-cli -a cc --cluster ip1:6381 config set masterauth cc
redis-cli -a cc --cluster call ip2:6381 config rewrite
 6、Redis 6.0 新增了几个命令:fix 的子命令:--cluster-fix-with-unreachable-masters

                                                 call的子命令:--cluster-only-masters、--cluster-only-replicas

                                                 集群节点备份:backup
7、迁移

① 在线迁移slot :在线把集群的一些slot从集群原来slot节点迁移到新的节点,即可以完成集群的在线横向扩容和缩容。有2种方式进行迁移

1)直接连接到集群的任意一节点:
   redis-cli -a cc --cluster reshard ip:port
2)连接到集群的任意一节点来对指定节点指定数量的slot进行迁移到指定的节点:

redis-cli -a cc --cluster reshard 192.168.165.132:6379 --cluster-from 117457eab5071954faab5e81c3170600d5192270 --cluster-to 815da8448f5d5a304df0353ca10d8f9b77016b28 --cluster-slots 10 --cluster-yes --cluster-timeout 5000 --cluster-pipeline 10 --cluster-replace

② 平衡(rebalance)slot 

1)平衡集群中各个节点的slot数量
redis-cli -a cc --cluster rebalance 192.168.163.132:6379
2)根据集群中各个节点设置的权重等平衡slot数量(不执行,只模拟)
redis-cli -a cc --cluster rebalance --cluster-weight 117457eab5071954faab5e81c3170600d5192270=5 815da8448f5d5a304df0353ca10d8f9b77016b28=4 56005b9413cbf225783906307a2631109e753f8f=3 --cluster-simulate 192.168.163.132:6379
③ 导入集群:外部Redis实例(9021)导入到集群中的任意一节点。
redis-cli --cluster import 192.168.165.132:6379 --cluster-from 192.168.165.132:9021 --cluster-replace
注意:测试下来发现参数--cluster-replace没有用,如果集群中已经包含了某个key,在导入的时候会失败,不会覆盖,只有清空集群key才能导入。
如果集群设置了密码,也会导入失败,需要设置集群密码为空才能进行导入(call)。通过monitor(9021)的时候发现,在migrate的时候需要密码进行auth认证。



 






posted on 2024-07-12 20:52 Benjamin 阅读(28) 评论(0)  编辑 收藏 引用 所属分类: 数据库


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理