pgxl/xc

pgxl/xc

下面是对pgxl/xc的一些理解,xl与xc区别主要在于xl比xc多了MPP,datanode间可以交换数据。

架构

pgsql-xl 主要分为三个部分:

  • GTM(Global Transaction Manager)
  • Coordinator
  • Datanode

这三部分都是对原pgsql的拆取改造。

下面对这三部分进行介绍。

GTM

GTM(全局事务管理器)的主要作用是:

  • 分配全局事务id(GXID)
  • 获取全局事务状态(active等)。
  • 管理全局数据(timestamp,sequence)
    GXID 递增
    获取全局活跃事务是为了在mvcc中对行的可见性进行判断。

note: 由于集群只有一个GTM节点,为了防止单点故障,可以配置一个热备节点保证高可用

GTM Proxy

由于每个事务都会频繁请求访问GTM,可以通过把几次请求放一起(甚至合为一个)来减少与GTM与协调器的交互,这就是GTM Proxy——通过在GTM与Coordinator间增加一层代理。

With GTM Proxy, you can promote GTM slave without stopping Postgres-XC cluster. If live transactions needs to communicate with GTM while GTM master is out, they will be aborted but you don’t have to restart nodes.

GTM的主备切换也需要手动,但不需停集群服务

Coordinator

coordinator(协调器)的主要作用是:

  • 处理客户端连接
  • 对sql进行解析,生成执行计划
  • 路由,把执行计划传给相应数据节点
  • 管理2pc

对于复制表,读的话查找最近数据节点;写的话,所有协调器都选择同一个节点写,以防止冲突,这个数据节点称为主数据节点
对于分布表,事务涉及多个节点,则通过两阶段提交控制事务。
对于ddl,发送到所有的协调器和数据节点上执行,也通过两阶段提交协议同步。

同时协调器是客户端的访问节点。客户端通过协调器对数据进行操作。

The Coordinator does not store any user data. It stores only catalog data to determine how to process statements, where the target Datanodes are, among others. Therefore, you don’t have to worry about Coordinator failure much. When the Coordinator fails, you can just switch to the other one.

Datanode

Datanode(数据节点)用来保存表和索引数据。可以执行协调器下传的查询等操作。数据节点间可建立一对一通讯(pgxl 用于join)。

事务管理

在prepare后本地事务会落磁盘

implicate

start 
     失败 abort
prepare
     部分失败  abort,abort 失败 clean清理 (都设为  clean)
commit
     部分失败 需 用clean 工具清理(去提交)

explicate

start    
     失败abort
执行prepare
     部分失败  失败的abort,成功的prepared  (clean 都为abort)
执行commit
     部分失败(只会因系统错误失败) 失败的为prepared ,其他为commited   用clean 工具清理(去提交)

若都为prepared ,
implicate commit ;
explicate 自己决定

xl/xc表分为全局表,分布表。

全局表

全局表存在在所有的datanode上。

每个节点都保存一份相同表
        read: 返回所有节点 然后会从中选取最优的一个(根据join tree PREFERRED node)
        update/insert: 先访问primary node(如果存在,不存在 返回所有节点),之后再操作其他节点,防止死锁。
        select for update: 返回primary node(如果存在,不存在 返回所有节点),防止死锁。
   写  primary
   读  preferred

分布表

分布表可通过hash、module、robin 三种方式分片。

pg xl
    1. 复制表:
        insert/update/read_fqs :所有节点  (primary node)
        else  select  :随机获取一个节点(modulo)
    2. 分布表:
        轮询(robin):
          insert: 获取下一个节点 ,初始节点随机获取
          else  : 所有节点
        哈希(hash):
          insert: 值为null 第一个节点,不为null,计算hash 取模获取相应节点
          else  : 值为null 所有节点,不为null,计算hash,取模获取相应节点
        取模(modulo):与hash类似
)
 通过非分片字段 当做值为null   
Queries with FOR UPDATE/SHARE can't be shipped

xc
    1. 复制表 
        read: 返回所有节点 然后会从中选取一个(根据join tree)
        update/insert: 先访问primary node(如果存在,不存在 返回所有节点),之后再操作其他节点,防止死锁。
        select for update: 返回primary node(如果存在,不存在 返回所有节点),防止死锁。
antdb:
    1. 复制表
       read: 返回所有节点 然后会从中选取一个(根据join tree)
        update/insert: 先访问primary node(如果存在,不存在 返回所有节点),之后再操作其他节点,防止死锁。
        select for update: 返回primary node(如果存在,不存在 返回所有节点),防止死锁。
    2. 分布表
       user defined: 有字段为null,且为插入,第一个节点,不为插入 所有节点;都不为null,通过自定义规则获取节点
  • 分区键只能有一个字段
  • 若有唯一索引,唯一索引需为分布键

note

  • 不能自动扩容,新增节点后需要手动操作扩容
  • 不能进行自动故障恢复
  • 多个Coordinator节点时需使用其他工具进行负载均衡
  • 流式复制
  • 不能切主
  • antdb 不支持通过mgr缩容
  • 数据节点间的数据传输–原来的Postgres-XC的D-Node间不能传数据–数据需要汇聚到C节点进行处理–Postgres-XL允许D-Node间进行数据传输
  • 执行计划.VS. SQL语句–C-node  D-node XC发送SQL语句,XL发送执行计划

你可能感兴趣的:(数据库)