亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

postgreSQL主從復制

發布時間:2020-02-25 08:43:04 來源:網絡 閱讀:375 作者:九月朦朧 欄目:數據庫

一、簡介

postgres在9.0之后引入了主從的流復制機制,所謂流復制,就是從服務器通過tcp流從主服務器中同步相應的數據。這樣當主服務器數據丟失時從服務器中仍有備份。
與基于文件日志傳送相比,流復制允許保持從服務器更新。 從服務器連接主服務器,其產生的流WAL記錄到從服務器, 而不需要等待主服務器寫完WAL文件。
PostgreSQL流復制默認是異步的。在主服務器上提交事務和從服務器上變化可見之間有一個小的延遲,這個延遲遠小于基于文件日志傳送,通常1秒能完成。如果主服務器突然崩潰,可能會有少量數據丟失。
同步復制必須等主服務器和從服務器都寫完WAL后才能提交事務。這樣在一定程度上會增加事務的響應時間。
注意:本次實驗是基于docker完成的

二、postgresql安裝

docker pull postgresql:9.4
docker images
REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
docker.io/postgres                                       9.4                 36726735dc3c        2 weeks ago         206 MB
docker run -it --name postgresql postgres:9.4 bash
su postgres
cd /usr/lib/postgresql/9.4/bin

存在/var/lib/postgresql/data目錄,初始化數據庫

./initdb -D /var/lib/postgresql/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

        ./postgres -D /var/lib/postgresql/data
or
        ./pg_ctl -D /var/lib/postgresql/data -l logfile start

到這里pg數據庫就安裝完成了
開啟數據庫,如果不需要日志可以不用加logfile

./pg_ctl start -D /var/lib/postgresql/data

同樣啟動一個備數據庫

docker run -it --name postgresql2 postgres:9.4 bash

步驟與上面相同

三、主服務器的操作

主服務器為172.18.0.4
先創建一個新目錄,用來歸檔日志,我這里其實沒有歸檔日志,按需所求。

mkdir /opt/pgsql/pg_archive

1.首先需要創建一個數據庫用戶進行主從同步。創建用戶replica,并賦予登錄和復制的權限。

postgres# CREATE ROLE replica login replication encrypted password 'replica'

2.修改pg_hba.conf,允許replica用戶來同步。
在pg_hba.conf里增加兩行:

host all all 172.18.0.5/32 trust #允許0.5連接到主服務器
host replication replica 172.18.0.5/32 md5 #允許0.5使用replica用戶來復制

這樣,就設置了replica這個用戶可以從172.18.0.4進行流復制請求。
*注:第二個字段必須要填replication
4.修改postgresql.conf

listen_addresses = '*' # 監聽所有IP
archive_mode = on # 允許歸檔
archive_command = 'cp %p /opt/pgsql/pg_archive/%f' # 用該命令來歸檔logfile segment,按需所求。
wal_level = hot_standby
max_wal_senders = 32 # 這個設置了可以最多有幾個流復制連接,差不多有幾個從,就設置幾個,設置稍大些較好。
wal_keep_segments = 256 # 設置流復制保留的最多的xlog數目,一個段為16MB,盡量設置大的值,防止主庫生成日志太快還沒來得及發送給hot_standy就被覆蓋。
wal_sender_timeout = 60s # 設置流復制主機發送數據的超時時間
max_connections = 100 # 這個設置要注意下,從庫的max_connections必須要大于主庫的

配置完兩個文件后重啟服務器。

pg_ctl stop -D /var/lib/postgresql/data
pg_ctl start -D /var/lib/postgresql/data

3.測試0.5能否連接0.4數據庫。在0.5上運行如下命令:

psql -h 172.18.0.4 -U postgres

看看是否能進入數據庫。若可以,則正常。

四、從服務器的操作

1.從主節點拷貝數據到從節點

su - postgres
rm -rf /opt/pgsql/data/* #先將data目錄下的數據都清空
pg_basebackup -h 172.18.0.4 -U replica -D /var/lib/postgresql/data -X stream -P # 從0.4拷貝數據到0.5(基礎備份)
mkdir /opt/pgsql/pg_archive

2.配置recovery.conf
復制/usr/share/postgresql/9.4/recovery.conf.sample 到 /var/lib/postgresql/data/recovery.conf

cp /usr/share/postgresql/9.4/recovery.conf.sample /var/lib/postgresql/data/recovery.conf

修改recovery.conf

standby_mode = on # 說明該節點是從服務器
primary_conninfo = 'host=172.18.0.4 port=5432 user=replica password=replica' # 主服務器的信息以及連接的用戶
recovery_target_timeline = 'latest'

3.配置postgresql.conf

wal_level = hot_standby
max_connections = 1000 # 一般查多于寫的應用從庫的最大連接數要比較大
hot_standby = on # 說明這臺機器不僅僅是用于數據歸檔,也用于數據查詢
max_standby_streaming_delay = 30s # 數據流備份的最大延遲時間
wal_receiver_status_interval = 10s # 多久向主報告一次從的狀態,當然從每次數據復制都會向主報告狀態,這里只是設置最長的間隔時間
hot_standby_feedback = on # 如果有錯誤的數據復制,是否向主進行反饋

配置完后重啟從服務器

pg_ctl stop -D /var/lib/postgresql/data
pg_ctl start -D /var/lib/postgresql/data

五、驗證是否部署成功

在主節點數據庫里執行:

select client_addr,sync_state from pg_stat_replication;

結果如下:

postgres=# select client_addr,sync_state from pg_stat_replication;
 client_addr | sync_state 
-------------+------------
 172.18.0.5  | async
(1 row)

postgres=# 

說明0.5是從服務器,在接收流,而且是異步流復制。
此外,還可以分別在主、從節點上運行 ps aux | grep postgres 來查看進程:
主服務器(0.4)上:

ps aux | grep postgres
root 210 0.0 0.0 48508 1548 ? S 06:34 0:00 su postgres
postgres 211 0.0 0.1 19864 2256 ? S 06:34 0:00 bash
postgres 250 0.0 0.9 273940 17632 ? S 06:41 0:00 /usr/lib/postgresql/9.4/bin/postgres -D /var/lib/postgresql/data
postgres 252 0.0 0.2 274044 3800 ? Ss 06:41 0:00 postgres: checkpointer process
postgres 253 0.0 0.1 274072 3216 ? Ss 06:41 0:00 postgres: writer process
postgres 254 0.0 0.3 273940 6108 ? Ss 06:41 0:00 postgres: wal writer process
postgres 255 0.0 0.1 274348 2656 ? Ss 06:41 0:00 postgres: autovacuum launcher process
postgres 256 0.0 0.0 129220 1836 ? Ss 06:41 0:00 postgres: stats collector process
postgres 276 0.0 0.1 274480 3164 ? Ss 06:57 0:00 postgres: wal sender process replica 172.18.0.5(42834) streaming 0/3019C90
postgres 391 0.0 0.0 38296 1752 ? R+ 07:36 0:00 ps aux
postgres 392 0.0 0.0 12772 692 ? S+ 07:36 0:00 grep postgres

可以看到有一個 wal sender 進程。

從服務器(94)上:

ps aux | grep postgres
root 394 0.0 0.0 48508 1548 ? S 06:42 0:00 su postgres
postgres 395 0.0 0.1 19884 2320 ? S 06:42 0:00 bash
postgres 488 0.0 2.3 314268 45052 ? S 06:57 0:00 /usr/lib/postgresql/9.4/bin/postgres -D /var/lib/postgresql/data
postgres 489 0.0 0.2 314452 4904 ? Ss 06:57 0:00 postgres: startup process recovering 000000010000000000000003
postgres 490 0.0 0.1 314388 3524 ? Ss 06:57 0:00 postgres: checkpointer process
postgres 491 0.0 0.1 314268 2956 ? Ss 06:57 0:00 postgres: writer process
postgres 492 0.0 0.0 129220 1848 ? Ss 06:57 0:00 postgres: stats collector process
postgres 493 0.0 0.2 319036 4384 ? Ss 06:57 0:01 postgres: wal receiver process streaming 0/3019C90
postgres 508 0.0 0.0 38296 1756 ? R+ 07:37 0:00 ps aux
postgres 509 0.0 0.0 12772 700 ? S+ 07:37 0:00 grep postgres
可以看到有一個 wal receiver 進程。
至此,PostgreSQL主從流復制安裝部署完成。
在主服務器上插入數據或刪除數據,在從服務器上能看到相應的變化。從服務器上只能查詢,不能插入或刪除。

主上:

postgres=# \c test;
You are now connected to database "test" as user "postgres".
test=# create table company(
test(# id int primary KEY NOT NULL,
test(# name TEXT NOT NULL,
test(# age INT NOT NULL,
test(# address CHAR(50),
test(# salary REAL,
test(# join_date DATE
test(# );
CREATE TABLE
test=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (1, 'Paul', 32, 'California', 20000.00,'2001-07-13');
INSERT 0 1
test=#
test=#
test=# select * from company;
id | name | age | address | salary | join_date
----+------+-----+----------------------------------------------------+--------+------------
1 | Paul | 32 | California | 20000 | 2001-07-13
(1 row)

從上:

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 test      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
(4 rows)

postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# select * from company
test-# ;
 id | name | age |                      address                       | salary | join_date  
----+------+-----+----------------------------------------------------+--------+------------
  1 | Paul |  32 | California                                         |  20000 | 2001-07-13
(1 row)
s

完成!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富川| 淮安市| 唐海县| 永新县| 耿马| 惠水县| 西吉县| 北海市| 南宁市| 宝应县| 武威市| 顺昌县| 大港区| 宜春市| 喜德县| 新巴尔虎右旗| 安陆市| 肥乡县| 衡阳县| 盖州市| 大冶市| 筠连县| 开阳县| 博白县| 通山县| 北碚区| 西峡县| 兴国县| 广州市| 安庆市| 南皮县| 成安县| 紫云| 营山县| 沾化县| 镇江市| 江华| 南阳市| 林西县| 昭通市| 阳新县|