citus是PostgreSQL数据库中的一种轻量级的分库分表解决方案。citus不是一个单独的程序,它是PostgreSQL数据库中的一个插件,可以使用create extension安装此插件。
每个citus集群有多个PostgreSQL数据库实例组成,数据库实例分为两类:
测试系统为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中数据表如下图:
当向test_table表中插入数据时可以看到子节点分片表中也同时会有数据。
5、查看执行计划:
可以看到在查询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数据库同步正常:
标红为插入数据
现在启动14 workder1数据库:service postgresql start
可以看到修改后的数据并未进行同步。
通过命令:SELECT * from pg_dist_shard_placement order by shardid, placementid;
结果如下图:
标红处是修改数据库,关闭14数据库后的查询,通过对比可以看到:
当shardstate为1时,数据同步正常,当shardstate为3时数据同步异常。
通过以复制分片方式对数据进行同步如下:
SELECT master_copy_shard_placement(102010, '192.168.10.17', 5432, '192.168.10.14', 5432);
命令执行后再次查询结果如下:
查看14数据库数据:
同步成功