日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

PostgreSQL高可用(二)使用pgpool实现主从切换+读写分离

發布時間:2023/12/31 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PostgreSQL高可用(二)使用pgpool实现主从切换+读写分离 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1主從流復制
    • 1.1 主機分配
  • 2主從切換
    • 2.1 手動切換
    • 2.2 pgpool 自動切換
      • 2.2.1 解壓編譯安裝
      • 2.2.2 添加環境變量
      • 2.2.3 配置pool_hba.conf
      • 2.2.4 配置pcp.conf和pool_passwd
      • 2.2.5 修改pcp.conf
      • 2.2.6 配置pgpool.conf
      • 2.2.7 failover_stream.sh內容:
      • 2.2.8 pgpool的啟動和關閉
      • 2.2.9 查看集群狀態
  • 3 測試(模擬master宕機)
    • 3.1 關閉master數據庫
    • 3.2 宕機后的恢復
      • 3.2.1 首先將master中的recovery.done改為recovery.conf,讓它成為新的從庫
      • 3.2.2 啟動宕機的數據庫
      • 3.2.3 使用pcp_attach_node命令
      • 3.2.4 查看當前集群狀態
  • 4 讀寫分離

1主從流復制

主從復制請看:[PostgreSQL高可用(一)主從流復制]

1.1 主機分配

  • OS:CentOS 7
  • 節點1:master(192.168.36.130)
  • 節點2:slave(192.168.36.131)
  • 節點3:slave(192.168.36.133)
  • 2主從切換

    2.1 手動切換

    在上一節中,配置好了流復制結構,接下來模擬主庫宕機,進行測試。

    1.主庫宕機
    在master上執行

    pg_ctl stop

    會發現測試庫報錯,連接不上主庫。
    這時我們創建觸發文件。

    touch /tmp/trigger_file0

    也可以放在別的目錄,記得要給postgres權限。
    這時,測試庫會變成主庫。我們在slave上的測試庫中新建測試表,并插入數據。

    create database test; create teble test_1 (id int); insert into test_1 valuse (1);

    將主庫的recover.done變為recovery.conf

    mv recovery.done recovery.conf

    啟動主庫

    pg_ctl start

    主庫會自動的發現時間線的差異,并拷貝過來。
    登錄主庫查詢,可以查到數據。

    如果你們更改recovery.done,或者進行了別的操作,你會發現數據是不一樣的。
    這是你需要停掉被恢復的庫,手動同步時間線。

    pg_rewind --target-pgdata=/home/postgres/data --source-server='host=slave port=5432 user=postgres dbname=postgres'

    將主庫的recover.done變為recovery.conf

    mv recovery.done recovery.conf

    再次啟動主庫。數據就已經同步了。

    你可以多次手動切換進行測試,但是你會發現一個問題。
    觸發文件trigger_file0每次在即創建完成后并不會存在,他在切換完成后就消失了。每次都要手動創建文件的話很麻煩,所以使用pgpool進行自動切換。

    2.2 pgpool 自動切換

    下載地址:http://www.pgpool.net/mediawiki/images/

    2.2.1 解壓編譯安裝

    tar -zxvf pgpool-II-3.6.0.tar.gz -C /opt/ cd /opt/pgpol-II/ ./configure –prefix=/opt/pgpool -with-pgsql=path -with-pgsql=/home/postgres make make install

    2.2.2 添加環境變量

    vim /etc/profilePGPOOL_HOME=/opt/pgpool export PGPOOL_HOME PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin:$PGPOOL_HOME/bin export PATH #使之生效 source /etc/profile

    2.2.3 配置pool_hba.conf

    增加一下內容

    host all all 0.0.0.0/0 md5 [postgres@pool etc]$ pwd /opt/pgpool/etc [postgres@pool etc]$ cat pool_hba.conf local all all trust host all all ::1/128 trust host all all 0.0.0.0/0 md5

    2.2.4 配置pcp.conf和pool_passwd

    (master)主節點登陸后執行:

    postgres=# select rolname,rolpassword from pg_authid;rolname | rolpassword --------------------+-------------------------------------postgres | md59df270eb52907fff723d9b8b7436113astream_replication | md54ef59c2cef276ba5fadf7c4bb545ea2cpgpool | md50b5752e4c7711493bdd283d5c4853774 (3 rows)

    修改pool_passwd增加SQL執行結果的內容
    形式為rolname:rolpassword例如:
    postgres:md59df270eb52907fff723d9b8b7436113a

    [postgres@pool etc]$ pwd /opt/pgpoo/etc [postgres@pool etc]$ cat pool_passwd postgres:md59df270eb52907fff723d9b8b7436113a stream_replication:md54ef59c2cef276ba5fadf7c4bb545ea2c pgpool:md56c2760b658de3ecd40300c0e8de3f02d

    2.2.5 修改pcp.conf

    [postgres@pool etc]$ pg_md5 -u postgres 123 202cb962ac59075b964b07152d234b70 [postgres@pool etc]$ vim /etc/pgpool/pcp.conf ## 加入 postgres:上一命令的輸出 postgres:202cb962ac59075b964b07152d234b70

    2.2.6 配置pgpool.conf

    內容如下:根據自己的配置進行相應的修改

    #CONNECTIONSlisten_addresses = '*' port = 9999 socket_dir = '/opt/pgpool' pcp_listen_addresses = '*' pcp_port = 9898 pcp_socket_dir = '/opt/pgpool'# - Backend Connection Settings -backend_hostname0 = '192.168.36.130' #主庫hosts backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/home/postgres/data' #數據庫位置 backend_flag0 = 'ALLOW_TO_FAILOVER' # backend_hostname1 = '192.168.36.131' #從庫hosts backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/home/postgres/data' #數據庫位置 backend_flag1 = 'ALLOW_TO_FAILOVER' # # # - Authentication - # enable_pool_hba = on pool_passwd = 'pool_passwd' # # # FILE LOCATIONS # pid_file_name = '/opt/pgpool/pgpool.pid' ##pid文件位置 logdir = '/data1/pg_logs' ##日志位置 # replication_mode = off load_balance_mode = on master_slave_mode = on master_slave_sub_mode = 'stream' # sr_check_period = 5 sr_check_user = 'pgpool' ##主庫創建的用戶 sr_check_password = '123' ##密碼 sr_check_database = 'postgres' # # # HEALTH CHECK 健康檢查 # health_check_period = 10 health_check_timeout = 20 health_check_user = 'pgpool' ##主庫創建的用戶 health_check_password = '123' ##密碼 health_check_database = 'postgres' ##檢查的庫 # # # FAILOVER AND FAILBACK # # 這是一個切換腳本,高可用全靠它 failover_command = '/data1/pg_bin/failover_stream.sh %d %H /tmp/trigger_file0'

    給腳本放到指定位置,加執行權限

    2.2.7 failover_stream.sh內容:

    # Failover command for streaming replication. # This script assumes that DB node 0 is primary, and 1 is standby. # # If standby goes down, do nothing. If primary goes down, create a # trigger file so that standby takes over primary node. # # Arguments: $1: failed node id. $2: new master hostname. $3: path to # trigger file.failed_node=$1 new_master=$2 trigger_file=$3# Do nothing if standby goes down. if [ $failed_node = 1 ]; thenexit 0; fi# Create the trigger file. /usr/bin/ssh -T $new_master /bin/touch $trigger_fileexit 0;

    2.2.8 pgpool的啟動和關閉

    啟動 pgpool -n -D > /data1/pg_logs/pgpool.log 2>&1 & 關閉 pgpool -m fast stop

    2.2.9 查看集群狀態

    [postgres@localhost etc]$ psql -p 9999 -h pool -U pgpool -d postgres 用戶 pgpool 的口令:postgres=> show pool_nodes;node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay ---------+----------------+-------+--------+-----------+---------+------------+-------------------+-------------------0 | 192.168.36.130 | 5432 | up | 0.500000 | primary | 0 | false | 01 | 192.168.36.131 | 5432 | up | 0.500000 | standby | 0 | true | 0 (2 rows)

    3 測試(模擬master宕機)

    3.1 關閉master數據庫

    master

    #因為加了PGDATA,所以在啟動和關閉時不用指定數據庫位置,很方便 [postgres@master data]$ pg_ctl stop waiting for server to shut down.... done server stopped

    pool
    master關閉后,從節點的連接中斷后又成功連接上

    postgres=> show pool_nodes; server closed the connection unexpectedlyThis probably means the server terminated abnormallybefore or while processing the request. The connection to the server was lost. Attempting reset: Succeeded. postgres=> show pool_nodes;node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay ---------+----------------+-------+--------+-----------+---------+------------+-------------------+-------------------0 | 192.168.36.130 | 5432 | down | 0.500000 | standby | 0 | false | 01 | 192.168.36.131 | 5432 | up | 0.500000 | primary | 0 | true | 0 (2 rows)


    發現master已經是standby了,且down機了,slave升為了primary

    slave成為新的主且slave中的recovery.conf 變成recovery.done

    3.2 宕機后的恢復

    最簡單的方法就是將宕機的主庫刪掉,是用pg_basebackup的命令重新備份,但在生產環境中,數據量會越來越多,所以每次都重新拷貝很大的數據是很麻煩的,所以需要增量拷貝。

    3.2.1 首先將master中的recovery.done改為recovery.conf,讓它成為新的從庫

    [postgres@master data]$ mv recovery.done recovery.conf

    3.2.2 啟動宕機的數據庫

    [postgres@master pg_xlog]$ pg_ctl start server starting [postgres@master pg_xlog]$ LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log".

    3.2.3 使用pcp_attach_node命令

    pcp_attach_node -d -U postgres -h pool -p 9898 -n 0

    3.2.4 查看當前集群狀態

    [postgres@pool etc]$ psql -h pool -p 9999 -U pgpool -d postgrespostgres=> show pool_nodes;node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay ---------+----------------+-------+--------+-----------+---------+------------+-------------------+-------------------0 | 192.168.36.131 | 5432 | up | 0.500000 | primary | 0 | false | 01 | 192.168.36.130 | 5432 | up | 0.500000 | standby | 0 | true | 0 (2 行記錄)

    恢復完成,master成為了新的standby。

    4 讀寫分離

    實現讀寫分離非常簡單,在pgpool.conf中添加參數就可以實現。

    load_balance_mode = on

    pgpool會自動的將select語句分到從庫上,將update等語句分到主庫上。

    總結

    以上是生活随笔為你收集整理的PostgreSQL高可用(二)使用pgpool实现主从切换+读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。