Last Updated on 10월 31, 2023 by Jade(정현호)
안녕하세요
이번 글은 MySQL Router 8.2.0 Innovation 버전에서 추가된 Read/Write Splitting 기능에 대해서 확인해보겠습니다.
Contents
MySQL Innovation Release
Innovation Release 에 대해서 먼저 간략하게 내용을 확인 후에 포스팅 주제인 MySQL Router의 Read/Write Splitting 기능에 대해서 살펴보도록 하겠습니다.
2023년 7월 18일 Oracle MySQL Blog을 통해서 MySQL의 앞으로 릴리즈 방향성에 대해서 발표하였습니다.
LTS - Long Term Support Release와 Innovation Release 두가지 릴리즈 버전으로 나뉘어서 제품의 향후 방향성에 대해서 발표되었습니다.
지금 사용중인 MySQL 8.0.x 버전은 8.0.34 버전 부터는 LTS 릴리즈가 되었으며 해당 버전 이후 부터는 8.0.35,8.0.36.. 출시는 되지만 bug fix 내용만 포함됩니다. 새로운 기능은 더이상 추가되지 않고 결함조치(bug fix) 내용만 포함됩니다.
반면 새롭게 소개되는 Innovation Release 에서는 새로운 기능을 포함하여 분기마다(3개월) 출시됩니다.
Innovation Release에는 새로운 기능이 제공되며, 새로운 기능을 사용해보고자 하는 경우 사용한다고 볼 수 있으며 Innovation Release에 대한 지원은 다음 릴리즈 나올 때까지 입니다.
즉 8.1.0 버전의 지원은 8.2.0 버전이 출시 전까지이며, 8.1.0 확인되는 결함(bug)은 패치 릴리즈가 나올 수 있지만 가능성은 적다고 합니다. 즉 Innovation Release의 확인되는 결함(bug)은 그 다음(또는 그 이후) Innovation Release에서 fix bug이 포함될 확률이 높습니다.
그래서 사용하는 Innovation Release에서의 문제는 다음 또는 그 이후 릴리즈에서 포함되어 있을 수 있으므로 메이저 버전 업그레이드를 해야 할 필요성이 있다는 것입니다.
지원일자가 그 다음 릴리즈가 나오기전이기 때문에 새로운 릴리즈가 출시되면 그 이전 버전에 대한 지원은 불가한 것으로 설명되고 있습니다.
지금 확인되는 MySQL 릴리즈 예정 다이어그램입니다.
[Introducing MySQL Innovation Release]
예정이고 예제임으로 버전 번호와 일자가 정확하지 않을 수 있습니다.
다이어그램에서 확인할 수 있는 정보로는 8.4.x 버전이 그 다음 LTS 버전이 될 예정이라고 합니다. 다만 이부분은 예상(예정)일 뿐 달라질 수 있습니다.
이번 포스팅글에서 다룰 내용은 글 작성 시점에서 얼마전에 출시된 MySQL Router 8.2.0 Innovation Release에 포함된 새로운 기능인 Read/Write Splitting 이며, 그래서 먼저 Innovation Release에 대한 내용을 간략하게 정리해보았습니다.
Read/Write Splitting
기능 요약
Read/Write Splitting 기능은 MySQL Router 8.2.0 Innovation Release 부터 추가된 새로운 기능 입니다.
MySQL 라우터는 읽기 쓰기 쿼리의 분할을 지원합니다. 이 기능을 사용하면 모든 읽기 트래픽을 읽기 전용 인스턴스로 보내고 모든 쓰기 트래픽을 읽기-쓰기 인스턴스로 보낼 수 있습니다.
이 기능을 사용하는데 있어서 사용자(클라이언트)가 무언가 할 것은 전혀 없습니다. MySQL Router 스스로 쿼리에 따라 리더 인스턴스로 또는 Read/Write(읽기-쓰기) 인스턴스로 보내게 됩니다.
이런 기능은 ProxySQL에서도 유사하게 지원하는 기능으로 ProxySQL에서는 Query Rule 이라는 기능으로 사용자가 지정한 정규식 표현의 쿼리 문장 설정을 통해서 쿼리를 Writer 호스트그룹 또는 Reader 호스트그룹으로 분기해서 쿼리 트래픽을 보내주는 기능을 제공하고 있습니다.
MySQL Router에서는 이런 별도의 Rule 설정이 없이 Read/Write Splitting 지원합니다.
Read/Write Splitting이 지원되면서 이제 더더욱 MySQL의 HA 선택에서 InnoDB Cluster를 선택해야 할 이유가 한가지 더 늘어난 것이라고 생각 합니다.
Read/Write Splitting 기능은 InnoDB Cluster 및 InnoDB ReplicaSet 에서 사용할 수 있습니다.
포스팅 테스트 환경은 현재 MySQL 8.0.34 버전으로 모두 업그레이드를 완료된 상태입니다.
LTS Release인 8.0.34 버전을 사용하기 있기 때문에 MySQL 데이터베이스 변경 없이 MySQL Router만 8.2.0 Innovation 으로 변경(업그레이드)하였을 때도 사용가능한지도 확인해보기 위해서 기존 8.0.34 로 구성된 InnoDB Cluster에서 MySQL Router만 업그레이드해서 진행하였습니다.
즉, MySQL Database와 MySQL Shell은 8.0.34 이고 MySQL Router만 8.2.0 으로 구성됩니다.
MySQL Router Upgrade
MySQL Router 업그레이드를 진행하겠습니다. 현재 포스팅 테스트 시스템에서 다음의 경로에서 MySQL Router를 사용중입니다.
경로: /usr/local/mysql-router
MySQL Router 8.2.0 다운로드 및 압축해제
## 파일다운로드 wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.2.0-linux-glibc2.17-x86_64.tar.xz ## 압축해제 tar xvf mysql-router-8.2.0-linux-glibc2.17-x86_64.tar.xz \ -C /usr/local
MySQL Router 중지
디렉토리를 교체 및 부트스트랩 복사 작업을 위해서 사용중인 Router를 중지합니다.
중지하게 되면 클라이언트의 트래픽이 MySQL Server로 전달되지 않습니다.
Router 업그레이드 과정 동안에 다른 Router로의 Failover나 서비스 점검 등, Router 업그레이드 작업 과정에서의 해당 Router로의 접속 불가에 대한 적절한 준비가 필요합니다.
포스팅 시스템은 MySQL 다중화(이중화)가 구현된 상태로 다음의 포스팅을 참조하시면 됩니다.
## 종료 cd /usr/local/mysql-router/{부트스트랩 디렉토리} ./stop.sh ## Router 프로세스 종료 확인 ps -ef| grep mysqlrouter
디렉토리 변경 작업
포스팅 글에서는 /usr/local/mysql-router 디렉토리 경로를 사용함에 따라 디렉토리 변경 작업을 진행하도록 하겠습니다.
• 기존 버전 디렉토리명 변경
$ cd /usr/local $ mv mysql-router mysql-router.8.0.34
• 새로운 버전 디렉토리명 변경
cd /usr/local mv mysql-router-8.2.0-linux-glibc2.17-x86_64 mysql-router
• 부트스트랩 복사 및 소유권 변경
## 기존 버전에서 부트스트랩 디렉토리 복사 cd /usr/local cp -rp ./mysql-router.8.0.34/{부트스트랩 디렉토리} ./mysql-router/ ## 추가 작업 cd ./mysql-router/{부트스트랩 디렉토리} cp mysqlrouter.conf mysqlrouter.conf.8.0.34 chown -R mysql:mysql /usr/local/mysql-router
새로운 config 추가
Read/Write Splitting 기능을 위해서 새로운 config 내용이 추가되었으며, Read/Write Splitting 기능을 사용하기 위해서 다음의 config 내용이 추가해야 합니다.
• Sample Config
[routing:bootstrap_rw_split] bind_address=0.0.0.0 bind_port=6450 destinations=metadata-cache://myreplica/?role=PRIMARY_AND_SECONDARY routing_strategy=round-robin protocol=classic connection_sharing=1 client_ssl_mode=PREFERRED server_ssl_mode=PREFERRED access_mode=auto
기존에 생성된 Read 또는 Read/Write 라우팅(포트)를 사용하는 것이 아닌 새로운 라우팅을 생성해야 하며 Read/Write Splitting 기능은 classic 프로토콜만 지원합니다.
위의 샘플 설정 내용 대부분 그대로 사용하시면 되며 Port 와 destinations 만 사용하는 환경에 따라서 수정하시면 됩니다.
Router 시작 및 업그레이드 확인
이제 MySQL Router 인스턴스를 시작 후 업그레이드 관련 내용을 확인해보도록 하겠습니다.
• 시작
cd /usr/local/mysql-router/{부트스트랩 디렉토리} ./start.sh
• 버전정보 확인
MySQL Shell 을 통해서 MySQL 인스턴스에서 접속하여 다음과 정보를 확인합니다.
js> var cluster = dba.getCluster() js> cluster.listRouters() { "clusterName": "JadeCluster", "routers": { "router-srv-1::ic-router-s1-i1": { "hostname": "router-srv-1", "lastCheckIn": "2023-09-24 14:55:13", "roPort": "6447", "roXPort": "6449", "rwPort": "6446", "rwXPort": "6448", "version": "8.0.34" }, "router-srv-2::ic-router-s2-i1": { "hostname": "router-srv-2", "lastCheckIn": "2023-10-29 18:04:18", "roPort": "6447", "roXPort": "6449", "rwPort": "6446", "rwXPort": "6448", "version": "8.2.0" <!!--- } } }
위와 같이 2번째 라우터의 버전이 8.2.0 으로 인식되는 것을 확인할 수 있습니다.
다만 DB는 8.0.34 버전이라서 splitting 포트 6450는 표기가 되지 않는 것은 확인할 수 있습니다.
Splitting 기능확인
Read/Write Splitting 전용 포트를 통해서 접속후에 쿼리를 수행하여 분기가 되는지 확인해보겠습니다.
• 트랜잭션 활성화 여부에 따른 분기 여부 확인
트랜잭션 활성화에 따른 조회 쿼리의 분기 여부를 접속한 DB서버의 호스트명과 read_only 상태 값을 통해 확인해보도록 하겠습니다.
-- 접속 후 sql 모드로 변경 js> \sql -- 접속된 DB서버의 호스트명 확인 및 read_only 여부 확인 SQL> select @@hostname,@@read_only; +------------+-------------+ | @@hostname | @@read_only | +------------+-------------+ | ic-server3 | 1 | +------------+-------------+ -- 트랜잭션 활성화 후에 다시 확인 SQL> start transaction; Query OK, 0 rows affected (0.0387 sec) SQL> select @@hostname,@@read_only; +------------+-------------+ | @@hostname | @@read_only | +------------+-------------+ | ic-server1 | 0 | +------------+-------------+ -- rollback을 통해 트랜잭션을 종료후 다시 조회 SQL>> rollback; Query OK, 0 rows affected (0.0025 sec) SQL> select @@hostname,@@read_only; +------------+-------------+ | @@hostname | @@read_only | +------------+-------------+ | ic-server3 | 1 | +------------+-------------+ 1 row in set (0.0408 sec)
위의 내용과 같이 트랜잭션 활성화 여부에 따라서 인스턴스를 분기하여 쿼리가 수행되고 있는지 확인할 수 있었습니다.
• DML 쿼리 수행
테스트 테이블 생성 후에 insert(dml) 을 수행해보도록 하겠습니다.
-- 테이블 생성 SQL> create table tb_test( id int not null primary key, col1 varchar(20), col2 varchar(20) ) ENGINE=InnoDB; -- insert 구문이 수행된 DB의 호스트명, read_only 정보를 입력 SQL> insert into tb_test(id,col1,col2) values(1,@@hostname,@@read_only); -- 입력된 데이터 조회(트랜잭션 미활성화) SQL> select @@hostname,@@read_only,col1,col2 from tb_test; +------------+-------------+------------+------+ | @@hostname | @@read_only | col1 | col2 | +------------+-------------+------------+------+ | ic-server2 | 1 | ic-server1 | 0 | +------------+-------------+------------+------+ -- 트랜잭션 활성화 후 다시 조회 SQL> start transaction; SQL> select @@hostname,@@read_only,col1,col2 from tb_test; +------------+-------------+------------+------+ | @@hostname | @@read_only | col1 | col2 | +------------+-------------+------------+------+ | ic-server1 | 0 | ic-server1 | 0 | +------------+-------------+------------+------+
테이블 생성 후 데이터를 입력시에 별도의 트랜잭션 활성화하지 않고 바로 DML(insert)이 수행하였는데도 Writer 인스턴스에서 정상적으로 실행된 부분을 확인할 수 있었습니다.(DB인스턴스 정보와 read_only 여부 확인)
이전과 동일하게 트랜잭션 상태에서 조회가 수행되는 DB인스턴스 정보가 변경됨을 확인할 수 있었습니다.
• select for update
트랜잭션 활성화 없이 select for update 를 수행시 어떻게 동작되는지 확인해보도록 하겠습니다.
-- 활성화된 트랜잭션이 있다면 종료를 위해 rollback 수행 SQL> rollback; -- select for update 를 수행 SQL> select @@hostname,@@read_only,col1,col2 from tb_test for update; +------------+-------------+------------+------+ | @@hostname | @@read_only | col1 | col2 | +------------+-------------+------------+------+ | ic-server1 | 0 | ic-server1 | 0 | +------------+-------------+------------+------+
select for update 구문에 대해서도 writer 인스턴스에서 수행되고 있음을 확인할 수 있었습니다.
• Admin API
MySQL InnoDB Cluster에서는 MySQL Shell을 통해서 여러가지 Admin API를 사용할 수 있습니다.
MySQL Router 8.2.0를 통해서도 가능한지를 확인해보았을 때는 Router와 MySQL 서버, MySQL Shell 간의 버전 차이에 따라서 이부분은 안되는 것으로 확인되고 있습니다.
JS > var cluster = dba.getCluster() Dba.getCluster: Unsupported server version: AdminAPI operations in this version of MySQL Shell support MySQL Server up to version 8.0 (RuntimeError)
이 부분은 router 를 거치지 않고 MySQL Shell 에서 DB 인스턴스를 직접 접속하면 정상적으로 수행됩니다. 그래서 이 부분은 큰 이슈가 되지는 않을 것 같습니다.
이번 포스팅에서는 MySQL Innovation Release에 대해서 간략하게 정리해보았고, MySQL Router 8.2.0에서 추가된 Read/Write Splitting 기능을 확인해보았습니다.
Read/Write Splitting 기능이 추가됨에 따라서 InnoDB Cluster(ReplicaSet)을 사용하는데 있어서 정말 좋은(필요한) 기능이 추가되었다고 생각하고, HA 솔루션을 선택함에 있어도 이런 부분도 매우 중요한 포인트가 될 것이라고 생각합니다.
이번 포스팅은 여기에서 마무리하도록 하겠습니다.
Reference
Reference URL
• blogs.oracle.com/mysql-innovation-lts
• dev.mysql.com/router-read-write-splitting
• blogs.oracle.com/mysql-82-readwrite-splitting
연관된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io