700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > mysql区间查询语句 分布式系统设计三要素 – 数据库 – 前端 mysql 阿帕奇

mysql区间查询语句 分布式系统设计三要素 – 数据库 – 前端 mysql 阿帕奇

时间:2021-02-21 21:49:24

相关推荐

mysql区间查询语句 分布式系统设计三要素 – 数据库 – 前端 mysql 阿帕奇

要素一: 多副本(Replication), 系统包含多个完全相同(一致)的节点,

要素二: 多分区(Sharding), 系统被拆分成多个完全独立的节点组,

要素三: 协作(Cooperation), 节点组之间有协作, 共同完成某项工作。

多副本

多副本很容易理解, 正如前面提到的那个技术人员的看法, 大部分挂以"分布式"之名的系统, 仅仅是因为其具备了多副本能力. 多副本技术非常重要, 因为它至少能解决分布式系统的两个核心目的: 高可用和可扩展.

事实上, 多副本并非 天然地 可扩展和高可用.

首先, 多副本遇到一致性的问题, 只有强一致性的多副本, 才可容灾达到高可用. 如果多副本不是强一致性, 那么必须增加一层 Indirection[1] 实现强一致性之后, 才能容灾. 实践中经常遇到的容灾操作, 例如 MySQL 主从切换, 都是增加了运维人员(Indirection)进行确认, 达到强一致性(数据真的一致, 或者即使数据不一致但人认为可接受)之后, 才进行切换.

其次, 只有使用者不强求强一致性, 多副本才是天然可扩展的. 例如, MySQL 主从同步, 使用者很多时候不要求强一致性, 所以读 Slave 副本. 同时, 工程上多副本对于写操作完全没有可扩展性, 因为所有的写操作的压力是同等作用于所有副本的. 但是,未经工程优化 的强一致性读操作, 多副本也没有可扩展性, 因为每一次读操作必须由全体副本共同完成, 压力也是同等作用于所有副本的.

可能有人对强一致性读操作的压力有疑问, 这里再多解释一下什么是工程优化. 被称为"唯一的共识协议"的 BasicPaxos 不区分工程实践上的读写操作, 每一次读操作都需要全部节点真正地做同样计算. 工程实践上, 在概率上能优化成先读取数据的摘要(例如版本号, MD5 值)做判断, 判断后再决定是否需要读取全部的数据, 从而降低压力.Raft 对读操作也做了工程优化, 例如 Leader 在确定自己的身份有效之后, 可以独立地处理读请求, 但 Raft 多副本只能有一个 Leader 可以处理请求(Raft Multi-Group 就是后面要提到的 Sharding), 无法得到扩展.

多副本天然要求强一致性, 所以, 大家提到多副本, 一般默认是指强一致性多副本, 所以, 是高可用的. 但是, 未经工程优化的强一致性多副本, 默认是无扩展性的. 1 台机器能存储 3TB 的数据, 3 台机器组成的多副本也只能存储 3TB 的数据, 而不是 9TB. 1 台机器能处理 10w qps 写请求, 3 台机器组成的多副本也只能处理 10w qps 写请求, 甚至更少.

多分区

多副本不是天然可扩展的, 但是多分区是天然可扩展的. 前面提到, 3 台机器组成的多副本, 只能存储 3TB 的数据, 处理 10w qps 请求. 如果数据对半分成 2 个分区, 再增加 3 台机器 , 这样的话, 整个系统的存储容量和处理能力是不是扩容到了 2 倍?

不像多副本必须经过仔细的工程优化, 只要对数据进行了分区(Sharding), 系统就是天然地扩展了. 例如前面提到的 Raft 多副本只能有一个 Leader, 如果大家将数据分成 3 等分, 那么每一个分区都可以拥有一个 Leader, 这样, 在不增加机器的前提下, 3 台机器都是 Leader, 对于读请求的处理能力, 理论上扩容为 3 倍, 从 10w qps 增加为 30w qps.

多分区之间是 shared-nothing 的, 每一个分区并不知道其它分区的存在, 也不依赖其它分区, 可以独立地进行工作. 如果分区之外的 Indirection 依赖两个分区才能完成某项工作, 那就涉及到了下面介绍的"协作".

协作

理想状态下, 系统被拆分成若干个完全独立的分区, 但是, 现实中分区之间必须进行协作, 共同完成某项工作. 例如某个数据库表被拆分分别存储在两个分区, 但需要对这个表格进行排序之后取某个区间时(order by xxx limit offset, size), 这两个分区在逻辑上就被强绑定在一起, 缺一不可.

比如某些分布式数据库, 一个事务跨越多个分区, 每一个分区上面的事务参与者, 都要指向一个单点标记(commit point), 只要其中一个分区宕机, 事务就无法完成.

协作是一种增加 Indirection 之后的结果, 为了解决问题, 大家不得不增加一层 Indirection[1]. 所以, 分布式系统往往要求分区之间进行协作, 完全独立的分区结构, 几乎是不可能存在的. 否则, 中国的某个技术人员部署了自己的 MySQL 数据库运行网站, 另外, 美国的某个程序员也独立地部署了自己的 MySQL 数据库和博客网站, 这两个人部署的独立的 MySQL 数据库, 你会认为它们两者组成了一个分布式系统吗? 你会认为两者是一个集群吗?

只有同时满足: 多副本, 多分区, 协作三个条件的系统, 才是真正意义上的分布式系统(集群)。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。