MySQL InnoDB Cluster(Group Replication) 구성
증상
목표: InnoDB Cluster(Group Replication + MySQL Shell + MySQL Router)로 MySQL에 자동 페일오버가 있는 고가용성을 구성한다.
1. 사전 요구 사항을 충족한다
InnoDB Cluster에는 모든 노드에 MySQL 8.0+, 고유한 server_id, GTID 모드, InnoDB 스토리지 엔진이 필요하다. 모든 인스턴스는 네트워크로 서로 도달할 수 있어야 하며 테이블에는 primary key가 있어야 한다. 관리용 clusterAdmin 사용자를 준비한다.
MySQL
-- my.cnf on each instance:
-- server_id unique, gtid_mode=ON, enforce_gtid_consistency=ON
CREATE USER 'icadmin'@'%' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON *.* TO 'icadmin'@'%' WITH GRANT OPTION;2. MySQL Shell로 각 인스턴스를 구성한다
mysqlsh에서 dba.configureInstance()는 각 노드를 Group Replication에 적합하게 만든다. 누락된 파라미터를 수정하고 필요하면 재시작을 요청한다. 모든 노드에서 반복한다.
MySQL
-- mysqlsh:
dba.configureInstance('icadmin@node1:3306')
dba.configureInstance('icadmin@node2:3306')
dba.configureInstance('icadmin@node3:3306')3. 클러스터를 생성한다(seed 노드)
한 노드에 연결하여 dba.createCluster()로 클러스터를 시작한다. 이 노드가 첫 primary가 된다. cluster 객체가 반환되며 이후 추가에 사용된다.
MySQL
-- mysqlsh, while connected to node1:
var cluster = dba.createCluster('appCluster')4. 다른 인스턴스를 클러스터에 추가한다
cluster.addInstance()로 secondary 노드를 추가한다. recoveryMethod로 clone(물리 복제, 새 노드에 빠름) 또는 incremental(GTID 기반)을 선택한다. 최소 3개 노드가 홀수 과반수와 자동 페일오버를 제공한다.
MySQL
-- mysqlsh:
cluster.addInstance('icadmin@node2:3306', {recoveryMethod: 'clone'})
cluster.addInstance('icadmin@node3:3306', {recoveryMethod: 'clone'})5. MySQL Router를 bootstrap한다
MySQL Router는 애플리케이션과 클러스터 사이를 라우팅한다. 읽기/쓰기(6446)와 읽기 전용(6447) 포트를 제공하며 primary가 바뀌면 트래픽을 자동으로 리디렉션한다. bootstrap은 클러스터 메타데이터로부터 구성을 생성한다.
MySQL
mysqlrouter --bootstrap icadmin@node1:3306 --user=mysqlrouter --directory /etc/mysqlrouter
# Then: mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &6. 클러스터 상태를 확인하고 페일오버를 검증한다
cluster.status()는 각 노드의 역할(R/W primary, R/O secondary)과 상태(ONLINE)를 보여 준다. clusterName과 topology가 정상이어야 한다. primary를 종료하고 새 primary가 자동 선출되는지 관찰하여 페일오버를 테스트한다.
MySQL
-- mysqlsh:
var cluster = dba.getCluster('appCluster')
cluster.status()
-- Members via SQL:
SELECT member_host, member_role, member_state FROM performance_schema.replication_group_members;