一、添加Citus新节点作为primary worker node
1、在新节点上安装PG和Citus,以及其他需要的组件(也可以在已有PG服务器上创建新的PG数据库实例);
2、初始化PG数据库实例,例如:
$initdb -D citus (PGDATA目录可以与其他节点不一样)
3、配置pg_hba.conf和postgresql.conf,可以从其他节点节点直接拷贝(如果在一个PG服务器上有多个实例,需要需改port)
4、启动PG数据库实例:
$pg_ctl -Dcitus start
5、在coordinator节点上执行添加新节点命令,例如:
postgres=#select * from citus_add_node('pgworker3.local',5432);
postgres=#select * from pg_dist_node;
6、重新平衡数据到新节点,直到rebalance成功完成(finished):
postgres=# select citus_rebalance_start();
postgres=# select citus_rebalance_status();
postgres=# select * from citus_shards; (能看到有shards已经分配到新的节点了)
二、添加Citus新节点作为secondary worker node节点
这里pgworker2.local:5434为primary节点,pgworker3.local:5434为需要添加的secondary节点
1、配置primary节点与secondary节点之间的PG复制:
使用pg_basebackup完成整库恢复了,在pgworker3.local (192.168.50.123)上执行:
$pg_basebackup --pgdata='/home/postgres/citus2'--dbname='host=pgworker2.local port=5434 user=postgres password=password' --label='citus from pgworker2' --format=plain --wal-method=stream --write-recovery-conf
恢复完成后检查postgresql.auto.conf中的系统变量是否正确,或者是否有多条,最后只保留一条正确的:
[postgres@cs81-123 ~]$ cat citus2/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
ssl = 'on'
ssl_ciphers = 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384'
primary_conninfo = 'user=postgres password=password channel_binding=prefer host=pgworker2.local port=5434 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
2、启动pgworker3.local上的新恢复的数据库实例:
$pg_ctl -Dcitus2 start
3、添加pgworker3.local:5434到Citus集群作为pgworker2.local:5434的secondary节点(主要为可以实现读写分离,增删改在pgworker2.local:5434上操作,select操作在pgworker3.local:5434上):
在CN节点pgcoord1.local(192.168.50.121)上执行:
postgres=#
postgres=# select citus_add_node('pgworker3.local', 5434, 3, 'secondary');
citus_add_node
----------------
13
(1 row)
或者
postgres=#
select citus_add_secondary_node(
'pgworker3.local', 5434
,
'pgworker2.local', 5434
);
citus_add_secondary_node
---------------------------
13
(1 row)
postgres=#
postgres=# select * from pg_dist_node order by nodeid;
nodeid | groupid | nodename | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards
--------+---------+-----------------+----------+----------+-------------+----------+-----------+-------------+----------------+------------------
1 | 0 | pgcoord1.local | 5432 | default | t | t | primary | default | t | f
4 | 3 | pgworker2.local | 5434 | default | t | t | primary | default | t | t
5 | 4 | pgworker3.local | 5432 | default | t | t | primary | default | t | t
13 | 3 | pgworker3.local | 5434 | default | f | t | secondary | default | f | t
(6 rows)
(可选)4、如果想实现primary和secondary节点的读写分离,需要修改系统变量citus.use_secondary_nodes为always(
注意所有参与Citus集群的PG数据库实例都需要修改):
postgres=#
postgres=# show citus.use_secondary_nodes ;
citus.use_secondary_nodes
---------------------------
never
(1 row)
postgres=#
postgres=#
alter system set citus.use_secondary_nodes =always;
ALTER SYSTEM
postgres=#
[postgres@cs81-121 ~]$ cat citus/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
ssl = 'on'
ssl_ciphers = 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384'
citus.use_secondary_nodes = 'always'
9、重启所有
参与Citus集群的PG数据库实例;
三、添加Citus新节点作为secondary coordinator node节点
这里pgcoord1.local:5432为primary节点,pgcoord2.local:5432为需要添加的secondary节点
1、配置pgcoord2.local:5432到pgcoord1.local:5432的PG复制:
具体步骤参考前面;
2、启动pgcoord2.local上新恢复的PG数据库实例:
$pg_ctl -Dcitus start
3、添加pgcoord2.local:5432到Citus集群作为pgcoord1.local:5432的secondary节点:
postgres=# select citus_add_node('pgcoord2.local', 5432, 0, 'secondary');
citus_add_node
----------------
16
(1 row)
postgres=#
postgres=# select * from pg_dist_node order by nodeid;
nodeid | groupid | nodename | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards
--------+---------+-----------------+----------+----------+-------------+----------+-----------+-------------+----------------+------------------
1 | 0 | pgcoord1.local | 5432 | default | t | t | primary | default | t | f
4 | 3 | pgworker2.local | 5434 | default | t | t | primary | default | t | t
5 | 4 | pgworker3.local | 5432 | default | t | t | primary | default | t | t
13 | 3 | pgworker3.local | 5434 | default | f | t | secondary | default | f | t
15 | 4 | pgworker2.local | 5432 | default | f | t | secondary | default | f | t
16 | 0 |pgcoord2.local | 5432 | default | t | t | secondary | default | t | f
(6 rows)
postgres=#
后续介绍怎么使用secondary节点接管primary节点...