1. Q:什么是OceanBase?

    A:OceanBase是由蚂蚁金服、阿里巴巴完全自主研发的金融级分布式关系数据库,始创于2010年。OceanBase具有数据强一致、高可用、高性能、在线扩展、高度兼容SQL标准和主流关系数据库、低成本等特点。OceanBase至今已成功应用于支付宝全部核心业务:交易、支付、会员、账务等系统以及阿里巴巴淘宝(天猫)收藏夹、P4P广告报表等业务。除在蚂蚁金服和阿里巴巴业务系统中获广泛应用外,从2017年开始,OceanBase开始服务外部客户,客户包括南京银行、浙商银行、印度Paytm、人保健康险。

    1. Q:OceanBase有哪些优势?

    A:OceanBase的主要有六大特性:

    • 高性能:存储采用读写分离架构,计算引擎全链路性能优化,准内存数据库性能。
    • 低成本:使用PC服务器和低端SSD,高存储压缩率降低存储成本,高性能降低计算成本,多租户混部充分利用系统资源。
    • 高可用:数据采用多副本存储,少数副本故障不影响数据可用性。通过“三地五中心”部署实现城市级故障自动无损容灾。
    • 强一致:数据多副本通过paxos协议同步事务日志,多数派成功事务才能提交。缺省情况下读、写操作都在主副本进行,保证强一致。
    • 可扩展:集群节点全对等,每个节点都具备计算和存储能力,无单点瓶颈。可线性、在线扩展和收缩。
    • 兼容性:兼容常用MySQL功能及MySQL前后台协议,业务零修改或少量修改即可从MySQL迁移至OceanBase。
    1. Q:OceanBase有哪些产品?

    A:OceanBase目前主要有6个产品:

    • OceanBase服务器
    • OceanBase云平台
    • ObProxy
    • 备份恢复工具
    • 历史库平台
    • OceanBase Connector Java
    1. Q:安装OceanBase服务器对硬件有什么要求吗?

    A:目前提供的试用版仅支持在物理机上安装。

    • 操作系统:试用版支持2种操作系统
    • Red Hat Enterprise Linux Server release 7 .2(内核Linuxversion 3.10版本)
    • CentOS Linux release 7.2 (内核Linuxversion 3.10版本)
    • CPU:16 核及以上,企业级客户要求最低32核
    • 内存: 64G及以上, 企业级客户要求256G及以上
    • 磁盘类型: 推荐SSD
    • 磁盘空间: 推荐内存大小的4倍及以上
    • 文件系统:EXT4
    • 网卡: 推荐千兆互联及以上
    1. Q:OceanBase的存储引擎和传统数据库有什么不一样的地方?

    A:OceanBase采用了一种读写分离的架构,把数据分为基线数据和增量数据。其中增量数据放在内存里(MemTable),基线数据放在SSD盘(SSTable)。对数据的修改都是增量数据,只写内存。所以DML是完全的内存操作,性能非常高。读的时候,数据可能会在内存里有更新过的版本,在持久化存储里有基线版本,需要把两个版本进行合并,获得一个最新版本。同时在内存实现了Block Cache和Row cache,来避免对基线数据的随机读。

    当内存的增量数据达到一定规模的时候,会触发增量数据和基线数据的合并,把增量数据落盘。同时每天晚上的空闲时刻,系统也会自动每日合并。

    1. Q:数据在OceanBase中是如何存储的?

    A:OceanBase的数据文件以宏块(Macro Block)为单位组织数据,每个宏块大小为2MB。宏块内部又划分出很多个16K(压缩前的大小)大小的微块(Micro Block),而每个微块里面包含多个行(Row)。OceanBase内部IO的最小单位是微块。

    1. Q:OceanBase是如何做到比传统数据库更省空间的?

    A:OceanBase通过数据编码压缩技术实现高压缩。数据编码是基于数据库关系表中不同字段的值域和类型信息,所产生的一系列的编码方式,它比通用的压缩算法更懂数据,从而能够实现更高的压缩效率。

    1. Q:用户如何使用OceanBase?

    A:和传统数据库一样,OceanBase提供了SQL接口,用户可以通过SQL语言访问、操作数据库。

    1. Q:从前运行在MySQL上的业务,迁移到OceanBase上的成本如何?

    A:OceanBase兼容常用MySQL功能及MySQL前后台协议,业务零修改或少量修改即可从MySQL迁移至OceanBase。

    1. Q:OceanBase作为一款分布式数据库,在编写SQL语句上和传统数据库有什么不一样的地方?

    A:首先,OceanBase兼容常用MySQL功能,所以用户可以和使用传统数据库一样通过SQL对OceanBase数据库进行访问。同时,OceanBase作为一款分布式数据库,无论是查询优化引擎还是SQL执行引擎都和传统数据库有很大的区别,为了让用户写出尽可能高效的SQL语句,我们提供了《OceanBaseSQL调优指南》供用户参考 https://oceanbase.alipay.com/docs/iyf3ru

    1. Q:OceanBase是如何实现高可用的?

    A:不同于传统数据库的主备或一主多从方案,OceanBase同样使用性价比较高、可靠性略低的服务器,但同一数据保存了多台(>=3)台服务器中的半数以上服务器上(例如3台中的2台,5台中的3台等),每一笔写事务也必须到达半数以上服务器才生效,因此当少数服务器故障时不会有任何数据丢失。不仅如此,传统数据库主备镜像在主库发生故障时,通常需要外部工具或人工把备库升级成主库,而OceanBase底层实现了Paxos高可用协议,在主库故障后,剩余的服务器会很快自动选举出新的主库,并继续提供服务。在多次蚂蚁机房断网演练中,OceanBase数据库都做到了自动切换且完全不丢数据,证明了OceanBase高可用架构的技术优越性。

    1. Q:在生产环境中,OceanBase会如何部署?

    A:OceanBase提供多种部署模式,可根据对机房配置以及性能和可用性的需求进行灵活选择。主要可以分为:

    • 同城三机房
    • 两地三中心三副本
    • 两地三中心五副本
    • 三地三中心五副本
    • 三地五中心五副本

    不同部署方式的区别可参考:https://oceanbase.alipay.com/docs/vdyo46。OceanBase认为未来云数据库的基本要求是完全不丢数据,且底层协议只能选择Paxos或者Paxos变种。为了支持机房级容灾,至少需要将服务部署到三个机房。虽然这种部署相对主、备双机房部署更加麻烦,但这是必须的。

    1. Q:OceanBase作为一款分布式数据库,业务APP连接数据库时和传统数据库是否有不同?

    A:OceanBase作为分布式数据库,副本可能分布在不同的机器上,为了尽可能地减少跨机数据访问,我们提供了OBProxy。OBProxy作为OceanBase分布式关系数据库专用反向代理服务器, 为前端用户请求提供了高性能、高准确率的路由转发服务, 为后端Server服务提供了高可用易扩展的容灾保障. 相对于其他数据库的代理服务器, OBProxy根据实际单机环境和OceanBase多集群部署的特点, 采用异步框架和流式转发的设计, 采用FastParse和LockFree的内存方案, 具备有限资源占用下百万QPS的能力和海量部署下丰富便捷的运维支持能力。

    1. Q:什么是实例,什么是租户,它们的关系是什么?

    A:OceanBase是一个多租户系统, 一个实例即 OceanBase 集群中的一个租户。 租户之间的数据不能互相访问。

    1. Q:我需要一个实例还是多个实例?

    A:如果有多个子系统, 每个子系统在数据库层面没有交互,建议每个子系统使用不同的实例。

    1. Q:OceanBase 在开发中要特别注意什么?

    A:以下列出开发过程中的注意事项,供参考。

    • 表建好后,主键不能更改,如果要改,只能删表重建。
    • 列类型修改有较大限制。varchar长度只能由短变长,不能由长变短。
    • 索引生效时间较长,建议在建表时将索引语句一并纳入。
    • 大数据量导入需要特别关注内存的使用情况。
    • mysql-connector-java的版本建议使用 5.1.30及以上。
    • 如果一个连接超过15分钟空闲,服务端会主动断开,在使用连接池的时候需要设置一个连接最大的空闲时间,比如Druid的minEvictableIdleTimeMillis小于15分钟。
    1. Q:应该使用分区表吗?

    A:是否使用分区表,可以参考如下判断过程

    • 如果一张表的数据量在可预期的未来会突破200GB,建议使用分区表。
    • 如果表具有比较明显的时间周期,建议使用分区表。
    • 目前分区表尚不支持分区规则修改,这个功能后续会加上,建议在目前容量不大的情况下先不使用分区表,待数据量上来以后再进行分区。
    1. Q:OceanBase目前有哪些功能限制?

    A:以下列出OceanBase目前版本中尚不支持的功能,以及使用过程中的一些注意事项,仅供参考。根据版本规划,我们会在后续的版本中陆续支持这些功能。

    • 不支持存储过程、触发器、自定义函数。
    • 不支持某些数据类型,比如不支持enum、set。
    • 不支持临时表。
    • 不支持一条Insert语句写多个分区。
    • 不支持loaddata。
    • 不支持全局索引。

    说明

    注意: SELECT…FOR UPDATE只支持单表查询。 不支持prepare语句。 字符集目前只支持utf8。 非建表语句中指定索引时,构建普通局部索引需要在一次合并后生效,构建唯一索引需要在两次合并后生效。