一系統環境及硬體
1.系統版本 centos 7.7
2.硬體
- cpu :>= 8核16線程
根據實際并發量來考量,比如 8 并發,每個seg裡面有2個資料節點,那麼cpu應該是 8*2*2=20核32線程,如果都是小查詢,核心數 可以适當降低
- 記憶體 :>= 16 GB
- 磁盤 :sas盤15k轉速,固态最好。生産環境上硬碟使用率最好 <30%
- 實體機:
系統盤:獨立一塊盤(最好做raid10),即2塊盤 資料盤:(根據seg中節點數來做raid0),如一個seg中2個節點,可以做2個raid組,每個節點放在不同的raid上,充分利用IO
- 虛拟機:建議系統盤和資料盤分開挂載
系統盤: >64GB 資料盤:按需配置設定
- 網絡:
多網口(卡): 用戶端網絡(可以千兆,萬兆) 内部網網絡(萬兆),網絡性能對GP影響最大 單網口(卡):萬兆即10Gbit
3.叢集規模
master :1 台
segment :3 台
standby :1 台
二.安裝部署
1.下載下傳離線安裝包
https://github.com/greenplum-db/gpdb/releases/tag/6.1.0
2.上傳到伺服器,放在/usr/local/src下
3.關閉防火牆
- 關閉防火牆(所有機器)
iptables (centos6.x)
關閉:service iptables stop
永久關閉:chkconfig iptables off
- 檢查firewalld (centos 7.x)
關閉:systemctl stop firewalld
永久關閉 :systemctl disable firewalld
4.關閉SELINUX(所有機器)
[root@mdw ~]# vi /etc/selinux/config
確定SELINUX=disabled
5.配置/etc/hosts (所有機器)
為之後GP在各個節點之間互相通信做準備。
修改各台主機的主機名稱。 一般建議的命名規則如下: 項目名_gp_節點
Master : dis_gp_mdw
Standby Master : dis_gp_smdw
Segment Host : dis_gp_sdw1 dis_gp_sdw2 dis_gp_sdw3 以此類推
如果Standby也搭建在某Segment host下,則命名為:dis_gp_sdw3_smdw
[root@mdw ~]# vi /etc/hosts
添加每台機器的ip 和hostname,確定所有機器的/etc/hosts中包含以下資訊:
10.16.162.166 dis-gp-mdw
10.16.162.151 dis-gp-sdw1
10.16.162.152 dis-gp-sdw2
10.16.162.153 dis-gp-sdw3-smdw
6.修改主機名
Centos7.x vi /etc/hostname
Centos6.x vi /etc/sysconfig/network
修改完之後 reboot機器
7.配置sysctl.conf(所有機器)
kernel.shmall = 197951838 # echo $(expr $(getconf _PHYS_PAGES) / 2)
kernel.shmmax = 810810728448 # echo $(expr $(getconf _PHYS_PAGES) / 2 \* $(getconf PAGE_SIZE))
kernel.shmmni = 4096
vm.overcommit_memory = 2
vm.overcommit_ratio = 75 #vm.overcommit_ratio = (RAM - 0.026 * gp_vmem_rq) / RAM #gp_vmem_rq = ((SWAP + RAM) – (7.5GB + 0.05 * RAM)) / 1.7
net.ipv4.ip_local_port_range = 10000 65535
kernel.sem = 500 2048000 200 4096
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.swappiness = 10
vm.zone_reclaim_mode = 0
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
#vm.min_free_kbytes = 487119#awk 'BEGIN {OFMT = "%.0f";} /MemTotal/ {print "vm.min_free_kbytes =", $2 * .03;}' /proc/meminfo
#對于大于64GB的主機,加上下面4行
vm.dirty_background_ratio = 0
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736 # 1.5GB
vm.dirty_bytes = 4294967296 # 4GB
#對于小于64GB的主機删除dirty_background_bytes dirty_bytes,加上下面2行
vm.dirty_background_ratio = 3
vm.dirty_ratio = 10
#vm.min_free_kbytes在記憶體 > 64GB系統的時候可以設定,一般比較少設定此參數。
#vm.min_free_kbytes,確定網絡和存儲驅動程式PF_MEMALLOC得到配置設定。這對記憶體大的系統尤其重要。一般系統上,預設值通常太低。可以使用awk指令計算vm.min_free_kbytes的值,通常是建議的系統實體記憶體的3%:
#awk 'BEGIN {OFMT = "%.0f";} /MemTotal/ {print "vm.min_free_kbytes =", $2 * .03;}' /proc/meminfo >> /etc/sysctl.conf
#不要設定 vm.min_free_kbytes 超過系統記憶體的5%,這樣做可能會導緻記憶體不足。
8.配置資源限制參數(所有機器)
在/etc/security/limits.conf檔案下增加以下參數
* soft nofile 524288
* hard nofile 524288
* soft nproc 131072
* hard nproc 131072
“*” 星号表示所有使用者
noproc 是代表最大程序數
nofile 是代表最大檔案打開數
RHEL / CentOS 6.X
修改:/etc/security/limits.d/90-nproc.conf 檔案的nproc
[root@mdw ~]# vi /etc/security/limits.d/90-nproc.conf
確定 * soft nproc 131072
RHEL / CentOS 7.X 修改:
修改:/etc/security/limits.d/20-nproc.conf 檔案的nproc
[root@mdw ~]# vi /etc/security/limits.d/20-nproc.conf
確定 * soft nproc 131072
ulimit -u 指令顯示每個使用者可用的最大程序數 max user processes,驗證傳回值為131072.
9.XFS挂載選項
XFS相比較ext4具有如下優點:
XFS的擴充性明顯優于ext4,ext4的單個檔案目錄超過200W個性能下降明顯
ext4作為傳統檔案系統确實非常穩定,但是随着存儲需求的越來越大,ext4漸漸不在适應
由于曆史磁盤原因,ext4的inode個數限制(32位),最多隻能支援40多億個檔案,單個檔案最大支援到16T
XFS使用的是64位管理空間,檔案系統規模可以達到EB級别,XFS是基于B+Tree管理中繼資料
GP 需要使用XFS的檔案系統,RHEL/CentOS 7 和Oracle Linux将XFS作為預設檔案系統,SUSE/openSUSE已經為XFS做了長期支援。
centos6.x需要先安裝xfs包
centos7.x不需要先安裝
例如挂載新xfs步驟:
1.[root@mdw ~]# fdisk /dev/sdd
然後跟着n,p,1提示做下去,最後wq儲存退出
[root@mdw ~]# mkfs.xfs /dev/sdd1
2.挂載目錄
[root@mdw ~]# mount /dev/sdd1 /data/master
3.設定自動挂載
[root@mdw ~]# vi /etc/fstab
/dev/sdd1 /data xfs rw,noatime,inode64,allocsize=16m 0 0
10.磁盤I/O 預讀大小設定
- 臨時生效
[root@mdw ~]# /sbin/blockdev --setra 16384 /dev/sda
- 永久生效
[root@mdw ~]# vi /etc/rc.d/rc.local
blockdev --setra 16384 /dev/sdd*
11.修改rc.local 權限
必須在啟動時可以運作 rc.local檔案。
例如,在RHEL / CentOS 7系統上,設定檔案的執行權限。
[root@mdw ~]# chmod + x /etc/rc.d/rc.local
12.磁盤I/O排程算法(確定是deadline)
centos7預設就是deadline
[root@mdw ~]# more /sys/block/sdd/queue/scheduler
noop anticipatory [deadline] cfq
如上所示,就不需要修改,否則按下面操作
RHEL 6.x or CentOS 6.x 可以修改 /boot/grub/grub.conf,增加 elevator=deadline 例如:
RHEL 7.x or CentOS 7.x, 使用 grub2 ,可以使用系統工具grubby來修改;
[root@mdw ~]# grubby --update-kernel=ALL --args="elevator=deadline"
重新開機後使用一下指令檢查
[root@mdw ~]# grubby --info=ALL
13.關閉Transparent Huge Pages (THP)
禁用THP,因為它會降低Greenplum資料庫的性能。
RHEL 6.x or CentOS 6.x 或更高版本預設情況下啟用THP。在RHEL 6.x上禁用THP的一種方法是添加參transparent_hugepage=never 到/boot/grub/grub.conf:
RHEL 7.x or CentOS 7.x, 使用 grub2 ,可以使用系統工具grubby來修改;
[root@mdw ~]# grubby --update-kernel=ALL --args="transparent_hugepage=never"
添加參數後,重新開機系統reboot。
參數檢查:
[root@mdw ~]# cat /sys/kernel/mm/*transparent_hugepage/enabled
always [never]
14.SSH連接配接門檻值
Greenplum資料庫管理程式中的gpexpand‘ gpinitsystem、gpaddmirrors,使用 SSH連接配接來執行任務。在規模較大的Greenplum叢集中,程式的ssh連接配接數可能會超出主機的未認證連接配接的最大門檻值。發生這種情況時,會收到以下錯誤:ssh_exchange_identification:連接配接被遠端主機關閉。
為避免這種情況,可以更新 /etc/ssh/sshd_config 或者 /etc/sshd_config 檔案的 MaxStartups 和 MaxSessions 參數
MaxStartups 300:30:1000
重新開機sshd,使參數生效
service sshd restart
15.同步叢集時鐘(NTP) (此項為操作,環境已經設定好ntp)
為了保證叢集各個服務的時間一緻,首先在master 伺服器上,編輯 /etc/ntp.conf,配置時鐘伺服器為資料中心的ntp伺服器。若沒有,先修改master 伺服器的時間到正确的時間,再修改其他節點的 /etc/ntp.conf,讓他們跟随master伺服器的時間。
[root@mdw ~]# vi /etc/ntp.conf
在server 最前面加上
master:
把server1,2,3,4全删
改成 server xxx,可以問公司IT人員公司的時鐘IP,如果沒有就設定成
server 1.cn.pool.ntp.org
segment:
server mdw prefer # 優先主節點
server smdw # 其次standby 節點,若沒有standby ,可以配置成資料中心的時鐘伺服器
[root@mdw ~]# service ntpd restart # 修改完重新開機ntp服務
16.檢查字元集
[root@mdw greenplum-db]# echo $LANG
en_US.UTF-8
如果為zh_CN.UTF-8
則要修改 CentOS 6.X /etc/syscconfig/i18n
CentOS 7.X /etc/locale.conf
17.建立gpadmin使用者(所有機器)
在每個節點上建立gpadmin使用者,用于管理和運作gp叢集
[root@mdw ~]# groupadd gpadmin
[root@mdw ~]# useradd gpadmin -g gpadmin -s /bin/bash
[root@mdw ~]# passwd gpadmin
三.叢集軟體安裝
1.安裝依賴(所有機器)root使用者執行
[root@mdw ~]# yum install -y zip unzip openssh-clients ed ntp net-tools perl perl-devel perl-ExtUtils* mlocate lrzsz parted apr apr-util bzip2 krb5-devel libevent libyaml rsync
2.執行安裝程式(root使用者執行)
執行安裝腳本,預設安裝到/usr/local/ 目錄下。
[root@mdw ~]# rpm -ivh greenplum-db-6.1.0-rhel6-x86_64.rpm
安裝完成後可在/usr/local下看到greenplum-db-6.1.0和它的軟連接配接greenplum-db
由于權限的問題,建議手動修改安裝路徑,放在/home/gpadmin下,執行以下語句
1.進入安裝父目錄
cd /usr/local
2.把安裝目錄移動到/home/gpadmin
mv greenplum-db-6.1.0 /home/gpadmin
3.删除軟連接配接
/bin/rm –r greenplum-db
4.在/home/gpadmin下建立新的軟連結
ln -s /home/gpadmin/greenplum-db-6.1.0 /home/gpadmin/greenplum-db
5.修改greenplum_path.sh (重要)
vi /home/gpadmin/greenplum-db/greenplum_path.sh
把 GPHOME=/usr/local/greenplum-db-6.1.0
修改為
GPHOME=/home/gpadmin/greenplum-db
6.把檔案賦權給gpadmin
chown –R gpadmin:gpadmin /home/gpadmin
3.叢集互信,免密登陸(root使用者執行)
生成密鑰
GP6.x開始gpssh-exkeys指令已經不帶自動生成密鑰了,是以需要自己手動生成
[root@mdw greenplum-db]# ssh-keygen -t rsa
提示語不用管,一直按Enter鍵使用預設值即可
4.将本機的公鑰複制到各個節點機器的authorized_keys檔案中
[root@mdw greenplum-db]# ssh-copy-id dis-gp-sdw1
[root@mdw greenplum-db]# ssh-copy-id dis-gp-sdw2
[root@mdw greenplum-db]# ssh-copy-id dis-gp-sdw3
5.使用gpssh-exkeys 工具,打通n-n的免密登陸
vi all_host
增加所有hostname到檔案中
dis-gp-mdw
dis-gp-sdw1
dis-gp-sdw2
dis-gp-sdw3
[root@mdw greenplum-db]# source /home/gpadmin/greenplum-db/greenplum_path.sh
[root@mdw greenplum-db]# gpssh-exkeys -f all_host
6.同步master 配置到各個主機
打通gpadmin 使用者免密登入
[root@mdw greenplum-db-6.2.1]# su - gpadmin
[gpadmin@mdw ~]$ source /home/gpadmin/greenplum-db/greenplum_path.sh
[gpadmin@mdw ~]$ ssh-keygen -t rsa
[gpadmin@mdw greenplum-db]$ ssh-copy-id dis-gp-sdw1
[gpadmin@mdw greenplum-db]$ ssh-copy-id dis-gp-sdw2
[gpadmin@mdw greenplum-db]$ ssh-copy-id dis-gp-sdw3
[gpadmin@mdw greenplum-db]$ mkdir gpconfigs
[gpadmin@mdw greenplum-db]$ cd gpconfigs
[gpadmin@mdw greenplum-db]$ vi all_hosts
把所有主機hostname添加進去
[gpadmin@mdw ~]$ gpssh-exkeys -f /home/gpadmin/gpconfigs/all_hosts
[gpadmin@mdw greenplum-db]$ vi /home/gpadmin/gpconfigs/seg_hosts
把所有資料節點hostname添加進去
7.批量設定greenplum在gpadmin使用者的環境變量(gpadmin使用者下)
添加gp的安裝目錄,和環境資訊到使用者的環境變量中。
編輯 .bashrc
source /home/gpadmin/greenplum-db/greenplum_path.sh
8.批量複制系統參數到其他節點(如果前面已經每台機器設定過可以跳過)
示例:
[gpadmin@mdw gpconfigs]$ exit
[root@mdw ~]# source /home/gpadmin/greenplum-db/greenplum_path.sh
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/hosts root@=:/etc/hosts
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/security/limits.conf root@=:/etc/security/limits.conf
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/sysctl.conf root@=:/etc/sysctl.conf
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/security/limits.d/20-nproc.conf
root@=:/etc/security/limits.d/20-nproc.conf
[root@mdw ~]# gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'sysctl -p'
[root@mdw ~]# gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'reboot'
9.叢集節點安裝
3.5.1 模拟gpseginstall 腳本(gpadmin使用者執行)
GP6.x無gpseginstall 指令,以下模拟此指令主要過程,完成gpsegment的部署
gpadmin 使用者下執行
1.cd /home/gpadmin
2.tar -cf gp6.tar greenplum-db-6.1.0/
3.vi /home/gpadmin/gpconfigs/gpseginstall_hosts
添加
dis-gp-sdw1
dis-gp-sdw2
dis-gp-sdw3-smdw
10.把壓縮包分發到segment上
gpscp -f /home/gpadmin/gpconfigs/gpseginstall_hosts gp6.tar =:/home/gpadmin
11.通過gpssh指令連結到各個segment上執行指令
[gpadmin@mdw gpconfigs]$ gpssh -f /home/gpadmin/gpconfigs/gpseginstall_hosts
tar -xf gp6.tar
ln -s greenplum-db-6.1.0 greenplum-db
exit
12.環境變量檔案分發到其他節點
[gpadmin@mdw gpconfigs]$ exit
[root@mdw greenplum-db-6.2.1]# su – gpadmin
[gpadmin@mdw ~]$ cd gpconfigs
[gpadmin@mdw gpconfigs]$ vi seg_hosts
把segment的hostname都添加到檔案中
dis-gp-sdw1
dis-gp-sdw2
dis-gp-sdw3
[gpadmin@mdw gpconfigs]$ gpscp -f /home/gpadmin/gpconfigs/seg_hosts /home/gpadmin/.bashrc gpadmin@=:/home/gpadmin/.bashrc
13.建立叢集資料目錄(root使用者執行)
1. 建立master 資料目錄
mkdir -p /data/master
chown -R gpadmin:gpadmin /data
source /home/gpadmin/greenplum-db/greenplum_path.sh
如果有standby節點則需要執行下面2句 dis-gp-sdw3-smdw 這個hostname靈活變更
gpssh -h dis-gp-sdw3-smdw -e 'mkdir -p /data/master'
gpssh -h dis-gp-sdw3-smdw -e 'chown -R gpadmin:gpadmin /data'
2. 建立segment資料目錄
source /home/gpadmin/greenplum-db/greenplum_path.sh
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/p1'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/p2'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/m1'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/m2'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'chown –R gpadmin:gpadmin /data'
四.叢集初始化
1.編寫初始化配置檔案(gpadmin使用者)
拷貝配置檔案模闆
su - gpadmin
cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config /home/gpadmin/gpconfigs/gpinitsystem_config
2.根據需要修改參數
vi /home/gpadmin/gpconfigs/gpinitsystem_config
注意:To specify PORT_BASE, review the port range specified in the net.ipv4.ip_local_port_range parameter in the /etc/sysctl.conf file.
主要修改的參數:
#primary的資料目錄
declare -a DATA_DIRECTORY=(/data/p1 /data/p2)
#master節點的hostname
MASTER_HOSTNAME=dis-gp-mdw
#master節點的主目錄
MASTER_DIRECTORY=/data/master
#mirror的端口要把前面的#去掉(啟用mirror)
MIRROR_PORT_BASE=7000
#mirror的資料目錄要把前面的#去掉(啟用mirror)
declare -a MIRROR_DATA_DIRECTORY=(/data/m1 /data/m2)
3.叢集初始化(gpadmin使用者)
執行腳本:
gpinitsystem -c /home/gpadmin/gpconfigs/gpinitsystem_config --locale=C -h /home/gpadmin/gpconfigs/gpseginstall_hosts --mirror-mode=spread
注意:spread是指spread分布政策,隻允許主機數>每個主機中的段執行個體數情況(number of hosts is greater than the number of segment instances.)
如果不指定mirror_mode,則是預設的group政策,這樣做的情況在段執行個體數>1時,down機之後不會導緻它的鏡像全在另外一台機器中,降低另外一台機器的性能瓶頸。
4.安裝中途失敗,提示使用 bash /home/gpadmin/gpAdminLogs/backout_gpinitsystem_gpadmin_* 回退,執行該腳本即可,例如:
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[FATAL]:-Unknown host gpzq-sh-mb: ping: unknown host gpzq-sh-mb
unknown host Script Exiting!
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[WARN]:-Script has left Greenplum Database in an incomplete state
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[WARN]:-Run command bash
/home/gpadmin/gpAdminLogs/backout_gpinitsystem_gpadmin_20191218_203938 to remove these changes
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[INFO]:-Start Function BACKOUT_COMMAND
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[INFO]:-End Function BACKOUT_COMMAND
[gpadmin@mdw gpAdminLogs]$ ls
backout_gpinitsystem_gpadmin_20191218_203938 gpinitsystem_20191218.log
[gpadmin@mdw gpAdminLogs]$ bash backout_gpinitsystem_gpadmin_20191218_203938
Stopping Master instance
waiting for server to shut down.... done
server stopped
Removing Master log file
Removing Master lock files
Removing Master data directory files
若執行後仍然未清理幹淨,可執行一下語句後,再重新安裝:
pg_ctl -D /data/master/gpseg-1 stop
rm -f /tmp/.s.PGSQL.5432 /tmp/.s.PGSQL.5432.lock
主節點
rm -rf /data/master/gpseg-1
所有資料節點
rm -rf /data/p1/gpseg-x
rm -rf /data/p2/gpseg-x
5.安裝成功後設定環境變量(gpadmin使用者)
編輯gpadmin 使用者的環境變量,增加(重要)
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
除此之外,通常還增加:(可以不設定)
export PGPORT=5432 # 根據實際情況填寫
export PGUSER=gpadmin # 根據實際情況填寫
export PGDATABASE=gpdw # 根據實際情況填寫
前面已經添加過 source /usr/local/greenplum-db/greenplum_path.sh,此處操作如下:
編輯 .bashrc
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
6.安裝成功後配置
psql 登陸gp 并設定密碼(gpadmin使用者)
psql -h hostname -p port -d database -U user -W password
-h後面接對應的master或者segment主機名
-p後面接master或者segment的端口号
-d後面接資料庫名可将上述參數配置到使用者環境變量中,linux 中使用gpadmin使用者不需要密碼。
psql 登入,并設定gpadmin使用者密碼示例:
psql -d postgres
alter user gpadmin encrypted password ‘xxx’;0.
7.用戶端登陸gp
配置 pg_hba.conf
vi /data/master/gpseg-1/pg_hba.conf
新增一行 host all all 0.0.0.0/0 md5
8.初始化standby節點
gpinitstandby -s dis-gp-sdw3