postgresql数据库使用Citus实现集群

citus是PostgreSQL数据库中的一种轻量级的分库分表解决方案。citus不是一个单独的程序,它是PostgreSQL数据库中的一个插件,可以使用create extension安装此插件。 
每个citus集群有多个PostgreSQL数据库实例组成,数据库实例分为两类:

  • master节点,通常有一台。master节点只存储分库分表的元数据,不存储实际的数据。
  • worker节点,通常有多台。worker节点存储实际的分片数据(shard)。

测试系统为debain系统,安装postgresql 使用apt安装:apt-get install postgresql   

本人安装成功后版本为9.6,接下来安装citus扩展,可以使用源码编译安装,也可以用apt进行安装,安装时注意citus版本与postgresql数据版本的对应。

使用apt安装:apt-get install postgresql-9.6-citus

这样citus安装成功。。

测试环境:主服务器(Coordinator)192.168.10.12   节点服务器(worker1)192.168.10.14

 节点服务器(worker2)192.168.10.17

所有服务器postgresql配置允许远程访问。

pg_hba.conf配置如下 :

12服务器:host    all             all             192.168.10.0/24            md5

节点服务器:host    all             all             192.168.10.0/24           trust

注意节点服务器最后不能配置md5方式,只能使用trust无密码验证方式,防火墙需要打开5432端口。

postgresql.conf配置如下:

所有服务器加入:shared_preload_libraries = 'citus' 

配置完成,重启数据库。

以下为所有服务器相同配置:

1、登录postgres,进入psql

       su postgres 

       psql

2、为当前数据库添加扩展库:

      CREATE EXTENSION citus;

如新建了数据库名称为:TestColony

       切换到数据库TestColony:   \c TestColony   切换到对应数据库后执行以上添加扩展库命令。

3、为Coordinator添加子节点。

SELECT * from master_add_node('192.168.10.14', 5432);

SELECT * from master_add_node('192.168.10.17', 5432);

4、查看节点是否添加成功。

SELECT * FROM master_get_active_worker_nodes();

如上图节点添加成功。

 

测试集群:

1、创建表

create table test_table(id int, name varchar(16));

2、表分片

SELECT master_create_distributed_table('test_table', 'id', 'hash');

3、设定分片个数(2)及每个分片副本数(2)

SELECT master_create_worker_shards('test_table', 2, 2);

4、创建完成后,可以在子节点看到分片后的数据表如下:

Coordinator中数据表如下图:

postgresql数据库使用Citus实现集群_第1张图片

当向test_table表中插入数据时可以看到子节点分片表中也同时会有数据。

postgresql数据库使用Citus实现集群_第2张图片

5、查看执行计划:

postgresql数据库使用Citus实现集群_第3张图片

可以看到在查询test_table数据时,实际上是从14 子节点进行数据查询,通过merge_job的任务将分片表进行合并查询。

6、当worker1服务器关闭或者断电时,对表test_table插入数据,此时worker2服务器数据同步正常,当worker1服务器

重启启动后,发现数据与worker2数据不一致的情况 。可以通过如下命令查询变化情况:

SELECT * from pg_dist_shard_placement order by shardid, placementid;

将14数据库关闭,对表test_table插入数据结果如下图:

17数据库同步正常:

postgresql数据库使用Citus实现集群_第4张图片

标红为插入数据

现在启动14 workder1数据库:service postgresql start

postgresql数据库使用Citus实现集群_第5张图片

可以看到修改后的数据并未进行同步。

通过命令:SELECT * from pg_dist_shard_placement order by shardid, placementid;

结果如下图:

postgresql数据库使用Citus实现集群_第6张图片

标红处是修改数据库,关闭14数据库后的查询,通过对比可以看到:

当shardstate为1时,数据同步正常,当shardstate为3时数据同步异常。

通过以复制分片方式对数据进行同步如下:

SELECT master_copy_shard_placement(102010, '192.168.10.17', 5432, '192.168.10.14', 5432);

命令执行后再次查询结果如下:

postgresql数据库使用Citus实现集群_第7张图片

查看14数据库数据:

postgresql数据库使用Citus实现集群_第8张图片

同步成功

 

 

 

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