Multi-master in PostgreSQL

来源:互联网 发布:一物降一物 知乎 编辑:程序博客网 时间:2024/05/19 09:12

一.介绍

Multimaster准许所有节点接受写入,在各个节点并发写入时就像在单个节点开不同的后台进程写入一样.为了保证高可用和各个节点数据的一致性,multimaster使用2ndQuandrand提供的逻辑复制和three-phase E3PC commit protocol.

二.基本流程

当postgres加载multimaster时, multimaster会为每个node节点设置逻辑复制的producer和consumer并且利用hook将事务放入管道.一个典型的复制流程包含以下阶段

  1. PREPARE阶段
    Multimaster捕获并将每一个COMMIT语句隐式转换为PREPARE语句,所有节点通过复制协议将事务传入cohort节点对传入的事务进行投票并将提交或者回滚信息传给事务启动的节点上的仲裁进程,这样可以保证所有cohort都可以接受事务,并且不会发生写入冲突,关于PREPARE TRANSACTION(2PC)可以查看一下连接
    http://www.postgres.cn/docs/9.5/sql-prepare-transaction.html

  2. PRECOMMIT阶段
    如果所有队列都同意提交事务,仲裁进程向所有队列节点发送PRECOMMIT来准备提交,队列节用PRECOMMITTED消息来响应仲裁进程.万一失败,所有节点可以通过投票用此消息来完成此事务

  3. COMMIT阶段
    如果PRCOMMIT阶段成功,所有节点的仲裁进程提交此事务

如果节点在PREPARE和COMMIT阶段之间崩溃或与集群断开连接, 对于存活的节点PRECOMMIT阶段保证有足够的信息来完成PREPARE TRANSACTION. PRECOMMITTED阶段的信息来帮助你避免以下场景:崩溃的节点已经提交或者终止了事务但是没有通知其他节点.在两阶段(2PC)中,这样的事务会一直保持锁,直到崩溃的节点恢复,否则可能会导致数据不一致.例如故障节点提交了此事务而存活的节点回滚了此事务

三.组成部分

Postgresql节点
同步逻辑复制
仲裁进程(健康检查和自动恢复)

四.限制

multimaster自动处理数据库复制.可以在任何节点上执行写入事务,并且同时处理每个群集节点上的临时表.但是请确保考虑以下复制限制
1. 一个集群multimaster只能复制一个数据库
2. 需要复制的表必须具有主键或replica identity.否则由于逻辑复制限制,将不允许复制.unlogged表不被复制
3. 自增序列.为了避免冲突multimaster修改了序列的默认值,以节点id为初始值,以集群节点数来增加.例如:3个机器集群node1以1开始1,4.7…;node2以2开始2,5,8…;node3以3开始3,6,9…
4. COMMIT延时.在目前的逻辑复制中,multimaster只在本地提交后才向其他节点发送数据,所以您必须等待事务处理两次:首先在本地节点,然后同时在其他所有节点.在写非常多的情况下,这可能导致明显的延迟
5. 事务隔离级别.目前只支持repeatable read事务隔离级别
6. DDL复制.由于目前多主是基于逻辑复制,DDL语句会在语句级别进行复制,会导致不同的节点上会分布式提交,在复杂的DDL语句例如存储过程和临时表中会与普通标准的PostgreSQL不一样,需要注意

五.安装

使用multimaster需要先安装postgresql,此处省略postgresql的安装

环境信息

IP| 角色| 数据库| OS
192.168.42.247|Node1| PostgreSQL 9.6.2| CentOS release 6.5
192.168.42.248|Node2| PostgreSQL 9.6.2| CentOS release 6.5
192.168.42.249|Node3| PostgreSQL 9.6.2| CentOS release 6.5

1.安装依赖包

yum install automake, libtool, bison, flex readline-devel

2.编译源码

在所有节点编译multimaster源码

cd /opt/soft/postgresql-9.6.2/contribgit clone https://github.com/postgrespro/postgres_clustersource /home/postgres/.bash_profilecd postgres_cluster./configure make -j 4 && make -j 4 installcd /opt/soft/postgresql-9.6.2/contrib/postgres_cluster/contrib/mmtsmake install

3.修改postgresql.conf文件

wal_level = logicalmax_connections = 100max_prepared_transactions = 300max_wal_senders = 10max_replication_slots = 10max_worker_processes = 250shared_preload_libraries = 'multimaster'default_transaction_isolation = 'repeatable read'multimaster.max_nodes = 3multimaster.node_id = 1  multimaster.conn_strings = 'dbname=postgres host=192.68.42.247, dbname=postgres host=192.68.42.248,dbname=postgres host=192.68.42.249'

1. multimaster.node_id不同节点设置不同node_id要求是连续且从1开始
2. default_transaction_isolation 目前multimaster只支持repeatable read事务隔离级别

4.修改pg_hba.conf文件

host    all             all             192.168.42.247/32      trusthost    all             all             192.168.42.248/32      trusthost    all             all             192.168.42.249/32      trusthost    replication     postgres        192.168.42.247/32        trusthost    replication     postgres        192.168.42.248/32        trusthost    replication     postgres        192.168.42.249/32        trust

5.重启数据库

pg_ctl -mf restart

6.搭建multimaster集群

在node2和node3上利用pg_basebackup初始化集群pg_basebackup -D /home/postgres/pgdata/ -Fp -Xs -v -P -h 192.168.42.247 -p 5432 -U postgres

7.创建 excension

连接任意一节点执行创建excensionCREATE EXTENSION multimaster;

到此multimaster搭建完成,具体请测试

原创粉丝点击