使用yum搭建postgresql的citus分片集群

    技术2022-07-11  96

    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)

    3 安装citus

    curl https://install.citusdata.com/community/rpm.sh | sudo bash yum install -y citus90_12#版本与12相同即可

    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');

    分别在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正常工作。

    Processed: 0.010, SQL: 9