阿里雲Polardb國產資料庫高可用部署實踐

jaymarco發表於2020-10-20

一、背景介紹

自從阿里於2010年發動了IOE運動,2013年因美國一起安全事件,將去IOE重要性重新推上另一個高度。政府部門、銀行、電信行業、製造業等各類企業紛紛進行各自的去IOE試點。近些年國內資料庫軟體越來越成熟,資料庫國產化成了熱門話題。企業都開始選擇成熟國產資料庫軟體來國產化,讓自己的業務資料庫不再對現有的資料庫軟體有更強的依賴性。

    本次某省移動資訊科技部門挑選了一個業務系統做國產化資料庫試點上線,最終選用了高度相容Oracle的阿里雲Polardb-O資料庫。此次國產化試點上線本人有幸重度參與專案其中。接下來的分享會為各位讀者精心挑選阿里雲Polardb-O資料庫運維場景並續集的形式來介紹, 高可用部署、軟體版本升級、功能維護性測試、高可用測試、日常巡檢、效能監控、應急演練、應急保障、備庫與恢復、備份策略、Polardb常見問題等常見場景。

二、資料庫系統規劃

 本方案高可用部署採用阿里雲Poardb-O 11.2版本部署搭建1主1備高可用叢集。主備節點之間採用流複製將pg_wal日誌檔案進行主備資料庫實時同步,確保主從節點資料一致性。同時透過 Cluster Mangaer叢集管控軟體來管理主從資料庫節點,實現主備庫之間能自動與手動切換,確保主備資料庫切換資料不丟失情況,還能提供資料庫高可用服務。

2.1 主機資訊

2.2 網路卡配置需求

 考慮到備份、高可用方面的需要,建議萬兆網及以上。

2.3 架構圖

2.4 安裝部署規劃

三、 基礎軟體部署

3.1 環境準備

1 關閉OS透明大頁

# 透過引數關閉大頁

echo never >   /sys/kernel/mm/transparent_hugepage/enabled

echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'   >> /etc/rc.d/rc.local

# 驗證是否關閉了透明大頁

grep HugePages_Total  /proc/meminfo

cat /proc/sys/vm/nr_hugepages

2 核心引數調優

修改核心引數誰的 /etc/sysctl.conf ,增加以下內容後,執行 sudo sysctl -p 生效。

vm.dirty_expire_centisecs=3000

net.ipv4.tcp_synack_retries=2

net.core.rmem_default=262144

vm.dirty_background_bytes=409600000

net.core.wmem_default=262144

vm.mmap_min_addr=65536

vm.overcommit_ratio=90

kernel.shmmni=819200

net.core.rmem_max=4194304

vm.dirty_writeback_centisecs=100

fs.file-max=76724600

net.core.somaxconn=4096

fs.aio-max-nr=1048576

net.ipv4.tcp_max_tw_buckets=262144

vm.swappiness=0

fs.nr_open=20480000

net.ipv4.tcp_fin_timeout=5

net.ipv4.ip_local_port_range=40000   65535

net.ipv4.tcp_keepalive_probes=3

net.ipv4.tcp_mem=8388608   12582912 16777216

kernel.shmmax = 329853488332

kernel.shmall=80530636

kernel.shmmni =   4096

kernel.msgmax =   65536

kernel.msgmni =   2005

kernel.msgmnb =   65536

kernel.sem=4096   2147483647 2147483646 512000

net.ipv4.tcp_keepalive_intvl=20

net.ipv4.tcp_keepalive_time=60

vm.overcommit_memory=0

net.ipv4.tcp_syncookies=1

net.ipv4.tcp_max_syn_backlog=4096

net.ipv4.tcp_timestamps=1

net.ipv4.tcp_rmem=8192   87380 16777216

net.ipv4.tcp_wmem=8192   65536 16777216

net.core.wmem_max=4194304

vm.dirty_ratio=80

net.core.netdev_max_backlog=10000

vm.zone_reclaim_mode=0

net.ipv4.tcp_tw_reuse=1

vm.nr_hugepages=192000

vm.nr_overcommit_hugepages=1000000

vm.overcommit_memory   = 2

  建立 /etc/security/limits.d/polardb_limits.conf ,內容如下:

* soft nofile 655360

* hard nofile   655360

* soft nproc 655360

* hard nproc 655360

* soft memlock   unlimited

* hard memlock   unlimited

* soft core   unlimited

* hard core   unlimited

3 關閉防火牆和selinux

-- 關閉防火牆

systemctl stop   firewalld

systemctl disable   firewalld

-- 關閉 selinux

vi /etc/selinux/config

SELINUX=disabled               -- 修改為disabled

4 建立polardb使用者和組

groupadd   polardb;useradd -g polardb polardb

echo " 密碼 " | passwd polardb --stdin

5 設定polardb使用者使用sudo許可權

1 先檢視系統是否安裝sudo,可以使用命令 rpm -qa sudo 檢視,若沒有安裝,可以使用yum安裝  yum -y install sudo 

#rpm -qa sudo

sudo-1.8.6p7-16.el7.x86_64

2、把polardb使用者加入wheel組,加入此組才有sudo許可權

#usermod   -aG wheel polardb

# id polardb

uid=1002(polardb) gid=1005(polardb)   groups=1005(polardb),10(wheel)

 3 、把如下 polardb使用者加入配置檔案/etc/sudoers

polardb         ALL=(ALL)       NOPASSWD: ALL

4 、遠端sudo ssh 開啟( 這一項特別注意不操作會影響後面節點加入 CM

sudo sed   -i   's/Defaults    requiretty/#Defaults    requiretty/g'   /etc/sudoers

sudo cat /etc/sudoers | grep requiretty

3.2 安裝polardb軟體

這裡軟體包是用 rpm 二進位制方式安裝

s udo rpm -ivh   t-polarstore-pfsd-san-1.1.41-20200830160257.alios7.x86_64.rpm

sudo rpm -ivh    PolarDB-O-0200-2.0.0-20200902034114.alios7.x86_64.rpm

3.3 配置polardb使用者環境變數

polardb 使用者配置環境變數,切換 polardb 使用者,在 .bash_profile 檔案中新增如下內容,最後使用命令 source .bash_profile 生效環境變數。

 

3.4 安裝與配置PFS軟體

    PFS 檔案系統用於儲存 Polardb-O 資料庫資料,本方案提供了四塊 sd* 裸盤,採集 LVM 磁碟管理方式來管理這 4 塊盤,後續磁碟擴容直接使用 LVM 擴容,建立邏輯卷方式用於 PFS 磁碟配置。這裡詳細描述如何裸盤如何採用 LVM 來建立邏輯卷,詳細配置過程請參考方案《 Polardb-O linux LVM 邏輯卷管理配置》。 這裡以建立好的邏輯卷 /vda/data 為例來配置 PFS 檔案系統。配置安裝 PFS 時需要佔用名稱為 $PFSDISK 的裝置。在安裝過程中過程中會格式化該裝置,如果 /dev/$PFSDISK 已經掛載過了,要 umount 該裝置。依次執行以下命令進行初始化:

1.          polardb 使用者登入,執行以下命令,格式化 $PFSDISK 裝置

sudo   /usr/local/bin/pfs -C disk mkfs -u 30 -l 1073741824 -f $PFSDISK

2.          等待一段時間,回顯輸出 pfs mkfs succeeds! 後,執行以下命令,啟動 PFS 服務

sudo   /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p $PFSDISK

3.          執行以下命令,建立 PFS 的資料庫目錄

sudo   /usr/local/bin/pfs -C disk mkdir $PFSDIR

3.5 配置polardb資料庫

3.5.1 初始化資料庫叢集

PolarDB-O 在資料庫啟動之前需要執行初始化資料庫叢集,請用 polardb 使用者登入,執行如下初始化資料庫命令:

initdb -D $PGDATA -E UTF8 --locale=C -U polardb

3.5.2 初始化PFS資料

如下命令請用 polardb 使用者操作,下面命令用途是將本地 $PGDATA 下面的資料複製到 PFS 磁碟上。後續資料庫載入直接讀寫 PFS 磁碟檔案。

sudo /usr/local/polardb_o_current/bin/polar-initdb.sh $PGDATA/ $PFSDIR/   disk

3.5.3 調整引數檔案

初始化資料庫叢集后,資料庫的引數檔案 postgresql.conf 檔案中都是預設引數,使用者可以根據自身需要進行修改,如下以記憶體 100 規格為例,需要修改的核心配置引數如下:

引數名

引數值

說明

autovacuum_max_workers

8

指定同時執行的 最大的 autovacuum 程式,預設為3 個。

autovacuum_work_mem

8G

每個worker 可使用的最大記憶體數

effective_cache_size

220GB

提供可用於磁碟快取記憶體的記憶體量的估計值

maintenance_work_mem

4GB

用於維護任務的記憶體設定。預設值為64MB

max_connections

36100

資料庫最大連線數

max_parallel_maintenance_workers

16

支援內建的過程使用並行的方式工作,例如建立索引,預設設定為2

max_parallel_workers

32

資料庫允許的最大並行程式數

max_parallel_workers_per_gather

24

支援並行的查詢使用的執行緒數

max_sync_workers_per_subscription

32

每個訂閱者的最大同步模式的工作執行緒數

max_wal_size

128GB

在自動WAL 檢查點使得WAL 增長到最大尺寸。

min_wal_size

64GB

只要WAL 磁碟使用率低於這個設定,舊的WAL 檔案總數被回收,以供將來檢查點使用

shared_buffers

220GB

資料庫服務使用的共享記憶體緩衝區

wal_buffers

16MB

將其WAL (預寫日誌)記錄寫入緩衝區,然後將這些緩衝區重新整理到磁碟

work_mem

64MB

每個程式可以使用的工作記憶體空間

特別注意:

如果在修改 Polardb 資料庫引數檔案 postgresql.conf 之前啟動過資料庫,請先確認檔案 $PGDATA/polar_node_static.conf 是否存在,若存在請將其 $PGDATA/polar_node_static.conf 檔案刪除後再啟動資料庫,否則會影響 Polardb-O 資料庫正常啟動。

為了實現其他機器對 PolarDB for O 資料庫的訪問,還需要修改訪問控制檔案,即 pg_hba.conf ,一般是放開所有的 ipv4 的訪問,尾部新增如下配置:

vi $PGDATA/pg_hba.conf

host all all   0.0.0.0/0 md5

host replication   all 0.0.0.0/0 md5

3.5.4 啟停資料庫軟體

在修改完配置檔案之後, polardb 使用者可以執行命令如下,啟動資料庫:

pg_ctl start -D $PGDATA

pg_ctl stop -D   $PGDATA

3.6 檢查資料庫安裝

3.6.1 資料庫檢查

資料庫啟動之後,使用 polardb 使用者可以透過 PolarDB-O 核心二進位制包中自帶的 psql 客戶端進行連通測試,執行如下命令:

psql -h$PGDATA -p$PGPOR T   -c “select 1”

psql -h$PGDATA   -p$PGPORT -c"select version()"

 3.6.2 服務程式檢查

資料庫啟動成功之後,會在資料庫目錄下生成一個 postmaster.pid ,其中第一行是 PolarDB forO 守護程式 pid ,使用者可以透過 ps -a|grep 守護程式 pid 檢查 PolarDB-O 程式情況,如需要檢查 polar-postgres logger checkpoin ter walwriter autovacuum 等程式

四、Polardb主備高可用部署安裝

4.1 初始化主節點

初化主節點需要進行如下操作:

主庫初始化操作需要完成以上第三章節的3.2~3.6章節內容。

4.2 建立主庫流複製賬號

使用 polardb 使用者可以透過 psql 客戶端建立流複製使用者

psql -h$PGDATA -p$PGPORT -c"create user  replicator  password ' 密碼 ' superuser; "

4.3 備庫初始化

初化化備節點需要進行如下操作:

1、對軟硬體環境進行安裝配置,請完成第3章節,3.1環境準備、3.2polardb-O資料庫軟體安裝、3.3配置使用者環境、3.4配置安裝PFS。

2、在備份執行pg_basebackup命令,使用主庫資料目錄和PFS初始化備庫資料目錄。(注意$PGDATA目錄不能提前建立,只建立字首目錄/app)

polar_basebackup -h< 主庫 IP> -p5432 -U replicator -D $PGDATA   --polardata=$PFSDIR --polar_storage_cluster_name=disk   --polar_disk_name=$PFSDISK --polar_host_id=2 -X stream --progress   --write-recovery-conf -v

3、修改備庫postgresql.conf檔案中的引數 $PFSDISK 替換成 PFS 實際檔案目錄, $PFSIR 替換成實際的裝置盤名稱

polar_hostid = 2

polar_disk_name =   $PFSDISK

polar_datadir =   $PFSDIR

polar_storage_cluster_name   = 'disk'

4、 啟動和檢查備庫節

啟動與檢查備節點可驗證資料庫是否連線成功。具體操作如下:

pg_ctl -c start -D $PGDATA

psql -h$PGDATA   -p$PGPORT

如果能連通,則證明資料庫安裝成功,並且啟動成功。

4.4 檢查主庫流複製狀態

備節點啟動之後,可使用psql 連線主節點,檢查流複製狀態。在主庫使用如下sql 確認流複製建立成功:

psql -h$PGDATA -p$PGPORT -c"select * from   pg_stat_replication;"

如果看到standby1 節點建立的流複製節點,則說明主備搭建成功。

4.5 cluster manager 叢集管控部署

4.5.1 CM主機初始化配置

  安裝 CM 軟體前需要對 CM 主機程式作業系統預配置準備,請參考第 章節,配置完成 3.1 小節下面的環境準備。

4.5.2 叢集節點主機互信關係建立

CM 需要遠端管理主備節點,需要打通CM 到主備兩臺主機之間戶型關係。這裡統一用polardb 使用者來建立戶信關係,polardb 使用者執行如下命令

ssh-keygen -t rsa

ssh-copy-id -i   ~/.ssh/id_rsa.pub  polardb 節點 1

ssh-copy-id -i   ~/.ssh/id_rsa.pub  polardb 節點 2

# 測試互信關係是否配置好,執行如下命令不需要輸密碼,說明互信已打通。

ssh polardb 節點 1 date;ssh polardb 節點 2 date;

4.5.3  CM軟體安裝

cm 節點上安裝cluster_manager ,如下所示:

rpm -ivh polardb_cluster_manager-1.0.0-1.x86_64.rpm

4.5.4 CM服務配置

1 、配置探針使用者

在主庫主機上建立aurora 探測使用者:

/usr /local/polardb_o_current/bin/createuser   -p $PGPORT -h $PGDATA --login

aurora -P -s

# 這裡密碼配置為“ 密碼

2 、建立配置檔案

CM 伺服器上面,使用polardb 使用者建立一個配置目錄

mkdir -p /app/polardb_cluster_manager/ /conf

#polardb_cluster_manager.conf 檔案中新增如下內容:

vi  /app/polardb_cluster_manager/   conf/polardb_cluster_manager.conf

{

"work_mode":"PolarPure",   "consensus":{ "port":5001 },

"account_info":{   "aurora_user":"aurora",   "aurora_password":" 密碼 ",

"replica_user":"replicator",   "replica_password":" 密碼 " },

"cluster_info":{   "port":5000 } }

4.5.5 CM服務管理

1、 啟動服務

CM 主機上使用polardb 使用者啟動CM 服務

/usr/local/polardb_cluster_manager/bin/polardb_cluster_manager_control.py   /app/polardb_cluster_manager start

 2、 停止服務

/usr/local/polardb_cluster_manager/bin/polardb_cluster_manager_control.py   /app/polardb_cluster_manager stop

3、 檢視服務

/usr/local/polardb_cluster_manager/bin/polardb_cluster_manager_control.py   /app/polardb_cluster_manager status

 4.6 CM叢集管理

4.6.1 配置資料庫節點資訊

Cluster Manager 節點將主庫節點加入CM管控

curl -H "Content-Type:application/json" -X POST --data   "{\"user\":\"polardb\",\"dataPath\":\"/app/polardb_data\",\"ip\":\" < 主庫 IP>\",\"port\":\"5432\",\"type\":\"   Master\",\"storage_type\":\"local_ssd\",\"sync\":\"SYNC\"}   "

Cluster Manager 節點將備庫節點加入CM管控

curl -H "Content-Type:application/json" -X POST --data   "{\"user\":\"polardb\",\"dataPath\":\"/app/polardb_data\",\"ip\":\" < IP>\",\"port\":\"5432\",\"type\":\"   Standby \",\"storage_type\":\"local_ssd\",\"sync\":\"SYNC\"}"  

4.6.2 配置HA VIP地址

在高可用方式下,對外提供資料庫伺服器的主機除了有一個真實 IP 外還有一個虛擬 IP ,使用這兩個 IP 都可以連線到該主機,所有專案中資料庫連結配置的都是到虛擬 IP ,當伺服器發生故障無法對外提供服務時,動態將這個虛 IP 切換到備用主機。

curl -H "Content-Type:application/json" -X POST --data   "{\"vip\":\" <VIP 地址 >\",\"mask\":\"255.255.255.0\",\"interface\":\"team0\"}   "

4.6.3 叢集狀態檢查

使用如下命令可以檢查主備庫在活狀態,VIP 漂流具體節點。

curl -H "Content-Type:application/json"


4.6.4 手動切換主從關係

CM 主機上透過如下命令可以完成手動主備切換

curl -H "Content-Type:application/json" -X POST --data   "{\"from\":\" < 主庫 IP>:5432\",\"to\":\"< 備庫 IP>:5432\"}"  

 五、總結

經過此次國產化資料庫專案實踐經驗總結,我們在軟體功能性測試、業務改造和高可用等功能場景上花了很多時間來研究與測試,測試過程中碰到了很多坑,也積累了很多國產化資料庫經驗,避免國產化資料庫新手踩坑,有興趣的朋友可以一起來交流與探討。


有需要的朋友可以關注我的公眾號,文章每日一更

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2728303/,如需轉載,請註明出處,否則將追究法律責任。

相關文章