You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yugabyte Row-Level Geo-Partitioning如何实现表数据水平拆分

问题根源

你当前的配置有两个核心错误导致行级地理分区未生效,数据没有按预期水平拆分:

  • 所有Yugabyte集群节点的placement标签完全一致,均为aws/us-east-1/us-east-1a,没有对应ap_south_1_tablespace定义的cloud1/datacenter1/rack1标签的节点,Yugabyte找不到匹配标签的节点存储印度分区数据,只能全部存在现有同标签节点上。
  • 分区表和表空间的标签匹配关系错误,你为US分区绑定的表空间对应aws/us-east-1区域,印度分区绑定的表空间对应不存在的节点标签,自然无法实现跨节点水平拆分。

具体操作步骤

第一步:重新部署集群,为不同节点配置不同的placement标签

假设你两个节点分别要存储US区域数据和印度区域数据,修改启动命令如下:

# 节点1(192.168.106.34):配置为US区域节点
/usr/local/yugabyte-2.9.0.0/bin/yugabyted start \
  --base_dir=/home/yugabyte/yugabyte-data \
  --listen=192.168.106.34 \
  --master_flags "placement_cloud=aws,placement_region=us-east-1,placement_zone=us-east-1a" \
  --tserver_flags "placement_cloud=aws,placement_region=us-east-1,placement_zone=us-east-1a" &

# 节点2(192.168.106.23):配置为印度区域节点
/usr/local/yugabyte-2.9.0.0/bin/yugabyted start \
  --base_dir=/home/yugabyte/yugabyte-data \
  --listen=192.168.106.23 \
  --join=192.168.106.34 \
  --master_flags "placement_cloud=aws,placement_region=ap-south-1,placement_zone=ap-south-1a" \
  --tserver_flags "placement_cloud=aws,placement_region=ap-south-1,placement_zone=ap-south-1a"

注意:两个节点都要配置master的placement标签,确保集群全局放置策略能识别所有区域节点。

第二步:重新创建匹配节点标签的表空间

删除原有错误的表空间后重新创建:

-- US区域表空间:匹配节点1的标签
CREATE TABLESPACE us_central_1_tablespace WITH (
  replica_placement='{"num_replicas": 1, "placement_blocks":
  [{"cloud":"aws","region":"us-east-1","zone":"us-east-1a","min_num_replicas":1}]}'
);

-- 印度区域表空间:匹配节点2的标签
CREATE TABLESPACE ap_south_1_tablespace WITH (
  replica_placement='{"num_replicas": 1, "placement_blocks":
  [{"cloud":"aws","region":"ap-south-1","zone":"ap-south-1a","min_num_replicas":1}]}'
);

第三步:按原逻辑创建分区表、插入测试数据

-- 创建父表
CREATE TABLE transactions (
    user_id   INTEGER NOT NULL,
    account_id INTEGER NOT NULL,
    geo_partition VARCHAR,
    account_type VARCHAR NOT NULL,
    amount NUMERIC NOT NULL,
    txn_type VARCHAR NOT NULL, 
    created_at TIMESTAMP DEFAULT NOW()
) PARTITION BY LIST (geo_partition);

-- 创建US分区绑定对应表空间
CREATE TABLE transactions_us 
    PARTITION OF transactions 
      (user_id, account_id, geo_partition, account_type, 
      amount, txn_type, created_at,
      PRIMARY KEY (user_id HASH, account_id, geo_partition))
    FOR VALUES IN ('US') TABLESPACE us_central_1_tablespace;

-- 创建印度分区绑定对应表空间
CREATE TABLE transactions_india 
    PARTITION OF transactions 
      (user_id, account_id, geo_partition, account_type, 
      amount, txn_type, created_at,
      PRIMARY KEY (user_id HASH, account_id, geo_partition))
    FOR VALUES IN ('India') TABLESPACE ap_south_1_tablespace;

-- 插入测试数据
INSERT INTO transactions VALUES (200, 20001, 'India', 'savings', 1000, 'credit');
INSERT INTO transactions VALUES (300, 30001, 'US', 'checking', 105.25, 'debit');

第四步:验证数据分片结果

执行以下命令验证数据只存在对应区域的节点上:

-- 验证分区数据归属
select * from transactions_us; -- 仅返回US数据
select * from transactions_india; -- 仅返回印度数据

-- 查看tablet分布确认存储节点
SELECT c.table_name, t.node_id, n.host FROM yb_servers() n
JOIN yb_tablets t ON n.uuid = t.node_id
JOIN pg_catalog.pg_class c ON t.table_id = c.relfilenode
WHERE c.relname IN ('transactions_us', 'transactions_india');

查询结果会显示transactions_us的tablet仅存在于192.168.106.34节点,transactions_india的tablet仅存在于192.168.106.23节点,实现水平拆分。

内容的提问来源于stack exchange,提问作者Eric Pan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:57:03