【redis_10】集群

写在前面

个人博客网址:https://jiong952.github.io/
个人github网址:https://github.com/jiong952
容量不够,redis如何进行扩容?

并发写操作, redis如何分摊?

另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。

之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置。

传统采用代理主机固定ip,但是这样消耗资源多

img

集群

Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

测试

创建6个实例

编写配置文件

include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
  • cluster-enabled yes 打开集群模式
  • cluster-config-file nodes-6379.conf 设定节点配置文件名
  • cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

拷贝多个6380 6381 6389 6390 6391

使用%s查找替换修改配置文件

例如:替换6379为6380 在一般模式下:%s/79/80

img

打开所有结点

将6个结点开启,确保所有的nodes-xxxx.conf文件都生成正常

img

img

合体

找到redis的安装目录 cd /opt/redis-6.2.6/src

使用合体命令

redis-cli --cluster create --cluster-replicas 1 192.168.200.130:6379 192.168.200.130:6380 192.168.200.130:6381 192.168.200.130:6389 192.168.200.130:6390 192.168.200.130:6391

–replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组。

img

这里三组主机79 子机89 …

采用集群策略连接

redis-cli -c -p 6379

也可以是80 81 会自动重定向到需要的主机

img

集群命令

查看集群信息

cluster nodes

img

结点分配与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>

img

查询插槽中包含多少个key

cluster countkeysinslot <hash slot>

img

查询插槽中的值

img

数字代表前几个

在集群中加入值

img

会自动重定向并切换主机

但是不在同一slot下的键值不可以使用mset,mget

img

可以通过设置组来解决,通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。

img

故障修复

如果主节点下线,从节点自动升为主节点?注意:15秒超时

img

shutdown 79的主节点 过了15秒后,其子节点91自动成为主机,而重新启动79后,就变为91的子节点

img

注意:单击故障重启需要返回配置文件所在目录/myredis,才可以重新回到集群

如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么,整个集群都挂掉

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no ,那么,该插槽数据全都不能使用,也无法存储。

redis.conf中的参数 cluster-require-full-coverage

集群的jedis开发

public class JedisClusterTest {
  public static void main(String[] args) { 
     Set<HostAndPort>set =new HashSet<HostAndPort>();
     set.add(new HostAndPort("192.168.31.211",6379));
     JedisCluster jedisCluster=new JedisCluster(set);
     jedisCluster.set("k1", "v1");
     System.out.println(jedisCluster.get("k1"));
  }
}

集群优缺点

好处

  • 实现扩容
  • 分摊压力
  • 无中心配置相对简单

坏处

  • 多键操作是不被支持的
  • 多键的Redis事务是不被支持的。lua脚本不被支持
  • 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiong-952

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值