MySQL - InnoDB Cluster(클러스터) - (6) - 인스턴스 숨기기(접속 라우팅 비활성화) 및 라우터 다중화 - Multi MySQL Router

Share

Last Updated on 1월 10, 2024 by Jade(정현호)

안녕하세요 

이번 글에서는 MySQL InnoDB Cluster에서 특정 멤버 인스턴스에 접속이 불가하도록 접속 라우팅 비활성화(숨기기) 와 Tag 기능 그리고 MySQL Router 다중화 등에 대해서 다뤄보도록 하겠습니다.

아래 포스팅에서 이어지는 MySQL InnoDB Cluster 연재 글입니다.

인스턴스 숨기기

MySQL Router는 클라이언트의 트래픽을 올바른 인스턴스로 자동 라우팅할 수 있게 해주는 InnoDB Cluster/ReplicaSet의 핵심 구성 요소입니다.

MySQL 라우터는 자동으로 복제 토폴로지 변경에 적응할 수 있으며, 동작 변경을 설정할 수 있는 인스턴스 태그 지정 기능이 도입됨에 따라서 라우터의 기능에 한가지 더 좋은 기능이 추가되었습니다.

MySQL 8.0.21 릴리스에서는 AdminAPI를 통해서 태그(tag) 지정 프레임워크를 도입되었으며 이를 활용하여 요구되는 기능을 도입할 수 있게 되었습니다.

인스턴스 숨기기 사용 용도

인스턴스를 일시적으로 트래픽을 수신할 수 없는 것으로 설정하는 기능은 다음과 같은 목적으로 사용할 수 있습니다.

  • 들어오는 트래픽을 중단하지 않고 서버에서 롤링 업그레이드 수행
  • MySQL을 중지하지 않고도 서버에서 유지 관리 작업 또는 구성 변경 수행
  • 뒤처지는 클라이언트에 대해서 트래픽 인입 제외
  • 재해 복구 목적으로 생성된 다른 영역/지역에 있는 데이터베이스에 대한 트래픽 제외
  • 일반 정규 업무 쿼리에 영향을 주지 않도록 백업을 수행하거나 보고서 생성 또는 배치 쿼리를 수행하는 동안 읽기 작업에서 해당 서버를 제외

Upgrades/Maintenance

MySQL의 롤링 업그레이드를 수행하려면 인스턴스를 오프라인으로 전환해야 합니다. 그러나 해당 인스턴스에 대한 연결 실패 가능성에 대해 걱정해야 합니다.

라우팅 대상 후보 목록에서 인스턴스를 제외하면 DBA는 서버를 안전하게 오프라인으로 전환하고 애플리케이션/라우터 트래픽이 서버로 전송되지 않도록 할 수 있습니다.

[그림1]

유지 관리 작업(Maintenance)의 작업 종류에 따라 서버를 오프라인으로 전환하지 않아도 될 수도 있습니다.

지금까지 성능 측면에서 영향을 받을 수 있는 트래픽 중단을 방지하기 위해 그룹 복제 또는 MySQL 자체를 중지하는 것을 의미했습니다.

이제는 인스턴스 숨기기 기능을 통해서 라우팅 후보에서 인스턴스를 제외하면 이 문제를 완전히 방지할 수 있습니다.

복제 지연

InnoDB Cluster는 동기복제 방식을 사용하는데 반해 InnoDB ReplicaSet이 비동기식 복제를 수행합니다.

비동기식 복제를 기반으로 한다는 점을 고려하면 복제 지연은 고려해야 할 요소입니다. 인스턴스가 복제에 뒤처지는 경우 DBA는 이를 따라잡아 복제 지연이 줄어들 때까지 애플리케이션 트래픽에서 인스턴스를 숨길 수 있습니다.

InnoDB 클러스터에도 동일하게 적용되지만 그룹 복제(Group Replication)는 사실상 동기식이며 복제 지연은 다르게 측정됩니다.

Disaster Recovery and Backups

보다 복잡한 아키텍처에는 백업 목적이나 재해 복구에 사용되는 서버가 포함됩니다.

백업에 사용되는 서버에서는 평소보단 많은 CPU 및 Disk I/O 등의 리소스를 사용합니다. 그렇기 때문에 애플리케이션에 요청한 쿼리의 응답속도가 다른 세컨더리 서버(인스턴스)에 비해 상대적으로 늦을 수 있으며, 추가적인 작업 부하를 받지 않아야 합니다.

재해 복구(DR)에 사용되는 경우 네트워크 레이턴시 등의 이유로 DR로의 전환 이전에는 사용하지 않은 Standby 형태로 존재해야 할 수도 있습니다.

이런 이유로 클라이언트 트래픽에서 제외 설정이 필요할 수 있습니다.

[그림2]

Secondary2 는 백업을 수행하는 데 사용되므로 클라이언트 연결에서 이를 제외합니다.

Data reports/Batch

특정 인스턴스에 대한 데이터 보고서를 생성하는 것은 매우 까다로울 수 있으며 인스턴스 성능에 영향을 미칠 수 있습니다. 이러한 이유로 권장되는 접근 방식은 해당 서버를 라우팅 후보 목록에서 제외하는 것입니다.

위의 이미지는 Batch, Backup, Developer 용도의 2번째 Secondary를 포함한 PSB(Primary Secondary Batch/Backup) 토폴로지 유형을 표현하고 있습니다.

2번째 Secondary는 정규 OLTP/Mixed 애플리케이션 쿼리가 아닌 Batch 쿼리 수행이나 Backup의 수행 또는 개발자 또는 업무담당자의 데이터 조회용 서버로 사용되는 형태입니다.

이런 인스턴스의 경우 서비스 애플리케이션의 접속 또는 트래픽을 분리할 필요가 있습니다.

그래서 InnoDB Cluster에서는 계속 설명하고 있는 인스턴스 숨기기를 통해서 트래픽을 보내기를 비활성화 할 수 있습니다.

hidden 태그 사용

Admin API의 setInstanceOption() 를 이용해서 인스턴스에 태그(tag)를 설정할 수 있습니다.

클라이언트 트래픽에서 인스턴스를 숨기기 위해 라우터의 동작을 즉시 변경할 수 있는 두 개의 built-in 태그를 도입했습니다.

  • _hidden : 클라이언트 애플리케이션의 가능한 대상 목록에서 인스턴스를 제외하도록 MySQL 라우터에 지시합니다. 인스턴스는 온라인 상태로 유지되지만 새로 들어오는 연결을 위해 라우팅 되지 않습니다.
  • _disconnect_existing_sessions_when_hidden : _hidden으로 표시된 인스턴스에서 기존 연결을 끊도록 라우터에 지시 여부 설정입니다.

_disconnect_existing_sessions_when_hidden 이 false인 경우 인스턴스에 대한 기존 클라이언트 연결이 닫히지 않습니다.

_disconnect_existing_sessions_when_hidden 의 기본값은 true 로 기존 연결을 끊도록 지시합니다.


[참고] 프롬프트 정보
글에서 js> 는 MySQL Shell 에서의 Java Script 모드에서의 실행을 의미합니다. SQL 모드에서 Java Script 모드로 전환은 \js 입력합니다.
sql> 은 MySQL Shell 에서의 SQL 모드에서의 실행을 의미합니다. Java Script 모드에서 SQL 모드로 전환은 \sql 입력합니다.



hidden 태그 설정

• setInstanceOption 으로 설정

js> var cluster = dba.getCluster()
js> cluster.setInstanceOption("ic-server3:3306", "tag:_hidden", true)

위와 같이 호스트명:포트 정보와 "tag:_hidden" 을 입력하여 인스턴스 숨기기를 설정할 수 있습니다.

현재 클러스터의 Primary는 ic-server2 이고 Secondary는 ic-server1 와 ic-server3 입니다. 이런 환경에서 ic-server3에 접속된 상태에서 위와 같이 tag를 설정한다면 _disconnect_existing_sessions_when_hidden 의 기본값은 true 임으로 바로 접속이 끊기게 됩니다.

-- 현재 접속은 ic-server3 임
SQL > select @@hostname;
+------------+
| @@hostname |
+------------+
| ic-server3 |
+------------+
1 row in set (0.0012 sec)


-- 다른 서버에서 hidden tag를 설정 후 다시 조회 쿼리 수행
-- 접속이 끊긴 것이 확인됨
SQL > select @@hostname;
ERROR: 2013 (HY000): Lost connection to MySQL server during query
The global session got disconnected..
Attempting to reconnect to 'mysql://clusteradm@192.168.56.82:3306'..
The global session was successfully reconnected.

-- 재접속이 이루어진 후 다시 조회
-- 조회 결과 다른 Secondary로 변경된 것을 확인할 수 있음
SQL > select @@hostname;
+------------+
| @@hostname |
+------------+
| ic-server1 |
+------------+
1 row in set (0.0007 sec)



tag 조회

설정한 hidden tag에 대한 정보 조회는 Admin API 와 데이터베이스의 딕셔너리 테이블 조회 두 가지 방법으로 확인할 수 있습니다.

• cluster. Options()

js> var cluster = dba.getCluster()
js> cluster.options()

"clusterName": "JadeCluster",
<... 중략 ...>
    "tags": {
        "global": [],
        "ic-server1:3306": [],
        "ic-server2:3306": [],
        "ic-server3:3306": [
            {
                "option": "_hidden", <!!--
                "value": true        <!!-- 
            }
        ]
<... 중략 ...>

tag 설정한 ic-server3에서 option 과 value가 설정 되어있는 것을 확인할 수 있습니다.


• v2_instances

-- mysql_innodb_cluster_metadata 스키마의 v2_instances 테이블

mysql> select * 
from mysql_innodb_cluster_metadata.v2_instances\G

*************************** 1. row ***************************
      instance_id: 8
       cluster_id: ca2f034a-39a0-11ed-a527-0800273eff76
            label: ic-server1:3306
mysql_server_uuid: 1b875030-3110-11ed-93e1-0800273eff76
          address: ic-server1:3306
         endpoint: ic-server1:3306
        xendpoint: ic-server1:33060
       attributes: {"server_id": 56133,
       "recoveryAccountHost": "%", 
       "recoveryAccountUser": 
       "mysql_innodb_cluster_56133"}
*************************** 2. row ***************************
      instance_id: 9
       cluster_id: ca2f034a-39a0-11ed-a527-0800273eff76
            label: ic-server2:3306
mysql_server_uuid: 1efa100a-3110-11ed-bcb7-080027f0d19f
          address: ic-server2:3306
         endpoint: ic-server2:3306
        xendpoint: ic-server2:33060
       attributes: {"joinTime": "2022-09-21 20:31:13.679", 
       "server_id": 56134,
       "recoveryAccountHost": "%", 
       "recoveryAccountUser": "mysql_innodb_cluster_56134"}
*************************** 3. row ***************************
      instance_id: 11
       cluster_id: ca2f034a-39a0-11ed-a527-0800273eff76
            label: ic-server3:3306
mysql_server_uuid: 2125fe44-3110-11ed-951a-0800276fe99d
          address: ic-server3:3306
         endpoint: ic-server3:3306
        xendpoint: ic-server3:33060
       attributes: {"tags": {"_hidden": true}, <!!---
       "joinTime": "2023-09-07 00:08:31.142", 
       "server_id": 56135, "recoveryAccountHost": "%", 
       "recoveryAccountUser": "mysql_innodb_cluster_56135"}

v2_instance 딕셔너리 테이블에서도 ic-server3의 attributes 컬럼에서 tags 가 설정된 것을 확인할 수 있습니다.


다시 접속되도록 설정

hidden tag를 설정하여 인스턴스 숨기기를 한 인스턴스를 다시 접속되도록 설정하기 위해서 false로 다시 설정을 하면 됩니다.

setInstanceOption 으로 설정

js> var cluster = dba.getCluster()
js> cluster.setInstanceOption("ic-server3:3306", "tag:_hidden", false)


이와 같이 hidden tag를 설정하여 라우터에서 트래픽을 차단할 수 있으며, 여러 상황에서 유용하게 사용할 수 있는 기능이라고 할 수 있습니다.

hidden tag를 사용하여 트래픽을 차단하여 배치나 개발자 조회 전용 인스턴스 또는 복제 Source 인스턴스 등의 여러가지 이유로 사용중이거나 운영 트래픽을 처리하지 않기 때문에 낮은 서버 사양을 사용하는 상황 경우 Primary 인스턴스의 장애 발생시에 해당 인스턴스를 Primary 로 승격(promotion)하고 싶지 않을 수도 있습니다.

즉, 해당 인스턴스는 계속적으로 운영 트래픽은 처리하지 않고 별도 용도로 사용하며, Primary 로 승격 대상이 아닌 형태로 하고자 할 때에는 hidden tag 사용과 함께 member_weight 수치를 낮춤으로써 Primary 로 승격이 될 예비 순위를 낮추는 설정을 하시면 됩니다.

member_weight 와 관련된 내용은 아래 포스팅에서 새로운 Primary 선출 방식의 member_weight 관련 내용을 참조하시면 됩니다.

                

MySQL Router 다중화

MySQL Router는 클라이언트 트래픽을 올바른 인스턴스로 자동으로 라우팅할 수 있게 해주는 InnoDB Cluster/ReplicaSet의 핵심 구성 요소입니다.

핵심 구성 요소인만큼 라우터에 문제가 발생되면 클라이언트 접속에도 문제가 발생하게 됩니다.

그렇기 때문에 접속을 담당하는 라우터의 다중화도 필요하며, InnoDB Cluster에서 여러 라우터를 사용할 수 있습니다.

또는 MySQL Router 인스턴스가 사용되는 서버안에서 추가로 라우터 인스턴스를 추가하여 다른 MySQL InnoDB Cluster로 접속을 구성하고자 할 수도 있습니다.

다중화 유형

MySQL Router를 여러 개 구성할 때 이와 같이 크게 두가지 유형이 있을 수 있습니다.

  • 다른 서버에서 구성
  • 같은 서버에서 구성



다른 서버에서 구성

다른 서버에서 구성은 서버 단위의 장애에 대비한 구성입니다. 보통 고가용성을 위해서는 최소 2~3개의 서버에 나눠서 구성을 하기 때문에 여러 대 서버에 MySQL Router를 Deploy 가 필요 합니다.

다른 서버에서 구성하는 것은 새로운 서버에서 MySQL Router 바이너리 설치 및 부트스트랩 실행에 따른 라우터 인스턴스 구성을 의미합니다. 
라우터 설치 및 부트스트랩 실행은 이전 포스팅을 참고하시면 됩니다.



같은 서버에서 구성

같은 서버에서 추가로 구성하는 경우는 보통 서버의 자원(CPU 나 메모리)이 여유롭고 그에 따라서 해당 서버에서 다른 InnoDB Cluster에 대한 접속도 처리를 하기 위해서 라우터 인스턴스를 추가로 구성함을 의미합니다.

위의 그림과 같이 ic-router 호스트네임의 서버안에서 라우터 인스턴스를 여러 개 생성(구성)하여 다른 InnoDB Cluster에 대해서 서비스를 하는 형태로 구성할 수 있습니다.

같은 서버에서 여러 개의 라우터 인스턴스를 생성할 때에 클라이언트가 접속하는 RW/RO 접속에 대해서 다음과 같이 두가지 방식이 있습니다.

  • 같은 IP를 사용하고 포트를 다르게 구성
  • 다른 IP를 사용하고 포트를 같게 구성

이런 구성에 대한 결정은 운영 정책이나 환경을 고려해서 선택합니다.

같은 IP사용 라우터 인스턴스 추가

같은 IP를 사용해서 라우터 인스터스를 추가할 경우에는 포트를 다르게 설정을 진행합니다.

현재 라우터가 구성된 서버 디렉토리 정보는 다음과 같습니다.

$ pwd
/usr/local/mysql-router

$ ls -al
합계 128
drwxr-xr-x.  8 mysql mysql    149  9월 10 02:50 .
drwxr-xr-x. 36 root  root    4096  9월  6 13:28 ..
-rw-r--r--.  1 mysql mysql 121462  3월 16 17:22 LICENSE.router
-rw-r--r--.  1 mysql mysql    679  3월 16 17:22 README.router
drwxr-xr-x.  2 mysql mysql    109  8월  4 08:45 bin
drwxr-xr-x.  4 mysql mysql    150  8월  4 08:45 lib
drwxr-xr-x.  3 mysql mysql     18  8월  4 08:45 man
drwxr-xr-x   5 mysql mysql    141  9월  9 19:52 myrouter-ic-router1
drwxr-xr-x.  3 mysql mysql     17  8월  4 08:45 share


이미 구성된 라우터 설치 경로는 위의 내용과 같이 위치하고 있으며 디렉토리는 myrouter-ic-router1 이고 인스턴스명은 ic-router1 입니다.

myrouter-ic-router2 디렉토리에 ic-router2 이름으로 부트스트랩 하도록 하겠습니다.


부트스트랩(배포)

myrouter-ic-router2 디렉토리에 ic-router2 이름으로 부트스트랩 하도록 하겠습니다.

$ sudo mysqlrouter --bootstrap clusteradm@ic-server1:3306 \
--name ic-router2 --directory /usr/local/mysql-router/myrouter-ic-router2 \
--account myrouter --user mysql


Please enter MySQL password for clusteradm: (clusteradm의 비밀번호 입력)
# Bootstrapping MySQL Router instance at '/usr/local/mysql-router-8.0.33-linux-glibc2.12-x86_64/myrouter-ic-router2'...

Please enter MySQL password for myrouter: (myrouter의 비밀번호 입력)
- Creating account(s) (only those that are needed, if any)
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /usr/local/mysql-router-8.0.33-linux-glibc2.12-x86_64/myrouter-ic-router2/mysqlrouter.conf

# MySQL Router 'ic-router2' configured for the InnoDB Cluster 'JadeCluster'

After this MySQL Router has been started with the generated configuration

    $ mysqlrouter -c /usr/local/mysql-router-8.0.33-linux-glibc2.12-x86_64/myrouter-ic-router2/mysqlrouter.conf

InnoDB Cluster 'JadeCluster' can be reached by connecting to:

## MySQL Classic protocol

- Read/Write Connections: localhost:6446
- Read/Only Connections:  localhost:6447

## MySQL X protocol

- Read/Write Connections: localhost:6448
- Read/Only Connections:  localhost:6449


부트스트랩 완료 후 설정된 포트정보는 위와 같이 기본 포트 정보로 구성되어 있습니다. 그에 따라서 라우터를 시작하기전에 포트번호 와 use_gr_notifications 을 수정하도록 하겠습니다.

$ cd myrouter-ic-router2
$ sudo vi mysqlrouter.conf



## 전
use_gr_notifications=0

## 후
use_gr_notifications=1

-----------------------------

## 전
[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=6446

## 후
[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=7446

-----------------------------

## 전
[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=6447

## 후
[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=7447

-----------------------------

## 전
[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=6448

## 후
[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=7448

-----------------------------

## 전
[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=6449

## 후
[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=7449

-----------------------------

## 전
[http_server]
port=8443

## 후
[http_server]
port=28443


포스팅에서는 새로운 라우터 인스턴스의 포트를 첫 6에서 7로 설정하였고 http_server의 포트는 기존과 겹치지 않기 위해서 다른 포트로(28443) 변경하였습니다.

라우터 인스턴스 시작 스크립트인 start.sh 를 사용하여 라우터 인스턴스를 시작한 다음 프로세스 기동과 포트 오픈을 확인해보도록 하겠습니다.

$ sudo ./start.sh 

$ ps -e | grep mysqlrouter 
   2523 pts/1    00:00:04 mysqlrouter
   2587 pts/2    00:00:03 mysqlrouter


$ sudo netstat -antp | grep mysqlrouter | grep LISTEN
tcp        0      0 0.0.0.0:18443           0.0.0.0:*               LISTEN      2587/mysqlrouter
tcp        0      0 0.0.0.0:28843           0.0.0.0:*               LISTEN      2523/mysqlrouter
tcp        0      0 0.0.0.0:6446            0.0.0.0:*               LISTEN      2587/mysqlrouter
tcp        0      0 0.0.0.0:6447            0.0.0.0:*               LISTEN      2587/mysqlrouter
tcp        0      0 0.0.0.0:6448            0.0.0.0:*               LISTEN      2587/mysqlrouter
tcp        0      0 0.0.0.0:6449            0.0.0.0:*               LISTEN      2587/mysqlrouter
tcp        0      0 0.0.0.0:7446            0.0.0.0:*               LISTEN      2523/mysqlrouter
tcp        0      0 0.0.0.0:7447            0.0.0.0:*               LISTEN      2523/mysqlrouter
tcp        0      0 0.0.0.0:7448            0.0.0.0:*               LISTEN      2523/mysqlrouter
tcp        0      0 0.0.0.0:7449            0.0.0.0:*               LISTEN      2523/mysqlrouter


mysqlrouter 프로세스 2개가 기동 된 것과 6xxxx 포트와 7xxxx 포트로 LISTEN 상태를 확인할 수 있습니다.

다른 IP사용 라우터 인스턴스 추가

현재 라우터가 구성된 서버 디렉토리 정보는 다음과 같습니다.

$ pwd
/usr/local/mysql-router

$ ls -al
합계 128
drwxr-xr-x.  8 mysql mysql    149  9월 10 02:50 .
drwxr-xr-x. 36 root  root    4096  9월  6 13:28 ..
-rw-r--r--.  1 mysql mysql 121462  3월 16 17:22 LICENSE.router
-rw-r--r--.  1 mysql mysql    679  3월 16 17:22 README.router
drwxr-xr-x.  2 mysql mysql    109  8월  4 08:45 bin
drwxr-xr-x.  4 mysql mysql    150  8월  4 08:45 lib
drwxr-xr-x.  3 mysql mysql     18  8월  4 08:45 man
drwxr-xr-x   5 mysql mysql    141  9월  9 19:52 myrouter-ic-router1
drwxr-xr-x.  3 mysql mysql     17  8월  4 08:45 share


구성된 라우터 설치 경로는 위의 내용과 같이 위치하고 있으며 디렉토리는 myrouter-ic-router1 이고 인스턴스명은 ic-router1 입니다.

테스트 환경에서 클라이언트가 접속하는 네트워크의 device는 enp0s8 입니다. 해당 디바이스에 추가로 가상IP를 구성하도록 하겠습니다.

기존에 구성된 MySQL 라우터 인스턴스 ic-router1 에서도 가상 IP로 사용 중이며 다음과 같은 환경입니다.

enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.62  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fed5:ef4b  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:d5:ef:4b  txqueuelen 1000  (Ethernet)
        RX packets 1057748  bytes 272038085 (259.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1424191  bytes 530059810 (505.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8:81: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.81  netmask 255.255.255.0  broadcast 192.168.56.255
        ether 08:00:27:d5:ef:4b  txqueuelen 1000  (Ethernet)

enp0s8:82: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.82  netmask 255.255.255.0  broadcast 192.168.56.255
        ether 08:00:27:d5:ef:4b  txqueuelen 1000  (Ethernet)

- R/W 용
enp0s8:81 / 192.168.56.81

- R/O 용
enp0s8:82 / 192.168.56.82

기존에 구성된 라우터 인스턴스도, 신규 생성할 라우터 인스턴스도 mysql 접속포트는 3306 으로 mysqlx 접속 포트는 33060 으로 구성하였습니다.

클라이언트에서 접속에 사용되는 ip 를 그대로 사용할 경우 부트스트랩(배포) 이후 포트만 변경하면 되고, ip를 다르게 사용할 경우 리눅스에서 가상IP(VIP)를 구성해서 사용하면 됩니다.

새로 생성할 myrouter-ic-router2를 위해서 다음과 같이 83,84 IP를 추가하도록 하겠습니다.


VIP 구성

테스트 환경에서 클라이언트가 접속하는 네트워크의 device는 enp0s8 이고 ip는 192.168.56.62으로 설정되어 있습니다.

해당 device에 추가로 가상IP를 구성하도록 하겠습니다.

## R/W 용
ifconfig enp0s8:81 192.168.56.83 netmask 255.255.255.0

## R/O 용
ifconfig enp0s8:82 192.168.56.84 netmask 255.255.255.0


부트스트랩(배포)

myrouter-ic-router2 디렉토리에 ic-router2 이름으로 부트스트랩 하도록 하겠습니다.

$ sudo mysqlrouter --bootstrap clusteradm@ic-server1:3306 \
--name ic-router2 --directory /usr/local/mysql-router/myrouter-ic-router2 \
--account myrouter --user mysql


Please enter MySQL password for clusteradm: (clusteradm의 비밀번호 입력)
# Bootstrapping MySQL Router instance at '/usr/local/mysql-router-8.0.33-linux-glibc2.12-x86_64/myrouter-ic-router2'...

Please enter MySQL password for myrouter: (myrouter의 비밀번호 입력)
- Creating account(s) (only those that are needed, if any)
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /usr/local/mysql-router-8.0.33-linux-glibc2.12-x86_64/myrouter-ic-router2/mysqlrouter.conf

# MySQL Router 'ic-router2' configured for the InnoDB Cluster 'JadeCluster'

After this MySQL Router has been started with the generated configuration

    $ mysqlrouter -c /usr/local/mysql-router-8.0.33-linux-glibc2.12-x86_64/myrouter-ic-router2/mysqlrouter.conf

InnoDB Cluster 'JadeCluster' can be reached by connecting to:

## MySQL Classic protocol

- Read/Write Connections: localhost:6446
- Read/Only Connections:  localhost:6447

## MySQL X protocol

- Read/Write Connections: localhost:6448
- Read/Only Connections:  localhost:6449


부트스트랩 완료 후 설정된 포트정보는 위와 같이 기본 포트 정보로 구성되어 있습니다. 그에 따라서 라우터를 시작하기전에 IP와 포트 그리고 use_gr_notifications 을 수정하도록 하겠습니다.

$ cd myrouter-ic-router2
$ sudo vi mysqlrouter.conf



## 전
use_gr_notifications=0

## 후
use_gr_notifications=1

-----------------------------

## 전
[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=6446

## 후
[routing:bootstrap_rw]
bind_address=192.168.56.83
bind_port=3306

-----------------------------

## 전
[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=6447

## 후
[routing:bootstrap_ro]
bind_address=192.168.56.84
bind_port=3306

-----------------------------

## 전
[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=6448

## 후
[routing:bootstrap_x_rw]
bind_address=192.168.56.83
bind_port=33060

-----------------------------

## 전
[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=6449

## 후
[routing:bootstrap_x_ro]
bind_address=192.168.56.84
bind_port=33060

-----------------------------

## 전
[http_server]
port=8443

## 후
[http_server]
port=28443


포스팅에서는 접속 포트를 3306/33060 으로 사용하고 있기 때문에 새로 생성한 ic-router2 인스턴스에도 이와 같이 동일하게 설정을 변경하였고 http_server의 포트는 기존과 겹치지 않기 위해서 다른 포트로 변경하였습니다.

라우터 인스턴스 시작 스크립트인 start.sh 를 사용하여 라우터 인스턴스를 시작한 다음 프로세스 기동과 포트 오픈을 확인해보도록 하겠습니다.

$ sudo ./start.sh

$ ps -e | grep mysqlrouter
   6681 pts/1    00:00:02 mysqlrouter
   6805 pts/1    00:00:01 mysqlrouter


$ sudo netstat -antp | grep 3306 | grep LISTEN
tcp        0      0 192.168.56.83:33060     0.0.0.0:*               LISTEN      6805/mysqlrouter
tcp        0      0 192.168.56.84:33060     0.0.0.0:*               LISTEN      6805/mysqlrouter
tcp        0      0 192.168.56.81:33060     0.0.0.0:*               LISTEN      6681/mysqlrouter
tcp        0      0 192.168.56.82:33060     0.0.0.0:*               LISTEN      6681/mysqlrouter
tcp        0      0 192.168.56.83:3306      0.0.0.0:*               LISTEN      6805/mysqlrouter
tcp        0      0 192.168.56.84:3306      0.0.0.0:*               LISTEN      6805/mysqlrouter
tcp        0      0 192.168.56.81:3306      0.0.0.0:*               LISTEN      6681/mysqlrouter
tcp        0      0 192.168.56.82:3306      0.0.0.0:*               LISTEN      6681/mysqlrouter

mysqlrouter 프로세스 2개가 기동 된 것과 81, 82, 83, 84 IP 각각 3306과 33060 포트로 오픈 된 것을 확인할 수 있습니다.

라우터 목록 확인

2개의 라우터 인스턴스의 설정 및 시작이 완료되었다면 AdminAPI를 통해서 MySQL InnoDB Cluster 에서도 2개의 라우터 정보가 확인되는지 조회해보도록 하겠습니다.

JS > var cluster = dba.getCluster()
JS > cluster.listRouters()
{
    "clusterName": "JadeCluster",
    "routers": {
        "ic-router::ic-router1": {
            "hostname": "ic-router",
            "lastCheckIn": "2023-09-10 14:08:03",
            "roPort": "3306",
            "roXPort": "33060",
            "rwPort": "3306",
            "rwXPort": "33060",
            "version": "8.0.23"
        },
        "ic-router::ic-router2": {
            "hostname": "ic-router",
            "lastCheckIn": "2023-09-10 14:08:05",
            "roPort": "3306",
            "roXPort": "33060",
            "rwPort": "3306",
            "rwXPort": "33060",
            "version": "8.0.23"
        }
    }
}

위에서 확인할 수 있는 것처럼 2개 라우터 정보가 조회되는 것을 확인할 수 있습니다.

DB상에서 메타데이터 테이블을 통해서 조회하고자 할 때는 mysql_innodb_cluster_metadata.routers 을 참고하면 됩니다.

mysql> select *
from mysql_innodb_cluster_metadata.routers\G



등록된 라우터에 대한 삭제는 이전 포스팅을 참조하시면 됩니다.



고가용성을 위한 여러 서버에 MySQL Router를 다중화(이중화)한 경우 또는 같은 서버내 여러 인스턴스를 사용하는 경우 등에 대해서 클라이언트의 접속 처리를 위해서는 여러 방안이 있을 수 있습니다.

대표적인 부분이 L4와 같은 로드밸런스가 있을 수 있으며, 클라우드의 경우 NLB도 고려해볼 수 있으며 그 외 여러가지 방법은 있을 것입니다. 이와 관련해서는 향후에 정리해보도록 하겠습니다.



긴 글 읽어 주셔서 감사합니다. 아래 다음 포스팅에서 InnoDB Cluster에 대한 내용은 이어집니다.

Reference

Reference URL
mysql.com/hiding-instances-on-mysql-innodb-cluster-replicaset
mysql.com/admin-api-tagging


연관된 다른 글

 

 

 

 

            

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x