You need to enable JavaScript to run this app.
导航
最佳实践:表状态异常的解决方法
最近更新时间:2024.11.27 15:57:31首次发布时间:2024.11.27 15:57:31

ByteHouse 作为一款 MPP 架构的分布式数据库,为了实现数据的均衡存储和查询的均衡分发,每张表的定义必须在每个节点上都存在且一致。
本文将详细介绍在 ByteHouse 中,当表状态出现“缺损”和“冲突”时的解决步骤。

表状态定义

表状态反映了表在集群中的分布状态,具体描述如下:

  1. 正常:表在集群中的分布正常。
  2. 缺损:表在集群中的部分节点缺失,可能导致部分查询因找不到表定义而失败,以及节点间的数据不均衡。
  3. 冲突:表在集群中的部分节点之间定义不一致,或分布式表与本地表定义不一致,可能导致多次查询出的返回不一致。

您可以在 ByteHouse 控制台”数据管理 “页面,查看到库表的状态。
Image

表缺损状态的解决方法

常见错误原因

表缺损状态产生的原因,常见于建表时未带上“on cluster”语法,致使部分节点上未同步。

基本解决步骤

  1. 找到表缺失的节点,可参考下面的语句。
SELECT table_name, create_table_query, host_address
from system.clusters as clusters 
left join (
    SELECT
        name as table_name,
        create_table_query,
        host() AS node
    FROM cluster(<cluster_name>,system,tables)
    where database = '<table>' and (name = '<table_name>' or name = '<table_name_local>')
)  as systable
on clusters.host_address = systable.node;
  1. 在缺表的某个节点上再执行带上“on cluster”语法的建表语句,即可补齐每个节点上的表定义。

使用举例

例如,defalut库中,存在一张test表为缺损状态。

  1. 查询表缺失的节点。参考上面的SQL语句执行后,可以看到控制台返回结果test表在某节点(192.18.0.232)缺失。

Image

表冲突状态的解决方法

  1. 比对各节点的 Schema 是否一致:
SELECT
    other_nodes.name as table_name,
    if(other_node_sql=first_node_sql,'same','diff') AS status,
    other_nodes.create_table_query AS other_node_sql,
    first_node.create_table_query AS first_node_sql,
    other_nodes.node
FROM 
( 
    SELECT
        name,
        create_table_query,
        host() AS node
    FROM cluster('bytehouse_cluster_test', 'system', 'tables')
    WHERE database = '<db_name>' AND (name = '<table_name_local>' or name = '<table_name>')
) AS other_nodes
LEFT JOIN 
(
    SELECT
        name,
        create_table_query
    FROM system.tables
    WHERE database = '<db_name>'  (name = '<table_name_local>' or name = '<table_name>')
) AS first_node
ON other_nodes.name = first_node.name
ORDER BY name;

如果有不一致,则:

  • 找到不一致的点(列名,列类型,等)
  • 通过重建对应节点的对应表(表没有数据,或属于分布式表的情况),或通过 Alter 对应表来解决该问题。
  1. 比对本地表和分布式表,列是否一致:
SELECT
    name AS column_name,
    type AS column_type,
    host() AS node_name
FROM cluster('bytehouse_cluster_test','system','columns')
WHERE database = '<db_name>' AND  (table = '<table_name>' or table = '<table_name_local>')
ORDER BY column_name, node_name;

如果有不一致,则:

  • 找到不一致的点(列名,列类型,等)
  • 通过重建对应节点的分布式表,或 Alter 对应的分布式表解决该问题。

总结

通过以上步骤,我们可以解决 ByteHouse 中表状态异常的问题,确保表在集群中的分布正常,从而提高数据库的性能和稳定性。