MySQL - InnoDB Cluster(클러스터) - (3) - MySQL Router - MySQL 라우터 구성

Share

Last Updated on 9월 24, 2023 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 이전 포스팅에서 이어서 MySQL InnoDB Cluster 구성에 대해서 기술되어 있으며, 그 중에서도 MySQL Router 에 대해서 설명되어 있습니다.  

아래 이전 포스팅에서 이어지는 글입니다.  

MySQL Router 설치

MySQL Router 설치 방법은 아래와 같이 크게 3가지 정도로 나눌 수 있습니다.


1) OS의 패키지를 통한 설치

패키지를 통한 설치에는 YUM(DNF) 또는 APT 와 같은 패키지 관리 툴에서 MySQL 의 공식 Repository 를 등록하여 다운로드 및 설치하는 방법과 https://dev.mysql.com/downloads/router 에서 직접 다운로드 받고 패키지 명령어로 설치하는 방법으로 나눌 수 있습니다

다운로드 및 설치하는 방식이 약간은 다르지만 결국은 OS 마다 정해진 패키지 시스템에 따라서 제작된 패키지(rpm 또는 deb) 파일을 통해서 설치하는 방법입니다.


2) Source Code 통해서 컴파일 하여 설치


3) 빌드 및 압축된 바이너리를 이용하여 설치


포스팅에서는 해당 방법으로 진행하였으며 MySQL Shell 과 MySQL Server 버전과 동일하게 8.0.23 버전으로 진행하였습니다.

              

사전 구성 및 유저 생성

설치 전에 먼저 사전 구성 및 유저 생성을 진행하겠습니다.

사전 필요 패키지 설치

$ sudo dnf -y install ncurses ncurses-devel \
ncurses-libs openssl openssl-devel glibc jq \
bison make cmake readline gcc gcc-c++ wget \
autoconf automake libtool* libmcrypt* git telnet \
patchelf libtirpc* rpcgen numactl numactl-devel \
ncurses-compat-libs libaio libaio-devel rsyslog

* 필수 패키지 외 컴파일 등을 고려하여 여러가지 패키지가 같이 나열되어 있습니다.


그룹 및 유저 생성

$ sudo groupadd mysql
$ sudo useradd -M -s /sbin/nologin -g mysql mysql

[참고] 패키지 형태로 설치할 경우 mysql 유저와 그룹이 생성됨으로 위 과정을 생략하여도 됩니다.


ulimit 설정

/etc/security/limits.conf 파일에 아래와 같이 입력합니다.

user$ sudo vi /etc/security/limits.conf
mysql    soft   memlock  unlimited
mysql    hard   memlock  unlimited
mysql    hard   nofile   65536
mysql    soft   nofile   65536
mysql    soft   nproc    16384
mysql    hard   nproc    16384



커널 파라미터 설정

/etc/sysctl.conf 파일에 아래와 같이 입력 후 적용합니다.

## 파일 수정
user$ sudo vi /etc/sysctl.conf

vm.swappiness=1

net.core.rmem_default = 16777216
net.core.rmem_max = 56777216
net.core.wmem_default = 16777216
net.core.wmem_max = 56777216
net.ipv4.tcp_rmem = 4096 131072 5809920
net.ipv4.tcp_wmem = 4096 16384  4194304
net.nf_conntrack_max = 131072
net.core.netdev_max_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
kernel.msgmnb = 1048576
kernel.msgmax = 2097152
net.ipv4.ip_local_port_range = 9000 65000

fs.file-max = 6815744
fs.aio-max-nr = 1048576



## 적용
sudo sysctl -p

                         

설치

파일 다운로드 및 압축해제

## 파일 다운로드
user$ wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-8.0.23-linux-glibc2.12-x86_64.tar.xz

## 파일 압축해제
user$ sudo tar xvf mysql-router-8.0.23-linux-glibc2.12-x86_64.tar.xz -C /usr/local

포스팅에서 설치 경로 /usr/local 는 예시로 다른 위치로 사용할 수 있습니다.


소유권 변경 및 경로 변경

user$ cd /usr/local
user$ sudo chown -R mysql:mysql mysql-router-8.0.23-linux-glibc2.12-x86_64
user$ sudo mv mysql-router-8.0.23-linux-glibc2.12-x86_64 mysql-router 

포스팅에서는 심볼릭 링크 대신에 mv명령어로 디렉토리명을 변경하였습니다.
향후 버전 업그레이드시 배포된 부트스트랩 디렉토리 및 conf 파일을 그대로 사용하기 위해서입니다.

MySQL Router는 심볼릭 링크를 사용하더라도 부트스트랩 배포시 다음과 같이 여러 파일에 실제 경로로 설정되기 때문입니다.

$ more mysqlrouter.conf

[DEFAULT]
name=ic-router-s1-i1
user=mysql
logging_folder=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../log
runtime_folder=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../run
data_folder=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../data
keyring_path=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../data/keyring
master_key_path=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../mysqlrouter.key
connect_timeout=15
read_timeout=30
dynamic_state=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../data/state.json
client_ssl_cert=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../data/router-cert.pem
client_ssl_key=/usr/local/mysql-router-8.0.23-linux-glibc2.12-x86_64/.../data/router-key.pem


환경 변수 추가 및 적용

echo "export PATH=\$PATH:/usr/local/mysql-router/bin" >> ~/.bash_profile
source ~/.bash_profile

                   

MySQL Router 설정

MySQL Router 를 사용하기 위해서 배포 와 설정을 진행하도록 하겠습니다.
              

배포(부트스트랩)

InnoDB 클러스터에서 사용할 라우터 서버를 구성하기 위해서 부트스트랩을 사용하여 MySQL 라우터를 배포하도록 하겠습니다.

• 부트스트랩 실행

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


실행 시 출력되는 내용은 아래와 같습니다.

Please enter MySQL password for clusteradm: 
# Bootstrapping MySQL Router instance at '/usr/local/mysql-router/myrouter'...

Please enter MySQL password for 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/myrouter/mysqlrouter.conf

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

After this MySQL Router has been started with the generated configuration

    $ mysqlrouter -c /usr/local/mysql-router/myrouter/mysqlrouter.conf

the 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:64460
- Read/Only Connections:  localhost:64470


먼저 위에서 진행한 부트스트랩 옵션에 대해서 간략하게 설명하도록 하겠습니다.

- bootstrap : MySQL InnoDB 클러스터와 함께 작동하도록 라우터 부트스트랩 및 구성합니다.
- 계정@주소 : InnoDB Cluster 멤버 중에서 Primary 역할 하는 인스턴스 정보를 입력합니다.
- name : 생성할 router 의 이름을 설정, 여기 옵션에서 지정한 이름은 설정 파일내에 기재되게 됩니다.
- directory : 부트스트랩 진행 시 생성되는 파일이 저장되는 디렉토리 경로를 설정합니다.
- account : MySQL Router 에서 InnoDB Cluster 의 서버에 접속할 때 사용하는 계정명을 지정하는 옵션입니다.
- user : MySQL Router 데몬이 구동할 때 사용할 OS 유저를 지정하는 옵션이며, 해당 옵션의 OS 유저명으로 생성되는 디렉토리 및 파일의 소유자로 설정됩니다.


실행 시 출력 된 내용에 몇 가지 살펴보도록 하겠습니다.

1) Please enter MySQL password for clusteradm
-> InnoDB Cluster 에 접속하기 위해서 사용한 옵션 "clusteradm@ic-server1:3306" 에서의 계정의 비밀번호를 입력하는 과정입니다.

2) Please enter MySQL password for myrouter
-> InnoDB Cluster 멤버에 접속해서 사용할 계정으로 지정한 "--account myrouter" 에 대해서 계정의 패스워드를 지정하는 과정입니다.

그 외에는 conf 파일의 경로나 cluster 'JadeCluster' 에 접속할 수 있도록 포트번호 정보가 출력되고 있습니다.
           

정보 확인

MySQL Router 에서 부트스트랩 단계가 완료되면 위에서 설명한 내용 한 내용과 같이 여러가지 정보가 출력 되며, 그 중에서 Cluster 'JadeCluster' 와 연결에 대한 정보를 담고 있는 포트 정보가 출력 되었으며 conf 파일내 내용과 기타 다른 정보도 확인해보도록 하겠습니다.     
           

설정 파일

InnoDB Cluster 와 연결에 대한 설정 정보는 conf 파일에 기술되어 있습니다. 포스팅에서 설정한 위치는 다음과 같으며 설치하는 환경에 따라서 경로는 다를 수 있습니다.

/usr/local/mysql-router/myrouter/mysqlrouter.conf


파일을 살펴보기 전에 생성된 myrouter 디렉토리에는 조회해보면 아래와 같은 디렉토리와 파일이 생성되어 있습니다.

$ ls -al
total 24
drwx------. 2 mysql mysql  116 Sep 17 23:14 .
drwx------. 5 mysql mysql  118 Sep 17 23:14 ..
-rw-------. 1 mysql mysql 1679 Sep 17 23:14 ca-key.pem
-rw-------. 1 mysql mysql 1090 Sep 17 23:14 ca.pem
-rw-------. 1 mysql mysql  104 Sep 17 23:14 keyring
-rw-------. 1 mysql mysql 1090 Sep 17 23:14 router-cert.pem
-rw-------. 1 mysql mysql 1679 Sep 17 23:14 router-key.pem
-rw-------. 1 mysql mysql  293 Sep 17 23:14 state.json


mysqlrouter.conf 파일의 내용은 아래와 같으며 여러 내용 중에서 InnoDB Cluster 와 연결 정보에 해당하는 내용 위주로 표기하였으며 일부 내용은 생략하였습니다.

[DEFAULT]
name=ic-router1
user=mysql
<..중략..>
dynamic_state=/usr/local/mysql-router/myrouter/data/state.json
<..중략..>

[metadata_cache:JadeCluster]
cluster_type=gr
router_id=1
user=myrouter
metadata_cluster=JadeCluster
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0

[routing:JadeCluster_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://JadeCluster/?role=PRIMARY
routing_strategy=first-available
protocol=classic

[routing:JadeCluster_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://JadeCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic

[routing:JadeCluster_x_rw]
bind_address=0.0.0.0
bind_port=64460
destinations=metadata-cache://JadeCluster/?role=PRIMARY
routing_strategy=first-available
protocol=x

[routing:JadeCluster_x_ro]
bind_address=0.0.0.0
bind_port=64470
destinations=metadata-cache://JadeCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x

[http_server]
port=8443
ssl=1
<..중략..>


위의 conf 에 설정된 내용에 대해서 살펴보도록 하겠습니다.

DEFAULT.dynamic_state : DEFAULT 세션에 있는 dynamic_state 옵션에 기록된 파일에 InnoDB 클러스터 메타데이터 서버 주소를 추적 및 저장하고 라우터가 재시작 되면 다시 로드 합니다. 

파일명은 state.json 이며, 해당 파일에는 아래와 같은 내용으로 클러스터내 MySQL 인스턴스 정보를 확인할 수 있습니다.

{
    "metadata-cache": {
        "group-replication-id": "12345-12345-12345-12345-12345",
        "cluster-metadata-servers": [
            "mysql://ic-server1:3306",
            "mysql://ic-server2:3306",
            "mysql://ic-server3:3306"
        ]
    },
    "version": "1.0.0"



metadata_cache : 해당 섹션은 MySQL Router에서 접속할 InnoDB Cluster의 정보 및 접속 관련된 설정을 포함하고 있습니다. 

metadata_cache.ttl : 캐시되어 있는 메타데이터에 대해서 갱신 주기를 의미합니다.

metadata_cache.use_gr_notifications : 그룹 복제에 대한 알림(통지) 동작에 대한 설정입니다. (기본값 0)
그룹 복제(Group Replication) 에 발생하는 변경 사항에 대해서 MySQL Router 가 통지를 받는 내용에 대한 설정입니다.

해당 옵션은 8.0.17 버전 부터 추가된 기능으로, 활성화되면 MySQL Router는 대부분의 클러스터 변경 사항에 대해 비동기식으로 알림을 받습니다. 


라우터는 그룹 복제에서 다음 알림 중 하나를 받으면 클러스터 메타 데이터를 새로 고치게 됩니다.

• group_replication/membership/quorum_loss

• group_replication/membership/view

• group_replication/status/role_change

• group_replication/status/state_change


그룹 복제 알림 기능을 사용하려면 MySQL Router에서 클러스터내 각 인스턴스로의 X 프로토콜 연결이 가능 해야 합니다. X 프로토콜 연결을 사용할 수 없는 경우 알림 기능이 활성화되지 않으며 설정된 TTL 간격으로 메타데이터의 새로 고침이 수행됩니다.

그룹 복제 알림은 X 프로토콜 연결에 의존하지만 수신된 알림(통지)은 인스턴스에 대한 클래식 MySQL 프로토콜 연결을 사용하는 메타데이터 새로 고침을 트리거를 하게 됩니다.


use_gr_notifications 이 활성화된 경우 그룹 복제 알림 기능은 클러스터 상태에 대한 정보를 최신 상태로 유지하는 기본 수단으로 사용되며 ttl 간격으로 수행되는 메타데이터 새로 고침은 추가적인 보호 수단이 되기 때문에 기본으로 설정된 값보다 더 높은 값으로 설정이 해도 되게 됩니다.

use_gr_notifications 이 비활성화된 경우 인스턴스에 다시 연결하고 메타데이터 변경을 자주 쿼리하는 오버헤드를 피하기 위해 낮은 ttl 값(예: 0.5s, 기본값)을 권장합니다.

기본값은 0 으로 사용하기 위해서는 1로 설정이 필요 합니다.



routing : 라우팅 섹션에는 목적지 정보와 그에 매핑 되는 포트 정보 등이 설정되어 있습니다.

routing.destinations : 애플리케이션으로 부터 MySQL Router 로 쿼리 요청을 받았을 경우 전달해야 하는 목적지 서버 정보(또는 클러스터) 를 지정하는 옵션입니다.  정적 설정(IP 나 호스트 별) 또는 동적 설정(클러스터명) 로 설정할 수 있습니다.

부트스트랩 방식으로 InnoDB Cluster 를 대상으로 Router를 설정하였을 경우 동적 설정으로 되며 해당 값에 Cluster 명이 기재되게 됩니다. 기재된 Cluster 에 대한 정보는 위에서 설명한 DEFAULT.dynamic_state 옵션에서 기재된 state.json 파일에 인스턴스의 호스트나 IP 정보가 기재되어 있습니다.


또한 metadata-cache://클러스터명/?role 옵션 통해서 해당 세션의 Role이 ReadWrite 가 가능한 Primary 인지 Read 만 가능한 Secondary 인지 등에 대한 설정이 가능하며, 허용되는 값은 PRIMARY, SECONDARY 또는 PRIMARY_AND_SECONDARY입니다

routing.route_strategy : 특정 라우팅 전략을 정의하며 기본 라우팅 값은 라운드 로빈(round-robin)입니다.

설정 가능한 값은 first-available, next-available, round-robin, round-robin-with-fallback 4개입니다.

PRIMARY 에서는 first-available 과 round-robin 이 사용 가능하며, 부트스트랩으로 생성시에는 first-available 으로 옵션으로 생성됩니다.

SECONDARY 에서는 first-available, round-robin 과 round-robin-with-fallback 이 사용 가능하며, 부트스트랩으로 생성시에는 round-robin-with-fallback 으로 옵션이 생성됩니다.

next-available 는 새 연결이 대상 목록에서 사용 가능한 첫 번째 서버로 라우팅 된다는 점에서 first-available 와 유사합니다. 다만 first-available 와 차이나는 점은 서버가 연결할 수 없는 것으로 표시되면(체크되면) 접속 대상 리스트에서 폐기되고 MySQL 라우터가 재시작하기전까지는 접속 대상으로 다시 사용되지 않습니다.

이와 관련하여 8.0.29 버전에서 unreachable_destination_refresh_interval 파라미터가 추가되었으며, quarantine 메커니즘은 연결할 수 없는 대상을 추적하고 나중에 다시 온라인 상태가 될 경우 가용성을 검색합니다. 이 옵션은 연결할 수 없는 각 대상 후보가 순환에 다시 추가되기 전에 가용성에 대해 조사되는 빈도(초)를 결정합니다.


8.0.23 버전에서는 아래와 같은 SSL/TLS 관련 파라미터가 추가되었습니다.
server_ssl_cipher
server_ssl_curves
server_ssl_verify
server_ssl_mode
client_ssl_dh_params
client_ssl_dh_params
client_ssl_curves
client_ssl_mode
           

라우터 DB 계정 정보

MySQL Router 를 InnoDB 클러스터와 연계를 하기 위해서 부트스트랩을 진행하였으며, 진행 프로세스 중간에서 DB에 계정을 생성하게 되었습니다.

해당 계정이 생성이 되었는지 생성되어 있다면 권한은 무엇이 부여되었는지 살펴보도록 하겠습니다.

-- cluster 내 인스턴스로 접속
user$ mysql -u clusteradm -p -h ic-server1

-- 유저 생성 확인
mysql> select user,host
from mysql.user
where user='myrouter';
+----------+------+
| user     | host |
+----------+------+
| myrouter | %    |
+----------+------+

-- 유저 권한 확인
mysql> show grants for myrouter@'%';
+------------------------------------------------------------------------------------------------+
| Grants for myrouter@%                                                                          |
+------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `myrouter`@`%`                                                           |
| GRANT SELECT, EXECUTE ON `mysql_innodb_cluster_metadata`.* TO `myrouter`@`%`                   |
| GRANT INSERT, UPDATE, DELETE ON `mysql_innodb_cluster_metadata`.`routers` TO `myrouter`@`%`    |
| GRANT INSERT, UPDATE, DELETE ON `mysql_innodb_cluster_metadata`.`v2_routers` TO `myrouter`@`%` |
| GRANT SELECT ON `performance_schema`.`global_variables` TO `myrouter`@`%`                      |
| GRANT SELECT ON `performance_schema`.`replication_group_member_stats` TO `myrouter`@`%`        |
| GRANT SELECT ON `performance_schema`.`replication_group_members` TO `myrouter`@`%`             |
+------------------------------------------------------------------------------------------------+


부트스트랩이 진행되면서 지정한 유저가 정상적으로 생성이 되었으며, 부트스트랩 과정에서 필요한 권한으로 생성이 완료된 상태입니다.
           

클러스터내 Router 정보

InnoDB Cluster의 메타데이터는 클러스터 정보외 Router 를 설정 이후에는 Router 정보도 확인할 수 있습니다.

Innodb Cluster에 등록된(연결된) Router 정보는 MySQL Shell의 AdminAPI 와 MySQL DB의 딕셔너리 정보에서 확인할 수 있습니다.

1) cluster.listRouters 명령어를 통해서 다음과 같이 확인할 수 있습니다.

JS > var cluster = dba.getCluster()
JS > cluster.listRouters()

{
    "clusterName": "JadeCluster", 
    "routers": {
        "ic-router-1::ic-router1": {
            "hostname": "ic-router-1", 
            "lastCheckIn": null, 
            "roPort": 6447, 
            "roXPort": 64470, 
            "rwPort": 6446, 
            "rwXPort": 64460, 
            "version": "8.0.23"
        }
    }
}


2) DB에서는 mysql_innodb_cluster_metadata 스키마의 routers 테이블에서 확인할 수 있습니다.

SQL > select * from mysql_innodb_cluster_metadata.routers\G
*************************** 1. row ***************************
    router_id: 1
  router_name: ic-router1
 product_name: MySQL Router
      address: ic-router-1
      version: 8.0.23
last_check_in: 2022-09-21 20:21:34
   attributes: {"ROEndpoint": "6447", 
   "RWEndpoint": "6446", 
   "ROXEndpoint": "64470", 
   "RWXEndpoint": "64460", 
   "MetadataUser": "myrouter"}
   cluster_id: 0e709af9-3142-11ed-9124-0800273eff76
      options: NULL
clusterset_id: NULL


호스트 정보, 포트 번호, Router 의 버전 정보를 확인할 수 있습니다.

mysql_innodb_cluster_metadata.routers 에서는 router_id 정보를 확인할 수 있으며, 다중 라우터(Multiple Router) 환경으로 구성할 경우 router_id 는 순차적으로 증가합니다.
부트스트랩이 완료된 후 생성된 mysqlrouter.conf 파일에서도 router_id 정보가 입력되어 있습니다.
                               

Router 시작 및 접속

이전 포스팅과 이번 포스팅을 통해서 MySQL 서버, MySQL Shell, InnoDB Cluster 구성, MySQL Router 설치 및 구성 등을 완료하였습니다.

이제 MySQL Router 시작 과 접속을 해보도록 하겠습니다.
             

MySQL Router 시작

MySQL Router부트스트랩으로 구성하였을 경우 --directory 옵션으로 지정한 경로에 Router 시작 및 중지를 하는 bash 스크립트가 자동으로 생성되며 해당 스크립트를 통해서 시작/중지를 할 수 있습니다.

먼저 포스팅에서는 실행하기 전에 파라미터 설정 1개를 변경하고 시작하도록 하겠습니다.(필수는 아님)

위에서 설명한 내용 중에서 use_gr_notifications 파라미터의 기본값은 0 임으로 사용하기 위해서 1로 변경 해야함을 설명하였습니다.
포스팅에서는 해당 파라미터를 변경 후 시작하도록 하겠습니다.

user$ cd /usr/local/mysql-router/myrouter
user$ sudo vi mysqlrouter.conf


## 파라미터 내용 변경
use_gr_notifications=0

to

use_gr_notifications=1


use_gr_notifications 를 활성화하면 클러스터내 인스턴스와 X 프로토콜 포트로 통신하게 됩니다. 이전 포스팅에서 RPM 계열에서 사용되는 방화벽 데몬인 firewalld 에서 3306 포트와 33060(X 프로토콜) 포트 모두를 개방한 내역이 있으므로 통신이 가능한지 체크해 보도록 하겠습니다.

user$ sudo telnet ic-server1 33060
Trying 192.168.56.133...
Connected to ic-server1.
Escape character is '^]'.

^CConnection closed by foreign host.


user$ sudo telnet ic-server2 33060
Trying 192.168.56.134...
Connected to ic-server2.
Escape character is '^]'.

^CConnection closed by foreign host.


user$ sudo telnet ic-server3 33060
Trying 192.168.56.135...
Connected to ic-server3.
Escape character is '^]'.

^CConnection closed by foreign host.

3개 서버 모두 X 프토토콜 포트로 통신이 되는 것을 확인하였습니다. 

이제 MySQL Router 를 시작하도록 하겠습니다.

# 경로 이동(포스팅에서의 설정 경로)
cd /usr/local/mysql-router/myrouter

# Router 실행
user$ sudo ./start.sh
PID 2916 written to '/usr/local/mysql-router/myrouter/mysqlrouter.pid'
logging facility initialized, switching logging to loggers specified in configuration


user$ ps -ef| grep mysql-router
root        2914       1  0 12:42 pts/1    00:00:00 sudo ROUTER_PID=/usr/local/mysql-router/myrouter/mysqlrouter.pid 
         /usr/local/mysql-router/bin/mysqlrouter -c /usr/local/mysql-router/myrouter/mysqlrouter.conf --user=mysql
mysql       2916    2914  1 12:42 pts/1    00:00:00 /usr/local/mysql-router/bin/mysqlrouter -c 
                                                  /usr/local/mysql-router/myrouter/mysqlrouter.conf --user=mysql


시작이 완료되었다면 오픈 된 포트 현황을 확인해보도록 하겠습니다.

user$ sudo netstat -antp | grep mysqlrouter
tcp        0      0 0.0.0.0:64470           0.0.0.0:*               LISTEN      2989/mysqlrouter    
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      2989/mysqlrouter    
tcp        0      0 0.0.0.0:64460           0.0.0.0:*               LISTEN      2989/mysqlrouter    
tcp        0      0 0.0.0.0:6446            0.0.0.0:*               LISTEN      2989/mysqlrouter    
tcp        0      0 0.0.0.0:6447            0.0.0.0:*               LISTEN      2989/mysqlrouter    
tcp        0      0 192.168.56.136:13272    192.168.56.135:33060    ESTABLISHED 2989/mysqlrouter    
tcp        0      0 192.168.56.136:60238    192.168.56.133:33060    ESTABLISHED 2989/mysqlrouter    
tcp        0      0 192.168.56.136:37628    192.168.56.133:3306     ESTABLISHED 2989/mysqlrouter    
tcp        0      0 192.168.56.136:40126    192.168.56.134:33060    ESTABLISHED 2989/mysqlrouter


RW 포트 6446 , RO 포트 6447 , X 프로토콜 RW 포트 64460 , X 프로토콜 RO 포트 64470 이 확인되고 있습니다.
또한 MySQL Router REST API 를 위한 포트인 8443 이 확인되고 있으며 맨 아래 ESTABLISHED 에는 각 인스턴스별로 X 프로토콜 33060 으로 접속 및 Primary 와 3306 포트의 연결이 확인되고 있습니다.

REST API 관련된 내용은 아래 내용을 참고하시면 됩니다.

                               

접속 확인

접속을 할 수 있는 준비가 되었으므로 MySQL Router 구동 서버가 아닌 다른 서버(like 애플리케이션 서버) 에서 접속해보도록 하겠습니다.

외부 서버에서 MySQL Router서버로 접속하기 위해서는 사용환경에 따라서 Cloud의 경우 보안그룹과 같은 리소스에서 포트 허용도 필요할 것이고, OS 구성환경에 따라서 OS 방화벽을 오픈 해야 할 수도 있습니다. 

접속 시도 전에 OS 방화벽을 오픈 하도록 하겠습니다.

sudo firewall-cmd --permanent --add-port=6446/tcp
sudo firewall-cmd --permanent --add-port=6447/tcp
sudo firewall-cmd --permanent --add-port=64460/tcp
sudo firewall-cmd --permanent --add-port=64470/tcp
sudo firewall-cmd --permanent --add-port=8443/tcp

sudo firewall-cmd --reload
sudo firewall-cmd --list-all

* 8443 포트는 REST API 사용을 위한 포트로 필수는 아니므로 해당 포트의 OPEN 은 생략해도 됩니다.


6646 포트와 6647 포트를 통해서 접속을 테스트해보겠습니다.

-- 6646 포트로 접속
JS > \connect clusteradm@ic-router1:6446
Creating a session to 'clusteradm@ic-router1:6446'
Please provide the password for 'clusteradm@ic-router1:6446': **********
Save password for 'clusteradm@ic-router1:6446'? [Y]es/[N]o/Ne[v]er (default No): N
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 5862
Server version: 8.0.23 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.

-- 호스트 와 read_only 상태 확인
ic-router1:6446 ssl  JS > \sql select @@hostname,@@read_only;
+------------+-------------+
| @@hostname | @@read_only |
+------------+-------------+
| ic-server1 |           0 |
+------------+-------------+


-- 6647 포트로 접속
ic-router1:6446 ssl  JS > \connect clusteradm@ic-router1:6447
Creating a session to 'clusteradm@ic-router1:6447'
Please provide the password for 'clusteradm@ic-router1:6447': **********
Save password for 'clusteradm@ic-router1:6447'? [Y]es/[N]o/Ne[v]er (default No): N
Fetching schema names for autocompletion... Press ^C to stop.
Closing old connection...
Your MySQL connection id is 43
Server version: 8.0.23 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.

-- 호스트 와 read_only 상태 확인
 ic-router1:6447 ssl  JS > \sql select @@hostname,@@read_only;
+------------+-------------+
| @@hostname | @@read_only |
+------------+-------------+
| ic-server3 |           1 |
+------------+-------------+

포트별로 다른 서버로 접속되는 것이 확인할 수 있으며, 접속하는 서버에 따라서 RW 와 RO 를 확인할 수 있는 Read_only 정보도 다르게 설정되어 있음을 확인할 수 있습니다.
         

MySQL Router 종료

MySQL Router 프로세스(데몬) 종료는 부트스트랩으로 구성하였을 경우 --directory 옵션으로 지정한 경로에 Router 시작 및 중지를 하는 bash 스크립트가 자동으로 생성되며 해당 스크립트를 통해서 중지를 할 수 있습니다.

user$ ls -al

drwxr-xr-x  5 mysql mysql  156  9월  8 14:23 .
drwxr-xr-x. 8 mysql mysql  138  9월  7 14:47 ..
drwx------  2 mysql mysql  116  9월  7 14:49 data
drwx------  2 mysql mysql   29  9월  7 14:49 log
-rw-------  1 mysql mysql 2530  9월  7 15:00 mysqlrouter.conf
-rw-------  1 mysql mysql  144  9월  7 14:49 mysqlrouter.key
drwx------  2 mysql mysql    6  9월  7 14:48 run
-rwx------  1 mysql mysql  441  9월  7 14:49 start.sh
-rwx------  1 mysql mysql  329  9월  7 14:49 stop.sh <!!----


디렉토리내 stop.sh 를 실행하여 MySQL Router를 종료합니다.

user$ sudo ./stop.sh

       

Router 등록 삭제

InnoDB Cluster에서 등록된 Router 정보를 삭제하는 방법은 다음과 같습니다.
제거하기 위해서는 MySQL Router 인스턴스의 이름호스트명을 확인해야 합니다.

cluster.listRouters() Admin Api 나 mysql_innodb_cluster_metadata 스키마의 routers 테이블을 통해서 hostname(address) 와 Router 인스턴스 이름을 확인합니다.

• 정보 조회

## Admin API
js> var cluster = dba.getCluster()
js> cluster.listRouters()

or

## 메타데이터 테이블 조회
SQL > select *
from mysql_innodb_cluster_metadata.routers\G


호스트 정보와 라우터 이름이 확인되었다면 아래와 같이 Admin API를 사용하여 등록된 라우터 정보를 삭제합니다.
'호스트정보::라우터이름' 과 같이 중간에 콜론(:) 2개를 사용하여 입력합니다.

js> cluster.removeRouterMetadata('ic-router-1::ic-router1')

* 이어지는 포스팅의 InnoDB Cluster 테스트 예제 시나리오에서 MySQL Router를 계속 사용되기 때문에 위의 과정은 참고 사항이며 현재 단계에서는 위의 작업을 생략해도 됩니다.


이번 포스팅에서는 여기서 마무리하며, 아래의 다음 포스팅에서 클러스터 Failover 와 클러스터 모드의 변경 및 클러스터 변경 작업 등에 대해서 확인해보도록 하겠습니다.

                            

Reference

Reference URL
mysql.com/mysql-router-installation-linux
mysql.com/deploying-bootstrapping
mysql.com/mysql-router-conf-options
mysql.com/mysql-router-configuration-file-example

• What is the Maximum Value for max_connections on Linux? (Doc ID 1385400.1)
• Recommended Linux kernel parameters for MySQL (Doc ID 2733424.1)


연관된 다른 글

 

 

 

                 

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