Categories
程式開發

GBase 8a MPP集群擴容實戰


本文由 dbaplus 社群授權轉載。

一、背景

由於業務模型的發展及數據周期保留的需要,最近某省運營商計劃將對現有GBase 8a集群進行擴容,從現有的3coor+21data節點擴到3coor+61data節點。

當前GBase 8a集群版本是GBase8a_MPP_Cluster-NoLicense-8.6.2_build33-R12-redhat7.3-x86_64。新增的40個節點只作為數據節點。本人有幸參與其中,負責具體的擴容及後續數據重分佈操作。

二、環境信息

1、硬件配置信息

CPU:

  • CPU數:4*8C (4個物理cpu,每個物理cpu有8個邏輯cpu)

內存:

  • MemTotal: 512GB

2、軟件版本

GBase 8a集群版本 GBase8a_MPP_Cluster-NoLicense-8.6.2_build33-R12-redhat7.3-x86_64

3、擴容機器規劃

為保證應用接入接口ip地址群不變,擴容後,仍保留3個coordinator(管理節點)節點不變,擴容40節點均為data(數據)節點。規劃主機名為gbase25-gbase64。

三、實施前準備

1、擴容實施的網絡環境需求

現場的網絡環境是原集群的24台服務器和新擴容40台服務器均為內網萬兆,外網千兆,雙網卡綁定,網絡測試結果符合擴容要求。

2、擴容實施的存儲空間需求

為保證擴容實施的絕對安全,需要每台服務器具有足夠的空間用來存放重分佈的臨時數據。集群已有節點每節點opt目錄有空閒空間13TB,根目錄空閒空間439GB;新增節點opt有空閒空間22TB,根目錄空閒空間149GB,符合擴容要求。

檢查發現有兩台服務器(IP地址為190、193)磁盤寫速度明顯異常,主機人員確定是RAID卡電池故障,修復後磁盤讀寫速度正常。

GBase 8a MPP集群擴容實戰 1

3、擴容實施的服務器需求

統一MPP集群節點的操作系統版本。擴容前已將新擴容節點操作系統統一重新集成,與集群已有節點操作系統版本一致,為rhel7.3,符合擴容要求。

四、擴容實施

1、添加新增節點root及gbase用戶互信

-- root用户
scp -r ~/.ssh 192.168.200.12:~/
-- gbase用户
scp -r ~/.ssh 192.168.200.12:~/

2、配置C3工具(該工具用於GBASE各節點同時執行執行命令)

-- root用户
vi /etc/c3.conf 添加
cluster new {
     192.168.200.11:redhat1
     192.168.200.12
}

3、使用C3工具配置擴容節點環境

-- 操作系统
cexec new_data: new: 'cat /etc/redhat-release'
-- 内核
cexec new_data: new: 'uname -a'
-- 防火墙
cexec new_data: new: 'service iptables status'
cexec new_data: new: 'service ip6tables status'
cexec new_data: new: 'chkconfig | grep iptables'
cexec new_data: new: 'chkconfig | grep ip6tables'
-- selinux
cexec new_data: new: 'sestatus'
cexec new_data: new: 'grep ^SELINUX= /etc/selinux/config'
-- 内存参数
cexec new_data: new: 'ulimit -H'
cexec new_data: new: 'ulimit -S'
cexec new_data: new: 'ulimit -m'
-- vi /etc/security/limits.config 添加
-- * soft as unlimited
-- * hard as unlimited
-- * rss as unlimited
-- 透明大页
cexec new_data: new: 'cat /sys/kernel/mm/redhat_transparent_hugepage/enabled'
-- echo "never" > /sys/kernel/mm/redhat_transparent_hugepage/enabled
-- 主机名检查
cexec new_data: new: 'hostname'

4、設置集群readonly後備份集群信息

-- 修改/etc/hosts
vi /etc/hosts 添加新增节点信息并同步到新增节点
-- 确认集群正常
gcadmin
gcadmin showddlevent
gcadmin showdmlevent
gcadmin showdmlstorageevent
-- 设置集群readonly
gcadmin switchmode readonly
-- scn tableid 备份
cexec 'python -c "import gcware;print gcware.getscn()"'
cexec 'python -c "import gcware;print gcware. gettableid ()"'
-- 版本信息查看
cexec "/opt/gcluster/server/bin/gclusterd -V"
cexec "gcadmin -V"
cexec data: "/opt/gnode/server/bin/gbased -V"
cexec 'gccli -ugbase -pgbase20110531 -Nse "select @@version"'
-- 数据库信息备份
sh backup_database.sh
ls -l /home/gbase/gbase_expand/201811
-- nodedatamap备份
gccli -ugbase -pgbase20110531 -vvv -e"rmt:select * from gbase.nodedatamap  into outfile '/home/gbase/gbase_expand/201811/nodedatamap.dat' fields terminated by '|'"
wc -l /home/gbase/gbase_expand/201811/nodedatamap.dat
-- 备份集群配置文件
cexec "mkdir -p /home/gbase/gbase_expand/201811/gcluster"
cexec "cp -r /opt/gcluster/config/ /home/gbase/gbase_expand/201811/gcluster/"
cexec "ls /home/gbase/gbase_expand/201811/gcluster/config"
cexec data: "mkdir -p /home/gbase/gbase_expand/201811/gnode"
cexec data: "cp -r /opt/gnode/config/ /home/gbase/gbase_expand/201811/gnode/"
cexec coor: "ls /home/gbase/gbase_expand/201811/gnode/config"
-- 备份corosync配置文件
cexec "cp -r /etc/corosync /home/gbase/gbase_expand/201811/"
cexec "ls /home/gbase/gbase_expand/201811/corosync | wc -l"
-- 备份gcware配置文件
cexec "cp -r /var/lib/gcware /home/gbase/gbase_expand/201811/"
cexec 'ls /home/gbase/gbase_expand/201811/gcware | wc -l'

5、執行擴容

-- 停止集群
cexec "service gcware stop"

--找到原来的升级包所在的目录
-- 修改demo.options
cd gcinstall/
vi demo.options
installPrefix= /opt
coordinateHost = 
dataHost = 134.32.48.8,134.32.48.11,134.32.48.13,134.32.48.14,134.32.48.46,134.32.48.47,134.32.48.48,134.32.48.50
existCoordinateHost =
134.32.48.208,134.32.48.209,134.32.48.210,134.32.48.211,134.32.48.212,134.32.48.213,134.32.48.214,134.32.48.215,134.32.48.216,134.32.48.217,134.32.48.218,134.32.48.219,134.32.48.220,134.32.48.221,134.32.48.222,134.32.48.223,134.32.48.224,134.32.48.225,134.32.48.226,134.32.48.227
existDataHost =134.32.48.208,134.32.48.209,134.32.48.210,134.32.48.211,134.32.48.212,134.32.48.213,134.32.48.214,134.32.48.215,134.32.48.216,134.32.48.217,134.32.48.218,134.32.48.219,134.32.48.220,134.32.48.221,134.32.48.222,134.32.48.223,134.32.48.224,134.32.48.225,134.32.48.226,134.32.48.227
loginUser= root
loginUserPwd = ' Huawei#123'
#loginUserPwdFile = loginUserPwd.json
dbaUser = gbase
dbaGroup = gbase
dbaPwd = gbase
rootPwd = ' Huawei#123'
#rootPwdFile = rootPwd.json
dbRootPwd = '[email protected]'
#mcastAddr = 226.94.1.39
mcastPort = 5493
-- 执行扩容
./gcinstall.py --silent=demo.options
-- 配置文件对比
diff /opt/gcluster/config/gbase_8a_gcluster.cnf /home/gbase/gbase_expand/201811/gcluster/config/gbase_8a_gcluster.cnf 
diff /opt/gnode/config/gbase_8a_gbase.cnf /home/gbase/gbase_expand/201811/gnode/config/gbase_8a_gbase.cnf
cexec data: md5sum /opt/gnode/config/gbase_8a_gbase.cnf
-- 生成新的distribution(备份方式)
gcadmin distribution gcChangeInfo.xml p 1 d 1
-- 生成新的hashmap
gccli -ugbase -pgbase20110531 -vvv -e"initnodedatamap"

6、擴容完成集群可用性基本驗證

增删改查测试
create database db_test;
create table db_test.t1(c1 int,c2 int) distributed by ('c1');
insert into db_test.t1 values (1,1),(2,2),(3,3);
update db_test.t1 set c2=10 where c1=1;
select * from db_test.t1;
delete from db_test.t1 where c1>=3;
select * from db_test.t1;
truncate table db_test.t1;
数据加载测试
load data infile 'sftp://gbase:[email protected]/tmp/t1.txt' into table db_test.t1 fields terminated by ':';
select count(1) from db_test.t1;
drop table db_test.t1;
drop database db_test;

五、數據重分佈

所有的MPP集群由於數據分佈在很多數據節點,所以在擴容操作完成後,為了避免數據傾斜,需要將所有的業務表數據重分佈到所有數據節點(包括擴容節點)。

-- 重分布
-- 设置重分布并发度为0
gccli -ugbase -pgbase20110531 -vvv -e"set global gcluster_rebalancing_concurrent_count=0"
gccli -ugbase -pgbase20110531 -Ns -e"select @@gcluster_rebalancing_concurrent_count"
-- 重分布整个实例
gccli -ugbase -pgbase20110531 -vvv -e"rebalance instance"
gccli -ugbase -pgbase20110531 -Ns -e"select count(1) from gclusterdb.rebalancing_status"
-- 调整优先级
create table test.reb_tab(db_name varchar(64),table_name varchar(64),priority int) replicated;
-- 插入优先级高的表
insert into test.reb_tab values ('test','t1',1),('test','t2',2);
update gclusterdb.rebalancing_status a, test.reb_tab b set a.priority=b.priority where a.db_name=b.db_name and a.table_name=b.table_name ;
select count(1) from gclusterdb.rebalancing_status where priority<5; 
-- 调整重分布并发度
gccli -ugbase -pgbase20110531 -vvv -e"set global gcluster_rebalancing_concurrent_count=1"
gccli -ugbase -pgbase20110531 -Ns -e"select @@gcluster_rebalancing_concurrent_count"
-- 暂停重分布
gccli -ugbase -pgbase20110531 -vvv -e"pause rebalance instance"
gccli -ugbase -pgbase20110531 -Ns -e"select status,count(1) from gclusterdb.rebalancing_status group by 1"
-- 继续重分布
gccli -ugbase -pgbase20110531 -vvv -e"continue rebalance instance"
gccli -ugbase -pgbase20110531 -Ns -e"select status,count(1) from gclusterdb.rebalancing_status group by 1"
-- 等待重分布完成
-- 恢复业务

六、效率分析

在擴容中各步驟的分別耗時情況:

  • 擴容:24日18:30 ~ 24日20:20,耗時約2小時;
  • 重分佈:一共8802張表,231T的數據量,24日20.25 ~ 26日10.36,耗時約38小時,原計劃91個小時(以工程經驗35MB/s的速度計算)。

注:因為有一張分佈極不平均的表,全部數據落在一個節點,70個字段,75億記錄,13壓縮,單個分片350GB。僅這一張表重分佈就用了12小時。除掉這張一表以外,8801張表實際用時27小時(24日20:25~25日23:25),達到118MB/s,重分佈速度遠遠超出預期。

七、經驗總結

1、MPP集群一般在做數據重分佈操作的時候,必須要考慮到業務調度的執行時間,因為重分佈操作可能會造成業務表鎖表從而影響業務調度的正常執行,本次擴容操作前調研數據同步時間為2點到下午15點,調度執行週期較長,採用在調度執行前將所有調度需要的業務表,提高重分佈優先級,提前完成重分佈,調度執行期間降低重分佈的並發度,從而做到能夠做到24小時重分佈,且不影響生產調度。如果日調度時間較短或者表過多無法篩選那些表為調度執行需要表的情況下,建議錯時重分佈數據。

2、新加節點除了考慮和本集群的網絡打通外,需要考慮到與數據加載機,與hadoop集群(如果配置了hdp加載數據的話)的網絡連通。

3、擴容前最好檢查下表的傾斜情況,傾斜較大的表建議調整分佈鍵,以防止本次擴容類似“因為有一張分佈極不平均的表,全部數據落在一個節點,70個字段,75億記錄,13壓縮,單個分片350GB。僅這一張表重分佈就用了12小時”的情況。

作者介紹

汪浩,新炬網絡核心業務系統DBA,主要涉及Oracle、Greenplum、Gbase等數據庫管理、IT運維管理工作,對數據庫多業務場景性能優化有著豐富的實踐經驗,專注於數據庫性能優化、IT運維自動化工作。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650787161&idx=2&sn=1e5957e9d70401ad26b06d40b26e5fc7&chksm=f3f978ccc48ef1dad1e354e53d35b3edac8b522c34dc3b354cbfa3852ebc435e188c99778a82&scene=27#wechat_redirect