Citus高可用方案演进介绍
点击上方"数据和云"
关注我们,享更多干货!
1. Citus的复制功能
Citus支持两种数据复制方案:
Citus的Shard Replication:通过将DML语句复制到多个Worker节点执行,实现对shard分片数据的复制,仅适用于append-only的负载;当某个Worker节点故障时,Coordinator节点会自动将查询请求转发到其他副本节点以实现高可用;
PostgreSQL的Streaming Replication:通过将Primary节点的WAL记录持续的复制到Standby节点,实现对Primary节点的完整复制,适用于负载较重的OLTP场景;
为什么会同时存在两种方案呢?可以看看Citus复制功能的演进过程。
1.1 第一阶段:客户端复制DML语句到多个Worker节点
在早期的版本中,Citus的主要应用场景是实时数据分析场景,用户批量的导入数据,并通过Citus进行实时数据查询分析,数据不需要修改,是完全Append-only的场景。
Append-Only的场景,各分片数据只需要在完成导入后是一致的就行,为了最大化导入性能,可以从客户端直接并行导入。
这个阶段,Citus导入数据的流程如下:
客户端通知Coordinator需要导入数据到某个表;
Coordinator节点分配对应的placement,并反馈连接信息给客户端;
客户端直接连接对应Shard及其副本,同时往多个副本写入数据;
客户端通知Coordinator更新元数据。
1.2 第二阶段:Coordinator复制DML语句到多个Worker节点
随着使用Citus的人越来越多,对于提供数据更新能力的需求也越来越多。为了提供数据更新能力,Citus需要解决两个主要的问题:
并发更新同一行记录,如何处理?
某个Shard副本不可用,如何处理?
为了解决引入数据更新能力的问题,Citus将更新操作集中到了Coordinator节点,由集中的Coordinator节点处理并发冲突和故障处理。
此时,数据的多副本复制,改成了由Coordinator节点复制DML语句到多个Worker节点执行。
1.3 第三阶段:推荐使用Streaming Replication
随着使用Citus的场景增加,例如多租户的场景,Citus引入了Co-located亲和性共存能力,可以把相同租户的数据亲和性存储在同一个Worker节点,方便支持Join查询,Rollup、外键约束等特性。
此时,前面基于复制Statment的复制方案就会碰到问题,当某个Shard因为短时故障被标记为invalid时,应该如何处理处于同一个Co-located亲和组的其他Shard?
不同步修改其他Shard状态,可能会引发违反外键约束的一致性问题;
同步修改其他Shard都为invalid状态,系统的可用性会严重下降。
这是一个两难的问题,为了安全起见,Citus在6.0版本中把复制因子的默认值从2改为了1,就是因为多租户场景下可能会产生违反外键约束的问题。
现在,Citus推荐的是使用PostgreSQL的Streaming Replication,如下图所示,Streaming Replication是primary-based replication,由主节点解决并发控制问题。
2. 云上Citus高可用备选方案
2.1 备选一:Streaming Replication
如前面描述,Streaming Replication是PostgreSQL的内置特性,通过将WAL记录持续复制到Standby节点,建立Hot Standby备份节点。
2.2 备选二:镜像卷
在云上,也可以使用云提供商的镜像卷能力,当Primary节点故障时,在对应备份卷的主机上拉起数据库进程接管业务。
2.3 备选三:从日志恢复
如果对RTO业务恢复时间不太敏感,也可以采用将WAL日志增量备份到对象存储的方式,本方案的成本更低,故障后,拉起对应计算节点,从对象存储恢复日志并重放数据即可。
2.4 备选方案对比
备选方案 |
优点 |
Streaming Replication |
简单方便,需要更高的存储IO能力及容量; |
镜像卷 |
利用云存储的高持久性和稳定性; |
从日志恢复 |
利用云存储的高持久性,可以实现PITR。 |
2.5 Azure Hyperscale (Citus)的高可用方案
Coordinator节点和Worker节点都使用Streaming Replication方案将数据同步复制到位于另一个AZ的Standby节点,支持AZ级的容灾。主要技术指标有:
故障检测:每30秒检测一次,连续5次检测都异常则判断为故障,总计150秒;
故障倒换:最高90秒完成;
业务影响时间:检测 + 倒换时间,总计240秒;
新建Standby节点时间:不超过1小时。
参考
https://www.citusdata.com/blog/2016/12/15/citus-replication-model-today-and-tomorrow/
https://github.com/citusdata/citus/issues/998
#
Citus简介
Citus是PostgreSQL数据库的分布式中间件,用以解决PostgreSQL横向扩展问题,以支持更大的数据量、更大的写入和查询性能。
Citus由CitusData公司开发,目前已被微软收购,并在Azure上提供Citus Cloud服务。Citus为开源软件,经过约10年的发展,最近刚发布10.0版本,License为AGPL。
不像pg-xc的原生分布式方案,Citus是以Extension的方式扩展PostgreSQL能力,不侵入修改PostgreSQL内核代码,可以很容易和PostgreSQL的新版本配套适用,享受到内核版本演进带来的好处。
关于作者
张程伟,云和恩墨资深数据库架构师,加入云和恩墨前在华为工作16年,一直从事存储及数据库领域的研究工作。
END
长按二维码 热招职位一键投递
长按二维码 热招职位一键投递
MySQL/PG/Oracle DBA
数据库专家(售前)、销售总监/经理
200+热招职位 覆盖全国40+所城市
由ACDU(中国DBA联盟)和墨天轮联合出品的全新视频节目「数据三分钟」已发布多期,快速了解数据行业动态,快关注我们的视频号看看吧!↓↓↓
点击下图查看更多 ↓
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂
点个“在看”
你的喜欢会被看到❤
Citus高可用方案演进介绍相关推荐
- mysql高可用方案MHA介绍
mysql高可用方案MHA介绍 概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10-30秒内),完成故障切换,部署MHA, ...
- mysql5.7新特性--官方高可用方案MGR介绍
MGR简介 MySQL Group Replication(下简称:MGR)是MySQL官方推出的一种基于Paxos协议的状态机复制.在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构 ...
- MySQL数据库的高可用方案总结
高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法 ...
- PostgreSQL HA集群高可用方案介绍 pgpool-II+PostgreSQL HA方案部署
PostgreSQL HA集群高可用方案介绍 & pgpool-II+PostgreSQL HA方案部署 一.PostgreSQL HA集群高可用方案介绍 二.pgpool-II+Postgr ...
- mysql高可用架构介绍_介绍详细的MySQL高可用方案
概述 MySQL高可用,顾名思义就是当MySQL主机或服务发生任何故障时能够立马有其他主机顶替其工作,并且最低要求是要保证数据一致性.因此,对于一个MySQL高可用系统需要达到的目标有以下几点: 数据 ...
- 腾讯数据库RTOlt;30s,RPO=0高可用方案首次全景揭秘
为帮助开发者更好地了解和学习分布式数据库技术,2020年3月,腾讯云数据库.云加社区联合腾讯TEG数据库工作组特推出为期3个月的国产数据库专题线上技术沙龙<你想了解的国产数据库秘密,都在这!&g ...
- 阿里双11高可用架构演进之路
阿里巴巴平台的业务规模在过去的8年呈指数级增长,给双11所带来的技术挑战是世界性的,特别是如何在零点峰值到来时确保系统的稳定性.零点技术挑战的本质是用有限的成本去实现最大化的集群整体吞吐能力和最佳的用 ...
- Redis 那些故障转移、高可用方案
欢迎关注方志朋的博客,回复"666"获面试宝典 Redis大家都不陌生,就算是没用过,也都听说过了. 作为最广泛使用的KV内存数据库之一,在当今的大流量时代,单机模式略显单薄,免不 ...
- mysql查询每个机构下的账号总数_MySQL高可用方案:实践篇
今天我们就来搭建一个读写分离,负载均衡的MySQL集群.想了解高可用理论方面内容的童鞋可以阅读理论篇. 奥兹·杰克:MySQL高可用方案:理论篇zhuanlan.zhihu.com 搭建的集群的基本 ...
最新文章
- Yolov4性能分析(上)
- android 筛选控件_Flutter学习六之实现一个带筛选的列表页面
- 机器学习基础-逻辑回归-09
- xshell有大量打印时,显示信息不全
- 使用数据增强技术提升模型泛化能力
- 最小生成树计数(洛谷-P4208)
- MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录...
- android 机子 启动不进入 android
- python实现登陆注册跳转_Python模拟登录和登录跳转的参考示例
- 简单游戏代码_简单游戏
- mybatis3的中文官方文档
- 软件测试 中静态测试与动态测试的区别
- 通用软件体系结构风格总结为五个大类
- 解决regedit taskmgr不能启动
- 如何解决chrome浏览器地址栏变黑色(chrome搜索栏变黑)(mac电脑)
- MapReduce之week2 test 分区计算结余(练习)
- 功能性模块:(7)检测性能评估模块(precision,recall等)
- WEB页面登陆管理 H3C设备
- 开方 质数_如何心算大数的高次开方(个人观点)
- html文本怎么打印出来,如何把一个html文件直接打印出来(200分)
热门文章
- openresty之http
- 双赢思维的五个要领_可访问网站双赢的4个原因
- 查询数据库中数据的年份_本地公开数据中的年份
- openstreetmap_OpenStreetMap成立10周年,开源医疗设备等等
- Bootstrap按钮的状态
- matlab标定工具箱 参数,使用MATLAB标定工具箱求出内外参数后怎样求实物的两点间......
- 视觉SLAM笔记(23) 图像
- matlab中if可以判断或语句吗,matlab中if 语句后面的判别式不能是算术表达式?或者说变量?...
- binwalk 提取bootimg_boot.img格式文件结构解析
- 家用简单电线路图_电师傅电工总结的家用电器,漏电开关,电线配置知识,简单实用...