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
相关产品推荐
相关产品推荐

