Changes between Initial Version and Version 1 of Phase1_Scaling_Replication


Ignore:
Timestamp:
03/01/26 00:04:28 (3 weeks ago)
Author:
226052
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Phase1_Scaling_Replication

    v1 v1  
     1= Скалирање и репликација на базите на податоци
     2
     3Во овој дел ќе демонстрираме имплементација на физичка streaming репликација на PostgreSQL база на податоци помеѓу два компјутери во локална мрежа.
     4Streaming репликацијата претставува механизам за континуирано пренесување на WAL записи од примарниот сервер до репликата во реално време преку WAL (Write-Ahead Log) записи.
     5PostgreSQL користи Write-Ahead Logging механизам, при што секоја промена во базата (INSERT, UPDATE, DELETE) најпрво се запишува во WAL лог датотеки. Овие WAL записи потоа се испраќаат до репликата, која ги репродуцира (replay) истите операции и на тој начин ја одржува синхронизацијата со примарниот сервер.
     6
     7== Типови на репликација во PostgreSQL
     8
     9PostgreSQL поддржува физичка и логичка репликација.
     10* Физичката репликација создава точна, byte-for-byte копија на примарниот сервер на еден или повеќе standby сервери. Ова се постигнува со континуирано читање и праќање на WAL записи од примарниот сервер до standby серверите, кои ги применуваат промените локално, што е возможно бидејќи WAL содржи детална историја за сите промени направени на базата.
     11* Логичката репликација во PostgreSQL функционира на ниво на SQL операции, при што се реплицираат логички промени како INSERT, UPDATE и DELETE. Таа користи publish–subscribe модел, каде примарниот сервер дефинира publication, а репликата креира subscription за одредени табели. Овој пристап овозможува селективна репликација и поголема флексибилност во споредба со физичката репликација.
     12
     13== Асинхрона и синхрона репликација
     14
     15Streaming репликацијата може да функционира во асинхрон или синхрон режим.
     16* Кај асинхроната репликација, примарниот сервер не чека потврда од репликата за запишаните WAL записи. Трансакцијата се смета за успешно завршена веднаш по запишување во WAL логот на примарниот сервер. Овој пристап овозможува подобри перформанси и помало доцнење, но постои ризик од губење на податоци доколку примарниот сервер падне пред репликата да ги прими сите записи.
     17
     18* Кај синхроната репликација, примарниот сервер чека потврда од репликата пред да ја потврди трансакцијата. Овој режим гарантира целосна конзистентност и нема ризик од губење на податоци, но резултира со поголемо доцнење и намалени перформанси.
     19
     20Во нашиот пример ќе кориситме streaming асинхрона репликација.
     21
     22== Конфигурација на Primary серверот
     23{{{
     24services:
     25  postgres-primary:
     26    image: postgres:18
     27    container_name: postgres-primary
     28    restart: always
     29    environment:
     30      POSTGRES_USER: admin
     31      POSTGRES_PASSWORD: admin
     32      POSTGRES_DB: film_rental
     33    ports:
     34      - "5432:5432"
     35    volumes:
     36      - ./init-schema.sql:/docker-entrypoint-initdb.d/01-schema.sql
     37      - ./insert-data.sql:/docker-entrypoint-initdb.d/02-data.sql
     38      - pg_primary_data:/var/lib/postgresql
     39      - ./pg_hba.conf:/etc/postgresql/pg_hba.conf
     40    command: >
     41      postgres
     42      -c wal_level=replica
     43      -c max_wal_senders=10
     44      -c max_replication_slots=10
     45      -c listen_addresses='*'
     46      -c hba_file=/etc/postgresql/pg_hba.conf
     47
     48volumes:
     49  pg_primary_data:
     50 }}}
     51
     52За примарниот сервер користиме Docker контејнер со PostgreSQL 18.
     53За потребите на репликацијата, најважни се следните параметри:
     54* wal_level=replica - овозможува генерирање на WAL записи потребни за физичка репликација.
     55* max_wal_senders=10 - дозволува до 10 паралелни процеси за испраќање WAL записи кон реплики.
     56* max_replication_slots=10 - овозможува користење replication slots.
     57* listen_addresses='*' - дозволува примање конекции од други машини.
     58* hba_file - дефинира custom pg_hba.conf конфигурација за контролирање на пристапот.
     59
     60== Конфигурација на pg_hba.conf (hba_file)
     61
     62За да може standby серверот да се поврзе кон примарниот сервер и да прима WAL записи, потребно е да се дозволи replication конекција во pg_hba.conf:
     63
     64{{{
     65# TYPE  DATABASE        USER            ADDRESS                 METHOD
     66host    replication     replicator      192.168.1.103/32         md5
     67}}}
     68
     69* host - правилото се однесува на TCP/IP конекции.
     70* replication - правилото важи за replication конекции, а не за нормален пристап до база.
     71* replicator - корисникот кој има REPLICATION привилегија.
     72* 192.168.1.103/32 - IP адресата на standby серверот /32 значи дека е дозволена само таа конкретна машина.
     73* scram-sha-256 - означува дека конекцијата се автентицира со лозинка користејќи SCRAM (Salted Challenge Response Authentication Mechanism) базиран на SHA-256 алгоритам. Лозинката не се испраќа во чист текст, туку се користи криптографски challenge–response механизам.
     74
     75
     76За да може standby серверот да се поврзе и да прима WAL записи од примарниот сервер, потребно е да се креира корисник со REPLICATION привилегија.
     77
     78{{{
     79film_rental=# CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replica_pass';
     80CREATE ROLE
     81}}}
     82
     83== Иницијализација на standby серверот со pg_basebackup
     84
     85За да може standby серверот да започне со streaming репликација, потребно е да се направи иницијална конзистентна копија од примарната база. Ова се постигнува со алатката pg_basebackup, која креира физичка копија од целиот PostgreSQL кластер додека серверот е активен.
     86
     87Командата што се користи е:
     88
     89{{{ pg_basebackup -h 192.168.1.219 -U replicator  -D ./data/18/docker  -P -v -R }}}
     90
     91* -h – IP адреса на примарниот сервер
     92* -U – replication корисник
     93* -D – директориум каде ќе се зачува копијата
     94* -P – прикажува прогрес
     95* -v – verbose режим
     96* -R – автоматски креира standby.signal и конфигурација за поврзување со primary серверот
     97
     98Со ова standby серверот добива конзистентна копија од состојбата на базата во моментот на backup и е подготвен да започне со streaming на WAL записи.
     99
     100{{{
     101pg_basebackup -h 192.168.1.219 -U replicator -D ./data/18/docker -P -v -R
     102Password:
     103pg_basebackup: initiating base backup, waiting for checkpoint to complete
     104pg_basebackup: checkpoint completed
     105pg_basebackup: write-ahead log start point: 0/7000028 on timeline 1
     106pg_basebackup: starting background WAL receiver
     107pg_basebackup: created temporary replication slot "pg_basebackup_284"
     10834297/34297 kB (100%), 1/1 tablespace                                         
     109pg_basebackup: write-ahead log end point: 0/7000120
     110pg_basebackup: waiting for background process to finish streaming ...
     111pg_basebackup: syncing data to disk ...
     112pg_basebackup: renaming backup_manifest.tmp to backup_manifest
     113pg_basebackup: base backup completed
     114}}}
     115
     116По иницијализацијата со pg_basebackup, standby серверот се стартува преку Docker контејнер кој го користи директориумот ./data како PostgreSQL кластер.
     117
     118{{{
     119services:
     120  postgres-replica:
     121    image: postgres:18
     122    container_name: postgres-replica
     123    restart: always
     124    ports:
     125      - "5433:5432"
     126    volumes:
     127      - ./data:/var/lib/postgresql
     128    command: >
     129      postgres
     130      -c hot_standby=on
     131
     132}}}
     133
     134* hot_standby=on - дозволува read-only операции на репликата.
     135
     136Бидејќи во директориумот веќе постои standby.signal датотека, PostgreSQL автоматски стартува во recovery режим и воспоставува streaming конекција кон примарниот сервер.
     137
     138== Верификација на репликацијата
     139
     140На standby серверот може да се провери дали серверот е во recovery режим со следната команда:
     141
     142{{{
     143film_rental=# SELECT pg_is_in_recovery();
     144 pg_is_in_recovery
     145-------------------
     146 t
     147(1 row)
     148}}}
     149
     150Вредноста t (true) означува дека серверот работи во recovery режим, односно дека е standby сервер.
     151На примарниот сервер може да се провери дали постои активна replication конекција:
     152
     153{{{
     154film_rental=# SELECT client_addr, state, sync_state FROM pg_stat_replication;
     155 client_addr |   state   | sync_state
     156-------------+-----------+------------
     157 172.19.0.1  | streaming | async
     158(1 row)
     159}}}
     160
     161* streaming означува дека WAL записите се испраќаат кон standby серверот
     162* async означува дека се користи асинхрона репликација
     163
     164== Тестирање на репликацијата со INSERT
     165
     166На primary серверот внесуваме нов запис:
     167{{{
     168docker exec -it postgres-primary psql -U admin -d film_rental -c "INSERT INTO language(name) VALUES ('OvaETest');"
     169INSERT 0 1
     170}}}
     171
     172Потоа на standby серверот проверуваме дали записот е реплициран:
     173{{{
     174docker exec -it postgres-replica psql -U admin -d film_rental -c "SELECT name FROM language WHERE name='OvaETest';"       
     175   name   
     176----------
     177 OvaETest
     178(1 row)
     179}}}
     180Ова потврдува дека streaming репликацијата функционира правилно и дека промените направени на примарниот сервер се пренесуваат и применуваат на standby серверот во реално време.
     181
     182
     183
     184
     185