Database/Maria,Mysql

인프런 - 따라하며 배우는 MySQL on Docker 학습 정리 - ProxySQL을 이용한 Proxy Layer 구축 (1)

bluebamus 2022. 1. 9.

* 참고하면 좋은 자료를 먼저 첨부함

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/

 

How to configure ProxySQL for the first time - ProxySQL

Initial Configuration This guide describes how to configure the basic components of ProxySQL step by step. […]

proxysql.com

        - https://choelhee.tistory.com/7

 

ProxySQL 을 이용한 read / write split 및 failover 구성

ProxySQL 를 이용한 failover 예상 아키텍쳐 전체 아키텍쳐 HAProxy 를 이용한 read / write split 및 failover proxysql 아키텍쳐 3개의 layer 는 모두 동일한 설정을 가진다. 상호 데이터를 이동할 수 있으며 쿼..

choelhee.tistory.com

 

댓글