2020-01-03 KK日記,第一次進行postgresql 11.5+pgpool 安裝

一、安裝規劃

  1. 安裝單實例
  2. 配置主從
  3. 安裝pgpool -ii

二、單實例安裝

2.1 操作系統

os: centos 7.6

cpu: 4 core

memory:32g

disk: 60g

192.168.0.1

192.168.0.2

2.2 postgresql 軟件準備

源碼: postgresql 11.5

 

2.3 安裝前檢查

使用 yum install 安裝以下包 

make 2.5+

gcc

readline readline-devel

zlib

zlib-devel

perl 5.8.3

perl-devel

python

tcl 8.4

2.4 修改內核參數、增加postgres用戶、修改/dev/shm 大小

2.4.1 修改內核參數

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 123695058124

kernel.shmall = 30198988

fs.aio-max-nr = 1048576

fs.file-max = 6815744

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 262144

net.core.rmem_max = 41943040

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

2.4.2 增加用戶

useradd postgres

passwd postgres

2.4.3 修改/dev/shm

fuser -km /dev/shm

mount -t tmpfs -o size=10240m tmpfs /dev/shm

 

vi /etc/fstab

tmpfs /dev/shm tmpfs defaults,size=10240m 0 0

備註:不修改這個,後面在大併發查詢時,可能會出現下面大錯誤

CAUSE BY:could not resize shared memory segment "/PostgreSQL.644318876" to 196864 bytes: 設備上沒有空間

2.6 修改limit配置

/etc/security/limits.conf

postgres   soft    nproc    65536

postgres   hard   nproc   65536

postgres   soft    nofile    2048
postgres   hard   nofile    65536
postgres   soft    stack    10240
postgres   hard   stack    10240

 

2.7 源碼安裝

scp postgresql-11.5.tar.gz [email protected]:/tmp
postgres login the 192.168.0.1
cd /tmp
tar zxvf postgresql-11.5.tar.gz
./configure 
 make 
 su -
 make install 
 mkdir /work/pgsql/data 
chown postgres /work/pgsql/data 
su - postgres 

#初始化數據庫

/usr/local/pgsql/bin/initdb -D /work/pgsql/data 

[postgres@pgdbdsvr001 ~]$ initdb -D /work/pgsql/data

 

The files belonging to this database system will be owned by user "postgres".

 

This user must also own the server process.

 

 

The database cluster will be initialized with locale "zh_CN.UTF-8".

 

The default database encoding has accordingly been set to "UTF8".

 

initdb: could not find suitable text search configuration for locale "zh_CN.UTF-8"

 

The default text search configuration will be set to "simple".

 

 

 

Data page checksums are disabled.

 

 

 

fixing permissions on existing directory /work/pgsql/data ... ok

 

creating subdirectories ... ok

 

selecting default max_connections ... 100

 

selecting default shared_buffers ... 128MB

 

selecting default timezone ... PRC

 

selecting dynamic shared memory implementation ... posix

 

creating configuration files ... ok

 

running bootstrap script ... ok

 

performing post-bootstrap initialization ... ok

 

syncing data to disk ... ok

 

 

 

 

WARNING: enabling "trust" authentication for local connections

 

You can change this by editing pg_hba.conf or using the option -A, or

 

--auth-local and --auth-host, the next time you run initdb.

 

 

 

 

Success. You can now start the database server using:

 

 

 

 

    pg_ctl -D /work/pgsql/data -l logfile start

 

#啓動實例
/usr/local/pgsql/bin/pg_ctl -D /work/pgsql/data -l logfile start 

[postgres@pgdbdsvr001 ~]$ ps -ef | grep postgres

 

root     25582  6303  0 18:32 ?        00:00:00 sshd: postgres [priv]

 

postgres 25610 25582  0 18:33 ?        00:00:00 sshd: postgres@pts/0

 

postgres 25611 25610  0 18:33 pts/0    00:00:00 -bash

 

postgres 25937     1  0 18:36 pts/0    00:00:00 /usr/local/pgsql/bin/postgres -D /work/pgsql/data

 

postgres 25939 25937  0 18:36 ?        00:00:00 postgres: checkpointer  

 

postgres 25940 25937  0 18:36 ?        00:00:00 postgres: background writer  

 

postgres 25941 25937  0 18:36 ?        00:00:00 postgres: walwriter  

 

postgres 25942 25937  0 18:36 ?        00:00:00 postgres: autovacuum launcher  

 

postgres 25943 25937  0 18:36 ?        00:00:00 postgres: stats collector  

 

postgres 25944 25937  0 18:36 ?        00:00:00 postgres: logical replication launcher  

 

postgres 25961 25611  0 18:36 pts/0    00:00:00 ps -ef

 

postgres 25962 25611  0 18:36 pts/0    00:00:00 grep --color=auto postgres

 

#創建test db
/usr/local/pgsql/bin/createdb qqt 
#連接test
/usr/local/pgsql/bin/psql qqt

 

2.8 連接參數配置

控制那些ip可以訪問pgsql

/work/pgsql/data/pg_hpa.conf

在不進行配置時,會出現下面的錯誤

 

#修改postgresql.conf 的參數

listen_addresses = '*'

port=5432

#修改pg_hba.conf

host    all             all             0.0.0.0/0             password

 

重啓pg

pg_ctl restart -D /work/pgsql/data  -m smart 

嘗試連接,成功。

2.8.1  dba與開發員連接pg的工具與方式

使用工具navicat  or  pgadmin

 

2.8.2 java 連接pg 的方式

下載jdbc

JDBC連接數據庫,首先應該獲取的是Java與PostgreSQL連接的jar包,驅動的下載地址:https://jdbc.postgresql.org/download.html 

示例代碼

package com.jpzhutech.select;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class SelectTest {

    public static void main(String[] args) {

        Connection connection = null;

        Statement statement = null;

        try {

            //String url = "jdbc:mysql://192.168.101.44/amon";

            String url = "jdbc:postgresql://192.168.100.120:5432/postgres";//換成自己PostgreSQL數據庫實例所在的ip地址,並設置自己的端口

            //String user = "root";

            String user = "postgres";

            //String password = "560128";

            String password = "";  //在這裏我的密碼爲空,讀者可以自己選擇是否設置密碼

            //Class.forName("com.mysql.jdbc.Driver");

            Class.forName("org.postgresql.Driver");  //一定要注意和上面的MySQL語法不同

            connection= DriverManager.getConnection(url, user, password);

            System.out.println("是否成功連接pg數據庫"+connection);

            String sql = "select * from student";

            statement = connection.createStatement();

            /**

             * 關於ResultSet的理解:Java程序中數據庫查詢結果的展現形式,或者說得到了一個結果集的表

             * 在文檔的開始部分有詳細的講解該接口中應該注意的問題,請閱讀JDK

             * */

            ResultSet resultSet = statement.executeQuery(sql);

            while(resultSet.next()){

                 //取出列值

                int id = resultSet.getInt(1);

                String name = resultSet.getString(2);

                System.out.println(id+","+name+",");

            }

        catch (Exception e) {

            throw new RuntimeException(e);

        }finally{

            try {

                statement.close();

            catch (SQLException e) {

                e.printStackTrace();

                throw new RuntimeException(e);

            }finally{

                try {

                    connection.close();

                catch (SQLException e) {

                    e.printStackTrace();

                    throw new RuntimeException(e);

                }

            }

        }

    }

}

 

命令行登陸

psql -U username -d database_name -h host -W

2.9 創建pg用戶

CREATE USER name [ [ WITH ] option [ ... ] ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

 

 

 

例子:

 

 

create user hqq with password 'password';

alter user hqq with superuser;

2.10 授權

grant select on book to hqq;

 

2.11 參數查看

命令:   show name    or   show all     

在主機層面,通psql登陸的如果忘記name 具體名字可以通過【tab】鍵自動補全。

對應的表是pg_settings

關聯繫統表

pg_tables   pg_roles   pg_user  pg_rules pg_indexes

 

3. 主從架構配置

3.1 從節點安裝

從節點ip:192.168.0.2

過程參考主節點,但不要執行initdb 這個命令。

3.2 主節點上配置

在postgres.conf修改以下參數:

wal_level=replica

archive_mode=on

archive_command='/bin/date'

max_wal_senders=10

wal_keep_segments=512

hot_standby=on

 

3.3 創建複製用戶

CREATE USER repuser REPLICATION LOGIN CONNECTION LIMIT 5 ENCRYPTED PASSWORD ’password ’;

 

配置pg_hba.conf,添加以下數據

 

host    replication     repuser         192.168.0.2/32          md5

3.4 複製數據到從庫

在從庫上os執行如下命令

 

[postgres@pgdbdsvr002] pg_basebackup - D $PGDATA  -Fp  -Xs -v -P -h 192.168.0.1 -p 5432  -U repuser

 

3.5 在從庫上配置recovery.conf

cp recovery.conf.sample $PGDATA

cd $PGDATA

mv recovery.conf.sample recovery.conf

 

vi recovery.conf

recovery_target_timeline = 'latest' 

 standby mode = on
primary_conninfo = 'host=192.168.0.1  port=5432 user=repuser'

 

3.6 在從庫上配置複製用戶的登陸信息

touch .pgpass

chmod 0600 .pgpass

vi .pgpass

192.168.0.1:5432:replication:repuser:password

192.168.0.2:5432:replication:repuser:password

3.7 驗證主從複製

ps -ef | grep wal 

看到以下信息,就是主庫,並且複製已經開啓

postgres  6101  6097  0 16:38 ?        00:00:00 postgres: walwriter   

postgres  6108  6097  0 16:38 ?        00:00:00 postgres: walsender repuser 10.87.140.53(41750) streaming 0/80004A8

 

看到以下信息,就是從庫,並且複製已經開啓

postgres 32211 22668  0 16:38 ?        00:00:00 postgres: walreceiver   streaming 0/80004A8

 

數據庫視圖:

select * from pg_stat_replication;

pg命令:

pg_controldata | grep cluster

Database cluster state:               in production                                #主庫

Database cluster state:               in archive recovery                      #備庫

3.8 主從切換

 

3.8.1  純手工切換

  1.  關閉主庫
    pg_ctl stop -m fast
  2.  執行備庫切換,在備庫端執行
    修訂pg_hba.conf 添加以下內容:

    host    replication     repuser         192.168.0.1/32          md5

    執行切換:
    pg_ctl promote -D $PGDATA
  3. 執行主庫切換
    3.1 在$PGDATA 增加recovery.conf

    vi recovery.conf

    recovery_target_timeline = 'latest' 

     standby mode = on
    primary_conninfo = 'host=192.168.0.2  port=5432 user=repuser'


    3.2 增加 .pgpass

    touch .pgpass

    chmod 0600 .pgpass

    vi .pgpass

    192.168.0.1:5432:replication:repuser:password

    192.168.0.2:5432:replication:repuser:password

  4. 啓動老主庫
    pg_ctl start -D $PGDATA  -l $PGDATA/pg_log/

 

ps: 注意決定不能在主庫在啓動狀態下,把從庫切換成主庫。

 

4. pgpool-ii 安裝

4.1 安裝規劃

  • 採用源碼方式安裝
  • 安裝用戶與pg 使用相同用戶 postgres
  • 安裝路徑默認安裝
  • 安裝組件:pgpool 、pgpool_recovery、pg_regclass (pg 9.4後不需要)、insert_lock(不採用native native replication mode不需要)
  • pgpool 安裝在現有pg 主從節點上。

4.2 開始安裝

----------使用postgres 在主備節點上進行安裝-------------------

上傳源碼,並解壓: 

tar zxvf pgpool-II-4.0.2.tar.gz

編譯並安裝

./configure   

make

root> make install

安裝完成後,在 /usr/local/bin 路徑下看到pgpool的東西

安裝完畢

 

4.2.2 安裝pgpool_recovery插件

$ cd pgpool-II-4.1.0/src/sql/pgpool-recovery
$ make
$ make install (用root安裝)
psql -f pgpool-recovery.sql template1

vi  postgres.conf 

 pgpool.pg_ctl = '/usr/local/pgsql/bin/pg_ctl'

pg_ctl reload -D $PGDATA

4.3 配置

4.3.1 免密互訪配置

*在pgdbsvr01 和pgdbsvr02 上做同樣修改

vi /etc/hosts

192.168.0.1   pgdbsvr01

192.168.0.2  pgdbsvr02

ssh-keygen

ssh-copy-id postgres@pgdbsvr02      # 在pgdbsvr02上執行 ssh-copy-id postgres@pgdbsvr01

 

4.3.2 授權

1)如果需要非root用戶啓動Pgpool時能啓動虛擬IP,需要配置該權限

    chmod u+s /bin/ping 

   chmod u+s /sbin/ifup 

   chmod u+s /sbin/ifdown

  chmod u+s /sbin/ip 

  chmod u+s /sbin/ifconfig 

  chmod u+s /sbin/arping

 

4.3.3 配置pool_hba.conf

cd /usr/local/etc

cp pool_hba.conf

chown postgres:postgres pool_hba.conf

host   replication  repuser        192.168.0.1/32    md5

host   replication  repuser        192.168.0.2/32    md5

host   all                all                0.0.0.0/0               md5

 

4.3.4 配置pgpool.conf

cp /usr/local/etc/pgpool.conf.sample-stream pgpool.conf

參數配置如下:

序號

參數名字

解釋

pgdbsvr01配置值

pgdbsvr02配置值

1 listen_addresses 配置pgpool的監聽地址 * *
2 port pgpool的監聽端口 9999 9999
3 backend_hostname0

配置後端 PostgreSQL 節點 0 的主機名或 IP

pgdbsvr01 pgdbsvr01
4 backend_port0

配置 PostgreSQL 節點 0 的端口 。

5432 5432
  backend_data_directory0

配置 PostgreSQL 節點 0 的數據目錄 。

/work/pgsql/data /work/pgsql/data
  backend_flag0

設置後端數據庫節點 的行爲,默認爲 ALLOW_TO_FAILOVER,表

示允許故障轉移。

ALLOW_TO_FAILOVER ALLOW_TO_FAILOVER
  backend_hostname1

配置後端 PostgreSQL 節點 1的主機名或 IP

pgdbsvr02 pgdbsvr02
  backend_port1 配置 PostgreSQL 節點 1 的端口 。 5432 5432
  backend_data_directory1 配置 PostgreSQL 節點 1的數據目錄 。 /work/pgsql/data /work/pgsql/data
  backend_flag1

設置後端數據庫節點1 的行爲,默認爲 ALLOW_TO_FAILOVER,表

示允許故障轉移。

ALLOW_TO_FAILOVER ALLOW_TO_FAILOVER
  enable_pool_ha

表示 pgpool 啓用 pool_hba.conf

on on
  pool_passwd

設置 MD5 認證的密碼文件, 默認爲 pool_passwd

pool_passwd pool_passwd
  log_destination

pgpool 支持兩種類型日誌輸出, stdeη和 syslog,

這裏設 置成 syslog, /var/log/message 系統日誌裏會顯示 pgpool 日誌。

syslog syslog
 

pid_file name

pgpool 進程的 PID 文件

/usr/local/etc /usr/local/etc
 

load balance mode  

表示是否開啓 pgpool 的負載均衡,如果開啓此參數,

 會被 pgpool 分發到流複製備庫上

on on
 

master slave mode

是否啓用主備模式,默認爲 off,設置成 on。

on on
  master_slave_sub_mode

設置主備模式,可選項爲 slony或 stream, slony表示使 用 slony 複製模式,

 stream 表示使用 PostgreSQL 內置的流複製模式,這裏設置成

stream 。

stream stream
  sr_check_period

流複製延時檢測的週期,默認爲 10秒

10 10
  sr_check_user

流複製延時檢測使用的數據庫用戶

repuser repuser
  sr_check_password   password password
  sr_check_database

流複製延時檢測時連接的數據庫

postgres postgres
  delay_threshold

當流複製備庫延遲大於設置的 WAL 字節數時,

pgpool 不會將 SELECT 語句分發到備庫

10000000 10000000
  health_check_period   5 5
  health_check_timeout   20 20
  health_check_user   repuser repuser
  health_check_password      
  health_check_database   postgres postgres
  health_check_max_retries   3 3
  health_check_retry_delay   3 3
  failover_command

failover_command 表示設置故障轉移的腳本,當 pgpool 主備實例或主機者機時,

觸發 此腳本進行故障轉移,後面四個參數爲 pgpool 系統變量, %d表示着機的節點 ID

 , %P 表 示老的主庫節點 ID, %H 表示新主庫的主機名,

 %R 表示新主庫的數據目錄,後面會貼出 failover stream.sh腳本中的內容。

/usr/local/etc/failover_stream.sh %d %P %H %R /usr/local/etc/failover_stream.sh %d %P %H %R
  use_watchdog

是否啓用 watchdog,默認爲 off。

on on
  wd_hostname

watchdog所在主機的 IP地址或主機名,和相應 pgpool位於同一主機。

pgdbsvr01 pgdbsvr02
  wd_port

watchdog 的端口 號,默認爲 9000。

9000 9000
  wd_priority

設置 watchdog 的優先級 ,當 pgpool 主節點服務通斷後,優先級越高

的 watchdog 將被選擇成 pgpool 主節點 ,實驗環境爲一主一備,只有兩個 pgpool 節

點,此參數無影響 。

1 1
 

delegate_IP

  192.168.0.3 192.168.0.3
 

if_cmd_path

設置啓動和關閉 VIP命令的路徑。

/sbin /sbin
  if_up_cmd

設 置啓動 VIP 的命令,使用 ip addr add 命令啓動一個 VIP .[默認生成]

ip addr add $_IP_$/24 dev eth0 label eth0:0

ip addr add $_IP_$/24 dev eth0 label eth0:0

  if_down_cmd 設 置啓動 VIP 的命令,使用 ip addr add 命令啓動一個 VIP .[默認生成]

ip addr del $_IP_$/24 dev eth0

ip addr del $_IP_$/24 dev eth0

 

heartbeat_destination0

設置遠程 pgpool 節點主機名或 IP,本地的 watchdog 心跳發 往遠程pgpool主機,

 heartbeat_ct巳stination後的編號從0開始

pgdbsvr02 pgdbsvr01
  heartbeat_destination_port0

設置遠程 pgpool 節點的端 口號, 默認爲 9694。

9694 9694
  heartbeat_device0

本地 pgpool 發送 watchdog 心跳的網絡設備別名 , 可以通過ip a名令獲得

eth0 eth0
  wd_life_point   3 3
  wd_lifecheck_query   select 1 select 1
  wd_lifecheck_dbname   postgres postgres
  wd_lifecheck_user   repuser repuser
  wd_lifecheck_password      
  other_pgpool_hostname0   pgdbsvr02 pgdbvr01
  other_pgpool_port0   9999 9999
  other_wd_port0   9000 9000
  max_pool

Number of connection pool caches per connection [需要重啓生效]

4 4
 

num_init_children

Number of concurrent sessions allowed [需要重啓生效] pgpool最大允許併發數

32 3000

 

參考:https://www.pgpool.net/docs/latest/en/html/example-cluster.html

4.3.5 切換腳本

pg_failover

#! /bin/bash

# Execute command by failover .

# special values: %d = node id

#                 %h = host name

#                 %p = port number

#                 %D = database cluster path

#                 %m = new master node id

#                 %M = old master node id

#                 %H = new master node host 口ame

#                 %P = old primary node id

#                 %R = new master database cluster path

#                 %r = new master port number

#                 %% = '%' character

 

 

falling_node=$1

old_primary=$2

new_primary=$3

pgdata=$4

pghome=/usr/local/pgsql

log=/tmp/failover.log

date >> $log

 

#輸出變量到日誌,方便此腳本出現異常時調試 。

 

echo ”falling node=$falling node” >> $log

echo ”old primary=$old primary” >> $log

echo ”new_primary=$new_primary” >> $log

echo ”pgdata=$pgdata” >> $log

 

#如果故障的數據庫爲主庫並且執行腳本的操作系統用戶爲 root

 

echo 'abc'

if [ -f $pgdata/recovery.conf ]; then

echo 'local failover ...'

$pghome/bin/pg_ctl promote -D $pgdata

echo 'successful'>>$log

else

echo 'remote failover'>> $log

ssh -T postgres@$new_primary $pghome/bin/pg_ctl promote -D $pgdata

echo 'successful'>>$log

fi;

echo "completed!" >> $log

exit 0;

 

4.3.6 切換演練

pgdbsvr01上執行:

pg_ctl stop -m fast

順利完成切換,然後啓動pgdbsvr01

cp $PGDATA/recovery.done $PGDATA/recovery.conf ; ls -l $PGDATA/recovery.conf

pg_ctl start -D $PGDATA -l $PGLOG

啓動後,通過show  pool_nodes 顯示:

 

執行如下命令即可恢復到up:

pcp_attach_node -d -h 192.168.0.1 -p 9898 -U pgpool -w -n 0

pcp_watchdog_info -v -w -U pgpool

                   

pg_rewind --target-pgdata $PGDATA --source-server='host=192.168.0.1 port=5432 user=postgres password=XXX   dbname=qqt' -P

#rewind完後,記得要調recovery.done 裏面的primary_info  的host ,因爲rewind是會把主庫的差異數據考過來的。。。所以會把recovery.done也一起考過來。

#備庫啓動,一定要確保recovery.conf已經存在, 否則建立不起復制,,一旦備庫以“主庫”模式啓動過,就不能再以複製模式啓動。

 

 

pgpool -f /usr/local/etc/pgpool.conf

pgpool -n -d > /tmp/pgpool.log 2>&1 &

 

注意事項

使用pgpool後,會自動負載均衡查詢語句的,那麼你想知道你連在那個庫上,建議使用:SELECT inet_server_addr(), inet_server_port();

查詢阻塞sql:

select datname,usename,wait_event_type,wait_event,pg_blocking_pids(pid) as blocked_by,query

from pg_stat_activity

where wait_event_type is not null and wait_event_type not in ('Activity','client');

發佈了73 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章