postgreSQL 마스터 복제

1. 소개


postgres는 9.0 이후에 주종의 흐름 복제 메커니즘을 도입했다. 이른바 흐름 복제는 서버가 tcp를 통해 주 서버에서 상응하는 데이터를 동기화하는 것이다.이렇게 하면 주 서버의 데이터가 분실되었을 때 서버에서 백업이 유지됩니다.파일 로그 기반 전송에 비해 흐르는 복사는 서버에서 업데이트를 유지할 수 있습니다.서버에서 주 서버에 연결하면 운영 서버가 WAL 파일을 다 쓸 때까지 기다릴 필요 없이 흐르는 WAL이 서버에서 기록됩니다.PostgreSQL 스트림 복제는 기본적으로 비동기적입니다.주 서버에서 업무를 제출하는 것과 서버에서 변화하는 것을 볼 수 있는 사이의 작은 지연이 있습니다. 이 지연은 파일 로그를 기반으로 전송하는 것보다 훨씬 적습니다. 보통 1초에 완성됩니다.주 서버가 갑자기 붕괴되면 소량의 데이터가 손실될 수 있습니다.동기식 복제는 운영 서버와 서버에서 WAL을 모두 작성한 후에 트랜잭션을 커밋해야 합니다.이렇게 하면 어느 정도에 사무의 응답 시간을 증가시킬 수 있다.주의: 이번 실험은docker를 바탕으로 완성된 것이다

2.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/dataThe 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 ... okcreating subdirectories ... okselecting default max_connections ... 100selecting default shared_buffers ... 128MBselecting default timezone ... Etc/UTCselecting dynamic shared memory implementation ... posixcreating configuration files ... okcreating template1 database in/var/lib/postgresql/data/base/1 ... okinitializing pg_authid ... okinitializing dependencies ... okcreating system views ... okloading system objects' descriptions ... okcreating collations ... okcreating conversions ... okcreating dictionaries ... oksetting privileges on built-in objects ... okcreating information schema ... okloading PL/pgSQL server-side language ... okvacuuming database template1 ... okcopying template1 to template0 ... okcopying template1 to postgres ... oksyncing 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
위와 같은 단계

3. 주 서버의 조작


메인 서버는 172.18.0.4입니다. 우선 로그를 압축하는 데 사용할 새 디렉터리를 만듭니다. 저는 사실 압축 로그가 없습니다. 필요에 따라.
mkdir/opt/pgsql/pg_archive
1. 먼저 데이터베이스 사용자를 만들어서 주종 동기화를 해야 한다.사용자 리플리카를 만들고 로그인과 복사 권한을 부여합니다.
postgres# CREATE ROLE replica login replication encrypted password 'replica'
2. pg_ 수정hba.conf, 리플리카 사용자가 동기화할 수 있도록 합니다.pg_에서hba.conf에 두 줄 추가:
host all 172.18.0.5/32 trust #0.5를 주 서버로 연결 허용 host replication replica 172.18.0.5/32 md5 #0.5를 사용하여 replica 사용자가 복사할 수 있도록 허용
이렇게 하면 리플리카를 설정합니다. 이 사용자는 172.18.0.4에서 흐름 복사 요청을 할 수 있습니다. *주: 두 번째 필드는replication4를 입력해야 합니다.postgresql를 수정합니다.conf
listen_addresses ='*'# 모든 IParchive_ 감청mode = on# 아카이브 허용_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_연결은 메인 라이브러리보다 커야 합니다.
두 개의 파일을 구성한 후 서버를 다시 시작합니다.
pg_ctl stop -D/var/lib/postgresql/datapg_ctl start -D/var/lib/postgresql/data
3. 0.5에 0.4 데이터베이스를 연결할 수 있는지 테스트한다.0.5에서 다음 명령을 실행합니다.
psql -h 172.18.0.4 -U postgres
데이터베이스에 들어갈 수 있는지 확인해 보세요.가능하다면 정상이다.

4. 서버로부터의 작업


1. 마스터에서 마스터로 데이터 복사
su-postgresrm-rf/opt/pgsql/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. 복구를 설정합니다.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
복구를 수정합니다.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_standbymax_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/datapg_ctl start -D/var/lib/postgresql/data

5. 배포 성공 여부 확인


마스터 데이터베이스에서 다음을 수행합니다.
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는 서버에서 수신 흐름이고 비동기 흐름으로 복제됩니다.이 밖에 각각 주, 노드에서 psaux | grep postgres를 실행하여 프로세스를 볼 수 있습니다: 주 서버 (0.4)에서:
ps aux | grep postgresroot 210 0.0 0.0 48508 1548 ? S 06:34 0:00 su postgrespostgres 211 0.0 0.1 19864 2256 ? S 06:34 0:00 bashpostgres 250 0.0 0.9 273940 17632 ? S 06:41 0:00/usr/lib/postgresql/9.4/bin/postgres -D/var/lib/postgresql/datapostgres 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/3019C90postgres 391 0.0 0.0 38296 1752 ? R+ 07:36 0:00 ps auxpostgres 392 0.0 0.0 12772 692 ? S+ 07:36 0:00 grep postgres
walsender 프로세스가 있습니다.
서버(94)에서:
ps aux | grep postgresroot 394 0.0 0.0 48508 1548 ? S 06:42 0:00 su postgrespostgres 395 0.0 0.1 19884 2320 ? S 06:42 0:00 bashpostgres 488 0.0 2.3 314268 45052 ? S 06:57 0:00/usr/lib/postgresql/9.4/bin/postgres -D/var/lib/postgresql/datapostgres 489 0.0 0.2 314452 4904 ? Ss 06:57 0:00 postgres: startup process recovering 000000010000000000000003postgres 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/3019C90postgres 508 0.0 0.0 38296 1756 ? R+ 07:37 0:00 ps auxpostgres 509 0.0 0.0 12772 700 ? S+07:37 0:00greppostgres에서walreceiver 프로세스를 볼 수 있습니다.이로써 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 DATEtest(# );CREATE TABLEtest=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY,JOIN_DATE) VALUES (1, 'Paul', 32, 'California', 20000.00,'2001-07-13');INSERT 0 1test=# 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

완성!

좋은 웹페이지 즐겨찾기