Infra/Docker

[Docker] Orchestra를 통해 High Availability(HA) 구축하기

simDev1234 2024. 1. 8. 22:39

1. 고가용성이란?

- 가용성 = Uptime / (uptime + downtime)

- 고가용성 = 바람직한 정도로 긴 시간 동안 지속적인 운영이 가능한 시스템 또는 컴포넌트 

- 고가용성의 시스템을 구축한다는 건 = 서비스가 다운되는 타임을 최소화하는 시스템을 구축한다는 것

 

2. HA 수동 설정 

[1] Orchestra를 Docker로 생성하기

- Orchestra는 MySQL용 복제 토폴로지 관리자로서, 고가용성 및 복제 관리 툴을 말한다.
- GUI/CLI/API를 통해서 상태를 확인하고 작업을 수행할 수 있다.

docker run -it --name orchestrator -h orchestrator \
--net mybridge --net-alias=orchestrator \
-p 3000:3000 -d openarkcode/orchestrator:latest

 

[2] 도커 컨테이너의 ip 주소 찾기

docker inspect --format '{{.NetworkSettings.Networks.mybridge.IPAddress}}' db001

 

[3] Master에서 Orchestrator에 접속할 수 있는 User 생성

create user orc_client_user@`172.%` identified by 'orc_client_password';
GRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD ON *.* TO orc_client_user@`172.%`;

 

[4] Orchestrator 접속

- https://{{호스트ip}}:3000/web/clusters 로 접속한다.
- clusters > discover 에 들어가서, 마스터 컨테이너명(db001) : 포트(3306) 를 입력한다.

 

- clusters > dashboard에 들어가면 master가 떠있고 master를 누르면 아래처럼 연결된 slave가 나타난다.

 

3. HA 테스트 진행하기

- read/write 모두 가능한 마스터인 db001가 갑자기 샷다운 된다고 하면

docker stop db001

- master는 리커버리가 필요한 상태가 되며 slave들은 master와 연결이 끊어짐에 따라 read가 불가능해진다. 

-  이때, Recovory를 눌러 db002를 마스터로 직접 승격해주면 db002가 master가 되며 db003이 slave로 붙는걸 볼 수 있다.

- db001를 db002의 slave로 들어가도록 하려면 db001를 재실행한 후, read_only 상태로 변경, db001의 master를 db002로 설정해준다.

docker start db001

docker exec -it -uroot db001 /bin/bash
mysql -uroot -p

mysql> set global read_only=1;
Query OK, 0 rows affected (0.01 sec)

mysql> change master to master_host='db002', \
    -> master_user='repl', master_password='repl', \
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.31 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

4. HA 자동화(Auto Failover) 하기

[1] Orchestra의 orchestrator.conf.json 파일을 통해 설정 수정하기

[root@dev opc]# docker exec -it orchestrator /bin/bash
bash-4.4# cd /etc/
bash-4.4# vi orchestrator.conf.json

- 아래와 같이 모든 컨테이너에 대해서 Master로 회복이 가능하되, 컨테이너 호스트이름이 db003일 때는 Master로 승격이 되지 않도록 하면, db001/db002는 Master로 회복이 되지만 db003는 Master로 회복이 될 수 없다.

[AS-IS]  [TO-BE]
 "RecoverMasterClusterFilters": [
    "_master_pattern_"
  ],
...
 "PromotionIgnoreHostnameFilters": [],
"RecoverMasterClusterFilters": [
    "*"
  ],
...
 "PromotionIgnoreHostnameFilters": ["db003"],

 

[2] Orchestra를 재실행하여 설정을 초기화한다.

docker restart orchestrator

 

[3] HA 자동화 테스트 해보기 

- 먼저, Audit > Recovery 에서 Failure 상태를 Acknowlege 해준다. (안해주면 정상적인 테스트가 되지 않는다)

- 아까와 마찬가지로 Master인 db002를 stop 시켜 샷다운 상태를 만든다.
- recovery를 누르지 않았으나 db001이 master로 승격된 후 db003이 slave로 붙은 걸 볼 수 있다. 

 

 

[출처] 따라하며 배우는 MySQL on Docker

[참고]

https://velog.io/@makeitcloud/%EB%9E%80-Availability-High-Availability-%EB%9E%80

https://dkswnkk.tistory.com/727

https://jhdatabase.tistory.com/entry/MySQL-Orchestrator-%EA%B5%AC%EC%B6%95-part-1