环境:
IP | 主机名 | 节点类型 | 系统 | 软件版本 |
111.111.111.160 | citus00 | coordinator node (CN) | CentOS 8.3 | PostgreSQL 14.5 + Citus 11.0.6 |
111.111.111.161 | citus01 | worker node | CentOS 8.3 | PostgreSQL 14.5 + Citus 11.0.6 |
111.111.11.1162 | citus02 | worker node | CentOS 8.3 | PostgreSQL 14.5 + Citus 11.0.6 |
在所有节点执行以下步骤
1、本地离线安装citus和postgresql
rpm -ivh citus_14-11.0.6-1.rhel8.x86_64.rpm
rpm -ivh citus_14-devel-11.0.6-1.rhel8.x86_64.rpm
rpm -ivh citus_14-llvmjit-11.0.6-1.rhel8.x86_64.rpm
rpm -ivh postgresql14-libs-14.5-1PGDG.rhel8.x86_64.rpm
rpm -ivh postgresql14-14.5-1PGDG.rhel8.x86_64.rpm
rpm -ivh postgresql14-server-14.5-1PGDG.rhel8.x86_64.rpm
rpm -ivh postgresql14-contrib-14.5-1PGDG.rhel8.x86_64.rpm
过程中如果有缺失的包可以使用本地yum源安装解决这个问题。
2、修改环境变量
可以先删除默认创建的postgres用户
userdel -r postgres
然后创建用户组
groupadd -g 5001 postgres
useradd -g 5001 -u 5001 -s /bin/bash -m postgres
这样的好处是用户home目录就会在/home/postgres下,否则默认是在/var/lib/pgsql下,
su - postgres
vi ~/.bashrc
添加下面变量
#For PostgreSQL
export PGHOME=/usr/pgsql-14
export PGDATA=/app/pgsql/14.5/data
export PGHOST=/app/pgsql/14.5/socket
export PGUSER=postgres
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH
$ mkdir -p /app/pgsql/14.5/data
$ mkdir -p /app/pgsql/14.5/socket
$ mkdir -p /app/pgsql/14.5/tablespace --自定义表空间目录
3、初始化数据库
$ initdb
3.1、修改 postgresql.conf
$ cd $PGDATA
$ vi postgresql.conf
# 修改listen_addresses
listen_addresses = '*'
3.2、修改unix_socket_directories
如果只是单纯修改这个参数指定的路径,那么psql会报错,在用户环境变量中指定PGHOST变量为这个目录就可以解决这个问题了,所以前面的PGHOST环境变量已经指定
unix_socket_directories = '/app/pgsql/14.5/socket'
3.3、加载pg_stat_statements和citus插件
默认这个插件是注释掉的,pg_stat_statements这个插件记录了所有SQL语句的执行统计信息,对SQL优化帮助很大,但是启用该插件需要重启数据库,所以在建库的时候就直接配置上就好。
citus分布式数据的插件
shared_preload_libraries = 'citus,pg_stat_statements' # (change requires restart)
3.4、配置pg_hba.conf
集群网段是111.111.111.0/24
cd $PGDATA
vi pg_hba.conf
# Allow unrestricted access to nodes in the local network. The following ranges
# correspond to 24, 20, and 16-bit blocks in Private IPv4 address spaces.
host all all 111.111.111.0/24 trust
3.5、配置防火墙
查看
firewall-cmd --zone=public --query-port=5432/tcp
添加5432端口(--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=5432/tcp --permanent
重新载入
firewall-cmd --reload
4、配置自启动
4.1、修改数据存储目录在自启动脚本中的值
# vi /usr/lib/systemd/system/postgresql-14.service
# Location of database directory
# Environment=PGDATA=/var/lib/pgsql/14/data/ #-- 注释掉这一句
Environment=PGDATA=/app/pgsql/14.5/data/ #-- 修正为实际值
4.2、修改完服务脚本后要使用下面命令重新载入配置,不然会报错:
systemctl daemon-reload
使用系统命令控制数据库启停
systemctl enable postgresql-14
systemctl status postgresql-14
systemctl start postgresql-14
5、给需要的数据库安装Citus扩展
CREATE EXTENSION citus;
------第六步只在coordinator节点执行
6、在coordinator节点添加coordinator和worker信息
SELECT citus_set_coordinator_host('111.111.111.160', 5432);
SELECT * from citus_add_node('111.111.111.161', 5432);
SELECT * from citus_add_node('111.111.111.162', 5432);
7、验证安装是否成功
所有节点均可执行
SELECT * FROM master_get_active_worker_nodes();
select citus_version();
8、Citus的分片复制
Citus将每个数据分片复制两份或多份,分布到不同的worker节点上,如果其中存储相同分片的一个worker节点宕掉,Coordinator节点会将查询路由到有相同分片的正常worker节点。要使用Citus的分片复制功能,需要创建分布式表之前设置启用分片复制功能,将“shard_replication_factor”,也就是每个分片的副本数量,设置为2或者更高,以支持更好的容错性。
本次的环境只有2个worker节点,就设置为2
SET citus.shard_replication_factor = 2;
9、citus创建表并分片
创建测试表
create table student(no int primary key,student_name varchar(40),age int,class_no int);
insert into student values(220001,'韩梅梅',16,2201);
insert into student values(220002,'李雷',17,2202);
worker节点本身也可以创建表,但是无法分片到其他节点,会报错
postgres=# SELECT create_distributed_table('student', 'no');
ERROR: operation is not allowed on this node
HINT: Connect to the coordinator and run it again.
总结:想要分片到整个集群的表,必须在coordinator节点创建并使用create_distributed_table分片到worker节点。
coordinator节点可以创建表,修改数据,worker节点可以在coordinator节点创建的表中修改数据,且自动同步到其他worker节点和coordinator节点,但是无法删除表。