Greenplum 最佳實踐安裝
文章目錄
系統層面配置(所有節點都要配置)
1、安裝計劃
3臺機器
192.168.0.111 mdw
192.168.0.112 sdw1
192.168.0.113 sdw2
2、系統/etc/hosts配置
配置/etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.0.80 dw-greenplum-1 mdw 192.168.0.81 dw-greenplum-2 sdw1 192.168.0.82 dw-greenplum-3 sdw2
3、修改主機名
[[email protected] ~]# vi /etc/hostname
mdw
各個主機配置上相應的主機名
4、關閉防火牆
centos7以上系統
[[email protected] ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbusorg.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
centos7以下
service iptables stop 停止防火牆服務,重啟電腦後仍然會開啟
chkconfig iptables off 關閉防火牆服務開機啟動,重啟後生效
可以兩個命令結合使用避免重啟
5、關閉selinux
vi /etc/selinux/config
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected
6、建立gpadmin使用者
groupdel gpadmin
userdel gpadmin
groupadd -g 530 gpadmin
useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin
對資料夾進行賦權,為gpadmin使用者建立密碼
chown -R gpadmin:gpadmin /home/gpadmin/
passwd gpadmin
[輸入密碼: gpadmin]
7、設定gpadmin使用者環境
[[email protected] ~]$ cd /home/gpadmin
[[email protected] ~]$ vi .bashrc
[[email protected] ~]$ vi .bash_profile
.bashrc和.bash_profile最後都新增下面兩行(兩個檔案其中一個即可)
source /usr/local/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/gpdata/master/gpseg-1
8、修改/etc/sysctl.conf
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736 #根據系統最大記憶體大小來設定=記憶體大小*1024的三次方
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 16777216 #記憶體頁為4k每頁,最大記憶體比上4的大小
kernel.shmmni = 4096
kernel.sem = 250 512000 100 2048
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1025 65535
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.overcommit_memory = 2
vm.overcommit_ratio = 90
9、配置/etc/security/limits.conf
新增以下內容
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
下面這兩行或許已存在,看一下檔案末尾
* soft memlock unlimited
* hard memlock unlimited
10、設定預讀塊的值
# /sbin/blockdev --getra /dev/sda 檢視預讀塊,預設大小為256
# /sbin/blockdev --setra 16384 /dev/sda 設定預讀塊
11、設定磁碟訪問I/O排程策略
#echo deadline > /sys/block/sda/queue/scheduler 【臨時生效】
#grubby --update-kernel=ALL --args="elevator=deadline" 重啟生效
在cent6.*裡面命令目測無用(red hat可行),需要手工去執行:
7裡面 /boot/grub2/grub.cfg
6裡面 vi /etc/grub.conf
在裡面的Linux或者kernel裡面都加上elevator=deadline
還需要在/etc/fstab末尾加上
LEBEL=/data /data xfs rw,noatime,inode64,allocsize=16m 1 1
重啟後檢視是否生效:
cat /sys/block/sda/queue/scheduler
12、配置免密
注:在root下和gpadmin下都得配置,這裡例子207是主,251和252是計算節點
三臺主機檢查 ~/.ssh 資料夾沒有則新建
ssh-keygen -t rsa 一路狂按回車,最終生成(id_rsa,id_rsa.pub兩個檔案).
把id_rsa.pub 複製到251,252兩臺node上去.
scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh
scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh
切換到251,252:
生成authorized_keys.
cat id_rsa.pub >> authorized_keys
然後把authorized_keys scp到207.
scp ~/.ssh/authorized_keys [email protected]:~/.ssh
然後把三臺機器 .ssh/ 資料夾許可權改為700,authorized_keys檔案許可權改為600(or 644).
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
正式安裝資料庫
1、上傳並解壓資料庫安裝檔案
(master節點)也可以使用tar包安裝
[yum install unzip net-tools perl -y]
# unzip greenplum-db-4.3.16.1-rhel5-x86_64.zip
2、安裝軟體(master節點)
# /bin/bash greenplum-db-4.3.16.1-rhel5-x86_64.bin
# ctrl c
安裝過程中會顯示以下內容,直接使用預設即可
安裝之後的目錄檔案如下:
3、配置環境變數:
其環境變數在/usr/local/greenplum-db/greenplum_path.sh檔案中也有,可以參考
開啟/etc/profile對環境變數修改:
vim /etc/profile 新增以下檔案:
GPHOME=/usr/local/greenplum-db-4.3.6.2(你安裝軟體的版本號對應的目錄)
PATH=$GPHOME/bin:$GPHOME/ext/Python/bin:$PATH
export GPHOME
export PATH
也可以臨時獲取環境引數(master節點)
# source /usr/local/greenplum-db/greenplum_path.sh
###4、將安裝好的安裝目錄分發到各個節點
#scp -r /usr/local/greenplum-5.2 @sdw1:/etc/local/
#scp -r /usr/local/greenplum-5.2 @sdw2:/etc/local/
為各個節點的安裝目錄建立一個軟連線,方便今後升級
#ln -s /usr/local/greenplum-5.2 greenplum
賦予這兩個目錄gpadmin的許可權
chown -R gpadmin:gpadmin /usr/local/greenplum-5.2
chown -R gpadmin:gpadmin /usr/local/greenplum
也可以用gpssh工具來實現上面的操作
執行gpseginstall工具 (master節點)
# gpssh-exkeys -f all_hosts -u gpadmin -p gpadmin
# gpseginstall -f all_hosts -u gpadmin -p gpadmin
如果這步執行後沒有對應目錄存在,那麼手工scp將greenplum-db-4.3.16.1拷貝過去,
然後建立軟連線:ln -fs greenplum-db-4.3.16.1 greenplum-db
修改檔案屬主: chown -R gpadmin:gpadmin /usr/local/greenplum-db 等】
all_hosts是上個步驟建立的檔案,安裝過程中會讓輸入三臺主機的密碼,完成後提示成功,如下圖:
5、建立all_hosts檔案
包含所有主機名的檔案
mdw
sdw1
sdw2
6、切換到gpadmin使用者驗證無密碼登入
(1)切換使用者[以上均為root使用者]
$ su - gpadmin
(2)使用gpssh工具來測試無密碼登入所有主機,結果如下圖:
$ source /usr/local/greenplum-db/greenplum_path.sh
或者直接新增到.bash_profile裡面
$ gpssh -f all_hosts -e ls -l $GPHOME
7、配置環境變數(master節點)
將". /usr/local/greenplum-db/greenplum_path.sh"新增到.bashrc檔案最後,
然後將.bashrc檔案傳送到sdw1和sdw2,命令如下:
scp .bashrc sdw1:~
scp .bashrc sdw2:~
新增“export MASTER_DATA_DIRECTORY=/data/master/gpseg-1”到~/.bashrc檔案尾,並同步到sdw1和sdw2節點
需要source一下.bashrc檔案
$ scp .bashrc sdw1:~
$ scp .bashrc sdw2:~
兩行都得加
8、建立data目錄
(1) 建立Master資料儲存區域
# mkdir -p ./data/master
(2) 改變目錄的所有權【如果是gpadmin使用者建立的話就不用再賦權】
# chown gpadmin:gpadmin ./data/master
(3) 建立一個包含所有segment主機名的檔案seg_hosts,內容如下:
sdw1
sdw2
(4) 使用gpssh工具在所有segment主機上建立主資料和映象資料目錄,如果沒有設定映象可以不建立mirror目錄
# gpssh -f seg_hosts -e 'mkdir -p /data1/primary /data2/primary' [或者gpdata/data1 data2]
# gpssh -f seg_hosts -e 'mkdir -p /data1/mirror /data2/mirror'
# gpssh -f seg_hosts -e 'chown -R gpadmin:gpadmin /data1/primary ....'
# gpssh -f seg_hosts -e 'chown -R gpadmin:gpadmin /data1/mirror ....'
9、同步系統時間【root使用者】
(1) 在Master主機上編輯/etc/ntp.conf來設定如下內容:
server 127.127.1.0
(2) 在Segment主機上編輯/etc/ntp.conf
server mdw
(3) 在Master主機上,通過NTP守護程序同步系統時鐘【gpadmin使用者】
# gpssh -f all_hosts -v -e 'ntpd
重啟ntpd服務 /etc/init.d/ntpd restart
檢視ntp同步情況 ntpq -p
使ntpd服務重啟伺服器後也啟動
chkconfig --level 0123456 ntpd on
10、驗證作業系統設定
# gpcheck -f all_hosts -m mdw
注意執行結果是否有error資訊,如果有處理掉錯誤資訊後重新執行上面的命令檢查,直至沒有error資訊
例如以下錯誤
20170215:00:22:13:004992 gpcheck:test01:root-[ERROR]:-GPCHECK_ERROR host(test02): on device (sr0) IO scheduler 'cfq' does not match expected value 'deadline'
20170215:00:22:13:004992 gpcheck:test01:root-[ERROR]:-GPCHECK_ERROR host(test01): on device (sr0) IO scheduler 'cfq' does not match expected value 'deadline'
#echo deadline > /sys/block/sr0/queue/scheduler這個錯誤就可解決
成功的資訊如下:
11、建立Greenplum資料庫配置檔案
(1) 以gpadmin使用者登入
# su - gpadmin
(2) 從模板中拷貝一份gpinitsystem_config檔案
$ cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config /home/gpadmin/gpinitsystem_config
$ chmod 775 gpinitsystem_config
(3) 設定所有必須的引數【需要對應配置檔案看一下,裡面大多選項都有,改原有內容即可】
ARRAY_NAME="EMC Greenplum DW"
SEG_PREFIX=gpseg
PORT_BASE=40000
declare -a DATA_DIRECTORY=(/data1/primary /data2/primary /data1/primary /data2/primary)
MASTER_HOSTNAME=mdw
MASTER_DIRECTORY=/data/master
MASTER_PORT=5432
TRUSTED_SHELL=ssh
CHECK_POINT_SEGMENT=8
ENCODING=UNICODE
(4) 設定可選引數
MIRROR_PORT_BASE=50000
REPLICATION_PORT_BASE=41000
MIRROR_REPLICATION_PORT_BASE=51000
declare -a MIRROR_DATA_DIRECTORY=(/data1/mirror /data2/mirror /data1/mirror /data2/mirror)
(5) 設定優化引數:【可以在建立好之後再來設定】
shared_buffer=2GB #segment用作磁碟讀寫的記憶體緩衝區
gp_vmem_protect_limit=28GB #每個segment的分配記憶體
statement_mem = 27.79*1024*0.9/500 = 51.222528
sed -i 's/shared_buffers = 125MB/shared_buffers = 1GB/g' /data/*/*/postgresql.conf
sed -i 's/gp_vmem_protect_limit = 8192/gp_vmem_protect_limit = 30720/g' /data/*/*/postgresql.conf
sed -i 's/kernel.shmmax = 500000000/kernel.shmmax = 53687091200/g' /etc/sysctl.conf
sysctl -p
HINT: Valid units for this parameter are "kB", "MB", and "GB".
postgres=# alter database lxcos set statement_mem to 1.8GB; [2G可能會報錯]
初始化之前退出重進一下遠端,yum install net-tools
12、執行初始化工具初始化資料庫
$ gpinitsystem -c gpinitsystem_config -h seg_hosts
成功之後,資料庫便啟動了,資訊如下:
13、啟動和停止資料庫
測試是否能正常啟動和關閉,命令如下
$ gpstart
$ gpstop
$ gpstate -s
安裝完成後的檢查
1、訪問資料庫
psql postgres
輸入查詢語句
select datname,datdba,encoding,datacl from pg_database;
顯示資訊如下
2、檢視節點執行情況
主庫下執行:
postgres=# select * from pg_stat_replication ;
procpid | usesysid | usename | application_name | client_addr | client_port | backend_start | state | sent_location | write_location | flush_loca
tion | replay_location | sync_priority | sync_state
---------+----------+---------+------------------+---------------+-------------+-------------------------------+-----------+---------------+----------------+-----------
-----+-----------------+---------------+------------
2270 | 10 | gpadmin | walreceiver | 192.168.0.110 | 18608 | 2017-09-24 22:29:46.733544-04 | streaming | 0/C000410 | 0/C000410 | 0/C000410
| 0/C000410 | 1 | sync
(1 row)
檢視執行情況,是否有宕機:【d】
postgres=# select * from gp_segment_configuration ;
dbid | content | role | preferred_role | mode | status | port | hostname | address | replication_port | san_mounts
------+---------+------+----------------+------+--------+-------+----------+---------+------------------+------------
1 | -1 | p | p | s | u | 5432 | mdw | mdw | |
3 | 1 | p | p | s | u | 40000 | sdw1 | sdw1 | 41000 |
4 | 2 | p | p | s | u | 40000 | sdw2 | sdw2 | 41000 |
5 | 3 | p | p | s | u | 40000 | sdw3 | sdw3 | 41000 |
8 | 1 | m | m | s | u | 50000 | sdw2 | sdw2 | 51000 |
9 | 2 | m | m | s | u | 50000 | sdw3 | sdw3 | 51000 |
10 | 3 | m | m | s | u | 50000 | sdw4 | sdw4 | 51000 |
12 | -1 | m | m | s | u | 5432 | sby | sby | |
2 | 0 | m | p | s | d | 40000 | sby | sby | 41000 |
7 | 0 | p | m | c | u | 50000 | sdw1 | sdw1 | 51000 |
6 | 4 | p | p | c | u | 40000 | sdw4 | sdw4 | 41000 |
11 | 4 | m | m | s | d | 50000 | sby | sby | 51000 |
(12 rows)
3、造資料計算測試
psql postgres連線到資料庫中
以下是在gp資料庫中
create table test01(id int primary key, t text);
select * from gp_segment_configuration;
insert into test01 select seq, seq||'xxxxxxxxxxxxxxxxxxx' from generate_series(1, 1000000) as t(seq);
insert into test01 select seq, seq||'xxxxxxxxxxxxxxxxxxx' from generate_series(1, 1000000) as t(seq);
create table test02(i1 int, i2 int, t text) DISTRIBUTED BY (i2);
insert into test02 select seq, seq, seq||'xxxxxxxxxxxxxxxxxxx' from generate_series(1, 1000000) as t(seq);
再建了一張測試表test02
explain analyze select a.*,b.* from test01 a, test02 b where a.id=b.i1;
在psql中執行命令: \timing 然後就能把每條sql的執行時間打印出來。
explain analyze select a.*,b.* from test01 a, test02 b where a.id=b.i1;