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 ...
随机推荐
- Visual Studio 设置 Inherited include Directories
在用Visual Studio进行开发的时候,避免不了要使用一些常用的第三方提供的库.如果是一次两次设置还能让人忍受,但是如果要写很多项目的话,设置这些库真的很让人头疼.不过Visual Studio ...
- zjoi2016 day1【bzoj4455】【bzoj4456】
首先做了T2的旅行者,看到bz上面过的人数比较多.. 考试的时候完全没有想太多.一闪而过了分块思想,然后就没有然后了.. 大视野上面有题解,竟然是一个初中生写的..? 正解其实是“分治”,每次选择中轴 ...
- SQL SERVER获取数据库中所有表名 XTYPE类型
SELECT (case when a.colorder=1 then d.name else null end) 表名, a.colorder 字段序号,a.name 字段名, (case whe ...
- 【原】iOS学习38网络之数据解析
1. 解析的基本的概念 解析:从事先规定好的格式中提取数据 解析前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JOSN解析 2. X ...
- 连连看[HDU1175]
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- BZOJ 2038 小z的袜子 & 莫队算法(不就是个暴力么..)
题意: 给一段序列,询问一个区间,求出区间中.....woc! 贴原题! 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过 ...
- HDU 2836 (离散化DP+区间优化)
Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...
- 20145304 Java第三周学习报告
20145304 <Java程序设计>第三周学习总结 教材学习内容总结 1.定义类: 类定义时使用class关键词,建立实例要使用new关键词. 代码如下: /*定义类 书上例子 衣服的型 ...
- leetcode Linked List Cycle
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...
- 【BZOJ】3771: Triple
http://www.lydsy.com/JudgeOnline/problem.php?id=3771 题意:n个带价值互不相同的物品,每次可以取1.2.3个物品,问能得到的所有的价值和这个价值的方 ...