c++获取可用端口号_PG高可用架构实施方案
1、PG概述
PostgreSQL是一個功能非常強大的、源代碼開放的客戶/服務器關系型數據庫管理系統(RDBMS)。PostgreSQL最初設想于1986年,當時被叫做Berkley Postgres Project。該項目一直到1994年都處于演進和修改中,直到開發人員Andrew Yu和Jolly Chen在Postgres中添加了一個SQL(Structured Query Language,結構化查詢語言)翻譯程序,該版本叫做Postgres95,在開放源代碼社區發放。
1996年,再次對Postgres95做了較大的改動,并將其作為PostgresSQL6.0版發布。該版本的Postgres提高了后端的速度,包括增強型SQL92標準以及重要的后端特性(包括子選擇、默認值、約束和觸發器)。
PostgreSQL是一個非常健壯的軟件包,有很多在大型商業RDBMS中所具有的特性,包括事務、子選擇、觸發器、視圖、外鍵引用完整性和復雜鎖定功能。另一方面,PostgreSQL也缺少商業數據庫中某些可用的特性,如用戶定義的類型、繼承性和規則。
2020-05-21,PostgreSQL全球開發組宣布PostgreSQL13的第一個Beta版本正式提供下載。這個版本包含將來PostgreSQL 13正式版本中的所有特性和功能,當然一些功能的細節在正式版本發布時可能會有些變化。
鑒于PG版本的穩定性和使用廣泛性,我們選擇PG11--postgresql-11.7這個版本。
2、高可用架構概述
Patroni+ ZooKeeper 方案:
健壯性:使用分布式文件系統作為數據存儲,主節點故障時進行主節點重新選舉,具有很強的健壯性。
支持多種復制方式: 基于內置流復制,支持同步流復制、異步流復制、級聯復制。
支持主備延遲設置:可以設置備庫延遲主庫WAL的字節數,當備庫延遲大于指定值時不做故障切換。
自動化程度高: 1)支持自動化初始PostgreSQL實例并部署流復制; 2)當備庫實例關閉后,支持自動拉起; 3)當主庫實例關閉后,首先會嘗試自動拉起; 4)支持switchover命令,能自動將老的主庫進行角色轉換。
避免腦裂: 數據庫信息記錄到ZOOKEEPER 中,通過優化部署策略(多機房部署、增加實例數)可以避免腦裂。
2.1.??????????Patroni簡介
Patroni基于Python開發的模板,結合DCS(例如ZooKeeper, ETCD, Consul )可以定制PostgreSQL高可用方案。
Patroni并不是一套拿來即用的PostgreSQL高可用組件,涉及較多的配置和定制工作。
Patroni接管PostgreSQL數據庫的啟停,同時監控本地的PostgreSQL數據庫,并將本地的PostgreSQL數據庫信息寫入DCS。
Patroni的主備端是通過是否能獲得leader key 來控制的,獲取到了leader key的Patroni為主節點,其它的為備節點。
2.2.??????????ZooKeeper簡介
ZooKeeper是一款基于FastPaxos算法和協議開發的,Zookeeper 分布式服務框架是Apache Hadoop 的一個子項目,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等。Patroni監控本地的PostgreSQL狀態,并將相關信息寫入ZooKeeper,每個Patroni都能讀寫ZooKeeper上的key,從而獲取外地PostgreSQL數據庫信息。
當ZooKeeper的leader節點不可用時,ZooKeeper會一致性的選擇一個合適的節點作為主節點,新的ZooKeeper主節點將獲取leader key,因此建議ZooKeeper集群為三個以上且為奇數的節點,不建議部署在同一個機房,有條件話盡量部署在三個機房。
一個標準的3節點ZooKeeper集群,最大容許1個節點故障。
3、讀寫分離和虛擬IP
3.1.??????????HAProxy
HAProxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案。HAProxy特別適用于那些負載特大的web站點, 這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的并發連接。并且它的運行模式使得它可以很簡單安全的整合進當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
HAProxy做數據庫讀寫分離,主要是通過限制訪問的端口號來實現,例如訪問5000端口是主數據庫,可讀可寫;訪問5001端口連接的是從數據庫,做只讀查詢。
3.2.??????????Keepalive
通過keepalive 來實現? PostgreSQL 數據庫的主從自動切換,以達到高可用,當主節點宕機時,從節點可自動切換為主節點,繼續對外提供服務,同時為了保證 keepalived 不會出現單點故障,所以keepalived 也搭建主備節點,防止單點故障。
同時,可以使用keepalive虛擬出來的IP進行數據庫訪問,結合HAProxy的讀寫分離功能,進行實現可高可用下的讀寫分離。
4、實施方案目標
4.1.??????????實施方案總體拓撲
4.2.??????????實施方案拓撲說明
技術方案主要目的是:
?? 利用zookeeper將節點做成分布式架構;
?? 將postgresql 數據庫和patroni軟件結合,完成數據庫的主從復制;
?? 利用haproxy進行主庫和從庫的讀寫分離;
?? 利用keepalive做節點間的高可用,并利用虛擬IP地址對外提供服務。
關鍵點是整合上述的各自功能,實現架構可自動切換的高可用功能。上述拓撲實施完成后,主要帶來以下收益:
5、項目實施控制
數據庫系統項目通常都是以循序漸進的方式推進,構建新的數據庫平臺。
6、實施環境準備
為了能讓客戶完成數據庫整合項目,在項目實施前需要具備以下條件:
6.1.??????????主機
由于數據庫整合項目,需要先構建三個數據庫整合平臺,因此必須有9臺主機來建立數據庫平臺:
主機升級改造 | ||||
硬件名稱 | 規格 | 數量 | 說明 | 其他 |
服務器 | CPU:24cpu MEM:64G 硬盤:服務可用存儲空間不低于2T | 3 | 構建基于PG數據庫的高可用平臺 | ?建議五臺服務器,三臺服務器用于做分布式主從復制,兩臺做高可用讀寫分離和VIP |
6.2.??????????存儲
PG數據庫的高可用平臺可以使用本地磁盤空間,也可以單獨掛載高性能存儲設備。如果單獨掛載存儲設備,空間需求如下:
存儲升級改造 | ||||
硬件名稱 | 規格 | 數量 | 說明 | 其他 |
生產存儲 | 10T容量 | 1臺 | 用于生產存儲,存儲可以使用現有存儲設備具體容量和需求以實際為主 | Raid 1+0 10T為可用空間 |
備份存儲 | 20T容量 | 1臺 | 用于備份存儲,備份存儲可以使用現有存儲設備具體容量和需求以實際為主 | Raid 5 |
SAN交換機 | 6口 | 2臺 | 用于搭建san環境 | 如存在,則忽略 |
6.3.??????????軟件系統
如果對于軟件有正版化需求,則需要額外購買正版化的Postgres,linux軟件授權.
操作系統升級改造 | ||||
軟件名稱 | 規格 | 數量 | 說明 | 其他 |
PostgreSQL | 3套 | PG數據庫的高可用平臺 | ||
Patroni | 3套 | PG數據庫的高可用平臺 | ||
zookeeper | 3套 | PG數據庫的高可用平臺 | ||
haproxy | 3套 | PG數據庫的高可用平臺 | ||
keepalive | 3套 | PG數據庫的高可用平臺 | ||
RHEL 7.6 x64 | 企業版 | 3套 | 用于PG數據庫的高可用平臺操作系統 | |
6.4.??????????IP地址
實施過程中,對應很多軟件都是開源的,安裝相對繁瑣復雜,因此建議打開互聯網連接,能夠和對應的安裝源通信。
資源升級改造 | ||||
軟件名稱 | 規格 | 數量 | 說明 | 其他 |
公有IP地址 | 生產段 | 3 | 用于PG數據庫的高可用平臺公用IP,日常管理 | 開放5432關口 |
虛擬IP地址 | 生產段 | 1 | 用于PG數據庫的高可用平臺虛擬IP,集群高可用 | 開放5000和5001端口 |
7、實施方案
7.1.??????????規劃
7.1.1.???? 軟件版本
POSTGRES數據庫集中平臺: | |
????????????? 項目 | 版本 |
操作系統 | Redhat Linux ?AS 7.6 64bit |
數據庫軟件版本 | PostgreSQL ?11.7 |
7.1.2.???? 存儲規劃
生產存儲數據庫部分存儲容量規劃如下:
數據庫名 | raid級別 | LUN | 可用容量(GB) | 用途 |
TWXPDS | 隨操作系統 | LUN1:100G | 1T | 主要用于數據庫存儲, 暫時分配1T空間,Linux LVM方式,方便后面空的動態擴展 |
備份存儲容量規劃如下:
系統名稱 | raid級別 | LUN | 可用容量(GB) | 用途 |
TWXPDS | 隨操作系統 | LUN2:600G | 600G | 主要用于數據庫備份,暫時分配600G空間,Linux LVM方式,方便后面空的動態擴展 |
WALS歸檔存儲容量規劃如下:
數據庫名 | raid級別 | LUN | 可用容量(GB) | 用途 |
TWXPDS | 隨操作系統 | LUN3:300G | 300G | 主要用于WALS歸檔,暫時分配300G空間,Linux LVM方式,方便后面空的動態擴展 |
7.1.3.???? 數據庫命名約定
POSTGRES數據庫集中平臺: | |
項目 | 取值 |
群集名 | pg_micky |
主機名 | micky1、micky2、micky3 |
數據庫名 | TWXPDS |
字符集 | UTF8 |
參數要求 | max_connections: ?500 shared_buffers: ?16000MB work_mem: ?32MB maintenance_work_mem: ?512MB synchronous_commit: ?on max_wal_size: ?1GB min_wal_size: ?80MB listen_addresses: ?'*' port: 5432 |
安裝組 | groupadd -g ?1000 postgres |
安裝用戶 | useradd -u 1000 -g postgres postgres |
軟件目錄 | mkdir ?-p /pgdata/data mkdir ?-p /backup mkdir ?-p /archive_wals mkdir ?-p /scripts chown ?-R postgres.postgres /backup chown ?-R postgres.postgres /archive_wals chown ?-R postgres.postgres /scripts chown ?-R postgres.postgres /pgdata/data |
表空間命名 | TWXPDS |
7.1.4.???? 數據庫網絡規劃
項目 | 取值 |
PUB IP | 192.168.24.140.X/255.255.254.0 |
VIP | 192.168.140.X |
網關 | 192.168.140.1 |
監聽端口 | 5432 |
7.2.??????????數據庫集中平臺創建
7.2.1.???? 基礎環境準備
1)?創建用戶、組
以root身份運行以下命令:
groupadd -g 1001 postgres
useradd -u 1000 -g postgres postgres
設置postgres賬戶的密碼:
passwd postgres
Changing password for user postgres.
New UNIX password: password
retype new UNIX password: password
passwd: all authentication tokens updatedsuccessfully.
2)? IP規劃(具體以實際為準)
127.0.0.1??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.140.74??micky1
192.168.140.75? micky2
192.168.140.76??micky3
3)? 創建相關目錄
數據庫存放位置:
mkdir -p /pgdata/data
---存放pg數據庫
mkdir -p /backup
---備份pg數據庫
mkdir -p /archive_wals
---WALS歸檔
mkdir -p /scripts
---特殊腳本部署位置
授權給psotgres賬戶:
?chown -R postgres.postgres/backup
chown -R postgres.postgres /archive_wals
chown -R postgres.postgres /scripts
chown -R postgres.postgres /pgdata/data
chown -R postgres:postgres /usr/local/postgresql
4)? 共享存儲規劃(以實際需求為準):
/dev/mapper/pgbackup-pgbackup: 645.3 GB
/dev/mapper/pgdata-pgdata: 1099.5 GB
/dev/mapper/pgwals-pgwals: 322.1 GB
5)? LVM相關操作
[root@micky1 ~]# vgcreate pgdata /dev/sdb2
? Volume group"pgdata" successfully created
[root@micky1 ~]# vgcreate pgwals /dev/sdb3
? Volume group"pgwals" successfully created
[root@micky1 ~]# vgcreate pgbackup/dev/sdb4
? Volume group"pgbackup" successfully created
[root@micky1 ~]# lvcreate -l 100%VG -npgdata pgdata
? Logicalvolume "pgdata" created.
[root@micky1 ~]# lvcreate -l 100%VG -npgwals pgwals
? Logicalvolume "pgwals" created.
[root@micky1 ~]# lvcreate -l 100%VG -npgbackup pgbackup
? Logicalvolume "pgbackup" created.
、
6)? 創建用戶Profile
創建 所有 用戶環境文件:
export PATH=/usr/local/postgresql/bin:$PATH
exportLD_LIBRARY_PATH=/usr/local/postgresql/lib:$LD_LIBRARY_PATH
export ZKHOME=/u01/apache-zookeeper-3.6.1
PATH=$PATH:$HOME/bin:$ZKHOME/bin
創建 postgres 用戶環境文件:
export PGHOME=/usr/local/postgresql
export PGDATA=/pgdata/data
7)? 安全設置
關閉防火墻:
[root@micky3 ~]# systemctl stop firewalld.service
[root@micky3 ~]# systemctl disablefirewalld.service
設置SELinux:
[root@micky3 ~]# vi /etc/selinux/config
# This file controls the state of SELinux on thesystem.
# SELINUX= can take one of these three values:
#????enforcing - SELinux security policy is enforced.
#????permissive - SELinux prints warnings instead of enforcing.
#???? disabled- No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#???? targeted- Targeted processes are protected,
#???? minimum- Modification of targeted policy. Only selected processes are protected.
#???? mls -Multi Level Security protection.
SELINUXTYPE=targeted
8)? 安裝依賴包
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install? libffi-devel
wget -chttps://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
cd Python-3.8.2
./configure --with-ssl
make && make install
創建Python軟連接:
rm -f /usr/bin/python
ln -s /usr/local/bin/python3 /usr/bin/python
7.2.2.???? 軟件安裝
tarzxvf postgresql-11.7.tar.gz
cdpostgresql-11.7
./configure--prefix=/usr/local/postgresql
#編譯安裝
makeworld && make install-world
……
make[2]:Leaving directory `/root/postgresql-11.7/contrib/unaccent'
make-C vacuumlo install
make[2]:Entering directory `/root/postgresql-11.7/contrib/vacuumlo'
/usr/bin/mkdir-p '/usr/local/postgresql/bin'
/usr/bin/install-c? vacuumlo '/usr/local/postgresql/bin'
make[2]:Leaving directory `/root/postgresql-11.7/contrib/vacuumlo'
make[1]:Leaving directory `/root/postgresql-11.7/contrib'
PostgreSQL,contrib, and documentation installation complete.
7.2.3.???? 初始化數據庫
Step1初始化并啟動數據庫
#初始化數據庫
initdb-D /pgdata/data
?#啟動服務
pg_ctl-D /pgdata/data -l /pgdata/data/logfile start
Step2修改參數并重啟數據庫
#修改postgresql.conf 文件
vi/pgdata/data/postgresql.conf
#修改為如下:
listen_addresses= '*'
port =5432
#--------------------允許遠程連接---------------------------
#修改客戶端認證配置文件pg_hba.conf,將需要遠程訪問數據庫的IP地址或地址段加入該文件
vi/pgdata/data/pg_hba.conf
#在文件的最下方加上下面的這句話(出于安全考慮,不建議這樣配置)
host??? all????????all???????? 0.0.0.0/0???????????? trust
host??????????? replication??????????? repuser??????????? 192.168.140.74/32??????????? md5
host??????????? replication??????????? repuser??????????? 192.168.140.75/32? ??????????md5
host??????????? replication??????????? repuser??????????? 192.168.140.76/32??????????? md5
pg_ctl-D /pgdata/data -l /pgdata/data/logfile stop
pg_ctl-D /pgdata/data -l /pgdata/data/logfile start
7.2.4.???? 配置主從同步
Step1主庫創建Replication專有用戶
?主庫創建Replication專有用戶
CREATEUSER repuser REPLICATION ENCRYPTED PASSWORD 'postgres';
Step2配置主庫postgresql.conf參數
altersystem set wal_level = replica;
altersystem set archive_mode = on;
altersystem set archive_command = '/bin/true';
altersystem set max_wal_senders = 10;
altersystem set wal_keep_segments = 512;
altersystem set hot_standby = on;
altersystem set synchronous_commit = on;
altersystem set synchronous_standby_names = 'pg_micky01,pg_micky02,pg_micky03'; srvctlstart alter system set archive_timeout = '30s';
altersystem set archive_command = 'cp %p /archive_wals/%f';
重啟數據庫:
pg_ctl-D /pgdata/data -l /pgdata/data/logfile stop
pg_ctl-D /pgdata/data -l /pgdata/data/logfile start
Step3備庫上使用pg_basebackup從主庫同步數據
?[postgres@micky2 data]$ pg_basebackup -D /pgdata/data-Fp -Xs -v -P -h 192.168.140.74 -p 5432 -U repuser
Password:
pg_basebackup:initiating base backup, waiting for checkpoint to complete
pg_basebackup:checkpoint completed
pg_basebackup:write-ahead log start point: 0/2000060 on timeline 1
pg_basebackup:starting background WAL receiver
pg_basebackup:created temporary replication slot "pg_basebackup_81452"
23831/23831kB (100%), 1/1 tablespace?????????????????????????????? ??????????
pg_basebackup:write-ahead log end point: 0/2000130
pg_basebackup:waiting for background process to finish streaming ...
pg_basebackup:base backup completed
Step4配置備庫recovery.conf
cp/usr/local/postgresql/share/recovery.conf.sample /pgdata/data/recovery.conf
vi/pgdata/data/recovery.conf
#節點micky2
recovery_target_timeline= 'latest'
standby_mode= on
primary_conninfo= 'host=192.168.140.74 port=5432 user=repuser password=postgresapplication_name=pg_atj02'
#節點micky3
recovery_target_timeline= 'latest'
standby_mode= on
primary_conninfo= 'host=192.168.140.74 port=5432 user=repuser password=postgresapplication_name=pg_atj03'
重啟備庫
pg_ctl-D /pgdata/data -l /pgdata/data/logfile stop
pg_ctl-D /pgdata/data -l /pgdata/data/logfile start
Step5查看配置是否生效
postgres=#SELECT usename,application_name,client_addr,sync_state FROM pg_stat_replication;
?usename | application_name |? client_addr?| sync_state
---------+------------------+---------------+------------
?repuser | pg_micky02???????? | 192.168.140.74 | sync
?repuser | pg_micky03???????? | 192.168.140.75 | potential
(2rows)
Step6插入數據查看同步情況
#創建測試數據庫
createdatabase micky;
?#切換到micky 數據庫
\cmicky
?#創建測試表
createtable micky (id integer, name text);
?#插入測試數據
insertinto micky values (1,'micky');
?#選擇數據
select* from micky ;
備庫查詢:
micky=# select * frommicky ;
?id | name
----+-------
? 1 | micky
(1 row)
總結
以上是生活随笔為你收集整理的c++获取可用端口号_PG高可用架构实施方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配一副眼镜多少钱啊?
- 下一篇: 做二代试管婴儿的成功率有多少