|
지금 운영중인 서비스에 ppas (edb) 를 사용중이다. postgres db의 상용 라이센스 제품이다.
pgpool 이란 제품을 이용해 ha 구성해 서비스 중이다. 약 2년동안은 문제 없이(promote 가 몇회 발생한적은 있지만.. )서비스 해왔다. 근데 사용자와 데이터가 늘면서 pgpool의 성능 문제가 발생하기 시작했다.
pgpool의 성능 문제는 따로 정리해보자. 이 pgpool의 성능 문제로 ha구성을 위한 또다른 제품을 검토해야했다.
첫째로 검토한 제품 pacemaker 다. pacemaker는 postgres 를 위한 제품이아니라 cluster 서버의 거의 모든 리소스를 이중화 전략을 짜고 구성하기 위한 제품이다. 그래서 많은 리소스 이중화 관리를 위한 기능을 제공해야하니 뭔가 상당히 복잡하고 용어도 생소부분이 많아 학습 비용이 생각보다 들어간다. 물론 학습비용은 엔지니어의 능력치에 따라 편차가 있을것이다.
그렇게 몇가지 삽질?을 하던중에 edb korea 관련 엔지니어 분께 EFM에 대한 조언을 들었다.
우리가 원하던? pgpool 제품에서 pool 기능을 뺀 ha 구성을 위한 제품이다.
https://www.enterprisedb.com/edb-docs/p/edb-postgres-failover-manager
EDB Docs: EDB Postgres Failover Manager
EDB Postgres Failover Manager EDB Postgres Failover Manager (EFM), a component of the EDB Postgres Platform, provides fault-tolerant clustering technology and redundant architecture to eliminate single points of failure and protect against system outages. The EDB Postgres Failover Manager documentat...
www.enterprisedb.com
설치는 yum 설치로 가능하고 설정도 몇가지 설정만 하면되서 학습비용은 거의 없다고 봐도된다.
EFM overview
EFM 은 아래 세가지 요소로 구성된다.
Master Node
Standby nodes
Witness node
Non-witness agent 를 수행하면 local database의 상태를 체크한다.
Datebase를 찾을수 없으면 idle mode
Database에서 recovery를 찾으면 standby mode
Database에서 recovery를 찾을수 없으면 master mode
장애가 발생하면 Failover Manager는 promote된 standby 서버가 최신 상태인지 확인한다.
JGroup 이란 놈을 통해서 각 노드를 연결하고 장애를 감지한다.
위 그림처럼 vip 를 이용하는것 외에 장애 발생시 로드밸런스를 이용해 reconfigure 할수도 있다.
EFM 3.7 이 지원하는 플랫폼
이글을 쓰는 시점에 EFM의 최신버젼은 3.7 버젼이다.
CentOS 6.x and 7.x
Red Hat Enterprise Linux 6.x and 7.x
Oracle Enterprise Linux 6.x and 7.x
Red Hat Enterprise Linux (IBM Power8 Little Endian or ppc64le) 7.x
Debian 9
SLES 12
Ubuntu 18.04
전제조건
Java 1.8 이상 설치
SMTP 서버 제공
- EFM에서 보내는 메일을 전송하기 위함
Streaming Replication 설정
- EFM 에서는 streaming replication만 지원한다.
- promote 후 demote는 자동으로 재구성하지 않는다.
Pg_hba.conf 설정
# vi /opt/TerraceTims/3rd/edb/dbdata/pg_hba.conf # access for itself host fmdb efm 127.0.0.1/32 md5 # access for witness/standby host fmdb efm 10.0.2.1/24 md5
efm : database user
fmdb : database dbname
설정변경후 reload 해줘야 한다
Firewalls 설정
# iptables -I INPUT -p tcp --dport 7800:7810 -j ACCEPT /sbin/service iptables save
Database User 권한 부여
- Efm.properties 에 설정되는 db.user 는 아래 쿼리가 가능한 권한을 가지고 있어야 한다.
pg_current_wal_lsn() pg_last_wal_replay_lsn() pg_wal_replay_resume()
아래와 같이 권한을 주면 된다.
GRANT pg_read_all_settings TO user_name;
Installing EFM on CentOS
centos에서 EFM 설치내용이다. yum 설치라 별건없다. repository 설정에 계정정보 입력하는것만 유의하면 된다.
[root@pcs-pg1 ~]# yum install -y http://yum.enterprisedb.com/edbrepos/edb-repo-latest.noarch.rpm Loaded plugins: fastestmirror, presto Setting up Install Process edb-repo-latest.noarch.rpm | 6.2 kB 00:00 Examining /var/tmp/yum-root-ANosuy/edb-repo-latest.noarch.rpm: edb-repo-20-1.noarch Marking /var/tmp/yum-root-ANosuy/edb-repo-latest.noarch.rpm to be installed Loading mirror speeds from cached hostfile * base: mirror.kakao.com * epel: ftp.iij.ad.jp * extras: mirror.kakao.com * updates: mirror.kakao.com Resolving Dependencies --> Running transaction check ---> Package edb-repo.noarch 0:20-1 will be installed --> Finished Dependency Resolution Dependencies Resolved ==================================================================================================================================== Package Arch Version Repository Size ==================================================================================================================================== Installing: edb-repo noarch 20-1 /edb-repo-latest.noarch 2.2 k Transaction Summary ==================================================================================================================================== Install 1 Package(s) Total size: 2.2 k Installed size: 2.2 k Downloading Packages: Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : edb-repo-20-1.noarch 1/1 warning: /etc/yum.repos.d/edb.repo created as /etc/yum.repos.d/edb.repo.rpmnew Verifying : edb-repo-20-1.noarch 1/1 Installed: edb-repo.noarch 0:20-1 Complete!
/etc/yum.repos.d/edb.repo 파일이 생성된다.
이파일을 아래와 같이 수정한다.
공식 가이드 문서에는 이렇게 기록 되어 있는데 enterprisedb.com 의 접속 정보로 변경해줘야 한다.
Yum repository 접속password정보는 enterprisedb.com 사이트를 접근 하면 확인할수 있다.
vi /etc/yum.repos.d/edb.repo [edb] name=EnterpriseDB RPMs 6 - x86_64 baseurl=https://아이디:패스워드@yum.enterprisedb.com/edb/redhat/rhel-6-x86_64 enabled=1 gpgcheck=1 gpgkey=file:///root/ENTERPRISEDB-GPG-KEY
위설정이 완료되면 아래와같이 설치한다.
[root@pcs-pg1 ~]# yum install edb-efm37 Loaded plugins: fastestmirror, presto Setting up Install Process Loading mirror speeds from cached hostfile * base: mirror.kakao.com * epel: ftp.iij.ad.jp * extras: mirror.kakao.com * updates: mirror.kakao.com edb | 2.5 kB 00:00 Resolving Dependencies --> Running transaction check ---> Package edb-efm37.x86_64 0:3.7-1.rhel6 will be installed --> Finished Dependency Resolution Dependencies Resolved ==================================================================================================================================== Package Arch Version Repository Size ==================================================================================================================================== Installing: edb-efm37 x86_64 3.7-1.rhel6 edb 5.5 M Transaction Summary ==================================================================================================================================== Install 1 Package(s) Total size: 5.5 M Installed size: 6.0 M Is this ok [y/N]: y Downloading Packages: Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : edb-efm37-3.7-1.rhel6.x86_64 1/1 Verifying : edb-efm37-3.7-1.rhel6.x86_64 1/1 Installed: edb-efm37.x86_64 0:3.7-1.rhel6 Complete!
Failover Manager를 설치후 해야할 일
Cluster properties file 수정
Cluster members file 수정
VIP설정 및 테스트
각 노드의 failover manager agent 시작
Configuring a Simple Failover Manager Cluster
테스트 환경에서 빨리 Failover Manager를 설정하는 방법이다.
설정이 꼭 필요한 주요 설정 정보에 대한 가이드 이다.
아래 과정이 수행되었다고 가정한다.
- master/standby node의 streaming replication 설정
- 각 노드에 failover manager 설치
이 예제의 cluster name은 efm 이다.
Master / standby node 중 하나의 node에서만 설정하고 프로세스를 구동하고 동일 config 파일을 다른노드로 복사해서 구동하면 된다.
Step 1. Working config 파일 생성
cd /etc/edb/efm-3.7 cp efm.properties.in efm.properties cp efm.nodes.in efm.nodes chown efm:efm efm.properties chown efm:efm efm.nodes
Step2. Password 암호화 생성
Properties 파일에 입력된 패스워드 암호화된 문자열로 입력해야 한다.
[root@pcs-pg1 efm-3.7]# /usr/edb/efm-3.7/bin/efm encrypt efm This utility will generate an encrypted password for you to place in your EFM cluster property file: /etc/edb/efm-3.7/efm.properties Please enter the password and hit enter: Please enter the password again to confirm: The encrypted password is: 074b627bf50168881d246c5dd32fd8d0 Please paste this into your efm.properties file db.password.encrypted=074b627bf50168881d246c5dd32fd8d0
Step3. Efm.properties 설정
{cluster_name}.properties 에는 Failover Manager Cluster의 연결 속성 및 동작을 지정하는 설정이 있다.
설정된 값은 Failover Manager가 시작되는 시점에 적용되므로 설정이 변경되면 재시작 해야한다.(EFM 모듈 재시작이 ha 구성에 영향을 주지 않는다.)
vi /etc/edb/efm-3.7/efm.properties ... db.user=mailadm db.password.encrypted=ab959cc2bf365e9644491b64a47d34cd db.port=5432 db.database=tims ... db.service.owner=mailadm ... user.email=webmcr@daou.co.kr ... bind.address=10.0.1.14:7800 ... is.witness=false ... pingServerIp=8.8.8.8 ... auto.allow.hosts=true ... stable.nodes.file=true
Step4. efm.nodes 설정
클러스터의 각 노드의 주소와 포트를 추가 한다.
vi /etc/edb/efm-3.7/efm.nodes 10.0.1.14:7800 10.0.1.28:7800 10.0.1.25:7800
Step5. Configure file을 각노드에 전달
각 노드에 복사후 bind.address 정보와 is.witness 정보를 변경해준다.
Step6. Start EFM Cluster
[root@pcs-pg1 ~]# service efm-3.7 start Starting local efm-3.7 service: [ OK ]
시작후 상태를 확인해본다.
[root@pcs-pg1 ~]# /usr/edb/efm-3.7/bin/efm cluster-status efm Cluster Status: efm Agent Type Address Agent DB VIP ----------------------------------------------------------------------- Master 10.0.1.14 UP UP Allowed node host list: 10.0.1.14 10.0.1.28 10.0.1.25 Membership coordinator: 10.0.1.14 Standby priority host list: (List is empty.) Promote Status: DB Type Address WAL Received LSN WAL Replayed LSN Info --------------------------------------------------------------------------- Master 10.0.1.14 1/94003168 No standby databases were found.
Startup 로그는 아래에서 확인가능하다.
[root@pg1 ~]# cat /var/log/efm-3.7/startup-efm.log 12/19/19 4:56:43 PM Setting source address for email notifications to webmcr@daou.co.kr. 12/19/19 4:56:43 PM Starting witness. 12/19/19 4:56:43 PM Agent logs will be written to /var/log/efm-3.7/efm.log 12/19/19 4:56:43 PM The virtualIp property is not set, starting EFM with VIP support disabled. 12/19/19 4:56:46 PM 12/19/19 4:56:46 PM ------------------------------------------------------------------- 12/19/19 4:56:46 PM GMS: address=pg1-64836(10.0.1.25), cluster=efm, physical address=10.0.1.25:7800 12/19/19 4:56:46 PM ------------------------------------------------------------------- 12/19/19 4:56:46 PM Checking shared properties with pcs-pg1-21811(10.0.1.14) 12/19/19 4:56:46 PM Testing remote database connections. 12/19/19 4:56:47 PM Witness is running.
Performing a Switchover
기본구성이 완료되면 promote 테스트를 수행해 본다.
[root@pg1 ~]# /usr/edb/efm-3.7/bin/efm promote efm Promote command accepted by local agent. Proceeding with promotion. Run the 'cluster-status' command for information about the new cluster state.
promote command 후에 상태를 확인해보면 아래와 같이 master가 바뀐걸 볼수 있다.
[root@pg1 ~]# /usr/edb/efm-3.7/bin/efm cluster-status efm Cluster Status: efm Agent Type Address Agent DB VIP ----------------------------------------------------------------------- Idle 10.0.1.14 UP UNKNOWN Witness 10.0.1.25 UP N/A Master 10.0.1.28 UP UP Allowed node host list: 10.0.1.14 10.0.1.28 10.0.1.25 Membership coordinator: 10.0.1.14 Standby priority host list: (List is empty.) Promote Status: DB Type Address WAL Received LSN WAL Replayed LSN Info --------------------------------------------------------------------------- Master 10.0.1.28 1/95000198 No standby databases were found. Idle Node Status (idle nodes ignored in WAL LSN comparisons): Address WAL Received LSN WAL Replayed LSN Info --------------------------------------------------------------- 10.0.1.14 UNKNOWN UNKNOWN Connection to 10.0.1.14:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
VIP 설정
vip 설정은 생각보다 간단하다. 아래 설정을만 추가하고 efm 서비스를 재기동하면 된다.
vi /etc/edb/efm-3.7/efm.properties ... virtualIp=10.0.1.252 virtualIp.interface=eth0 virtualIp.prefix=24 virtualIp.single=true
Cluster-status에서 vip 상황을 모니터링할 수 있다.
[root@pcs-pg1 efm-3.7]# /usr/edb/efm-3.7/bin/efm cluster-status efm Cluster Status: efm Agent Type Address Agent DB VIP ----------------------------------------------------------------------- Standby 10.0.1.14 UP UP 10.0.1.252 Witness 10.0.1.25 UP N/A 10.0.1.252 Master 10.0.1.28 UP UP 10.0.1.252* Allowed node host list: 10.0.1.14 10.0.1.28 10.0.1.25 Membership coordinator: 10.0.1.14 Standby priority host list: 10.0.1.14 Promote Status: DB Type Address WAL Received LSN WAL Replayed LSN Info --------------------------------------------------------------------------- Master 10.0.1.28 1/9D0097C8 Standby 10.0.1.14 1/9D0097C8 1/9D0097C8 Standby database(s) in sync with master. It is safe to promote.
Failover 테스트
장애 상황을 아래 8가지 상황을 가정하고 테스트한다.
NO | Master | Standby | Witness | desc | |||||
DB | EA | SYS | DB | EA | SYS | EA | SYS | ||
초기 | UP | UP | UP | UP | UP | UP | UP | UP | |
CASE1 | Down | | | | | | | | |
CASE2 | | Down | | | | | | | |
CASE3 | | | Down | | | | | | |
CASE4 | | | | Down | | | | | |
CASE5 | | | | | Down | | | | |
CASE6 | | | | | | Down | | | |
CASE7 | | | | | | | Down | | |
CASE8 | | | | | | | | Down | |
|