使用yum搭建postgresql的citus分片集群
postgreSQL的相关操作:https://www.runoob.com/postgresql/postgresql-tutorial.html
citus是PostgreSQL数据库中的一种轻量级的分库分表解决方案。citus不是一个单独的程序,它是PostgreSQL数据库中的一个插件,可以使用create extension安装此插件。
每个citus集群有多个PostgreSQL数据库实例组成,数据库实例分为两类:
master节点,通常有一台。master节点只存储分库分表的元数据,不存储实际的数据。
worker节点,通常有多台。worker节点存储实际的分片数据(shard)。
主机规划
环境:centos7
master:192.168.200.90
worker1: 192.168.200.91
worker2: 192.168.200.92
1 安装postgreSQL(所有主机),本次采用yum直接安装
官方yum安装:自行选择postgreSQL的版本,我采用12
https://www.postgresql.org/download/linux/redhat/
# Install the repository RPM:
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
yum install postgresql12-server
# Optionally initialize the database and enable automatic start:
#初始化数据库data
/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12
yum安装之后默认的路径:
/usr/pgsql-12/
数据库默认目录data:
/var/lib/pgsql/12/data/
2 修改配置文件(所有主机)
master设置为0.0.0.0/0的md5连接
worker设置为0.0.0./0或者对应网段的trust连接
需要修改的配置文件:
/var/lib/pgsql/12/data/pg_hba.conf
#master
host all all 0.0.0.0/0 md5
#worker1、2
host all all 0.0.0.0/0 trust
/var/lib/pgsql/12/data/postgresql.conf
listen_addresses = '*' # what IP address(es) to listen on;
shared_preload_libraries = 'citus' # (change requires restart)
1
2
3
4
3 安装citus
curl https://install.citusdata.com/community/rpm.sh | sudo bash
yum install -y citus90_12#版本与12相同即可
1
2
4 防火墙开放
开放防火墙端口(默认5432)
5 重启postgreSQL
6 在master中添加worker节点
#将Citus扩展添加到希望在集群中使用的每个数据库(master、worker都要执行)
#需要切换到postgres
psql -c “CREATE EXTENSION citus;”
#添加节点,可使用psql -c
SELECT * from master_add_node('192.168.200.91', 5432);
SELECT * from master_add_node('192.168.200.92', 5432);
#删除节点,可使用psql -c
SELECT * from master_remove_node(''?,?);#若添加错误,执行此删除
#查看节点是否添加成功,可使用psql -c
SELECT * FROM master_get_active_worker_nodes();
7 在master中创建表测设分片
#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);
#不报错则前面都设置成功。
创建完成后,可以在子节点看到分片后的数据表如下(分片数为2,副本数为2):
#插入数据
insert into test_table values (1,'yyp');
insert into test_table values (2,'csq');
insert into test_table values (3,'lzl');
1
2
3
4
分别在master、worker1、worker2中查看数据的分片情况。
宕机与修复
当worker1宕机后,又从master中插入了数据,会导致worker1中数据同步失败。
修复worker1后,查看表中数据存在丢失。
宕机
master:
#查看数据同步情况
postgres=# SELECT * from pg_dist_shard_placement order by shardid, placementid;
shardid | shardstate | shardlength | nodename | nodeport | placementid
---------+------------+-------------+----------------+----------+-------------
102036 | 3 | 0 | 192.168.200.91 | 5432 | 57
102036 | 1 | 0 | 192.168.200.92 | 5432 | 58
102037 | 1 | 0 | 192.168.200.92 | 5432 | 59
102037 | 1 | 0 | 192.168.200.91 | 5432 | 60
(4 行记录)
#shardstate为1表示正常同步,为3表示同步失败
修复
将worker2中的shardis=102036的分片复制给work1
postgres=# SELECT master_copy_shard_placement(102036, '192.168.200.92', 5432, '192.168.200.91', 5432);
#分片从worker2复制到worker1,ip写反会报错
#再次查看分片情况
postgres=# SELECT * from pg_dist_shard_placement order by shardid, placementid;
shardid | shardstate | shardlength | nodename | nodeport | placementid
---------+------------+-------------+----------------+----------+-------------
102036 | 1 | 0 | 192.168.200.91 | 5432 | 57
102036 | 1 | 0 | 192.168.200.92 | 5432 | 58
102037 | 1 | 0 | 192.168.200.92 | 5432 | 59
102037 | 1 | 0 | 192.168.200.91 | 5432 | 60
(4 行记录)
在worker1、worker2中分别查看数据,数据已经恢复正常且相同。
继续在master中插入数据,worker1、worker2正常工作。
————————————————
版权声明:本文为CSDN博主「无望之欲」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linux_yyp/article/details/107066728
相关文章