GBase 8a
运维管理
文章
Gbase 8a 数据节点分布不均匀解决
发表于2024-05-09 16:58:43134次浏览2个评论
一、场景
某Gbase 8a 集群数据节点(3gc+3gn,并且节点复用,)出现倾斜现象,其中两个节点数据量6.5T,其中一个节点数据量1.4T。
二、排查过程和原因分析
- 根据现象初步怀疑为表在各个节点分布不均匀和表的delete产生空洞导致数据倾斜。
- 执行空洞率查询脚本和数据分布查询脚本收集集群中大表在各个节点的分布情况和空洞率情况。观察到存储占用排名靠前的大表的数据99%集中在n1分片上,n1的主备分片分别位于2节点和1节点,故导致1和2节点的存储占用远超3节点,导致数据倾斜。
- 根据上述现象,加上集群采取节点复用(gc+gn共用一台服务器),数据库参数 gcluster_random_insert设置为默认值0(该参数在gc节点上存在gn节点时,控制在执行 insert value 时,数据分布到gn节点的规则:0代表进入的每条数据都落在和发起gc节点相同的单机节点上,1代表进入的每条数据,采用 random()% 分片数原则,随机落在任意gn节点上。)故猜测数据库连接串存在问题,使所有的连接都连接在1节点上,导致插入数据都落在1节点上的n1分片上,并同步至1节点的n1分片,从而产生倾斜现象。
- 和开发核对咨询大表入库数据来源和数据库连接串信息,被告知大表的数据皆从ogg中通过每分钟定时插入进gbase数据库中(而其他集群大表皆为load入库,从而数据均匀分布),并且发现连接串中缺少&gclusterId 参数信息从而导致数据库连接只有故障转移功能而缺少负载均衡功能。
- 至此,数据倾斜原因可确定为:应用执行的连接都落在1节点上,并根据insert数据入库规则(节点复用 gcluster_random_insert为0时,数据入在连接管理节点所在机器上的数据节点上,分片优先选在排序后序号较小的分片),数据落在1节点的1分片上,并同步至2节点的1分片上,导致1和2节点的数据量远大于3节点。
三、解决方案
修改连接gbase数据库的连接串,使其故障转移和负载均衡功能正常运行,参考模板如下:
jdbc:gbase://192.168.1.56:5258/test?user=gbase&password=######&failoverEnable=true&hostList=192.168.1.57,192.168.1.58&gclusterId =gcl1"修改数据库参数使insert value 均匀分布到各个节点
gccli -uroot gbase> set global gcluster_random_insert=1 #再修改各个节点配置文件中此参数,防止重启后失效将分布不均匀的大表进行导出再导入,步骤如下
gccli -uroot gbase> use DB_NAME gbase> create TB_NAME_NEW like TB_NAME; gbase> alter table TB_NAME rename TB_NAME_OLD; gbase> select * from TB_NAME_OLD into outfile '${outdir}/${tbname}.txt' fields terminated by '\\\x01\\\x01' enclosed by '\xFF' ESCAPED BY '\xFD' null_value ''; gbase> load data infile 'file://${IP}/${outdir}/${tbname}.txt' into table TB_NAME_NEW data_format 3 HAVING LINES separator fields terminated by '\\\x01\\\x01' enclosed by '\xFF; ####校验tb_name_new和tb_name_old数据一致性,如无差别执行下列语句。 gbase> select * from information_schema.CLUSTER_TABLE_SEGMENTS a where table_schema='DB_NAME' and table_name='TB_NAME'; gbase> alter table TB_NAME_NEW rename TB_NAME; gbase> drop table TB_NAME_OLD;
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526