我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。跑过十五公里、徒步爬过衡山、有过三个月减肥20斤的经历、是个喜欢躺平的狠人。
拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。有从0到1的高并发项目经验,利用弹性伸缩、负载均衡、报警任务、自启动脚本,最高压测过200台机器,有着丰富的项目调优经验。
经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的《Java项目实战—深入理解大型互联网企业通用技术》,以及《解密程序员的思维密码–沟通、演讲、思考的实践》。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
SeniorRD
在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。
集群模式是一种处理海量数据、高并发和高可用性的方式。当数据量不大时,可以使用 Redis 的 replication 模式,一个 master 多个 slaves,保证读取效率,同时使用 sentinel 集群保证高可用性。但是当数据量增加,需要更高的并发和可用性时,就需要使用 Redis cluster。Redis cluster 可以自动将数据进行分片,每个 master 节点可以存放一部分数据,多个 master 节点上可以挂载多个 slave 节点,这样可以实现 Redis 的横向扩展,支撑更大的数据量和更高的并发。当部分 master 节点不可用时,Redis cluster 仍然可以继续工作。
Redis cluster 架构使用 cluster bus 进行节点间通信,用来进行故障检测、配置更新、故障转移授权等操作。cluster bus 使用 gossip 协议,通过二进制的方式进行高效的数据交换,不占用过多的网络带宽和处理时间。
举个例子,假如一个电商网站需要处理海量的订单数据,同时需要支持高并发和高可用性。在订单数据量不大时,可以使用单机 Redis,但是当订单数据量增加时,需要使用 Redis cluster 进行横向扩展。将订单数据进行分片存储在多个 master 节点上,每个 master 节点还可以挂载多个 slave 节点,保证了高并发和高可用性。当部分 master 节点不可用时,订单数据仍然可以在其他节点上访问,保证了网站的正常运行。同时,通过 cluster bus 进行节点间通信,保证了故障检测和故障转移的高效性和准确性。
Redis集群采用了类似于RAFT协议的分布式算法,将数据分布在多个节点上,并由集群管理器负责节点的故障转移和重新分配。在客户端访问Redis集群时,需要进行节点路由和数据迁移。
Redis集群协议定义了集群节点之间的通信方式,包括节点间消息的格式、流程和规则。其中最重要的协议是CLUSTER命令,用于集群的创建、添加、删除和配置等操作。
Redis集群协议基于二进制流传输,使用Socket连接进行节点间通信。在Redis集群中,每个节点都有一个唯一的节点ID和一个或多个IP地址和端口号,用于与其他节点通信。
集群中的每个节点都有一个角色,包括主节点、从节点和备份节点。主节点负责处理客户端的读写请求,并将写操作同步到从节点和备份节点。从节点复制主节点的数据,并在主节点宕机时接管主节点的工作。备份节点负责存储主节点的数据备份,以便在主节点故障时恢复数据。
Redis集群协议支持数据分片,即将Key按照哈希值分配到不同的节点上。每个主节点有一组从节点,从节点通过复制主节点的数据来保持数据一致性。当主节点宕机时,从节点会选举出一个新的主节点,然后重新分配槽位,并将数据迁移到新的主节点上。
在实践中,为了确保Redis集群的高可用性和性能,需要进行合理的节点部署、负载均衡和故障转移等策略。同时,需要合理设置Redis的配置参数,如最大内存限制、持久化策略和网络设置等,以满足不同的需求。
Redis 集群中,元数据维护是非常重要的。元数据是指维护节点间映射关系的数据,包括节点的状态、槽位的分配情况、节点间通信等信息。元数据是集群中各个节点协同工作的基石,因此必须要得到良好的维护。
在 Redis 集群中,元数据的维护可以采用两种方式:集中式、Gossip 协议。
在计算机领域中,集群协议指的是一组算法和规则,用于维护一个集群中的节点的状态、数据和元数据。如果想象一下多个计算机节点像一个蜂群一样,集群协议就像是这个蜂群的一种管理方式,它能够确保每个节点都知道其他节点的状态,并且能够在某个节点出现故障时自动地进行失败转移,从而保证整个集群的稳定性和可靠性。
集中式集群协议是其中的一种形式,它的主要特点就是将集群中的元数据集中存储在一个节点上,通过这个节点来维护整个集群的状态。比如说,如果有一个包含多个节点的分布式系统,其中一个节点的状态发生了变化,那么这个变化就会被记录在集中式的元数据存储中,并且其他节点可以随时从这个存储中获取最新的状态信息。
一个典型的集中式元数据存储的例子就是大数据领域的Storm。Storm是一个分布式的大数据实时计算引擎,它使用ZooKeeper来存储和维护所有的元数据。在Storm中,每个节点都会周期性地向ZooKeeper发送心跳信号,以保证ZooKeeper中存储的节点状态信息是最新的。当一个节点的状态发生了变化(比如故障或者加入集群),它会将这个变化信息发送到ZooKeeper,并且所有其他节点会在下一次心跳中获取这个最新的状态信息,从而及时感知到集群中节点的变化。
集中式集群协议的好处在于它能够快速地更新和感知节点状态的变化,从而提高集群的时效性和可靠性。但是,它也存在一些缺点。首先,由于所有的元数据都存储在一个节点上,可能会导致这个节点的压力非常大,从而影响集群的整体性能。另外,如果这个节点出现了故障,整个集群的稳定性也会受到影响。因此,在实际应用中,需要根据具体的场景选择适合的集群协议来维护集群的状态和元数据。
在集中式元数据维护方式下,所有的节点都会将元数据交给一个特定的节点进行维护和管理。当一个节点加入或退出集群时,它需要向该特定节点汇报其状态并更新元数据。由于所有元数据都在一个节点上维护,因此这种方式会带来一个很大的压力,也增加了单点失效的风险。
gossip 协议是Redis集群中的一种协议,常用于数据的共享。所有节点都持有一份元数据,包括数据内容、数据结构、数据类型等等。当某个节点的元数据发生变化时,会将这个变化信息发送给其它节点,从而让所有节点的元数据都得到更新。
比如,假设一个Redis集群中有5个节点,每个节点都保存了相同的数据,这些数据在每个节点上都有所不同,但是它们的元数据都是相同的。当其中一个节点的数据发生变化时,它会将这个变化的信息广播给其它节点,其它节点再进行相应的更新。如果这个变化信息在一段时间内没有被广播到所有节点,那么这个更新就会有一定的延时,可能会导致一些操作出现滞后。
Gossip协议的好处在于,元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续打到所有节点上去更新,降低了压力。而且,gossip协议的数据共享也更具有容错性,如果某个节点宕机或者出现故障,其它节点还可以继续工作,并维持集群的正常运行。而且,由于gossip协议的分布式特性,它的性能也比较优秀。
但是Gossip协议也有一些不好的地方。由于数据共享是通过广播实现的,因此广播的成本比较高,而且广播的延迟也比较大。如果数据更新频率比较高,那么Gossip协议可能会导致网络拥塞和性能下降。此外,Gossip协议的性能也受到节点数量的限制,如果节点数过多,那么Gossip协议的性能也会降低。
在 Gossip 协议元数据维护方式下,所有节点都会相互通信并传播信息。每个节点会维护一份较小的元数据,而这份元数据会通过 Gossip 协议与其他节点分享。当一个节点加入或退出集群时,它会将信息随机发送给其他几个节点,这些节点也会继续传播,直到所有节点都得到消息。这种方式下,节点之间相互传播信息,避免了集中式方式下单点失效的问题,同时也减轻了一个节点管理所有元数据的负担。
在Redis Cluster架构下,每个节点都有一个专门用于节点间通信的端口,用于数据传输的是自己提供服务的端口号+10000。每个节点会定期发送ping消息给其它节点,用于检测节点之间的连接是否正常。同时,其它节点也会返回pong消息,以响应ping请求。通过这种方式,各个节点之间可以保持相互的连接,并进行数据共享和更新。
如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
SeniorRD
博主的人生感悟和目标
- 程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本身是一个很普通程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
- 有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
- 内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
- 这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。