多个Gbase集群间表同步思路

背景:项目中存在多个不同子系统,每个子系统都拥有一套gbase集群,而有些表是各个子系统间公用的,如果各子系统只在自己的Gbase集群中更新公共配置,就会导致各子系统配置数据不一致,进而影响整个系统的功能功能,所以需要有一个框架来定时同步各子系统的配置数据。

问题:如何判断表变更?进行表同步时,考虑版本不同可能存在表结构差异,如何保证同步时让业务影响最小?

思路:1、gbase提供集群间同步工具是基于镜像集群的底层二进制同步工具,也就是要求两个集群结构(分片数量,节点数量,分布情况)完全相同。我们的子系统是根据各个集群数据量多少自由扩展,而非镜像集群,不满足,那么就只能自己开发同步进程。要做同步就必须能感知表的变更,通过表的变更触发同步。大部分关系型数据库都有触发器,但是gbase不太支持触发器,排除。gbase的审计日志gclusterdb.audit_log_express,属于事后分析,默认十分钟写一次,也只记录执行时间大于等于1秒的,必须执行 set global long_query_time=0,才会所有正常执行的操作都会记录(当然如果sql在执行过程中终止,比如ctrl c 这个好像不记录的)。开启所有记录对gbase有影响,也不推荐使用。最后跟gbase专家沟通,采用创建复制表,然后通过gnode 5050端口去判断表的状态更新时间可以确认是否变更。
 

CREATE TABLE "t6" (
    "id" int(11) DEFAULT NULL
) replicated;

gbase> show table status like 't6'\G;
*************************** 1. row ***************************
                       Name: t4
                     Engine: EXPRESS
                    Version: 10
                 Row_format: Compressed
                       Rows: 1
             Avg_row_length: 235
                Data_length: 235
            Max_data_length: 0
               Index_length: 0
                  Data_free: 0
             Auto_increment: NULL
                Create_time: 2019-04-24 08:56:20
                Update_time: 2019-04-24 08:57:03
                 Check_time: NULL
                  Collation: utf8_general_ci
                   Checksum: NULL
             Create_options: avg_row_length=5
         Limit_storage_size: 0
               storage_size: 918
            table_data_size: 0
                    Comment:
 local_hash_index_file_size: 0
global_hash_index_file_size: 0
1 row in set (Elapsed: 00:00:00.01)

ERROR:
No query specified

2、我们不是专业的数据库厂家,要做到增量同步比较困难,这里采用了全量同步,如果表变更了则导出对应列的csv文件,在目标集群创建一张临时表,然后将csv文件导入临时表中,再将正式表重命名备份表,将临时表重命名正式表。重命名中间有短暂的业务间隙,但是如果正式表在使用或者被锁,重命名肯定会失败,那同步进程就会放弃重命名也不会影响业务,如果正式表重命名成功,那么临时表是新创建的也不会重命名失败,所以中间的过程其实是很短暂的,这样对业务影响应该是很小,相对来说是一种比较安全可靠的操作。
Gbase导出表数据命令:select 表列名称 into outfile '/home/gbase/data/表名.csv' fields terminated by '|'  from 表名。
创建临时表方法:CREATE TABLE 表名_temp LIKE 表名。
重命名方法:rename table 表名 to 表名_tmp;
对于版本间差异就需要考虑按列导入,gbase模板支持按列table_fields导入。
 

原创文章 33 获赞 6 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lanyue1/article/details/89630762