【Redis】无中心化集群-创新互联
一、闲话
新闻名称:【Redis】无中心化集群-创新互联
标题链接:http://cdiso.cn/article/epocj.html
最近染上了新冠,整整在家休息了一周,然后就遇上某些很c蛋的事,更加坚定了我要抓紧学习跳槽的念头,再苟一苟,小不忍则乱大谋~
创新互联建站10多年成都企业网站建设服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,成都企业网站建设及推广,对塑料袋等多个领域拥有丰富的网站制作经验的网站建设公司。二、基本概念1、什么是redis集群
- Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N
- Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求
2、redis集群的作用
- 容量不够,使用集群进行扩容
- master节点负责写操作,在高并发的写操作场景,master节点就会成为性能瓶颈, 使用集群分摊压力
- 主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息,无中心化只需要配置一个一个节点即可,节点间可相互访问
3、redis集群的劣势
- 不支持多键操作,即mset,除非分组,比较麻烦
- 多键的redis事务不支持,而且不支持lua脚本
- 在集群出现之前,很多公司都是使用通过代理主机来解决数据的分区,通过代理主机决定往哪个分区上发送请求,这样往无中心化集群迁移起来比较麻烦
因为我本地只有一个虚拟机,所以我通过多端口启动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
从任何一个端口登入集群,通过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
登入集群,录入、查询键值对可以自动重定向到对应实例 - 不在一个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表示插槽值,只能看属于当前实例的插槽中的key - 返回slot中的key:
cluster getkeysinslot
,count表示要查看的key的数量
4、故障恢复
- 当某段slot所属的主服务器挂掉,那么它的从服务器会取代他成为主实例,就算他后面恢复了,也不会再变回主实例
- 如果某一段slot的主节点从节点都挂掉了,那么集群的工作情况就需要看配置文件redis.conf中的参数cluster-require-full-coverage的设置情况
- 设置为yes,那么整个集群都挂掉,无法工作。默认为yes
- 设置为no,那么只是这一段的插槽无法工作(数据无法使用,也无法存储),集群的其余,部分可以正常工作
5、集群的Jedis开发
Java提供了JedisCluster这个类,用于操作redis集群
如有错误,欢迎指正!!!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
新闻名称:【Redis】无中心化集群-创新互联
标题链接:http://cdiso.cn/article/epocj.html