OceanBase高可用实践

背景

高可用是构建分布式系统的基石。一方面,出于成本考虑, 分布式系统往往采取比较廉价的硬件,其可靠性相对于小型机、专有硬件有很大的不足, 而分布式系统的规模一般比较大,假如硬件的可靠性只有三个9(99.9%), 一个1000台机器规模的集群每天将面临1台机器宕机的风险,在如此大规模的情况下,存储介质,比如硬盘可能会随时都有损坏,结点之间的网络可能随时都会有抖动,机房可能局部或整体断电,地区或数据中心可能会出现不可用,如果不在设计时考虑这些问题,当这些情况出现的时候,系统将很快处于不可用的状态;另一方面,分布式系统的程序在设计与实现上也更为复杂,软件上既要容错硬件的不可靠,同时软件自身也有可能有问题, 在对外部环境容错的同时需要考虑对软件BUG的容错。

OceanBase在设计之初就充分考虑了高可用问题,确保OceanBase有能力在这些异常出现后,仍然能最大可能的提供服务。

高可用的基本策略

冗余是实现高可用的通用方法,为防止数据丢失,将数据冗余多份;为防止系统中某些节点故障,对某些功能节点进行冗余。 冗余带来的好处是可以抵御某些节点的损失,而带来的坏处则主要是成本、性能和一致性问题。

成本主要包括额外的存储、网络、机柜等硬件成本,这是构建高可用分布式系统的必不可少的开销,其总体成本较专有硬件仍然要低,因为专有硬件实际上也需要在内部对某些模块进行冗余以获取高可用性。 性能和一致性问题则是高可用分布式系统必须要处理问题,这两个问题直接影响整个系统正确性、延时与吞吐量。

在传统myql或oracle中,我们往往通过添加备机来实现高可用,且为了实现高性能和高可用,一般会使用“最大可用”模式:

主机尽力将数据同步到备机,而不管是否同步成功,当主机挂掉以后,将备机升级成主机以继续提供服务,这就意味着如果主机在宕机前有数据没有同步到备机,要么通过某种特殊的手段将数据从宕掉的主机同步到备机,要么就接受暂时的数据不一致而继续提供服务,在这种情况下,如果出现主机永久损坏,则会造成数据丢失:

为了解决这个问题,可以使用最大保护模式(早期的MySQL版本不支持),即主机将日志同步到备机成功后再应答客户,这样会引入另外一个问题,即备机故障或网络抖动会导致失败,影响可用性; 小微引入了共享存储,将数据库redo log放在共享存储上,主机宕机以后,备机需要确保主机所有的数据都已经同步才能对外提供服务:

 

这样在主机宕机时,备机作一些额外的检查后升级为主机继续提供服务,这样可以确保数据一致性,但引入了共享存储。传统的主备模式还有另外一个问题是主备之间无法通过自身决出主备,需要人工切换或者使用一个第三方组件:

但是又引入了HA模块的稳定性问题,如果HA模块和主机的网络不通, HA将不能识别主机是活着还是网络有问题,此时HA如果进行切换而主机还活着则会造成后果很严重的双主问题。

OceanBase高可用策略

故障可以分为单机故障(磁盘、内存等硬件介质损坏或单台软件Crash都属于单机故障),机架/机房故障(比如整个机架或机房的电源断电)以及地区/数据中心(比如地区地震造成该区网络隔离)故障,一般来说,故障单位越小,出现频率越高,而除非自然灾害,一个地区出现故障的概率极小,故障单位越小,实现高可用的难度和成本越低,故障单位越大,由于引入环境、距离等因素,实现高可用的难度和成本会呈指数倍增长。比如为了预防单机故障,只需要在本机房预备冗余节点,故障时通过某些技术方案,可以做到实时切换;而为了预防数据中心故障,则需要在另外一个地区预备冗余的数据中心,在故障时由于通信距离等原因,基本上无法做到无损切换。

OceanBase虽然在设计之初就考虑到了硬件和软件的不可靠,但OceanBase的高可用并非一蹴而就,在实现过程中,为了快速实现或者绕过某个暂时无法攻克的技术难点,会进行综合权衡,只实现一些出现概率较高的基本高可用策略,而通过人肉或其它手段来保证在某些很难出现的灾难出现后可以尽快恢复。然后通过逐步迭代,逐渐完善,将高可用的范围提高,比如OceanBase最初的时候只考虑单机故障的高可用,到目前为止已经可以实现同城IDC之间的容灾。

分布式系统为了设计与实现的简单,往往会在系统中设置一个全局单点,来负责相对比较轻量的管理任务, OceanBase中的rootserver就是这样一个角色;它主要负责集群中其它角色的管理并作为用户的入口,通常其压力不高且无本地数据需要存储,所需信息都可以通过其它角色的汇报来重建。

而作为一个分布式数据库,OceanBase面临着两个很难解决的问题:数据一致性与分布式事务,在早期的OceanBase版本中,采取的策略是暂时绕过这两个问题,等技术积累到一定程度后再回过头来解决,所以在OceanBase中另外增加了一个单写入节点,这个节点的压力很高,数据无法通过其它节点来恢复,我们需要保证这些单节点的高可用。另外一个是保存基线数据结点的高可用,这些结点被设计成可以弹性伸缩,本身具备高可用属性,但仍然需要考虑磁盘故障以及数据副本之间的一致性。 我们会在下面的章节分别描述对这两类节点的高可用策略。

系统单点

在早期OceanBase的版本中,主要依靠主备来为单点提供高可用, 使用两台机器,其中的一台角色为主的机器对外提供服务,另外一台机器做为热备, 当主机挂掉后,备机切换为主,继续提供服务。

如前所述,这种“最大可用”模式的主备机制主要有两个问题:第一个问题在于这两台机器无法通过自身来决出主备,必须要依赖于一个第三方组件,早期我们使用了HA(linux-ha.org) 来做为仲裁组件,HA使用VIP机制,两台机器共享VIP, 同一时刻VIP只会加载在其中的一台机器, VIP会提供给外部应用程序作为OceanBase集群的入口地址,即VIP加载在哪一台机器上,该机就会作为主对外提供服务,程序可以通过不断检测VIP是否存在来判断本机是否为主机,当HA通过我们提供的检测程序检测到主机故障后,就会将VIP切换到备机, 此时外部请求就会路由到原来的备机,原来的备机检测到VIP“飘”到本机后,会将自己的角色置为主:

 

使用HA主要有几个问题:

  1. HA为了防止网络抖动带来的误判,要求将两台机器使用网线直连, 这就限制了两台机器只能放在一个机柜,如果整个机柜断电,则服务不可用,这样就不能抵御机柜以及机房的容灾。
  2. 数据一致性不能保证,一般不要求使用HA的角色持久化特别重要的数据。 其数据应该能通过其他角色的汇报而重建。

另外一个问题在于这种机制无法保证数据不丢失, 某些极端情况下需要停机恢复,如果有机器永久损失,则可能会造成数据的丢失,在某些业务上可能无法接受。

而Updateserver是OceanBase中至关重要的节点,其数据丢失直接影响用户,也不能通过其它类型节点来重建,所以Updateserver最早抛弃HA模式,而改为通过Rootserver来选主:

 

Updateserver每次写入都会生成一条日志,每条日志有一个惟一且单调递增的日志号, 各Updateserver向Rootserver汇报自己的日志号, Rootserver选取日志号最大的Updateserver为主并发放租约,备Updateserver同时需要向主Updateserver注册,由主Updateserver发放租约。Updateserver使用一主多备的形式, 每次写入必须要写入多数派个节点成功才能应答客户,写入请求首先发送到主Updateserver,主Updateserver生成日志并同步到备机,收到多数派个成功回应以后应答客户。如果收不到足够多的回应,则不会应答客户端,该条写入可能生效,也可能不生效。

由于要求写入多数派个节点才算成功,所以主备间的网络延迟不能太高,目前OceanBase要求updateserver主备分布在同城的不同IDC, 如果采取一主两备的模式, 最大可以容忍一个同城IDC故障。

当某一台机器同步日志失败时,主机会将其剔除在恢复之前不再向其同步日志, 这对网络要求很高,如果网络连续出现抖动,则会造成可用性问题。在最新版本OceanBase, 将同步日志的方式也改为Paxos方式,一条日志只需要写到多数派个结点上成功便为成功,不需要各台备机顺序回应,进一步容忍短暂的网络问题。

虽然Updateserver去掉了对HA的依赖,但Rootserver仍然需要HA来选主,由于HA无法部署在两个IDC,所以我们对IDC之间的容灾使用的策略是在另外一个IDC部署一个备集群,在主集群出现故障时,通过人肉的方式将备集群切换为主来提供服务。

基于这个原因,OceanBase 在0.5里彻底取消了基于HA的主备机制,而是通过使用类似paxos的算法来进行选举:

 

让程序自身投票来决出主备, 当一台机器得到多数派的认可,它即可以成为主,这样系统能容忍一定数量节点的不可用,比如,如果是2台,则不能容忍有机器宕机,3台则可以容忍一台机器宕机, 3台机器可以部署在不同的机房以容忍机房故障。

Updateserver仍然通过Rootserver来选主,但这样也存在一个问题,当Updateserver和Rootserver同时故障的时候,Updateserver必须要等Rootserver恢复完成后才能恢复,增加了故障恢复的时间 。在后续的OceanBase版本中,将去除Updateserver这个单写入节点,并将其选主的权力下放到自身,摆脱由Rootserver选主的局面。届时Rootserver的工作会更为简单,单点不会成为OceanBase的瓶颈。

基线数据

Rootserver/Updateserver是通过冗余节点来进行容灾,备节点一般不提供服务或只提供有限的服务,基线数据则是通过冗余数据来实现高可用与扩展服务能力。通过冗余3~6份数据来提供更多的服务能力。冗余的数据不能存储在相同的机器上,以避免机器宕机后损失可用性。同时在可能的情况下,数据需要分布在不同的机架上,以抵御整机架断电或断网,OceanBase在早期的实现中,为了简化实现与对机器分布的要求,未考虑数据分布在不同的机柜,曾出现过整机架断网而造成服务不可用。

基线数据的副本数决定了一个集群同时有多少台机器可以宕机,如果使用三副本,则同时可以有两台机器宕机,每个基线数据结点都和Rootserver保持心跳,当该结点宕机以后,rootserver会检测到并根据目前系统中所拥有的副本数量启动复制,为了避免因网络抖动所带来的不必要的副本复制,我们设定在安全的情况下(比如剩余副本数大于1) 可以容忍副本丢失一段时间(比如8小时),当副本丢失超出该时长后才启动复制。

副本数的选择和集群中机器的数量、单机数据量以及数据恢复速度相关,一般情况下会选择至少3个副本,因为2副本情况下,如果出现一个副本丢失,集群需要立即启动复制,而此时集群可能正处于请求高峰期。阳老师有一个关于副本数选择的计算方法:

“假设总共有N个节点计算机,它们的平均无故障时间都是M,云计算系统对一个数据副本丢失并进行复制的时间为T,则一台计算机在T时间内出故障的概率是T/M,不出故障的概率是(1-T/M):

N台机器在该时间内都不出故障的概率是(1-T/M)的N次方;

N台机器在该时间内恰好有1台出故障的概率是:(1-T/M)的(N-1)次方T/MN;

N台机器在该时间内恰好有2台出故障的概率是:

(1-T/M)的(N-2)次方T/MT/MN(N-1)/(2*1)

因此,N台机器在该时间段内至少有两台机器故障的概率是:

P2(N, M, T)=1-都不出故障的概率-恰好1台出故障的概率

因此,N台机器在该时间段内至少有两台机器故障的概率是:

P3(N, M, T)=1-都不出故障的概率-恰好1台出故障的概率--恰好2台出故障的概率

因此假如N=1000,M=50,000小时,T=600秒,则

P2 (N=10台,M=50,000小时,T=600秒) = 5.0*10的-10次方;

P2 (N=1000台,M=50,000小时,T=600秒) = 6.1*10的-9次方;

P2 (N=5000台,M=50,000小时,T=600秒) = 1.4*10的-4次方;

P3 (N=10台,M=50,000小时,T=600秒) = 4.5*10的-15次方;

P3 (N=1000台,M=50,000小时,T=600秒) = 6.2*10的-9次方;

P3 (N=5000台,M=50,000小时,T=600秒) = 7.6*10的-7次方;

可以看出,当机器数量达到5000台时,至少3台机器出故障的概率低于百万分之一,而至少两台机器出故障的概率高于万分之一。因此采用3个数据副本时数据有比较高的可靠性。”

并计算出一个表格,假设故障时其它服务器以25MB/s的速度恢复丢失数据:

 

MTBF为机器的平均无故障时间,从表中可以看出三副本同时丧失的概率是极低的。

基线数据的另一个较为普遍的异常为磁盘损坏, OceanBase存储基线数据的角色为ChunkServer, ChunkServer并未使用RAID方式来使用磁盘,一块磁盘损坏就意味着永久损失该盘上的所有数据,需要Rootserver从另外的机器上进行复制。 当ChunkServer检测到该磁盘出错(读取或写入失败)时,会主动将该盘剔除并上报, 让Rootserver启动复制程序补足副本。

基线数据需要和增量数据合并而产生新的基线数据,这个过程是由每台ChunkServer各自完成自己所负责的数据分区,即相同数据的几个副本会各自己完成这个合并过程,为了保证各台ChunkServer合并出来的新基线数据是一致的,每台Chunkserver在汇报副本信息的时候需要同时汇报校验值,以检查副本是否一致,如果出现不一致的情况,则是软件有bug或数据有问题,ChunkServer保留两个版本,解决问题后回退到上一个版本进行重新合并。这种问题出现一般都是软件Bug, 根据之前的经验,出现这种情况的时候,用户有可能已经读到不正确的数据,而造成这种问题的主要原因是Updateserver节点的数据不一致,我们通过改造Updateserver的日志同步方式(由主备改为一主多备且要求多数派成功)和加强校验后,这个问题已经得到杜绝。

跨数据中心容灾

到目前为止,OceanBase可以部署在同城的不同IDC并容忍少数个IDC故障。OceanBase一般会在同城选择三个不同的IDC进行部署。 目前还无法做到跨数据中心的容灾。 主要原因是由于通信距离的增加,异地数据中心之间的网络延时较高,无法做到同步复制数据,而通过异步的形式进行复制则无法做到无损容灾,我们目前通过一些手段,比如实时拷贝数据库的redo log到异地数据中心,可以做到最坏情况只丢失几秒的数据。

总结

相较于传统的主备模式,OceanBase可以容忍少数派的节点损坏不中断服务且不丢失数据,为很多需要高可用且不能丢数据的业务提供了共享存储以外的解决方案。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

咦,拆分个字符串都这么讲究?

来源 | 沉默王二封图 | CSDN 付费下载于视觉中国提到拆分字符串,我猜你十有八九会撂下一句狠话,“这有什么难的,直接上 String 类的 split() 方法不就拉到了!”假如你真的这么觉得,那可要注意了,事情远没这…

linux-centos7 常用的基本命令--目录管理、基本属性

一、目录管理 1、cd (切换目录) cd 路径 :切换路径命令,路径可以是绝对路径,也可以是相对路径 ./ : 当前目录 返回上级目录: cd … 返回用户目录: cd ~ 2、ls(列出目录&#xff…

开源考试系统 - 本地代码调试运行

文章目录一、后端部署1. 图形化克隆项目2. 命令克隆项目3. 创建数据库,初始化数据库脚本4. IntelliJ IDEA打开项目5. 数据库连接和redis配置6. 启动redis和后端程序6. 浏览器访问二、前端部署2.1. 打开源码安装依赖2.2. 依次启动admin端和student端2.3. 浏览器访问补…

KDD 2019论文解读:异构信息网络上的对抗生成学习

前言 网络表示学习是一种在低维空间中表示网络数据的方法,在异构信息网络分析中得到了广泛的应用。现有的异构信息网络表示学习方法虽然在一定程度上实现了性能的提高,但仍然存在一些主要的不足。最重要的是,它们通常采用负抽样的方法从网络…

剖析疫情环境下的国内云市场:大势所趋,正是大展拳脚的好时机!

作者 | 马超责编 | Carol封图 | CSDN 付费下载于视觉中国4月29日,谷歌的母公司Alphabet正式发布了2020年第一季度财报,报告显示,Alphabet比去年同期的363.39亿美元增长13%,不计入汇率变动的影响为同比增长15%;在业绩公…

开源考试系统 -微信小程序开发

文章目录一、小程序前置准备1. 创建小程序2. 下载小程序开发工具二、小程序后端部署2.1. 配置修改2.2. 启动redis2.3. 启动后端项目三、小程序前端部署3.1. 微信小程序打开项目3.2. 学生端登录页面3.3. admin端登录一、小程序前置准备 1. 创建小程序 去腾讯小程序官网注册账号…

linux-centos7 常用的基本命令--文件内容查看、硬链接和软链接

一、文件内容查看 1、cat (由第一行开始显示文件内容) cat [-AbeEnstTuv] [--help] [--version] fileName参数说明: -n 或 --number:由 1 开始对所有输出的行数编号。-b 或 --number-nonblank:和 -n 相似&#xff0…

共享学习:蚂蚁金服数据孤岛解决方案

如果有A、B、C三位同学,他们各自手上有10、15、20块钱,这时需要在相互不知道对方有多少钱的情况下,不借助力第三方来计算三个人一共有多少钱。请问这时候,我们如何实现呢?——这,就是最经典的秘密共享场景。…

学之思开源考试系统 - 使用手册

文章目录一、前期准备1. 启动后端2. 启动前台管理员端3. 启动前台学员端二、用户添加2.1. 学生添加2.2. 管理员添加三、题目管理3.1. 添加学科2.2. 单选题添加2.3. 多选题添加2.4. 判断题添加2.5. 填空题添加2.6. 简答题添加四、试卷管理4.1. 固定试卷添加4.2. 时段试卷添加4.3…

看似简单的搜索引擎,原来背后的数据结构和算法这么复杂?

来源 | 码海封图 | CSDN 付费下载于视觉中国前言我们每天都在用 Google, 百度这些搜索引擎,那大家有没想过搜索引擎是如何实现的呢,看似简单的搜索其实技术细节非常复杂,说搜索引擎是 IT 皇冠上的明珠也不为过,今天我们来就来简单…

阿里巴巴在应用性能测试场景设计和实现上的实践

本文是《Performance Test Together》(简称PTT)系列专题分享的第5期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论体系&…

linux-centos7 常用的基本命令--Vim编辑器

一、Vim编辑器 1、什么是 vim? Vim通过一些插件可以实现和IDE一样的功能! Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 简单的来说, vi 是老式的字处理器…

linux-centos7 常用的基本命令--用户账号管理、查看和修改主机名

简介 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们…

领导者必备:三元简化模型,助你加速团队成长

关注成员成长 很早之前,现代管理之父德鲁克提出过一个影响深远的观点,“21世纪的组织,最有价值的资产是组织内的知识工作者和他们的生产力。”现代企业的各位管理者,遇到最大的两类问题就是战略和组织,看不到、想不到…

90% 程序员都吃亏在这门技术上了,你呢!

老李一直怀疑自己是不是年纪大了,脑子跟不上了。作为十几年经验的资深 Java 工程师,维护这公司产品的核心代码的他,现在迭代产品的时候,经常出 Bug 。有时修复一个 Bug 时间,比开发一个需求的时间要长很多,…

车载多传感器融合定位方案:GPS +IMU+MM

导读 高德定位业务包括云上定位和端上定位两大模块。其中,云上定位主要解决Wifi指纹库、AGPS定位、轨迹挖掘和聚类等问题;端上定位解决手机端和车机端的实时定位问题。近年来,随着定位业务的发展,用户对在城市峡谷(高…

linux-centos7 常用的基本命令--用户组管理

用户组管理 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同…

我画了35张图,就是为了让你深入 AQS!

来源 | 程序员cxuan责编 | Carol谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Sem…

Cassandra Java堆外内存排查经历全记录

背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测。压测时候比较容易触发OOM Killer,把cassandra进程干掉。问题是8G这个规格我配置的heap(Xmx)并不高(约6.5g)已经留出了足够的空间给系统。只有可能是Java堆…

数据中台之结构化大数据存储设计

前言 任何应用系统都离不开对数据的处理,数据也是驱动业务创新以及向智能化发展最核心的东西。这也是为何目前大多数企业都在构建数据中台的原因,数据处理的技术已经是核心竞争力。在一个完备的技术架构中,通常也会由应用系统以及数据系统构…