元数据同步
- 元数据同步指在两个或多个 PostgreSQL 实例之间,完成元数据(如:建外部表等 DDL 操作)的同步。元数据同步工具主要用于定时解析主 SSQL 日志中新增的 DDL 操作语句并下发到各备 SSQL 执行,同时能过滤日志中执行失败的 DDL 操作语句。以两个 PostgreSQL 实例为例(一主一备),在主 PostgreSQL 实例中创建数据库和外部表,并通过元数据同步工具,实现将新创建的数据库和外部表同步到备 PostgreSQL 实例中,完成元数据同步。
创建 PostgreSQL 实例 myinst 和 myinst1
1)切换到 SequoiaSQL-PostgreSQL 安装目录;
1 | cd /opt/sequoiasql/postgresql |
2)添加实例;
添加实例 myinst(作为主 PostgreSQL 实例);
1 | bin/sdb_sql_ctl addinst myinst -D database/5432/ -p 5432 |
添加实例 myinst1(作为备 PostgreSQL 实例);
1 | bin/sdb_sql_ctl addinst myinst1 -D database/5433/ -p 5433 |
Note:
指定实例名为 myinst,该实例名映射相应的数据目录和日志路径,用户可以根据自己需要指定不同的实例名,实例默认端口号为 5432。
3)查看实例,可以看到实例名为 myinst 的数据和日志目录信息;
1 | bin/sdb_sql_ctl listinst |
4)启动实例;
启动实例 myinst;
1 | bin/sdb_sql_ctl start myinst |
启动实例 myinst1;
1 | bin/sdb_sql_ctl start myinst1 |
5)查看实例状态;
1 | bin/sdb_sql_ctl status |
配置 PostgreSQL 实例免密登录
若 PostgreSQL 实例开启了用户鉴权,需要创建元数据同步用户以及配置免密登录。
1)进入 sdbadmin 的 home 目录;
1 | cd /home/sdbadmin |
2)同步工具已提前放置在 sdbadmin 的 home 目录,解压同步工具;
1 | tar xvf SsqlDisseminateDDL.tar |
3)进入解压目录;
1 | cd SsqlDisseminateDDL |
4)拷贝免密文件到 home 目录;
1 | cp .pgpass /home/sdbadmin/ |
5)将文件权限设置为0600;
1 | chmod 0600 /home/sdbadmin/.pgpass |
PostgreSQL 实例日志设置
1)进入 myinst 实例的数据目录,修改部分配置;
1 | cd /opt/sequoiasql/postgresql/database/5432 |
2)为了配合元数据同步,需要对应修改 postgresql.conf 配置文件的参数;
1 | echo "log_destination = 'csvlog'" >> postgresql.conf |
Note:
- log_destination:设置输出的日志类型;
- logging_collector:是否开启日志功能,默认为关闭(off),开启为 on;
- log_directory:日志输出目录;
- log_filename:日志文件名称命名规则;
- log_rotation_age:单个日志文件的保存周期,默认保存 1 天(1d);
- log_rotation_size:单个日志文件的大小, 若超过指定大小,那么将新生成一个日志文件;
- log_statement:控制记录哪些 SQL 语句;
工具配置
将元数据同步程序及 config 配置文件拷贝到本地,并查看 config 文件内容。
1)拷贝元数据同步工具到数据目录;
1 | cp /home/sdbadmin/SsqlDisseminateDDL/SsqlDisseminateDDL ./ |
2)拷贝元数据同步工具配置到数据目录;
1 | cp /home/sdbadmin/SsqlDisseminateDDL/config ./ |
3)查看 config 配置内容;
1 | more config |
操作截图:
注:配置文件中参数包括:目标 PostgreSQL 实例 myinst1 运行的服务器名,端口号;源 PostgreSQL 实例 myinst 的安装目录,数据目录,解析日志目录;PostgreSQL 同步用户;以及元数据同步程序的执行时间间隔、执行日志目录,执行日志文件前缀。
重启 myinst 实例
创建配置文件指定的解析日志目录和执行日志目录,重启源 PostgreSQL 实例 myinst,使配置生效;
1)创建日志目录;
1 | mkdir /opt/sequoiasql/postgresql/database/5432/pg_log |
2)重启 myinst 实例;
1 | /opt/sequoiasql/postgresql/bin/sdb_sql_ctl restart myinst |
启动元数据同步工具
元数据同步工具在启动后会一直常驻后台运行,主要用于定时解析主 PostgreSQL 实例日志中新增的 DDL 操作语句并下发到各备 PostgreSQL 实例中执行。
1 | nohup python /opt/sequoiasql/postgresql/database/5432/SsqlDisseminateDDL & |
在 SequoiaDB 中建立集合空间和集合
进入 SequoiaDB Shell,在 SequoiaDB 巨杉数据库引擎中创建 company 集合空间和 employee 集合。
1)使用 Linux 命令进入 SequoiaDB Shell 命令行;
1 | sdb |
2)使用 JavaScript 语法,连接协调节点,获取数据库连接;
1 | var db = new Sdb("localhost", 11810); |
3)创建 company_domain 数据域;
1 | db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } ); |
4)创建 company 集合空间;
1 | db.createCS("company", { Domain: "company_domain" } ); |
5)创建 employee 集合;
1 | db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } ); |
6)写入数据;
1 | db.company.employee.insert( { "empno": 1, "ename": "Jack", "age": 35 } ); |
7)关闭 db 数据库连接;
1 | db.close(); |
8)退出 SequoiaDB Shell;
1 | quit; |
验证元数据同步
在主 PostgreSQL 实例中创建 company 数据库并配置连接信息创建 employee 外部表,然后登录备 PostgreSQL 实例查看是否已经创建了数据库和外部表。
在 myinst 实例中创建数据库
1)在 PostgreSQL 的 myinst 实例创建数据库 company;
1 | /opt/sequoiasql/postgresql/bin/sdb_sql_ctl createdb company myinst |
2)查看数据库;
1 | /opt/sequoiasql/postgresql/bin/psql -l |
操作截图:
加载 SequoiaDB 连接驱动
1)登录 PostgreSQL Shell 连接 myinst 实例的 company 数据库;
1 | /opt/sequoiasql/postgresql/bin/psql -p 5432 company |
2)加载 SequoiaDB 连接驱动;
1 | CREATE EXTENSION sdb_fdw; |
3)在 PostgreSQL 实例中配置 SequoiaDB 连接参数;
1 | CREATE SERVER sdb_server FOREIGN DATA WRAPPER sdb_fdw |
实例与数据引擎中集合关联
将 PostgreSQL 实例中的外部表与 SequoiaDB 中的集合空间、集合关联。
1)创建 employee 表;
1 | CREATE FOREIGN TABLE employee |
2)查询 myinst 实例 employee 表中的数据;
1 | SELECT * FROM employee; |
3)退出 myinst 实例;
1 | \q |
查询 myinst1 实例是否已经建表成功
1)登录 PostgreSQL Shell 连接 myinst1 实例的 company 数据库;
1 | /opt/sequoiasql/postgresql/bin/psql -p 5433 company |
2)查询 myinst1 实例 employee 表中的数据;
1 | SELECT * FROM employee; |
3)退出 myinst1 实例;
1 | \q |