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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

c++获取可用端口号_PG高可用架构实施方案

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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高可用架构实施方案的全部內容,希望文章能夠幫你解決所遇到的問題。

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