ด้วย replication คุณคัดลอกข้อมูลจาก database server หนึ่ง คือ source ไปยังอีก server หนึ่ง คือ replica Replication เป็นฟีเจอร์ฐานข้อมูลที่ทรงพลัง ให้ high availability และรองรับ disaster recovery
บทนำ
คุณยังสามารถสร้าง replica servers สำหรับการทดสอบและรายงาน เพื่อลดโหลดบน production Online Transactional Processing (OLTP) databases บทความนี้ช่วยให้คุณเข้าใจประเภท replication ต่างๆ ใน PostgreSQL® และขั้นตอนที่จำเป็นในการ implement streaming replication ของ PostgreSQL database
รายละเอียด Replication
ตอนนี้ถึงเวลาเข้าใจ replication modes, models และ types of replication ใน PostgreSQL และเรียนรู้เกี่ยวกับ write-ahead logging
Asynchronous และ Synchronous Modes
แผนภาพต่อไปนี้แสดง modes ของ PostgreSQL replication:
ใน asynchronous replication source server ไม่ต้องรอ transaction-completion acknowledgment จาก replica server replication transactions คิวขึ้นบน replica server และทั้งสอง servers สามารถอยู่ out-of-sync ได้เป็นเวลาที่ระบุจนกว่าการประมวลผลจะเสร็จสิ้น
ใน synchronous mode replication source server รอ acknowledgment จาก replica server หรือ servers ว่าแต่ละ replication transaction เสร็จสิ้นก่อนจะดำเนินต่อ ทั้ง source และ replica servers ต้องพร้อมใช้งานตลอดเวลา หากได้รับ transaction-failed message จาก replica source server จะ roll back transaction นั้น ในโหมด replication นี้ source และ replica servers จะ in sync เสมอ ข้อเสียคือถ้า replica server ล้มหรือไม่สามารถทำ transaction ให้เสร็จ source server จะเข้า hung state
Single- และ Multi-source Replication Models
ด้วย Single-source replication คุณมี source server เพียงหนึ่ง และ replica servers หนึ่งหรือมากกว่า Source ส่ง replication transactions ไปยัง replicas ทั้งหมด
Replica servers สามารถรับการเปลี่ยนแปลงได้เฉพาะจาก source server หากพวกเขาได้รับการเปลี่ยนแปลงจาก non-source server replicas จะไม่ replicate transactions กลับไปที่ source
ใน Multi-source replication คุณมี source server มากกว่าหนึ่ง หาก table row เปลี่ยนบน source database หนึ่ง source server นั้นจะ replicate การเปลี่ยนแปลงไปยัง counterpart table rows บน source servers อื่นๆ สำหรับ model นี้ให้สำเร็จ คุณต้องใช้ conflict resolution schemes เพื่อป้องกัน duplicate primary keys และปัญหาอื่นๆ
Types of Replication (ประเภทของ Replication)
มี replication 3 ประเภท:
- Streaming Replication: PostgreSQL ทำให้ replication ประเภทนี้พร้อมใช้งานตั้งแต่ version 9 ขึ้นไป Replicas พร้อมใช้งานสำหรับ run-only select queries ข้อกำหนดหลักสำหรับประเภทนี้คือ source และ replica databases ต้องเป็น major version เดียวกัน
- Cascading replication: นำเข้ามาใน PostgreSQL 9.2 ประเภท replication นี้อนุญาตให้คุณ replicate จาก standby server แทนที่จะโดยตรงจาก source server สามารถลดโหลดบน source server ได้
- Logical replication: คุณสามารถใช้ประเภทนี้เพื่อ replicate selected data set หรือ database object หรือ replicate ระหว่าง major versions ต่างๆ ของ PostgreSQL ใน logical replication คุณสามารถใช้ standby server สำหรับ writes ได้ แต่มีข้อจำกัด ไม่สามารถ replicate Truncate, large objects เช่น (lob, blob, clob), sequences, schemas และ DDL ได้
Write-Ahead Logging (WAL)
ก่อนที่คุณจะเริ่มใช้ streaming replication คุณควรเข้าใจ write-ahead logging (WAL) และวิธีการทำงาน
ใน PostgreSQL ระบบจะบันทึกการเปลี่ยนแปลงใดๆ ที่ทำไปยัง database ใน log file ก่อน จึงบันทึกใน data file และการเปลี่ยนแปลงเหล่านี้เรียกว่า WAL records ทุก WAL record มีหมายเลขเฉพาะตัวเรียกว่า log sequence number (LSN)
ด้วย streaming replication ใน PostgreSQL replica database server ใช้ WAL file เพื่อ replicate การเปลี่ยนแปลงบน source database server
มี 3 mandatory processes ที่เล่นบทบาทสำคัญใน streaming replication บน PostgreSQL database:
- WAL sender
- WAL receiver
- Startup
WAL sender process รันบน source server ในขณะที่ WAL receiver และ startup processes รันบน replica server เมื่อคุณเริ่ม replication เหตุการณ์ต่อไปนี้จะเกิดขึ้น:
- WAL receiver process ส่ง LSN จนกว่า replica จะ replay WAL data ไปยัง master
- WAL sender process บน source ส่ง WAL data ไปยัง replica จนกว่าจะถึง latest LSN ที่ส่งโดย WAL receiver
- ต่อมา WAL receiver เขียน WAL data ที่ส่งโดย WAL sender ไปยัง WAL segments
- Startup process บน replica replay ข้อมูลที่เขียนไปยัง WAL segment
- สุดท้าย streaming replication เริ่มต้น
Test Case (กรณีทดสอบ)
นี่คือขั้นตอนในการตั้งค่า streaming replication ใน PostgreSQL ระหว่าง source และ replica หนึ่ง:
Step One
ก่อนอื่น เราต้องแน่ใจว่า source และ replica servers ทั้งสองมี passwordless SSH authentication configured แล้ว หากไม่มี เราต้องกำหนดค่าด้วย ssh-keygen
เพื่อเรียนรู้เกี่ยวกับ passwordless SSH configuration ดูที่ https://linuxize.com/post/how-to-setup-passwordless-ssh-login/
Source node 192.168.24.28
Replica node 192.168.24.29
Username `postgres` บน source และ replica ทั้งสอง
Step Two
รันคำสั่งต่อไปนี้บนทั้งสอง servers เพื่อหยุด firewall:
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
Step Three
- บน source server ไปที่ data directory:
cd /var/lib/pgsql/11/data - แก้ไขไฟล์ postgresql.conf และทำการเปลี่ยนแปลงต่อไปนี้:
archive_mode = on archive_command = 'cp %p /var/lib/pgsql/archive/%f' max_wall_senders = 5 wal_keep_segment =32 wal_level = replica listen_addresses = '*' - เพิ่ม replica server IP address entry ใน pg_hba.conf:
host postgres postgres (ip_address)192.168.24.29/32 trust host replication postgres (ip_address)192.168.24.29/32 trust - สำหรับทุกการเปลี่ยนแปลงใน pg_hba.conf reload service:
$ /usr/local/pgsql_11/bin/pg_ctl -D /var/lib/pgsql/11/ reload - สร้าง /var/lib/pgsql/archive/ archive directory หากยังไม่มี
- Restart server เพื่อสะท้อนการเปลี่ยนแปลง
Step Four
บน replica server:
- ไปที่ data directory และหยุด service:
$ /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ stop - ลบทุกอย่างออกจาก data directory บน replica และพยายามเชื่อมต่อกับ source โดยใช้คำสั่งต่อไปนี้:
$ /usr/pgsql-11/bin/psql -h 192.168.24.28 - ถ้าทำงาน ให้เริ่ม base backup จาก replica:
$ cd /var/lib/pgsql/11/data $ /usr/pgsql-11/bin/pg_basebackup -D /var/lib/pgsql/11/data/ -X fetch -h 192.168.24.28 -R -P
คำสั่งเหล่านี้คัดลอกข้อมูลทั้งหมดจาก data directory ของ source database ไปยัง replica data directory และสร้างไฟล์ recovery.conf
Step Five
หลังจาก base backup เสร็จ คุณต้องตรวจสอบไฟล์ recovery.conf เซิร์ฟเวอร์ใดที่มี recovery.conf file ใน data directory เป็น replica server และมีข้อมูลของ source server ทำการแก้ไขต่อไปนี้:
Standby_mode = 'on'
Primary_conninfo = 'user=postgres host=192.168.24.28 port=5432'
ไฟล์ควรปรากฏดังนี้:
$ Vi recovery.conf
Standby_mode = 'on'
Primary_conninfo = 'user=postgres passfile=''/home/postgres/.pgpass'' host=192.168.24.28 port=5432 sslmode=disable sslcompression=0 target_session_attrs=any'
Step Six
ตอนนี้ start server และ validate การเปลี่ยนแปลง:
- ล็อกอิน source:
/usr/local/pgsql_11/bin/psql Postgres=# Postgres=# Select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 1934 usesysid | 26712 usename | postgres application_name | walreceiver client_addr | 192.168.24.29 client_hostname | client_port | 52143 backend_start | 2020-11-07 11:30:31.035614-05 backend_xmin | state | streaming sent_lsn | 0/50000E34 write_lsn | 0/50000E34 flush_lsn | 0/50000E34 replay_lsn | 0/50000E34 write_lag | flush_lag | replay_lag | sync_priority | 0 sync_state | async - ล็อกอิน replica:
/usr/local/pgsql_11/bin/psql Postgres=# Postgres=# Select * from pg_is_in_recovery(); Pg_is_in_recovery ---------------------------------- t - ตรวจสอบด้วย OS-level command จาก source:
$ ps -ef|grep sender postgres 1934 1718 0 11:31 ? 00:00:00 postgres: wal sender process replicator 192.168.24.29(52143) streaming 0/50000E34 - ตรวจสอบด้วย OS-level command จาก replica:
$ ps -ef|grep receiver postgres 1358 1748 0 11:31 ? 00:00:04 postgres: wal receiver process streaming 0/50000E34Sender และ receiver transactions ควรเหมือนกัน และ replica จะอยู่ใน read-only mode เสมอ
- (optional) โดย default replication อยู่ใน asynchronous mode หากต้องการเปลี่ยนเป็น synchronous replication ไปที่ source server และทำการเปลี่ยนแปลงต่อไปนี้ใน postgresql.conf:
synchronous_standby_names='*' inจากนั้น restart services:
$ /usr/local/pgsql_11/bin/pg_ctl -D /var/lib/pgsql/11/ restart
สรุป
บทความนี้อธิบายประเภทของ replication และขั้นตอนในการตั้งค่า streaming replication คุณมักใช้สิ่งนี้ (โดยเฉพาะใน analytics) เพื่อให้ read-only replica เพื่อลดโหลดจาก primary server
มันยังมีประโยชน์หากคุณต้องการ high availability environment หรือ failover ไปยัง hot standby server หาก primary ล้ม
เรียนรู้เพิ่มเติมเกี่ยวกับบริการข้อมูลของเรา
ใช้แท็บ Feedback เพื่อแสดงความคิดเห็นหรือถามคำถาม คุณยังสามารถเริ่มการสนทนากับเราได้