SHARE NOTHING SHARE EVERYTHING
http://mp.weixin.qq.com/s?__biz=MjM5ODYwMjI2MA==&mid=2649736156&idx=1&sn=23931f48282f6ef38f3d3e1875631dbf&scene=2&srcid=0627YxiA6JDyQNbECRBTfjjc&from=timeline&isappinstalled=0#wechat_redirect
【科技文】PGXZ—腾讯分布式关系数据集群—架构解析
我们常说的 Sharding 其实就是Share Nothing架构,它是把某个表从物理存储上被水平分割,并分配给多台服务器(或多个实例),每台服务器可以独立工作,具备共同的schema,比如阿里的TDDL和我厂的TDSQL,只需增加服务器数就可以增加处理能力和容量。
本质上来讲,PGXZ内部是垂直按照分布列进行节点级的水平分隔,是某种Sharding的实现,但PGXZ把这些分布逻辑和细节屏蔽到了数据库的内部,对外提供和单机数据库一样的接口,在保证了易用的同时还提供了强大的数据库能力。PGXZ的CN和DN的每个节点都是一个PostgreSQL的实例,从实现上来讲,PGXZ就是在PG的代码上加了集群的相关功能,从而做成了一个MPP的数据库集群。本文主要解析PGXZ为了实现MPP架构对PG做的修改。 PGXZ的架构简图如下:
Coord:协调节点,对外提供接口,负责数据的分发和查询规划,多个节点位置对等;CN上只存储系统的元数据,并不存储实际的业务数据。
Datanode:存储实际数据,并执行协调节点分发的执行请求,实际存储数据的节点;DN上存储业务数据;各个DN可以存储在不同的物理机上,相互之间隔离,这也就是所谓的Share Nothing。
GTM:全局事务管理器,负责全局事务管理;GTM上不存储数据 PGXC执行SQL的过程:
Step1:业务发送请求到Coord节点,Coord节点向GTM请求 事务信息。Step2:Coord发送SQL语句和事务信息到Datanode。Step3:Datanode执行完SQL后返回结果给CN。Step4:CN收集DN的结果并汇总会后返回给业务。
PGXZ的元数据管理首先介绍下集群的节点管理,节点管理涉及到两张表:PGXC_NODE,管理集群的DN和CN,保存集群所有的DN和CN信息。字段信息如下:
包含CN访问节点时必须的信息,主要是节点名称,节点是CN还是DN,端口,IP等等。PGXZ提供了ADD NODE,ALTER NODE,ROMOVE NODE等命令来对系统的节点进行添加,修改,删除,这些命令的底层就是操作的PGXC_NODE表。
PGXC_GROUP,PGXZ提供了一个节点组的概念,通过组可以把大规模的集群成几个小规模的集群,在建表时指定对应的存储组,进而达到业务上物理隔离的目的。表结构如下:
主要有组名称,组中成员节点OID等字段。CREATE NODE GROUP,DROP NODE GROUP等命令主要对PGXC_GROUP表进行操作。
为了管理集群中表的信息,PGXZ在PG原有的元数据的基础增加PGXC_CLASS对集群中的表进行管理:
pclocatortype描述集群表的分布方式:
'H':哈希分布,使用分布列的hash值对分布节点数取模决定数据存储到哪个节点。该中分布释放无法做到线性扩容和缩容。
'R':复制表,这个表中的数据在所有分布节点上是完全相同的,也就是每个写入操作都会复制到分布节点。该种表一般用在数据量很小的表上。
'N': 随机分布,表中的记录随机分布到所有的存储节点。
'S':Sharding分布,表中的数据使用分布列的哈希值在一个逻辑的分布表上进行取模获得写入的节点。这种分布模式的表可以做到很好的扩容和缩容特性。
pcattnum是集群表的第一分布列,从1开始。
Psecondattum是集群的第二分布列,在双KEY分布时用来计算数据的存储位置,当前该列类型只能是timestamp。
这个表在DN和CN上都有存储,在每次建表操作时CN协调集群内部的所有节点完成建表操作,在每个节点上创建对应的PGXC_CLASS记录,完成建表操作。
CN在生成执行计划时根据PGXC_CLASS来决定请求发送往哪些节点。
PGXZ集群内部的连接管理PGXZ在CN中新加了Pooler进程来管理CN到其他CN和DN的连接,这个进程起到连接池的作用。
通过Pooler进程,CN可以高效的获取到其他节点的连接,保证事务的执行效率。
Pooler进程中有多个dbpool,每个dbpool对应一组数据库和用户名的组合,不同的用户名和数据库的组合对应不同的dbpool。
dbpool在该用户首次登录这个数据库的时候创建,使用hash表来管理该用户往各个节点的对应数据库的连接池。每个节点的连接池存放在以nodeid为键的hash表中。这个连接池具有普通数据库连接池所需的特性,包括最大连接数,最小连接数,连接生命周期等等。
第一步,CN向所有节点发起BEGIN TRANSACTION,保证整个操作的原子性,这个操作由CN内部发起,业务无感知。
第二步,CN向所有节点发起CREATE TABLE命令,每个节点完成建表操作。
第三步,CN向每个节点开启两阶段事务,这个阶段包括发起请求的节点自己。阶段结束后,所有节点完成PREPARE。
第四步, CN向所有节点发起两阶段事务提交请求,至此,建表操作结束。
说到两阶段事务,对应的故障和处理方法是一定要讨论的。在第一和第二个阶段发生故障时,事务此时还是普通事务,直接回滚所有节点的事务即可,不会有其他的副作用。但是在第三阶段以后情况有所不同,在事务被PREPARED以后,事务中的信息在两阶段事务中进行了持久化,这个事务必须通过COMMIT PREPARED或者ROLLBACK PREPARED来完成。
在一些极端的场景下,比如节点硬件故障,磁盘空间不足,COMMIT PREPARED或者ROLLBACK PREPARED阶段会被异常结束,这些系统的事务状态当前是未决的。因为两阶段事务的持久化信息中很有可能会包含锁的信息,如果这些事务得不到很及时的处理就会对后续的业务处理造成较大的影响。我们提供了一个2PC事务的自动处理工具,在系统监测到残留的2PC事务时,运行工具来处理系统的两阶段事务,保证业务的正常运行。
工具会扫描系统的2PC事务状态并做出处理,处理的方式如下表:
通过上面的方法,在系统发生故障时,可以有效的降低2PC事务带来的影响。 总结:除了元数据管理,集群连接管理,2PC事务意外,PGXZ在查询优化器的层面也做了很多优化来解决分布式后的查询优化。这里篇幅所有限不做详细的解析。
思考:数据库存储架构的发展主要有Shared Nothing和Share Everything。Share Everything的集群商业软件有SybaseIQ,Oracle RACK等,但是在开源软件软件领域目前还没有相应的解决方案。当前具备POSIX接口的分布式文件系统已经在很多的生产环境投入使用,我们是不是也可以畅想下基于DFS的Share Everything架构的数据库集群?
SHARE NOTHING SHARE EVERYTHING的更多相关文章
- 数据库架构设计的三种模式:share nothing , share everythong , share disk
数据库构架设计中主要有Shared Everthting.Shared Nothing.和Shared Disk: Shared Everthting:一般是针对单个主机,完全透明共享CPU/MEMO ...
- Linux常用命令大全(share)
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- 2017 browser market share
Refer to Net Market Share published data for year 2017, browser share percentage as below table show ...
- 利用 share code 插件同步代码片段
利用 Settings Sync可以同步 VS code 配置,但它只能同步插件,利用 Settings Sync 再配合 share code 插件可以同步自定义代码片段,可以把 VS code ...
- Share and NTFS Permission
NTFS Permissions Share Permissions Share and NTFS Permission Similarities 共享权限和NTFS权限的相似性 Modifying ...
- String(char[] value, boolean share) {
记录一下今天被蠢到 1. 在观察StringBuffer类的toString方法时,发现了个没见过的方法 return new String(toStringCache, true); @Overri ...
- web share api 分享
概述 Navigator.share() 方法通过调用本机的共享机制作为 Web Share API 的一部分.如果不支持 Web Share API,则此方法为 undefined. 此项功能仅在 ...
- LA 3231 - Fair Share
You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...
- 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图
[源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...
随机推荐
- 学习资源asp.net
http://www.runoob.com ajax 同一表单,多部分提交.增加,修改,删除 服务器端控件: http://technet.microsoft.com/zh-cn/library/cc ...
- Angular跨域
Angular 跨域很简单,记住格式就好,有一些细节的东西需要跟后台商量的 比如地址栏的callback前面是&还是?跨域的原理请参考<jsonp跨域> Angular 跨域代码 ...
- 本BLOG简介(内有一道UVa524素数环进阶版)【B001】
[B001]Hi,大家好,今天我的博客第一天开通,今天奉上开博题,出自首都师师范大学附属中学OJ(题号未知在练习场中)原题为UVa524,题目要求如下: [难度B]—————————————————— ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- Java的集合类
转自:Q.Mr的博客 http://www.cnblogs.com/zrtqsk/p/3472258.html (本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教 ...
- ACM 疯牛
疯牛 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小 ...
- SDCycleScrollView 滚动视图的使用(广告)
github库链接https://github.com/gsdios/SDCycleScrollView 无限循环自动图片轮播器(一步设置即可使用) // 网络加载图片的轮播器 cycleScroll ...
- [CareerCup] 18.7 Longest Word 最长的单词
5.7 Given a list of words, write a program to find the longest word made of other words in the list. ...
- JAVA中保留指定小数位方法
import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; ...
- JAVA中JDBC连接数据库
这里列举了JDBC连接Oracle . SQLServer .MySQL 三种 数据库 1.Oracle连接(导入classes12.jar 包) public static Connection g ...