您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
如何基于OceanBase构建应用和数据库的异地多活?
租户,分区,分区表如何基于OceanBase构建应用和数据库的异地多活?
发布时间:2016-12-08加入收藏来源:互联网点击:
如何基于OceanBase构建应用和数据库的异地多活?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
OceanBase是以集群形式运行的,由一堆服务器组成。机器会分为三组,每组一个区域(称为Zone),各个机器通过网络互相访问。没有光纤交换机、共享存储以及直连网线等。
服务器通常建议CPU、内存和磁盘尽可能的大,磁盘建议用普通SSD盘。普通服务器的好处是便宜,劣势是可靠性和性能可能不如小型机那么高。也就是说OceanBase可以部署在一组可靠性和性能不是特别高的普通服务器上,却提供了高性能、高可用和高可靠、弹性伸缩等多项能力。
以上是一个OceanBase集群的外观和能力,但是提供给业务的并不是这个集群的全部资源和能力,而是其子集,即租户(Tenant)。
OceanBase多租户特性
OceanBase定义了一些基本的资源规格(Resource unit config,如4CPU8Gmem500Gdisk等),然后选取某类资源规格创建一组资源池(Resource Pool),此时集群资源就有一部分被分配出去了。最后将这个资源池关联到一个新建租户,则租户就可以使用这个资源池的能力。
OceanBase默认有个sys,管理整个集群。用户租户必须在sys内部创建。
#sys登录方法
$mysql -hxxx.xx.11.11 -uroot@sys#obdemo -P2883 -proot oceanbase -A
#资源规格(UnitConfig)
create resourceunit S0_uc max_cpu=2,max_memory='5G',…
资源单元(Unit)
create resourcepool Pool_01 unit='S0_uc',unit_num=2,...
(Tenant)
create tenant test_ins resource_pool_list= ('Pool_01'),...
OceanBase兼容了大部分MySQL连接协议和语法,租户的使用体验跟MySQL实例很像。研发可以在租户里创建数据库(Database)、表(Table)。还包括分区表等。
OceanBase里描述数据的最小粒度是分区。普通的表(非分区表)就是一个分区,分区表则包含多个分区。
数据是绝对隔离,资源有一定程度隔离。研发可以将业务先垂直拆分为多个独立的子业务,分别使用不同的租户或者集群。
OceanBase资源单元
不知道数据具体在哪个机器上,也可以说没必要知道。只是租户的性能还取决于运维为租户规划的资源池分布情况,所以了解一下资源单元的分布特点对性能规划也是有意义的。
资源池(Resource Pool)是由一组资源单元(Resource Unit)组成。资源单元数量默认跟Zone的数量一致或者是它的倍数(可以配置具体分布在哪些Zone以及每个Zone里的Unit数量)
资源单元具备一定的资源能力,是数据的容器。租户拥有的资源单元规格和数量决定了这个租户最大性能。资源单元可以在同一个Zone的不同节点之间自由迁移,OceanBase借此来维持各个节点的资源利用率尽可能维持一个均衡状态。
OceanBase拆分设计
数据库拆分
数据库拆分有两种。
一是垂直拆分。即按业务模块拆分到不同的实例或库里。为了模块之间互不影响,拆分到不同的实例比较好。
一是水平拆分
。将一个业务表拆分到N个相同结构的物理表中。中间件做业务表(逻辑表)到分表(物理表)的映射路由以及其他相关操作(如结果聚合计算)等。这个N个物理表可以在不同实例的不同分库中。分库的维度和分表的维度可以不一样,比较灵活。
分区表。将一个物理表设计为分区表,拆分到N个分区。分区表的各个分区结构是数据库内部保证一致。OceanBase选择的是分区表的水平拆分方式,并且支持二级分区表(即有2个不同的拆分维度叠加使用)。
业务表order先经过中间件拆分为100个分表(存在10个分库里),每个分表在OceanBase内部又是一个分区表(100个分区)。分库分表的维度和分区表分区的维度都是一致的,根据用户ID。
分库分表和分区各有利弊。
分库分表的好处是各个分表的结构一致性是在中间件层保证,比较好控制,比较适合灰度变更(允许部分分表结构不一致,最终必须全部一致)。此外更大的好处是,分库分表是实现异地多活单元话架构的必不可少的条件。缺点是中间件的SQL支持范围有限。
分区的好处是在数据库内部解决了拆分问题。针对分区表的SQL功能是数据库SQL引擎的本质工作,相关特性(全局索引、二级分区等)会持续开发完善。
分区
分库分表架构设计,需要确定机器数、实例数、分库数和分表数的拓扑,性能理论上限取决于主实例所处的机器节点数。此后要做扩展就要调整这四个元素的数目及其联系。这种扩展很可能涉及到分表数据的迁移,需要借助外部工具或产品实现。
分区架构设计,研发确定分区策略和分区数,运维确定租户的资源单元数量,OceanBase确定资源单元(Unit)在哪些机器节点上以及分区(Partition)在哪些资源单元里。同一个分区不能跨节点存储此后要做扩展就是调整资源单元的规格、数量。
OceanBase在确定Unit里的分区的位置时会尽量让每个节点的负载维持均衡。这个负载的计算方式比较复杂,会综合考虑OB节点内部CPU、内存和空间利用率等。分区随意分布对应用性能很可能有负面影响。当业务上有联系的两个表的分区分布在不同的资源单元里(同时也分布在不同的节点里),这两个表的连接就难以避免跨节点请求数据,网络上的延时会影响这个连接的性能。
每个分区在集群里数据实际有三份,即三副本(Replica)。忽略了Zone2和Zone3的细节。三副本之间的数据同步靠把Leader副本的事务日志同步到其他Follower副本中。Paxos协议会保障这个事务日志传输的可靠性(事务日志在一半以上成员里落盘,剩余成员最终也会落盘),同时还有个以分区为粒度的选举机制,保障Leader副本不可用的时候,能快速从现有两个Follower副本里选举出新的Leader副本,并且数据还绝对不丢。这里就体现了故障切换时两个重要指标:RPO=0, RTO<30s。
Locality
t0和t1业务上是有联系的表(如主表和详情表),两者都是分区表,分区策略和分片数都相同,OceanBase提供了一个表属性“表分组”(TableGroup)。设置为同一个表分组的不同表的分区数一定一样,并且同号分区组成一个“分区分组”(PartitionGroup)。同一个分区分组的分区一定会分配在同一个资源单元(Unit)内部(也就是会在同一个节点内部),彼此的连接逻辑就避免了跨节点请求。另外一个效果是如果一个事务同时修改两个有业务关联的分区,使用分区分组也可以规避跨节点的分布式事务。这个表分组属性的设置就是OceanBase的Locality特性之一——影响相关分区的分布。
实际上每个分区都有三副本(Replica, 本文例子),省略了t0(p0)和t1(p0)的其他两个副本都分别会在同一个Unit里分配。不仅如此,每个分区的三副本里都会有leader副本默认提供读写服务。leader副本是选举出来的。t0(p0)和t1(p0)的leader副本也一定会在同一个Unit里(即在同一个Zone里)。这样才彻底的避免了连接的时候跨节点请求。
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |