一、安裝規劃
- 安裝單實例
- 配置主從
- 安裝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
|
#啓動實例
/usr/local/pgsql/bin/pg_ctl -D /work/pgsql/data -l logfile start
|
#創建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
示例代碼
|
命令行登陸
psql -U username -d database_name -h host -W
2.9 創建pg用戶
CREATE USERname
[ [ WITH ]option
[ ... ] ] whereoption
can be: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMITconnlimit
| [ ENCRYPTED ] PASSWORD 'password
' | PASSWORD NULL | VALID UNTIL 'timestamp
' | IN ROLErole_name
[, ...] | IN GROUProle_name
[, ...] | ROLErole_name
[, ...] | ADMINrole_name
[, ...] | USERrole_name
[, ...] | SYSIDuid
例子:
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 純手工切換
- 關閉主庫
pg_ctl stop -m fast - 執行備庫切換,在備庫端執行
修訂pg_hba.conf 添加以下內容:host replication repuser 192.168.0.1/32 md5
執行切換:
pg_ctl promote -D $PGDATA - 執行主庫切換
3.1 在$PGDATA 增加recovery.confvi recovery.conf
recovery_target_timeline = 'latest'
standby mode = on
primary_conninfo = 'host=192.168.0.2 port=5432 user=repuser'
3.2 增加 .pgpasstouch .pgpass
chmod 0600 .pgpass
vi .pgpass
192.168.0.1:5432:replication:repuser:password
192.168.0.2:5432:replication:repuser:password
-
啓動老主庫
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
|
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');