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
官方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-12yum安装之后默认的路径: /usr/pgsql-12/ 数据库默认目录data: /var/lib/pgsql/12/data/
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)开放防火墙端口(默认5432)
创建完成后,可以在子节点看到分片后的数据表如下(分片数为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正常工作。