跳至主要內容

KlustronDB FAQ

KlustronDB大约 14 分钟

KlustronDB FAQ

1、KlustronDB 是否是默认开启分布式事务?是否有开关可以关闭?例如有的分布式数据库支持开关,可根据业务需求进行配置?

KlustronDB的分布式事务处理是自动运行的,没有开关切换。只有当一个事务确实写入了多个shard之后,才会做两阶段提交,否则就是一阶段提交,也就是说无需手动开关。

2、针对常规的统计信息,如TPS(含回滚率等)、QPS、RT等指标,在KlustronDB中如何查看?可以在系统视图中,还是在XPanel可查?

  • 1.3 版本中可以在XPanel中查看。

3、KlustronDB 中锁的机制如何?文档中只看到 MySQL 中锁的处理机制。同理,死锁检测机制如何,相关参数有哪些?

  • In KlustronDB, table locking works as follows:
    • For a DML statement, in the computing node executing the query, a table level intention lock is acquired on each table and/or partition accessed;
      • When query tasks executed in the storage node(s) storing the corresponding table, for DML statements like INSERT/DELETE/UPDATE, a table-level intentional write lock is acquired at the server layer, and row locks are acquired in InnoDB when rows are inserted/updated/deleted the same as community MySQL does; For SELECT, a table-level intentional read lock is acquired, and a global and local snapshot is acquired, and no transaction lock is obtained.
    • For DDL, an exclusive table-level lock is acquired both at the server layer and the engine layer.
  • kunlunbase_global_deadlock_detection | KlustronDB

4、KlustronDB 常规的隔离级 RR、RC 都支持?

  • 4、KlustronDB支持多种事务隔离级别:读已提交,可重复读,串行化。

5、关于序列,我看在是在KlustronDB的storage shard中记录在一个表中。这里是否会存在性能瓶颈?此外,如果创建时指定Cache选型,在不同计算节点使用时,是Cache到本地,因此会存在跳号等问题吗?

  • 创建序列时可以指定cache 为多个值,比如20,以避免性能瓶颈;也可以修改已有序列的cache值。假如cache设置为1,则获取每一个值都需要修改storage shard中的序列记录,那么性能才会损耗较大。
  • 如果多个计算节点CN1,CN2同时在使用同一个序列,每个序列的cache 为20,那么CN1使用的序列值100-119时,CN2在使用的序列值是120-139。这是为了合理的性能做出的取舍。

6、针对table group,我理解是人为设定表的存储位置;这与常规分布式数据库的ER表还有所不同。KlustronDB是否支持ER表?

  • Table group用于确保多个表始终在同一个shard上面,仿佛是一个框子把这些表绑在一起。这样写入这些表的事务可以在同一个shard中执行和提交,查询这些表的只读查询也可以被下推到storage shard中执行,实现更好的性能。
  • ER表确实可以被分组为同一个table group中,这样就可以确保这些表在同一个shard,即使扩容时也会同时把一个table group中全部的表搬迁到另一个shard。

7、PG支持的多种索引(如非BTree索引),是否在KlustronDB中可创建?

  • PostgreSQL 的常用索引功能在KlustronDB中都有对应等价的索引。KlustronDB存储节点kunlun-storage基于MySQL开发,以避免PostgreSQL 存储引擎的性能问题,同时也就不再使用PostgreSQL的存储引擎来存储用户数据,也因此不直接使用PostgreSQL的索引功能来索引用户数据。不过,MySQL不仅支持b+tree索引,也支持空间索引,全文索引,因此并不存在无法索引的系统数据类型或者无法实现的索引能力。

8、全局二级索引,是否有计划未来支持?

  • 全局二级索引会严重降低数据增删改的性能,如果仅用于查询则很鸡肋。KlustronDB的计算节点知道每个表的分片所在的shard,因此即使查询条件没有指定shard key,也只需要到存储着这个表的分片的那几个shard去读写数据,并不会读写全部shard。

尽管如此,未来我们会根据用户需求来决定何时实现该功能。

9、视图是否支持跨分片的语句?如果支持,查询视图时会拆解视图后下推吗?

  • 视图支持跨分片语句。在查询处理的转换阶段,各级视图的查询语句会合并到使用视图的顶层查询语句的语法树中,统一执行。因此在查询执行层面,并不知道那个查询语句是否使用了视图,因此也就不存在‘下推视图’这样的动作。

10、之前谈到的复合分片(分片+分片),分片分区方式是否支持?

  • KlustronDB支持多级分区,每一级分区的方式和参数彼此独立没有影响。唯一一个要求是,每一级分区的shard key 列集合一定包含上面各级分区的shard key列集合。详见此文

11、游标是否支持?自定义函数是否支持?

  • KlustronDB支持游标和自定义函数。不仅支持用PL/SQL定义存储过程和函数,还可以用c/python,java,javascript, lua等多种编程语言定义存储过程和函数。

12、字符集方面,MySQL 常见的UTF8MB4、GB18030 是否支持?

  • KlustronDB 支持客户端使用UTF8MB4, GBK/GB18030/GB2312。
  • KlustronDB 所有组件都使用MySQL的字符集和排序规则,支持把客户端以中文GB系列编码输入的文本自动转换为被访问表的字符集和排序规则,同时把查询结果中的字符编码转换为客户端编码。
  • 当创建表时,可以在表级和列级指定字符集和排序规则给varchar, char, text等类型的列,默认是UTF8MB4, utf8mb4_unicode_ci。
  • See more about charsets and collations.

13、如果源库与目标库的字符集不同,但兼容情况下,通过KlustronDB提供的工具是否可实现迁移和sync能力?

  • 总的来说,可以实现迁移和数据同步,具体说明如下。
  • KlustronDB支持客户端使用常见字符集。只要源库字符编码是KlustronDB支持的客户端字符集(就是PostgreSQL支持的客户端字符集, 包含所有 unicode 字符集和 GBK/GB18080/GB2312 字符集),那么数据以SQL语句送入KlustronDB后就被自动转换为KlustronDB内部字符集(UTF8等,CREATE DATABASE时可以指定)。
  • See more about charsets and collations.

14、备份方面,我看目前支持物理备份到HDFS,是否支持备份到本地(或NFS上)?是否支持时点还原?是否支持对象闪回?

  • KlustronDB 支持备份到本地(或NFS上)。
  • KlustronDB支持恢复到任意时间点,即时点还原(PiTR)。用户可以通过恢复到指定时间点来找回各种数据库对象。

15、常规的 MySQL 和 PG 的导入导出命令是否支持?是否可实现不通过计算节点,针对数据节点的快速导入?

  • KlustronDB 支持PostgreSQL的数据导入导出命令COPY,也支持pg_dump/pg_load工具做数据导入导出; 包括支持从PostgreSQL数据库导出或者导入PostgreSQL数据。
  • KlustronDB 也支持用自带工具kunlun_myloader 导入 mydumper从mysql导出的数据;也可以使用自带工具kunlun_mydumper导出数据以便使用myloader导入MySQL实例。但是不支持MySQL的LOAD DATA导入命令。
  • KlustronDB也支持使用自带的逻辑备份功能发起命令来导出全量集群数据,并且导出的数据可以灌入MySQL/PostgreSQL实例。
  • 必须经过计算节点才能导入数据,这是因为KlustronDB的计算节点知道每个表的分片所在的shard,因此必须通过计算节点来导入数据,才能确保数据导入到正确的shard中。

16、当前KlustronDB是否支持版本升级?滚动升级?降级?

  • KlustronDB 支持不停服的热升级即滚动升级,1.3版本中发布。升级和降级是一样的,都支持。

17、在扩展方面,针对计算节点的水平扩缩容是可以在线进行?是否有对应的LB方案提供?存储节点水平扩缩容方面,数据需手工做重分布?

  • 可以在集群运行期间通过XPanel GUI界面或者调用cluster_mgr API随时增加计算节点,不影响已有连接中任何业务。计算节点加入集群完成初始化之后就可以对外提供服务。
  • LB方案需要用户配置,方法非常简单便捷:在集群安装完毕之后,把它的所有计算节点加入到LB的候选节点集合中;在给已有集群新增计算节点完成初始化之后,把新增的计算节点加入到LB的候选节点集合中。
  • 增加了存储分片(storage shard)后,需要选择一组表来发起搬迁命令,KlustronDB的相关组件就会自动执行表搬迁命令,将数据迁移到新的存储分片中,并且这些表在被搬迁期间,持续可以读写。

18、读写分离方面,是否支持延迟感知(即将延迟大的从库剥离出来,不承担读)?针对跨片情况,是否支持读的一致性?

  • 计算节点自动选择延时最小的备机来读取,不会从延迟大的备节点读取数据;
  • 由于主备延迟不可预测,因此出于性能考虑,如果从备机读取数据,全局MVCC机制自动不启用。全局MVCC只在从主节点读取数据时自动启用,所以如果要跨分片查询时确保全局查询一致性,可以在特定连接中关闭读写分离开关。

19、cluster_mgr、node_mgr,应支持高可用?如node_mgr异常,如何恢复?

  • Cluster_mgr支持高可用,在clustermgr集群主节点退出后其余节点可以自动运行raft协议选出新主,并且其内部持久状态数据有raft机制的高可用机制的保护, 因此新主节点中必然有全部数据;
  • Nodemgr运行在KlustronDB集群所运行的每个服务器 中,负责拉起该服务器上的计算节点和存储节点进程,在服务器启动时以及这些进程因为各种原因退出时。
  • Nodemgr 由crontable或者linux system服务负责自动拉起,在初始化集群(bootstrap)时会做此配置。Nodemgr 不存储本地持久状态数据,所以无需数据恢复。
  • Nodemgr平时不介入数据读写和事务处理的主流程,即使其进程真的退出了,也不会影响到KlustronDB集群的正常运行,并且会迅速被操作系统自动重新拉起。

20、当出现脑裂时,cluster_mgr与计算和存储节点脑裂等,行为如何?是否做过混沌测试?

  • Cluster_mgr和存储集群高可用机制确保了不会发生脑裂。
    • cluster_mgr使用raft协议实现高可用,对于2*N+1个节点的cluster_mgr集群, raft协议要求必须有N+1个节点同意其中某个节点是主节点,因此即使发生网络分区,另外N个节点也无法选举出另一个主节点,完全避免脑裂。raft协议也同时要求任何一笔事务必须有至少N+1个节点同意,才能被提交。因此新主节点比如含有全部最新数据。
    • 存储集群使用fullsync 机制确保高可用,由cluster_mgr负责选主。cluster_mgr选主时要求一个2*N+1个节点的存储集群,必须可以访问其中至少N+1个备机节点,否则无法选主。从这些备机中选择含有最新数据的节点作为主节点,即使发生网络分区,另外的至多N个节点一定无法选举出另一个主节点,因为数量就不够N+1个;并且选举出来的主节点一定含有最新数据,因为在集群运行期间,一个2*N+1个节点的shard,必须有至少N个备机确认收到一个事务的数据,该事务才算提交完成。也就是任何一个完成提交的事务,必然存在于至少N+1个节点中。
  • 一个KlustronDB集群的多个计算节点之间没有直接复制关系,这些计算节点把DDL日志写入到元数据集群的ddl log,并且总是从中按照完全相同的顺序复制执行其他计算节点执行过的ddl log,来达到一个KlustronDB集群的所有计算节点具有相同的元数据。
  • 做过节点故障的混沌测试,有大量自动测试,每天在Jenkins自动运行。

21、计算节点是否支持连接池处理?

  • KlustronDB支持外部连接池处理,用户可以使用PostgreSQL社区的连接池工具,比如pgpool-II,来在计算节点上配置外部连接池,来管理数据库连接。

22、新增存储节点时,复制表(Mirror Table)如何处理?自动复制数据?

  • 总的来说,新增shard和存储节点,与新增复制表,通过同步互斥实现了有机协调;
  • 新增的复制表,会自动复制数据到所有的存储分片(shard)中;新增的shard中会自动存储有全部的mirror表。
  • 更多信息见此文档

23、Xpanel 是否有慢查询能力

  • 慢查询日志记录在计算节点的日志文件中
  • KlustronDB-1.3 版本会图形化显示慢查询及其相关信息,目前收集到了ES中,通过kinaba可以查找到。

24、KlustronDB存储节点是否支持国密算法?

  • KlustronDB-1.3 版本实现国密算法加密插件

25、安全方面,如SQL审计、防火墙功能、白名单, KlustronDB 是否支持?

  • 支持,KlustronDB包含基于PostgreSQL 社区的pg_audit实现的SQL审计功能扩展pg_audit,以及sqlfirewall等扩展插件。

26、KlustronDB是否完全遵循SQL92\SQL99标准?

27、KlustronDB是否支持CTE语法?

  • KlustronDB支持CTE, window function,以及cube,rollup, grouping set 等所有OLAP语法。

28、KlustronDB兼容PostgreSQL,那是否在PostgreSQL上注册的所有函数,可以不用调整直接注册在KlustronDB上?

  • PostgreSQL的所有系统函数,在KlustronDB中全都存在,可以直接在SQL语句中直接调用,无需任何调整;同时,MySQL的所有系统函数(spatial函数、JSON函数除外)也在KlustronDB中几乎全都存在,可以直接在SQL语句中调用,无需任何调整。
  • KlustronDB还支持定义和使用PostgreSQL的存储过程和存储函数,语法与PostgreSQL完全相同。可以用plpgsql, java, javascript, lua, python等语言实现这些存储过程和存储函数。
  • PostgreSQL社区绝大多数extension无需任何代码修改就可以挂到KlustronDB正常工作。不过要使用KlustronDB 自带的头文件,以及这些插件的代码,来build和install这些插件。不能直接使用基于PostgreSQL的头文件build的插件库文件。
  • 只有postgis, pgvector等少量重量级的extension,有自己的data_types或者数据存储方法。它们是需要进一步的研发工作来融入KlustronDB。我们扩展了postgis,使它可以挂到KlustronDB的计算节点上,并且与KlustronDB的存储节点交互来读写空间数据。对于pgvector,我们在KlustronDB的存储节点中实现向量数据管理,以便pgvector可以挂到KlustronDB的计算节点实现向量数据管理和查询功能

29、KlustronDB支持API连接还是JDBC连接操作,JDBC是否有特殊性?

  • 通用的jdbc库就可以连,我们没有修改jdbc实现。而且各种编程语言的客户端连接库(connector)都可以连接,且无需任何代码修改或者重新编译,就可以直接连接到KlustronDB正常工作。 详见KlustronDB对当前主流编程语言的 MySQL connector 汇总open in new window
  • KlustronDB支持MySQL和PostgreSQL两种连接协议和SQL语法,原本使用MySQL和PostgreSQL的应用软件系统,无需修改或者重新编译,就可以直接连接到KlustronDB正常工作

END