2.10.4 view meta
2.10.4.1 view 种类
- mysql中的view
- dble中的view
2.10.4.2 view meta概述
在Dble 2.18.11.0 版本中新增了对view的支持,作为一个中间件支持view采用的方法是和复杂查询类似的逻辑,将VIEW创建的语句中的select部分进行解析,并将解析所得到的解析树进行存储,当有query调用到视图的时候使用解析树进行局部的替代还原成完整的查询SQL,从而达到view实现的效果。
在MySQL中的View meta信息是一种持久化的存储。Dble中的view实现方式也类似,这样Dble中view的实现会给Dble本身带来状态,这个状态需要Dble自身进行保存和维护,所以在view中采取了和XA事务日志相似的方式,并且以视图创建SQL的形式进行以下两种方式的存储:
- 本地文件存储
- ZK存储
在每次发生重启的时候Dble会在初始化meta的时候,通过读取文件或者是ZK中的信息将创建视图的SQL进行重新的解析,最终以解析树的形式保存到meta中去。
在Dble 2.19.10.0版本中新增了对mysql view创建的支持,mysql view会被dble直接下发到后端mysql中执行。 不过,创建mysql view有着各种限制,首先view 所属的schema必须采取以下配置,即垂直分片的方式:
<schema name="schema2" sqlMaxLimit="100" shardingNode="dn5">
</schema>
view中涉及的表必须是shardingNode dn5 中的表。对于mysql view,dble则没有持久化,但是依然会有相对应的view meta。mysql view 支持通过dble修改,也支持在后端节点手动修改并通过reload方式加载到dble。
2.10.4.2 view meta保存
本地文件存储
本地文件的存储中,对应的信息以JSON的格式存放在本地文件中,文件的存储路径以及文件名称通过bootstrap.cnf中的viewPersistenceConfBaseDir和viewPersistenceConfBaseName两个参数进行配置(默认存储于./viewConf/viewJson中),具体的文件内容举例如下
[{
"schema": "testdb",
"list": [{
"name": "view_test",
"sql": "create view view_test as select * from a_test"
}, {
"name": "vt2",
"sql": "create or replace view vt2 as select * from suntest"
}, {
"name": "suntest",
"sql": "create view suntest as select * from sbtest"
}]
}]
ZK K/V存储
在集群状态下Dble的各个内部状态需要同步,包括view的创建删除和修改,具体的key值会存储在ZK BASE_PATH/view下,并使用key值schema_name:view_name,在view中使用json的格式进行create sql和修改的serverID的存储,以下给出一个举例:
{
"serverId":"10010",
"createSql":"create view view_test as select * from a_test"
}
此JSON字符串当作value存储在 /..../view/testdb:view_test