今天就跟大家聊聊有關(guān)怎么在PostgreSQL中配置一個邏輯復(fù)制功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的章貢網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!PostgreSQL 安裝環(huán)境可見之前的搭建環(huán)境教程
分別在3臺服務(wù)器 pg_hba.conf 配置文件新增
host all all 10.10.56.0/0 md5 host replication all 10.10.56.0/0 trust
允許在 10.10.56.0 同一網(wǎng)段的服務(wù)器所有用戶 進行復(fù)制、連接等操作
分別在 16、17、19 服務(wù)器啟動服務(wù),連接數(shù)據(jù)庫執(zhí)行sql,檢查單個數(shù)據(jù)庫是否為單實例主庫
pocdb=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- f (1 row)
如上查詢是否為備庫 ,f 為表示false,即為主庫,反之 t 為從庫
分別在 16、17、19 單實例數(shù)據(jù)上創(chuàng)建數(shù)據(jù)庫、用戶、分配權(quán)限
postgres@clw-db3:/home/postgres> /opt/pgsql-10/bin/psql -p 5432 postgres psql (10.3) Type "help" for help. postgres=# create database pocdb; CREATE DATABASE pocdb=# CREATE USER l_repl PASSWORD '123456' REPLICATION; CREATE ROLE
在 16、17 服務(wù)器上分別創(chuàng)建 p 表(即表示各自業(yè)務(wù)的表),并給邏輯復(fù)制的用戶 l_repl 分配權(quán)限。
pocdb=# CREATE TABLE p(id bigint primary key,ival int); CREATE TABLE pocdb=# GRANT ALL ON p TO l_repl; pocdb=# pocdb=# pocdb=# pocdb=# pocdb=# \d+ p Table "public.p" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------+-----------+----------+---------+---------+--------------+------------- id | bigint | | not null | | plain | | ival | integer | | | | plain | | Indexes: "p_pkey" PRIMARY KEY, btree (id)
在 16、17 服務(wù)器上分別創(chuàng)建發(fā)布者,即把自己的 p 表發(fā)布出去,使 訂閱者 可以訂閱
pocdb=# CREATE PUBLICATION p_pub FOR TABLE p WITH (publish = 'insert,update,delete'); CREATE PUBLICATION
在19上創(chuàng)建訂閱者,即分別訂閱 16、17 服務(wù)器各自發(fā)布的表
CREATE SUBSCRIPTION p1_sub CONNECTION 'host=10.10.56.16 port=5432 user=l_repl dbname=pocdb password=123456' PUBLICATION p_pub; CREATE SUBSCRIPTION p2_sub CONNECTION 'host=10.10.56.17 port=5432 user=l_repl dbname=pocdb password=123456' PUBLICATION p_pub;
16 服務(wù)器插入奇數(shù)id 數(shù)據(jù)
pocdb=# INSERT INTO p (id,ival) VALUES (1,1); INSERT 0 1 pocdb=# pocdb=# select * from p; id | ival ----+------ 1 | 1 (1 row)
17 服務(wù)器插入偶數(shù)id數(shù)據(jù)
pocdb=# INSERT INTO p (id,ival) VALUES (2,2); INSERT 0 1 pocdb=# pocdb=#
注 意
在16和17服務(wù)器插入數(shù)據(jù)時,必須主鍵不能沖突,否則會出錯,在實際業(yè)務(wù)中,插入的數(shù)據(jù)主鍵永遠(yuǎn)不會沖突
此處我們在16服務(wù)器插入主鍵為 奇數(shù) 的數(shù)據(jù),17為 偶數(shù) 的數(shù)據(jù)
此時19服務(wù)器查看P表匯總的數(shù)據(jù)
pocdb=# select * from p; id | ival ----+------ 1 | 1 2 | 2 (2 rows)
發(fā)現(xiàn)數(shù)據(jù)已經(jīng)復(fù)制過來,達(dá)到我們需要的需求
背 景
在實際業(yè)務(wù)需求中,我們可能會有一些數(shù)據(jù)字典之類的公共表,即現(xiàn)有A、B、C 獨立的數(shù)據(jù)庫,但是他們都需要共同的字典表 R 表,且R表的入口只能有一個,比如只能在A庫進行寫入,其他庫則需要同步該表,故通過邏輯復(fù)制來實現(xiàn)。
pocdb=# CREATE PUBLICATION r_pub FOR TABLE r WITH (publish = 'insert,update,delete,TRUNCATE'); CREATE PUBLICATION pocdb=#
邏輯復(fù)制不支持 TRUNCATE 級聯(lián)刪除表數(shù)據(jù)
在16、17、19 分別創(chuàng)建 R表
CREATE TABLE R (id bigint ,age int);
配置文件上述已經(jīng)配置,同上,16 發(fā)布 R 表,17 與 19 分別 訂閱16服務(wù)器的R表,即可實現(xiàn)上述業(yè)務(wù)。
補充:PostgreSQL邏輯復(fù)制壓測方案
本次壓力測試過程基于以上
56.16 –> 56.19 監(jiān)控延遲腳本
創(chuàng)建腳本 query_logical_lag.sh,并分配權(quán)限
#!/bin/bash /opt/pgsql-10/bin/psql pocdb< postgres@clw-db2:~> chmod +x query_logical_lag2.sh postgres@clw-db2:~> ls -l total 4 -rwxr-xr-x 1 postgres postgres 218 May 8 16:49 query_logical_lag2.sh56.17 –> 56.19 延遲監(jiān)測腳本
創(chuàng)建腳本 query_logical_lag2.sh
#!/bin/bash /opt/pgsql-10/bin/psql pocdb<分配權(quán)限,不然無法執(zhí)行腳本
postgres@clw-db2:~> chmod +x query_logical_lag2.sh postgres@clw-db2:~> ls -l total 4 -rwxr-xr-x 1 postgres postgres 218 May 8 16:49 query_logical_lag2.sh執(zhí)行監(jiān)控延遲
在16服務(wù)器執(zhí)行:
clw_db1 postgres@clw-db1:~> for i in {1..100000} > do > /home/postgres/query_logical_lag.sh >> /home/postgres/query_logical_lag1 > sleep 5 > done表示:執(zhí)行query_logical_lag.sh腳本 100000次,每執(zhí)行一次等待5s,把查詢結(jié)果記錄到
query_logical_lag1文件
在17服務(wù)器執(zhí)行
clw_db2 crontab -e for i in {1..10000000} do /home/postgres/query_logical_lag.sh >> /home/postgres/query_logical_lag2 sleep 5 done創(chuàng)建sequence,使用sequence保證不同節(jié)點插入的數(shù)值是奇數(shù)或偶數(shù)
56.16
create sequence p_seq1 increment by 2 minvalue 1 maxvalue 100000000000000 cache 50 no cycle; ----cache是否需要調(diào)大56.17 服務(wù)器創(chuàng)建序列
create sequence p_seq1 increment by 2 minvalue 2 maxvalue 100000000000000 cache 50 no cycle;16、17 服務(wù)器分別創(chuàng)建壓測腳本 bench_script_for_insert.sql
\sleep 500ms \set ival random(1, 500000000) INSERT INTO p(id, ival) VALUES (nextval('p_seq1'),:ival);16、17分別執(zhí)行 pgbench 壓測命令
/opt/pgsql-10/bin/pgbench -c 150 -j 120 -T 600 -f /pgdata/10/poc/scripts/bench_script_for_insert.sql pocdbnmon監(jiān)控cpu、內(nèi)存、網(wǎng)絡(luò)
chmod +x /home/super/pgsoft/nmon_x86_64_sles11 /home/super/pgsoft/nmon_x86_64_sles11 -f -c 120 -s 10注:
-f 將結(jié)果存儲在當(dāng)前目錄的文件中,以nmon結(jié)尾,自動生成
-c 總共統(tǒng)計120次
-s 每隔10s統(tǒng)計一次
chmod +x /home/pgsoft/nmon_x86_64_sles11 chmod +x /home/pgsoft/nmon_x86_64_sles11 /home/pgsoft/nmon_x86_64_sles11 -f -c 120 -s 10 /home/super/pgsoft/nmon_x86_64_sles11 -f -c 120 -s 10看完上述內(nèi)容,你們對怎么在PostgreSQL中配置一個邏輯復(fù)制功能有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
當(dāng)前標(biāo)題:怎么在PostgreSQL中配置一個邏輯復(fù)制功能-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://weahome.cn/article/cspcio.html