写点什么

如何设计贴合业务的高性能高可用中间件系统

作者:天天向上
  • 2021 年 12 月 30 日
  • 本文字数:1577 字

    阅读完需:约 5 分钟

1、高性能网络模型

  • 传统网络模型:PPC 和 prefork、TPC 和 prethread

  • Reactor 网络模型基于多路复用的事件响应网络编程模型

单 Reactor 单进程/单线程

单 Reactor 多线程

多 Reactor 多进程/线程

  • proactor 模式


2、基于 ZooKeeper 的高可用架构

2.1、ZooKeeper 设计步骤

设计 Path -> 选择节点类型 -> 设计节点数据 -> 设计 Watch

2.2、主备切换方案

1、设计 Path

由于只有 2 个角色,因此直接设置两个 znode 即可:master、slave,样例: /com/taobao/book/operating/master

/com/taobao/book/operating/slave

2、选择节点类型

当 master 节点挂掉的时候,原来的 slave 升级为 master 节点,因此用 ephemeral 类型的 znode。

3、设计节点数据

由于 slave 成为 master 后,会成为新的复制源,可能出现数据冲突,因此 slave 成为 master 后,节点写入成为 master 的时间,这样方便人工修复冲突数据。

4、设计 Watch

1. 节点启动的时候,尝试创建 master znode,创建成功则切换为 master,否则创建 slave znode,成为 slave;

2. 如果 slave 节点收到 master znode 删除的事件,就自己去尝试创建 master znode,创 建成功,则自己成为 master,删除自己创建的 slave znode。

2.3、选举方案

  • 最小节点获胜

1. 设计 Path

集群共用父节点 parent znode,集群中的每个节点在 parent 目录下创建自己的 znode。

2. 选择节点类型

当 Leader 节点挂掉的时候,持有最小编号 znode 的集群节点成为新的 Leader,因此用 ephemeral_sequential 类型 znode。

3. 设计节点数据

可以根据业务需要灵活写入各种数据。

4. 设计 Watch

1. 节点启动或者重连后,在 parent 目录下创建自己的 ephemeral_sequntial znode;

2. 创建成功后扫描 parent 目录下所有 znode,如果自己的 znode 编号是最小的,则成为 Leader,否则 watch parent 目录;

3. 当 parent 目录有节点删除的时候,首先判断其是否是 Leader 节点,然后再看其编号是否 正好比自己小 1,如果是则自己成为 Leader,如果不是继续 watch。

  • 抢建唯一节点

1. 设计 Path

集群所有节点只有一个 leader znode,本质上就是一个分布式锁。

2. 选择 znode 类型

当 Leader 节点挂掉的时候,剩余节点都来创建 leader znode,看谁 能最终抢到 leader znode,因此用 ephemeral 类型。

3. 设计节点数据

可以根据业务需要灵活写入各种数据。

4. 设计 Watch

1. 节点启动或者重连后,尝试创建 leader znode,尝试失败则 watch leader znode;

2. 当收到 leader znode 被删除的事件通知后,再次尝试创建 leader znode,尝试成功则成为 leader ,失败则 watch leader znode。

  • 法官判决

1. 设计 Path

集群共用父节点 parent znode,集群中的每个节点在 parent 目录下创建自己的 znode。

2. 选择节点类型

当 Leader 节点挂掉的时候,持有最小编号 znode 的集群节点成为“法官”,因此用 ephemeral_sequential 类型 znode。

3. 设计节点数据

可以根据业务需要灵活写入各种数据,例如写入当前存储的最新的数据对应的事务 ID。

4. 设计 Watch

1. 节点启动或者重连后,在 parent 目录下创建自己的 ephemeral_sequntial znode,并 watch parent 目录;

2. 当 parent 目录有节点删除的时候,所有节点更新自己的 znode 里面和选举相关的数据;

3. “法官”节点读取所有 znode 的数据,根据规则或者算法选举新的 Leader,将选举结果写入 parent znode;

4. 所有节点 watch parent znode,收到变更通知的时候读取 parent znode 的数据,发现是自己则成 为 Leader。

3、复制集群架构设计技巧

  • Redis Sentinel

选举算法:Raft

三种模式:双节点、三节点、分离部署

  • MongoDB Replication

选举算法:Raft(3.2.0 版本开始)

4、分片集群架构设计技巧

Elasticsearch

部署模式:Master 和 Data 混合部署、Master 和 Data 分离部署、Coordinating 分离部署、Cross cluster replication

Redis Cluster

MongoDB

HDFS


5、常见选举算法

Gossip 协议

Bully 选举算法

Raft 选举算法

用户头像

天天向上

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
如何设计贴合业务的高性能高可用中间件系统