[출처] http://cutewebi.tistory.com/727

이번에 처음 하면서 엄청 고생을 했음. 아직도 정확히는 잘 모름

* Streaming Replication
 - 이중화 설정을 할 경우 마스터, 슬레이브 서버로 명함
 - 기본값은 async(비동기방식)이며 동기화 방식으로 설정할 경우 슬레이브 DB가 멈춰 있으면
   입력 처리가 되지 않음, 마스터가 슬레이브 서버의 트랜잭션 응답을 기다리기 때문.
 - 마스터 DB에 장애가 발생했을 경우 자동으로 슬레이브 DB가 마스터 DB가 된다.
   이 경우 마스터 DB 서버의 postgresql, tomcat은 정지를 시키고
   (안전을 위해 postgresql 설정 파일은 슬레이브 모드로 변환해 둠).
   슬레이브 서버의 tomcat, postgresql 을 중지후, postgresql의 설정 파일을 마스터 용으로
   파일 복사 후, postgresql, tomcat을 시작하는 방식으로 이중화를 구현함.
 - 이전 마스터 서버의 장애 복구의 경우 엔지니어가 장애 원인 파악 후 수동으로 복구
   수동 복구시 정해진 메뉴얼에 따라 슬레이브 모드로 시작함
   슬레이브 시작시 설정 파일은 마스터 설정 파일도 백업해 둠.
   현재 마스터 서버가 장애 발생시 위와 동일한 방식으로 슬레이버가 마스터 역할을 대행

1 기본 정보
 마스터 : 192.168.1.52
 슬레이브 : 192.168.1.53

2 Postgresql
 1) 설치
  - 기존의 8.X 버전이 설치 되어 있는 경우 충돌이 발생, 삭제후 설치 할것
  - 마스터, 슬레이브 동일
  root 계정> yum erase postgresql94*
  root 계정> yum list postgres*
  root 계정> yum install postgresql94-server
  root 계정> yum install postgresql94-contrib
 2) 설치 장소
  설치 디렉토리 : /usr/pgsql-9.4/
  Postgresql Data 디렉토리 : /var/lib/pgsql/9.4/data
 3) postgres 계정 환경 설정
  - path를 /ext/profile에 등록해 주는게 더 좋을거 같음
  root 계정> su - postgres
  설정 파일에 postgresql 경로를 지정해 줌
  postgres 계정> vi .bash_profile
  PATH=/usr/pgsql-9.4/bin:$PATH
  export PATH
 4) postgres 비밀번호 추가
  postgres 계정> psql
  ############# postgres 실행화면 ############
  psql (9.4.1)
  Type "help" for help.
  postgres-# \password postgres
  Enter new password:postgres
  Enter it again:postgres
  CTRL + D 종료

3 iptables 포트 open
 - tomcat, postgres 포트가 오픈이 되어 있는지 확인. 없을 경우 추가
 vi /etc/sysconfig/iptables
 service iptables restart

4 마스터 서버 설정
 1) pg_hba.conf 수정
  - 비밀번호 묻는거 없이 바로 접속하기 위해 trust 로 지정함
  root 계정> cd /var/lib/pgsql/9.4/data/
  root 계정> vi pg_hba.conf
  host    replication     postgres        192.168.1.52/32          trust
  host    replication     postgres        192.168.1.53/32          trust
 2) postgresql.conf 수정
  root 계정> cd /var/lib/pgsql/9.4/data/
  root 계정> vi postgresql.conf
 
  # 모든 서버 요청에 대해서 받을수 있게 설정
  listen_addresses = '*'
 
  # 마스터가 슬레이브의 접속을 받아들일 수 있도록 준비.
  wal_level = hot_standby
 
  # 슬레이브 DB의 반영처리가 늦어지는 경우, 또는 장시간동안 슬레이브 DB를 정지한 후에 재가동한 경우등에
  # 아카이브된 WAL archive 파일을 사용해서 마스터 DB와 동기화시킬 수 있는 이점이 있다.
  # 주의할 점은 WAL archive 파일의 수납장소가 마스터와 슬레이브 양쪽에서 참조할 수 있는 곳이여야 한다.
  # 또한 디스크 용량확보를 위해 오래된 WAL archive 파일은 정기적으로 삭제해주는 것이 좋다.
  # archive_mode = off. WAL archive 파일을 위한 디스크 확보가 어렵거나 DB의 유지 보수 점검이 어려울 경우에
  # archive 모드를 off로 할 수도 있다.
  # 단점으로는 슬레이브 DB의 데이터 갱신이 장시간 지연되었을 경우 그 이후 데이터 처리가 정확히 반영되지
  # 못할 수도 있다. 마스터 DB와 동기화가 이뤄지지 않았을 경우에는 다시 마스터 DB의 복제를 해야 할 필요도 생긴다.
  archive_mode = on
  archive_command = 'cp %p /var/lib/pgsql/9.4/ARCHIVE/%f'

  # 접속가능한 슬레이브의 접속수를 설정( 슬레이브 수 + 1)
  max_wal_senders = 2
  # 리플리케이션용으로 남겨둘 WAL 파일의 수를 지정. (8~32가 적당)
  wal_keep_segments = 8
 
  # synchronous_standby_names = 'slave1'
  # replication을 동기화 방식으로 처리하고자 할 경우 슬레이브 DB의 이름을 설정한다.
  # 또한 이후에 슬레이브 DB 설정 시에도 위에 적은 이름을 사용한다.
 3) WAL Arichive 저장 디렉토리 생성
  root 계정> mkdir /var/lib/pgsql/9.4/ARCHIVE
 4) 권한 변경
  root 계정> chown -R postgres.postgres /var/lib/pgsql
 
5 마스터 서버 재실행
 - root 계정으로 실행해도 될거 같은데... 이건 테스트를 아직 해 보지 않았음
 postgres 계정> pg_ctl -D /var/lib/pgsql/9.4/data restart -m fast
 # 즉시 정지 하고 싶을 경우
 # pg_ctl -m fast stop

6 슬레이브 서버 설정
 1) 마스터 DB 복제
  DB 복제 전용툴로 pg_basebackup이 추가되었다. 원격 서버의 백업용도로도 활용할 수 있고,
  테이블스페이스가 있을 경우에도 전체를 다 백업해 준다.
  복제를 하기 전에 data를 data_old 로 변경
  root 계정 > mv /var/lib/pgsql/9.4/data /var/lib/pgsql/9.4/data_old
  root 계정 > su - postgres
  postgres 계정> pg_basebackup -h 192.168.1.52 -p 5432 -U postgres -D /var/lib/pgsql/9.4/data --xlog --checkpoint=fast --progress
 2) postgresql.conf 수정
  root 계정> cd /var/lib/pgsql/9.4/data/
  root 계정> vi postgresql.conf
  hot_standby = on
 3) recovery.conf 파일 생성
  root 계정> cp /usr/pgsql-9.4/share/recovery.conf.sample ./recovery.conf
  root 계정> vi recovery.conf
  restore_command = 'cp /var/lib/pgsql/9.4/ARCHIVE/%f %p'
  archive_cleanup_command = 'pg_archivecleanup /var/lib/pgsql/9.4/ARCHIVE/ %r'
  recovery_target_timeline = 'latest'
  standby_mode = on
  primary_conninfo = 'host=192.168.1.52 port=5432'
 4) 권한 변경
  root 계정> chown -R postgres.postgres /var/lib/pgsql

7 슬레이브 서버 재실행
 - root 계정으로 실행해도 될거 같은데... 이건 테스트를 아직 해 보지 않았음
 postgres 계정> pg_ctl -D /var/lib/pgsql/9.4/data restart -m fast
 # 즉시 정지 하고 싶을 경우
 # pg_ctl -m fast stop

8 replication 상태 확인
 - 마스터 서버에서 아래 명령어 실행
  root 계정>  su - postgres
  postgres 계정> psql -x -c "Select * From pg_stat_replication"
  -[ RECORD 1 ]----+------------------------------
  pid              | 13981
  usesysid         | 10
  usename          | postgres
  application_name | walreceiver
  client_addr      | 192.168.1.53
  client_hostname  |
  client_port      | 49841
  backend_start    | 2015-03-05 13:31:49.592448+09
  backend_xmin     |
  state            | streaming
  sent_location    | 0/3B0A5810
  write_location   | 0/3B0A5810
  flush_location   | 0/3B0A5810
  replay_location  | 0/3B0A5660
  sync_priority    | 0
  sync_state       | async

  마스터와 슬레이브에서 슬레이브 DB의 이름을 지정하지 않았기 때문에 async(비동기방식)으로 표시된다

9 참고
 - 동기화 방식 replication
  마스터와 슬레이브의 설정 파일에서 슬레이브 DB의 이름을 같은 것으로 설정하면 동기화 방식이 이루어진다.
  마스터 서버 postgresql.conf
  synchronous_standby_names = 'slave1'
  슬레이브 서버 recovery.conf
  primary_conninfo = 'host=192.168.1.52 port=5432 application_name=slave1'
 - 동기화 방식으로 replication을 할 경우에 슬레이브 DB가 멈춰 있으면 입력 처리가 되지 않는 것에 주의한다.

'DB' 카테고리의 다른 글

postgresql 이중화 관련  (0) 2015.07.25
postgresql 이중화 관련  (0) 2015.05.22
postgresql 백업 및 복구  (1) 2015.02.01
DB HA 관련  (0) 2015.01.05
임시 메모  (0) 2014.11.24
Posted by gt1000

블로그 이미지
gt1000

태그목록

공지사항

어제
오늘

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함