Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

PostgreSQL Replication สำรวจ: High Availability และ Disaster Recovery

ด้วย 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:

PostgreSQL Replication สำรวจ: High Availability และ Disaster Recovery

ใน 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 เหตุการณ์ต่อไปนี้จะเกิดขึ้น:

  1. WAL receiver process ส่ง LSN จนกว่า replica จะ replay WAL data ไปยัง master
  2. WAL sender process บน source ส่ง WAL data ไปยัง replica จนกว่าจะถึง latest LSN ที่ส่งโดย WAL receiver
  3. ต่อมา WAL receiver เขียน WAL data ที่ส่งโดย WAL sender ไปยัง WAL segments
  4. Startup process บน replica replay ข้อมูลที่เขียนไปยัง WAL segment
  5. สุดท้าย 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

  1. บน source server ไปที่ data directory:
    cd /var/lib/pgsql/11/data
  2. แก้ไขไฟล์ 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 = '*'
  3. เพิ่ม 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
  4. สำหรับทุกการเปลี่ยนแปลงใน pg_hba.conf reload service:
    $ /usr/local/pgsql_11/bin/pg_ctl -D /var/lib/pgsql/11/ reload
  5. สร้าง /var/lib/pgsql/archive/ archive directory หากยังไม่มี
  6. Restart server เพื่อสะท้อนการเปลี่ยนแปลง

Step Four

บน replica server:

  1. ไปที่ data directory และหยุด service:
    $ /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ stop
  2. ลบทุกอย่างออกจาก data directory บน replica และพยายามเชื่อมต่อกับ source โดยใช้คำสั่งต่อไปนี้:
    $ /usr/pgsql-11/bin/psql -h 192.168.24.28
  3. ถ้าทำงาน ให้เริ่ม 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 การเปลี่ยนแปลง:

  1. ล็อกอิน 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
  2. ล็อกอิน replica:
    /usr/local/pgsql_11/bin/psql
    Postgres=# Postgres=# Select * from pg_is_in_recovery();
    Pg_is_in_recovery
    ----------------------------------
    t
  3. ตรวจสอบด้วย 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
  4. ตรวจสอบด้วย OS-level command จาก replica:
    $ ps -ef|grep receiver
    postgres 1358 1748 0 11:31 ? 00:00:04 postgres: wal receiver process streaming 0/50000E34

    Sender และ receiver transactions ควรเหมือนกัน และ replica จะอยู่ใน read-only mode เสมอ

  5. (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 เพื่อแสดงความคิดเห็นหรือถามคำถาม คุณยังสามารถเริ่มการสนทนากับเราได้