Redis高可用集群架构

高可用集群架构

哨兵模式缺点

  1. 主从切换阶段, redis服务不可用,高可用不太友好
  2. 只有单个主节点对外服务,不能支持高并发
  3. 单节点如果设置内存过大,导致持久化文件很大,影响数据恢复,主从同步性能

高可用集群

        由多个主从节点群组成的分布式集群,具有复制,分片,高可用特性。并且支持水平扩展,官方建议水平扩展不超过1000个。redis集群的性能和高可用性均优于哨兵模式。

高可用集群搭建

redis集群需要至少三个master节点,这里搭建三个(一主一从)小集群,共6个redis节点

1. 把旧的redis.conf配置文件copy到8001文件夹下,并修改如下配置

port 8001    #端口
pidfile /var/run/redis_8001.pid  #把pid进程号写入pidfile配置的文件
#指定数据文件存放位置,必须要指定不同的目录位置
dir /home/kk/local/redis-7.2.3/high-cluster/8001 
cluster-enabled yes    #启动集群模式
cluster-config-file nodes-8001.conf    #集群节点信息文件,这里800x最好和port对应上
cluster-node-timeout 10000

2. 分别启动6个节点

src/redis-server high-cluster/8001/redis.conf
src/redis-server high-cluster/8002/redis.conf
src/redis-server high-cluster/8003/redis.conf
src/redis-server high-cluster/8004/redis.conf
src/redis-server high-cluster/8005/redis.conf
src/redis-server high-cluster/8006/redis.conf

3. 创建集群,系统会自动给每个节点分配槽位

src/redis-cli --cluster create --cluster-replicas 1 192.168.6.128:8001 192.168.6.128:8002 192.168.6.128:8003 192.168.6.128:8004 192.168.6.128:8005 192.168.6.128:8006

4. 验证集群

        连接任意一个客户端,查看集群信息和节点信息

[kk@localhost redis-7.2.3]$ src/redis-cli -p 8001
127.0.0.1:8001> cluster info
127.0.0.1:8001> cluster nodes

5. 关闭集群,依次关闭6个节点

src/redis-cli -p 8001 shutdown

槽位

概念

Redis Cluster 将所有数据划分为 16384 个 slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。

当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,需要纠正机制来实现槽位信息的校验调整。

槽定位算法

Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。

HASH_SLOT = CRC16(key) % 16384

跳转重定位

当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽位映射表。

示例

节点间通信机制

通信方式

集群的元数据(集群节点信息,主从角色,节点数量,各节点共享的数据等)通信方式

  • 集中式
  • gossip 

redis cluster节点间采取gossip协议进行通信

网络抖动

        当某个节点持续失联时间超过cluster-node-timeout,可以认定该节点出现故障,需要进行主从切换。如果没有这个选项,网络抖动会导致主从频繁切换 (数据的重新复制)。

脑裂数据丢失

        网络分区后, 主节点和从节点可能网络通讯中断, 会重新在从节点选举出一个新的主节点, 这个时候这两个主节点都能写数据, 网络恢复后, 旧的主节点会被更新成从节点, 这时旧主节点写入的数据就会丢失。

解决方案:

加上下面配置,往旧的主节点写数据时, 会失败,从节点数量小于1.

此配置虽然提升了一致性,但是会牺牲可用性

min-slaves-to-write 1  //写数据成功最少同步的slave数量

集群存在问题

1. 批量操作失败

mset/mget批量操作时, 如果hash槽位不在一个节点, 会写入/读取失败

解决:在key的前面加上{XX},这样参数数据分片hash计算的只会是大括号里的值,确保不同的key能落到同一slot里去

示例:

mset {user1}:1:name kk {user1}:1:age 18

水平扩容

集群命令

  1. create:创建一个集群环境host1:port1 ... hostN:portN
  2. call:可以执行redis命令
  3. add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
  4. del-node:移除一个节点
  5. reshard:重新分片
  6. check:检查集群状态

高峰时用add-node扩容, 高峰结束用del-node缩容,用reshard槽位迁移

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/228916.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器常用命令

文章目录 启动类命令帮助类命令镜像命令列出本地主机上的镜像在远程仓库中搜索镜像下载镜像保存镜像加载 tar 包为镜像查看占据的空间删除镜像 虚悬镜像命令自动补全新建启动容器启动交互式容器启动守护式容器 列出正在运行的容器容器其他启停操作启动已经停止的容器重启容器停…

AWS连甩3项Serverless创新,高效创建和操作缓存,用AI优化资源配置性价比

云创科技11月28日拉斯维加斯报道,在一年一度的AWS re:Invent首日,AWS实用计算高级副总裁Peter DeSantis延续Monday Night Live的传统,发表主题演讲并分享了AWS数据库和分析产品组合中的3项Serverless创新,以帮助客户在任何规模下分…

前五年—中国十大科技进展新闻(2012年—2017年)

前五年—中国十大科技进展新闻(2012-2017) 2017年中国十大科技进展新闻1. 我国科学家利用化学物质合成完整活性染色体2. 国产水下滑翔机下潜6329米刷新世界纪录3. 世界首台超越早期经典计算机的光量子计算机诞生4. 国产大型客机C919首飞5. 我国首次海域天…

MySQL双主双从数据库集群搭建

1 引言 在之前的文章中提到过相关搭建方法,具体请参考《MySQL主从数据库搭建》这篇文章,本文主要讲述双主双从,双主多从集群的搭建方式。 这里要问一个问题,为什么MySQL要搭建数据库集群呢?我想应该有以下几点原因&…

揭秘Git高手的10个秘密武器:让你的工作效率飙升!

Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分,每天都要与之互动。 精通Git不仅能简化你的日常操作,还能显著提高生产力。在这篇文章中,我们将探讨一组能够极大提升生产力的命令。 随着对…

pg truncate

命令选项 TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ][ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]1.ONLY:只truncate指定的表。当表有继承子表或有子分区时,默认会一起truncate;only可只truncate继承父表。分区父表不能指定only --不…

【数据结构】树与二叉树(廿五):树搜索给定结点的父亲(算法FindFather)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲a. 算法FindFatherb. 算法解析c. 代码实现 3. 代码整合 5.3.1 树的存储结构 5. 左儿子右兄弟链接结构 【数据结构】树与二叉树(十九&…

2023年港澳台联考中录取分数高性价比的985和211大学来啦

导读 一直以来,985和211都是港澳台联考报名录取中,大家最关心的两类大学。其实每年的港澳台联考都有一些性价比很高的学校,今天我们就来看一下这些优秀的985和211大学吧!(景于行跟您承诺,本篇文章分享的分数…

SpringBoot+VUE3前后端分离-【支付宝支付】

1、支付宝沙箱应用申请 https://open.alipay.com/develop/sandbox/app 打开支付宝沙箱能够看到如下信息: 获取到appid; 2、获取应用私钥以及支付宝公钥 在接口加密方式选择公钥模式启用,根据操作即可获取应用公钥、应用私钥以及支付宝公钥…

uniapp使用vue3和ts开发小程序获取用户城市定位

这个组件的功能:可以重新定位获取到用户的具体位置,这个是通过getLocation这个api和高德地图的api获取到的,getLocation这个api需要在微信公众平台后台>开发管理> 接口管理里面申请才能使用的,不然无法使用哦,这…

如何处理枚举类型(上)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 我们会分为上、下两篇分…

Spring代理方式之静态、动态代理(JDK和CGlib动态代理)

目录 1、代理设计模式的概念 2、静态代理 3、动态代理(JDK和CGlib动态代理) 1. JDK动态代理是基于接口的代理(Interface-based proxy) 2. CGLIB代理是基于类的代理(Class-based proxy) ⭐比较&#x…