인프런 - 따라하며 배우는 MySQL on Docker 학습 정리 - ProxySQL을 이용한 Proxy Layer 구축 (1)
* 참고하면 좋은 자료를 먼저 첨부함
https://www.youtube.com/watch?v=Mzks0isSqMM
1. MySQL Load Balancers가 필요한 이유
1) MySQL Load Balancers의 정의
- 종류 : MaxScale, ProxySQL, HAProxy, MySQL Router, nginx
- 역할 :
1) MySQL 이중화로 자동으로 복구가 되더라도 Application에서는 변경된 사항을 알지 못함
2) MySQL의 장애 복구로 변경된 Master Database와 연결될 수 있도록 도와주는 Proxy Layer 서비스가 필요함
3) 이러한 기능 Load Balance라 명하며, heartbeat 등의 기능으로 하위 서버 상태를 확인하여 관리함
2. 구축 방법
1) ProxySQL Container 실행
mkdir -p /db/proxysql/data /db/proxysql/conf
chmod 777 -R /db/proxysql /db/proxysql/data /db/proxysql/conf
2) conf 폴더에 proxysql.cnf 파일 생성 (최소한 설정값, 퍼미션 644)
datadir="/var/lib/proxysql"
admin_variables=
{
admin_credentials="admin:admin;radmin:radmin"
mysql_ifaces="0.0.0.0:6032"
}
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:6033"
default_schema="information_schema"
stacksize=1048576
server_version="5.5.30"
connect_timeout_server=3000
monitor_username="monitor"
monitor_password="monitor"
monitor_history=600000
monitor_connect_interval=60000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_read_only_timeout=500
ping_interval_server_msec=120000
ping_timeout_server=500
commands_stats=true
sessions_sort=true
connect_retries_on_failure=10
}
3) ProxySQL Container 실행
sudo docker run -it --name proxysql -h proxysql --net mybridge --net-alias=proxysql -p 16032:6032 -p 16033:6033 -v /db/proxysql/data:/var/lib/proxysql -v /db/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf -d proxysql/proxysql
sudo docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
4) Proxy Layer 구성
- ProxySQL 접속
mysql -h127.0.0.1 -P16032 -uradmin -pradmin --prompt "ProxySQL Admin>"
5) mysql_servers 테이블에 그룹별 db 서버 설정
- query
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, 'db001', 3306)
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, 'db001', 3306)
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, 'db002', 3306)
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, 'db003', 3306)
LOAD MYSQL SERVERS TO RUNTIME
SAVE MYSQL SERVERS TO DISK
6) mysql_replication_hostgroups테이블에 그룹별 기능 설정
- read hostgrroup, write hostgroup 을 지정
- read / write 구분 방법을 지전한다. ( read_only, super read_only, innodb read_only )
-query
INSERT INTO mysql_replication_hostgroups VALUES (10,20,'read_only','test comment')
LOAD MYSQL SERVERS TO RUNTIME
SAVE MYSQL SERVERS TO DISK
7) mysql_users 테이블에 그룹별 db 서버 설정
- query
INSERT INTO mysql_users(username,password,default_hostgroup,transaction_persistent) VALUES ('appuser','apppass',10,0)
LOAD MYSQL SERVERS TO RUNTIME
SAVE MYSQL SERVERS TO DISK
8) mysql_query_rules 테이블에 query 문법별 룰 설정
- 쓰기 query
INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup) VALUES (1,1,'^SELECT.*FOR UPDATE$',10)
LOAD MYSQL SERVERS TO RUNTIME
SAVE MYSQL SERVERS TO DISK
- 읽기 query
INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup) VALUES (2,1,'^SELECT',20)
LOAD MYSQL SERVERS TO RUNTIME
SAVE MYSQL SERVERS TO DISK
8) Reference
- https://proxysql.com/documentation/proxysql-configuration/
- https://choelhee.tistory.com/7
댓글