iLeLe 2020-3-21 13:50作者

GBase8a的AB版本判断和一些应用

字数 9062 阅读 366 评论 1 赞 1
GBase8a集群是列存储的MPP集群,具有简单的2VCC版本控制,因为数据的存储运算都在data节点,即gnode上进行。所以我们说AB版本也是从gnode的角度来看。下面介绍下v8.6.x版本下的AB版本判断及应用。
1.gnode元数据
[gbase@hd55 ttt_n1.GED]$ gncli -uroot -pxxxxx -e"desc db1.ttt_n1" 
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1    | varchar(20) | YES  |     | NULL    |       |
| c2    | varchar(20) | YES  |     | NULL    |       |
| c3    | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
[gbase@hd55 ttt_n1.GED]$ ll
total 56
-rw------- 1 gbase gbase  113 Jul 16  2020 C00000.ctl.A
-rw------- 1 gbase gbase  113 Jul 16  2020 C00000.ctl.B
-rw------- 1 gbase gbase  106 Jul 16  2020 C00000.map
-rw------- 1 gbase gbase  113 Jul 16  2020 C00001.ctl.A
-rw------- 1 gbase gbase  113 Jul 16  2020 C00001.ctl.B
-rw------- 1 gbase gbase  106 Jul 16  2020 C00001.map
-rw------- 1 gbase gbase  113 Jul 16  2020 C00002.ctl.A
-rw------- 1 gbase gbase  113 Jul 16  2020 C00002.ctl.B
-rw------- 1 gbase gbase  106 Jul 16  2020 C00002.map
-rw------- 1 gbase gbase 1918 Jun 14 06:29 table.delete.A
-rw------- 1 gbase gbase  239 Jun 14 06:29 table.des.A
-rw------- 1 gbase gbase  239 Jul 16  2020 table.des.B
-rw------- 1 gbase gbase   52 Jun 14 06:29 table.state.A
-rw------- 1 gbase gbase   52 Jul 16  2020 table.state.B
[gbase@hd55 ttt_n1.GED]$ pwd
/opt/gnode/userdata/gbase/db1/metadata/ttt_n1.GED
在gnode的数据存储目录下,可用看到表中每个列文件都有ctl、map两类元数据文件,这里且称为列元数据,并可能存在.A和.B两个版本;同时还存在table.delete、table.des、table.state三个表元数据文件。
2. 如何确定当前的可用版本是A版本还是B版本。
gnode上通过两个方式来进行AB版本的控制。
一、通过lock文件来控制是使用table.state.A还是table.state.B,当lock文件不存在时,使用的是table.state.A版本,反之使用的是table.state.B版本;
二、通过table.state.A/B文件来控制或标记列元数据表元数据的文件版本,可通过metadump工具查看,如下(延续上面例子,没有lock文件,表元数据版本是table.state.A):
[gbase@hd55 ttt_n1.GED]$ metadump table.state.A
This tool is designed for use at GBase internally,and is unsupported externally.
GBase makes no claims and holds no liability regarding the external use of this tool.
This tool is copyrighted and his redistribution is restricted.
table.state.A
+-------------------------------------+-----------------+
| TABLE_STATE_VERSION                 | 65536           |
| sizeof(int)                         | 4               |
| self_version                        | 1               |
| TABLE_STATE_TABLE_INFO              | 196608          |
| sizeof(int) + sizeof(uint64)        | 12              |
| table_scn                           | 3040763         |
| table_last_operation                | DELETE          |
| TABLE_STATE_TABLE_VERSION           | 131072          |
| sizeof(int)*3                       | 12              |
| ctl_version                         | B               |
| des_version                         | A               |
| delete_version                      | A               |
+-------------------------------------+-----------------+
这里的ctl_version、des_version、delete_version就是列元数据版本和delete map版本。
3. AB版本的应用
首先,如上metadump table.state.A展示,可以查看该表上一次的操作是DELETE(table_last_operation)、表scn是3040763;
metadump table.des.A可以查看表的table id(t_num)、是否加密等信息,感兴趣的可以自己建立多个表、多种字段类型进行测试验证。

截止目前,AB版本最为有用的一个场景是,将刚刚删除的数据找回来;
如果该表最后一次操作是delete,之后未再进行其他dml和load、ddl等操作的情况下,通过切换AB版本可以上一次将删除的数据找回,如下:
(1)查询表中数据
[gbase@hd55 ttt_n1.GED]$ gncli -uroot -pxxxxx -e"select count(*) from db1.ttt_n1"
+----------+
| count(*) |
+----------+
|    15166 |
+----------+
(2)执行数据删除
[gbase@hd55 ttt_n1.GED]$ gncli -uroot -pxxxxx -e"delete from db1.ttt_n1 where rowid<1000"       
[gbase@hd55 ttt_n1.GED]$ gncli -uroot -pxxxxx -e"select count(*) from db1.ttt_n1"        
+----------+
| count(*) |
+----------+
|    14167 |
+----------+
(3)查看AB版本,此时有效版本为B版本, metadump table.state.B 确认上个操作是delete,而不是其他。
[gbase@hd55 ttt_n1.GED]$ ll
total 60
-rw------- 1 gbase gbase  113 Jul 16  2020 C00000.ctl.A
....
-rw------- 1 gbase gbase  106 Jul 16  2020 C00002.map
-rw------- 1 gbase gbase    0 Jun 14 06:58 lock
-rw------- 1 gbase gbase 1918 Jun 14 06:29 table.delete.A
....
-rw------- 1 gbase gbase   52 Jun 14 06:58 table.state.B
[gbase@hd55 ttt_n1.GED]$ metadump table.state.B
....
+-------------------------------------+-----------------+
| TABLE_STATE_VERSION                 | 65536           |
| sizeof(int)                         | 4               |
| self_version                        | 1               |
| TABLE_STATE_TABLE_INFO              | 196608          |
| sizeof(int) + sizeof(uint64)        | 12              |
| table_scn                           | 0               |
| table_last_operation                | DELETE          |
| TABLE_STATE_TABLE_VERSION           | 131072          |
| sizeof(int)*3                       | 12              |
| ctl_version                         | B               |
| des_version                         | B               |
| delete_version                      | B               |
+-------------------------------------+-----------------+
(4)删掉lock文件进行AB版本切换
[gbase@hd55 ttt_n1.GED]$ rm -f lock
(5)确认数据找回
[gbase@hd55 ttt_n1.GED]$ gncli -uroot -pxxxxx -e"refresh table db1.ttt_n1"       
[gbase@hd55 ttt_n1.GED]$ gncli -uroot -pxxxxx -e"select count(*) from db1.ttt_n1"
+----------+
| count(*) |
+----------+
|    15166 |
+----------+

上面是从一个gnode上操作n1分片介绍AB版本和delete数据的找回,在实际操作中,数据的delete是从gcluster发起,需要在每个gnode上都进行AB版本的切换。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

添加新评论 1 条评论

iLeLe 2020-3-21 13:54
集群实际使用过程中,避免直接对gnode分片表进行dml操作,会破坏集群的数据一致性。
回复

您需要登录后才可以评论 登录 | 立即注册

作者其他文章