1. 程式人生 > >Greenplum 最佳實踐安裝

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;