PostgreSQL 邏輯複製外掛 UDR,可以愉快的玩類似MySQL的binlog複製了。
阿新 • • 發佈:2019-02-20
Postgres2015全國使用者大會將於11月20至21日在北京麗亭華苑酒店召開。本次大會嘉賓陣容強大,國內頂級PostgreSQL資料庫專家將悉數到場,並特邀歐洲、俄羅斯、日本、美國等國家和地區的資料庫方面專家助陣:
- Postgres-XC專案的發起人鈴木市一(SUZUKI Koichi)
- Postgres-XL的專案發起人Mason Sharp
- pgpool的作者石井達夫(Tatsuo Ishii)
- PG-Strom的作者海外浩平(Kaigai Kohei)
- Greenplum研發總監姚延棟
- 周正中(德哥), PostgreSQL中國使用者會創始人之一
- 汪洋,平安科技資料庫技術部經理
- ……
2015年度PG大象會報名地址: |
|
PostgreSQL 的流複製素來以高效,實時,穩定著稱;為企業解決了很多問題,例如容災,備份,HA,讀寫分離等等。 但是流複製有一個無法克服的弊端,下游節點只能做到只讀,並且只能複製整個叢集(使用walbouncer可以做到基於表空間或庫級別的物理流複製)。 如果使用者確實有表級或行級的複製需求,我們不得不使用其他手段來實施,例如londiste3, dblink, trigger, bucardo, slony-I等。 這些外掛或工具是基於觸發器的,所以對上游節點的效能影響比較大,而且複製效率一般般。 PostgreSQL社群一直在努力將邏輯複製加入到PG的核心中,同樣使用的是XLOG,從XLOG中解出row,在下游節點回放。有點類似於MySQL的binlog複製方案。 在邏輯複製加入PostgreSQL核心程式碼前(預計9.6的版本可能會加入),使用者可以使用2nd提供的bdr外掛來實現邏輯複製。 如果做單向的複製,使用9.4或以上的PostgreSQL版本即可,而如果要使用雙向複製(多主),則需要使用2nd提供的PostgreSQL版本。 地址: 本文以單向複製為例,即UDR,講解一下這個外掛的使用。 下載外掛,我們需要的是bdr-plugin的穩定分支。 # git clone -b bdr-plugin/REL0_9_STABLE git://git.postgresql.org/git/2ndquadrant_bdr.git bdr-plugin
CREATE TABLE
up=# insert into tb select generate_series(1,100);
INSERT 0100up=# create extension btree_gist;CREATE EXTENSIONup=# create extension bdr;CREATE EXTENSION # 建立測試表,測試資料型別,測試函式,測試檢視 postgres=# \c upYou are now connected to database "up" as user "postgres".up=# create table t1(id int primary key,info text);CREATE TABLEup=# create or replace function f1() returns void as $$ declare begin raise notice '%', now(); end; $$ language plpgsql;CREATE FUNCTIONup=# create view v1 as select count(*) as cnt from t1;CREATE VIEWup=# create type dt as (c1 int,c2 int,c3 int);CREATE TYPEup=# insert into t1 select generate_series(1,100);INSERT 0 100up=# create table t2(id int,c1 dt);CREATE TABLEup=# insert into t2 values (1,'(1,1,1)');INSERT 0 1up=# insert into t2 values (2,'(1,1,1)');INSERT 0 1up=# insert into t2 values (2,'(1,1,1)');INSERT 0 1up=# insert into t2 values (2,'(1,1,1)');INSERT 0 1up=# insert into t2 values (2,'(1,1,1)');INSERT 0 1 建立bdr擴充套件後,新建的表會自動新增TRUNCATE觸發器 up=# \d t1 Table "public.t1" Column | Type | Modifiers --------+---------+----------- id | integer | not null info | text | Indexes: "t1_pkey" PRIMARY KEY, btree (id)Triggers: truncate_trigger AFTER TRUNCATE ON t1 FOR EACH STATEMENT EXECUTE PROCEDURE bdr.queue_truncate() # 建立下游節點的資料庫down,同時也在這個資料庫中建立bdr擴充套件。 postgres@digoal-> psql -h 127.0.0.1-p 1922psql(9.4.4)Type"help"for help.postgres=# create database down;CREATE DATABASEpostgres=# \c downYou are now connected to database "down" as user "postgres".down=# create extension btree_gist;CREATE EXTENSIONdown=# create extension bdr;CREATE EXTENSIONdown=# create database up; -- 務必建立哦 為什麼在下游節點還需要建立一個up庫(雖然我們不是將資料訂閱到up庫),但是沒有這個庫,還原會報錯,例如: 這顯然是個BUG。 Dumping remote database "hostaddr=127.0.0.1 port=1921 dbname=up user=postgres fallback_application_name='bdr (6203675445083668497,1,16385,): init_replica dump'"with1 concurrent workers to "pg_bdr_temp_dump_dir/postgres-bdr-000C837A-1.8393"Restoringdump to local DB "hostaddr=127.0.0.1 port=1922 dbname=down user=postgres fallback_application_name='bdr (6203675445083668497,1,16385,): init_replica restore' options='-c bdr.do_not_replicate=on -c bdr.permit_unsafe_ddl_commands=on -c bdr.skip_ddl_replication=on -c bdr.skip_ddl_locking=on'"with1 concurrent workers from"pg_bdr_temp_dump_dir/postgres-bdr-000C837A-1.8393"pg_restore:[archiver (db)]Errorwhile PROCESSING TOC:pg_restore:[archiver (db)]Errorfrom TOC entry 3265;1262