安装PostgreSQL Citus集群(postgresql12)

1 进入postresql官网下载页面,提示了centos相关下载安装等信息。
https://www.postgresql.org/download/linux/redhat/

image.png
2 连接到centos7服务器

3 根据官网提示在命令行中下载安装
yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf module disable postgresql
dnf clean all

image.png

yum install postgresql12
yum install postgresql12-server
yum -y install postgresql12-server postgresql12

附带安装
yum install postgresql12-libs
yum install postgresql12-contrib
yum install postgresql12-devel
yum -y install postgresql12-libs postgresql12-contrib postgresql12-devel
CentOS 7 以上的版本输入:
systemctl stop firewalld.service
执行开机禁用防火墙自启命令 :
systemctl disable firewalld.service

为包管理器添加Citus存储库
curl https://install.citusdata.com/community/rpm.sh | sudo bash
2. 安装PostgreSQL + Citus并初始化数据库
#安装带有Citus扩展的PostgreSQL
sudo yum install -y citus90_12

修改数据库路径(如果需要的话)
1、postgresql安装后,默认的数据库路径是/var/lib/pgsql/9.x/data
2、新建一个路径作为新的数据库数据路径,假如是/home/data
sudo mkdir /home/data
sudo chown -R postgres:postgres data
sudo chmod 700 data
最后这个赋权命令是必须的,不然数据库启动回有问题的
4、修改service文件
找到vim /usr/lib/systemd/system/postgresql*.service
修改这个文件中的
Environment=PGDATA=/var/lib/pgsql/9.4/data/
将其修改为自己的新的数据路径:
Environment=PGDATA=/home/data/
至此所有的修改工作就完成了,这个方法比较简单,但是前提是postgresql已经作为服务添加到了systemctl,这一点需要注意
5、此时可以重新启动postgresql了,但是,尝试了几个方法都不能成功,只有重起一下系统,才可以
reboot系统
然后启动postgres服务
sudo systemctl restart posrgresql-12

4 数据库初始化
/usr/pgsql-12/bin/postgresql-12-setup initdb
#预加载citus扩展
echo “shared_preload_libraries = ‘citus’” | sudo tee -a /var/lib/pgsql/12/data/postgresql.conf
在启动数据库之前,让我们更改它的访问权限。默认情况下,数据库服务器只监听本地主机上的客户机。作为此步骤的一部分,我们指示它监听所有IP接口,然后配置客户端身份验证文件以允许来自本地网络的所有传入连接。
echo “listen_addresses = ‘*’” | sudo tee -a /var/lib/pgsql/12/data/postgresql.conf

/var/lib/pgsql/12/data/pg_hba.conf
其中,coordinate节点的pg_hba.conf配置:

IPv4 local connections:

host all all 0.0.0.0/0 md5

worker节点的pg_hba.conf配置:

IPv4 local connections:

host all all 172.21.98.0/24 trust
设置自启动
systemctl enable postgresql-12
systemctl start postgresql-12

必须将Citus扩展添加到希望在集群中使用的每个数据库。下面的示例将扩展添加到名为postgres的默认数据库。
sudo -i -u postgres psql -c “CREATE EXTENSION citus;”
如果不是默认数据库:
sudo -i -u postgres psql -d 数据库名称 -c “CREATE EXTENSION citus;”

3.2 协调节点新增工作节点
以后的管理操作仅仅在协调节点(cn)上操作
sudo -i -u postgres psql -c “SELECT * from master_add_node(‘172.21.98.141’, 5432);”
sudo -i -u postgres psql -c “SELECT * from master_add_node(‘172.21.98.142’, 5432);”
sudo -i -u postgres psql -c “SELECT * from master_add_node(‘172.21.98.143’, 5432);”
sudo -i -u postgres psql -c “SELECT * from master_add_node(‘172.21.98.144’, 5432);”

#查看工作节点:
sudo -i -u postgres psql -c “SELECT * FROM master_get_active_worker_nodes();”
在这里插入图片描述
在这一步,您已经完成了安装过程,可以使用Citus集群了。新的Citus数据库可以通过psql通过postgres用户访问:
sudo -i -u postgres psql

以默认用户登录
Yu@Coat ~ $ sudo su postgres #切换至postgres
postgres@Coat /home/Yu $ psql postgres#登入默认数据库
[sudo] passwordfor Yu:
psql (9.1.6)
Type “help” for help.
以上命令也可以简化为:

Yu@Coat ~ $ sudo -u postgres psql postgres
登录之后给默认用户“postgres”设置密码

postgres=# \password postgres #给postgres用户设置密码
Enter new password:
Enter it again:
postgres=#

测试集群:
1、创建表
create table test_table(id int, name varchar(16));
2、表分片
SELECT master_create_distributed_table(‘test_table’, ‘id’, ‘hash’);
3、设定分片个数(4)及每个分片副本数(2)
SELECT master_create_worker_shards(‘test_table’, 4, 2);
4、创建完成后,可以在子节点看到分片后的数据表如下:
select tablename from pg_tables where schemaname=‘public’;
在这里插入图片描述
Coordinator中数据表如下图:
select tablename from pg_tables where schemaname=‘public’;
在这里插入图片描述
当向test_table表中插入数据时可以看到子节点分片表中也同时会有数据。
在这里插入图片描述
5、查看执行计划:
explain select * from test_table;
在这里插入图片描述
可以看到在查询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数据库数据:
在这里插入图片描述
同步成功