容量不够,redis如何进行扩容?
并发写操作, redis如何分摊?
另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。
之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置。
传统采用代理主机固定ip,但是这样消耗资源多
集群
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
测试
创建6个实例
编写配置文件
|
|
- cluster-enabled yes 打开集群模式
- cluster-config-file nodes-6379.conf 设定节点配置文件名
- cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
拷贝多个6380 6381 6389 6390 6391
使用%s查找替换修改配置文件
例如:替换6379为6380 在一般模式下:%s/79/80
打开所有结点
将6个结点开启,确保所有的nodes-xxxx.conf文件都生成正常
合体
找到redis的安装目录 cd /opt/redis-6.2.6/src
使用合体命令
|
|
--replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组。
这里三组主机79 子机89 ...
采用集群策略连接
redis-cli -c -p 6379
也可以是80 81 会自动重定向到需要的主机
集群命令
查看集群信息
cluster nodes
结点分配与ip设置
- 一个集群至少要有三个主节点。
- 选项--cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
- 分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
slots插槽
一个 Redis 集群包含16384 个插槽(hash slot),数据库中的每个键都属于这16384 个插槽的其中一个,
集群使用公式CRC16(key) % 16384 来计算键key 属于哪个槽,其中CRC16(key) 语句用于计算键key 的CRC16 校验和。
集群中的每个节点负责处理一部分插槽。
举个例子,如果一个集群可以有主节点,其中:
- 节点 A 负责处理0号至5460号插槽。
- 节点 B 负责处理5461号至10922号插槽。
- 节点 C 负责处理10923号至16383号插槽。
使用插槽保证数据平均分配到多个主机上
计算slots
cluster keyslot <key>
查询插槽中包含多少个key
cluster countkeysinslot <hash slot>
查询插槽中的值
数字代表前几个
在集群中加入值
会自动重定向并切换主机
但是不在同一slot下的键值不可以使用mset,mget
可以通过设置组来解决,通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
故障修复
如果主节点下线,从节点自动升为主节点?注意:15秒超时
shutdown 79的主节点 过了15秒后,其子节点91自动成为主机,而重新启动79后,就变为91的子节点
注意:单击故障重启需要返回配置文件所在目录/myredis,才可以重新回到集群
如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么,整个集群都挂掉
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no ,那么,该插槽数据全都不能使用,也无法存储。
redis.conf中的参数 cluster-require-full-coverage
集群的jedis开发
|
|
集群优缺点
好处
- 实现扩容
- 分摊压力
- 无中心配置相对简单
坏处
- 多键操作是不被支持的
- 多键的Redis事务是不被支持的。lua脚本不被支持
- 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。