【Redis】无中心化集群

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【Redis】无中心化集群,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、闲话

最近染上了新冠,整整在家休息了一周,然后就遇上某些很c蛋的事,更加坚定了我要抓紧学习跳槽的念头,再苟一苟,小不忍则乱大谋~

二、基本概念

1、什么是redis集群

  • Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N
  • Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求

2、redis集群的作用

  • 容量不够,使用集群进行扩容
  • master节点负责写操作,在高并发的写操作场景,master节点就会成为性能瓶颈, 使用集群分摊压力
  • 主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息,无中心化只需要配置一个一个节点即可,节点间可相互访问

3、redis集群的劣势

  • 不支持多键操作,即mset,除非分组,比较麻烦
  • 多键的redis事务不支持,而且不支持lua脚本
  • 在集群出现之前,很多公司都是使用通过代理主机来解决数据的分区,通过代理主机决定往哪个分区上发送请求,这样往无中心化集群迁移起来比较麻烦

三、搭建redis集群

因为我本地只有一个虚拟机,所以我通过多端口启动redis来模拟集群

  • 创建一个目录/redisCluster用来存放配置文件,创建端口号6379对应的配置文件
  • 6379端口对应的配置文件内容如下,重点是后面追加的三个
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  #设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
  • 修改完6379端口配置文件后,再复制出5个,使用命令%s/6379/6380来进行配置的批量替换
  • 启动这6个端口的redis服务,然后检查nodes-xxxx.conf文件是否都生成正常
  • 接着就是去redis安装目录的src文件夹下,执行命令将这6个服务组合成一个集群,命令为redis-cli --cluster create --cluster-replicas 1 192.168.153.128.101:6379 192.168.153.128:6380 192.168.153.128:6381 192.168.153.128:6389 192.168.153.128:6390 192.168.153.128:6391
    • 命令中--cluster-replicas后面的1表示为每台主服务器分配1台从服务器
    • 这里的IP需要填服务器的IP,而不是localhost或者127.0.0.1
  • 执行上方的命令之后,系统就会自动分配好一主一从的分组,我们只需要输入yes确认就可以了
  • 集群搭建完成之后,我们可以使用redis-cli -c -p <port>从任何一个端口登入集群,通过cluster nodes查看集群信息

四、集群操作和故障恢复

1、集群分配原则

  • 主节点不能处于同一个IP地址,主节点和他的从节点不能处于同一IP地址
  • 至少有3个主节点
  • 命令中--cluster-replicas后面的1表示为每台主服务器分配1台从服务器

2、slot插槽
一个Redis集群包含 16384 个插槽(hash slot), Redis数据库中的每个键都属于这 16384 个插槽的其中一个,可以理解为用它来区分到底操作集群哪个分区

  • 在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口
  • redis-cli客户端提供了–c参数实现自动重定向,使用redis-cli -c -p <port>登入集群,录入、查询键值对可以自动重定向到对应实例
  • 不在一个slot下的键值,不能使用mget,mset等多键操作,但是可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去,如mset k1{user} v1 k2{user} v2 k3{user} v3会把k1、k2和k3塞到一个slot中

3、集群操作指令

  • 查看key属于哪个slot:cluster keyslot k1
  • 查看某个slot中存在的key的数量:cluster countkeysinslot <slot>,slot表示插槽值,只能看属于当前实例的插槽中的key
  • 返回slot中的key:cluster getkeysinslot <slot> <count>,count表示要查看的key的数量

4、故障恢复

  • 当某段slot所属的主服务器挂掉,那么它的从服务器会取代他成为主实例,就算他后面恢复了,也不会再变回主实例
  • 如果某一段slot的主节点从节点都挂掉了,那么集群的工作情况就需要看配置文件redis.conf中的参数cluster-require-full-coverage的设置情况
    • 设置为yes,那么整个集群都挂掉,无法工作。默认为yes
    • 设置为no,那么只是这一段的插槽无法工作(数据无法使用,也无法存储),集群的其余,部分可以正常工作

5、集群的Jedis开发
Java提供了JedisCluster这个类,用于操作redis集群

如有错误,欢迎指正!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136730.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!