架构师训练营 - 总结 6
一. 数据库分库分表
数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单库的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。数据库分布式核心内容无非就是数据切分,以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。可以分为两种方式:业务分库和表数据分片
1.1 业务分库
业务分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。
优点:
(1)解决业务系统层面的耦合,业务清晰
(2)与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等
(3)高并发场景下,业务分库一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈
缺点:
(1)部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度
(2)分布式事务处理复杂
(3)依然存在单表数据量过大的问题(需要表数据分区)
1.2 表数据分区
单表数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行表数据分区了。表数据分区是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果。
优点:
(1)不存在单表数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力
(2)应用端改造较小,不需要拆分业务模块
缺点:
(1)跨分片的事务一致性难以保证
(2)跨库的join关联查询性能较差
(3)数据多次扩展难度和维护量极大
1.3 常用的支持分库分表中间件
Atlas
CobarMy
CAT(基于Cobar)
二. Nosql数据库
2.1 关系数据库
与Nosql数据库在一致性方面的比较一般来说,构建NoSql,为了高可用和海量数据存储,我们会选择牺牲一致性,我们可以选择不实现强一致性,而实现弱一致性或者最终一致性。
关系型数据库事务的4个基本特性ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
而对于分布式事务的特性BASE,则是反这个标准的,即基本可用(Basically Availble)、软状态/柔性事务(Soft-state)、最终一致性(Eventual Consistency)
2.2 Cassandra架构简述
Cassandra 设计用来处理多节点大型数据工作负载,系统中没有单点,Cassandra 采用peer-to-peer架构,数据在所有节点之间分发。cluster中所有node具有相同的角色。每个node互相独立,同时在内部又互相沟通。cluster中所有node都可以处理读写请求,而不用管数据具体在哪儿。如果一个node挂了,其它node可以处理读写请求。
(1) node之间的沟通
Cassandra 各node之间采用 gossip 协议进行沟通,gossip 进程每秒与集群中最多三个node交换信息,信息包括node自身的信息以及与该node交换过信息的node的信息,这样,所有node都可以很快获取集群中所有的node信息。
(2) Data distribution and replication
Cassandra是一个分区的按行存储的数据库(partitioned row store database)。在Cassandra中,数据以table的形式组织起来,primary key唯一标记一行,同时,primary key也决定了数据行存储的node,replication是数据行的备份,Cassandra将数据复制到多个node上,从而实现高可用和容错。
2.3 HBase架构简述
HBase是一个分布式的、面向列的开源数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase存储数据行在一个表里。一个数据行拥有一个可选择的键和任意数量的列,一个或多个列组成一个ColumnFamily,一个Fmaily下的列位于一个HFile中,易于缓存数据。表是疏松的存储的,因此用户可以给行定义各种不同的列。在HBase中数据按主键排序,同时表按主键划分为多个Region。
在分布式的生产环境中,HBase 需要运行在 HDFS 之上,以 HDFS 作为其基础的存储设施。HBase 上层提供了访问的数据的 Java API 层,供应用访问存储在 HBase 的数据。在 HBase 的集群中主要由 Master 和 Region Server 组成,以及 Zookeeper.如下图所示:
HBase 中相关模块的作用:
<1>Master
Base Master用于协调多个Region Server,侦测各个RegionServer之间的状态,并平衡RegionServer之间的负载。HBaseMaster还有一个职责就是负责分配Region给RegionServer。HBase允许多个Master节点共存,但是这需要Zookeeper的帮助。不过当多个Master节点共存时,只有一个Master是提供服务的,其他的Master节点处于待命的状态。当正在工作的Master节点宕机时,其他的Master则会接管HBase的集群。
<2>Region Server
对于一个RegionServer而言,其包括了多个Region。RegionServer的作用只是管理表格,以及实现读写操作。Client直接连接RegionServer,并通信获取HBase中的数据。对于Region而言,则是真实存放HBase数据的地方,也就说Region是HBase可用性和分布式的基本单位。如果当一个表格很大,并由多个CF组成时,那么表的数据将存放在多个Region之间,并且在每个Region中会关联多个存储的单元.
<3>Zookeeper
对于 HBase 而言,Zookeeper的作用是非常重要的。首先Zookeeper是作为HBase Master的HA解决方案。也就是说,是Zookeeper保证了至少有一个HBase Master 处于运行状态。并且Zookeeper负责Region和Region Server的注册。
评论