카테고리 없음
[Docker] Replication 을 위한 Proxy 셋업
Jackerson
2022. 6. 2. 08:10
* 아키텍처
* ProxySQL Container 실행
- Docker Host에 컨피그를 위한 폴더 생성 (권한 777)
# 폴더 생성
> mkdir -p /shared/proxysql/data /shared/proxysql/conf
> chmod 777 -R /shared/proxysql
* config file 생성
- Path : /shared/proxysql/conf/proxysql.cnf (file permission 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_timeout=500
ping_interval_server_msec=120000
ping_timeout_server=500
commands_stats=true
connect_retries_on_failure=10
}
* ProxySQL Container 실행
> docker run -it --name proxysql -h proxysql \
--net [연결할 네트워크] --net-alias=proxysql \
-p 16032:6032 -p 16033:6033 \
-v /shared/proxysql/data:/var/lib/proxysql \
-v /shared/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf \
-d proxysql/proxysql
- 실행 예제
> docker run -it --name proxysql -h proxysql --net replbridge --net-alias=netproxysql -p 16032:6032 -p 16033:6033 -v /shared/proxysql/data:/var/lib/proxysql -v /shared/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf -d proxysql/proxysql
- 컨테이너 실행 확인
> docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
- ProxySQL 접속
> mysql -h127.0.0.1 -P16032 -uradmin -pradmin --prompt "ProxySQL Admin>"
* ProxySQL 용 DB 계정 생성
: db001에 접속 하여 계정을 생성한다.
# 테스트용 데이터베이스 생성
mysql> create database testdb default character set utf8;
# 어플리케이션에서 사용할 계정 생성 및 읽기/쓰기 권한 부여
mysql> create user appuser@'%' identified by 'apppass';
mysql> grant select, insert, update, delete on testdb.* to appuser@'%';
# ProxySQL 에서 사용할 모니터링 용도 계정 생성 및 필요한 권한 부여
mysql> create user 'monitor'@'%' identified by 'monitor';
mysql> grant REPLICATION CLIENT on *.* to 'monitor'@'%';
# 권한 반영
mysql> flush privileges;
* ProxySQL 에 각 서버 정보 등록
- ProxySQL 접속
> mysql -h127.0.0.1 -P16032 -uradmin -pradmin --prompt "ProxySQL Admin>"
- 정보 등록
# hostgroup_id -> 10:Read/Write, 20:Read
# Read/Write group
ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(10,'db001',3306);
# Read group
ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(20,'db001',3306);
ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(20,'db002',3306);
ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(20,'db003',3306);
# replication group
ProxySQL Admin> INSERT INTO mysql_replication_hostgroups VALUES(10,20,'read_only','');
# 정보 적용
ProxySQL Admin> LOAD MYSQL SERVERS TO RUNTIME;
ProxySQL Admin> SAVE MYSQL SERVERS TO DISK;
# application 용 유저 정보 등록
ProxySQL Admin> INSERT INTO mysql_users(username,password,default_hostgroup,transaction_persistent) VALUES('appuser','apppass',10,0);
# user 정보 등록
ProxySQL Admin> LOAD MYSQL USERS TO RUNTIME;
ProxySQL Admin> SAVE MYSQL USERS TO DISK;
# 쿼리 룰 등록
## SELECT, UPDATE는 10번그룹으로
ProxySQL Admin> INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup)VALUES(1,1,'^SELECT.*FOR UPDATE$',10);
## SELECT 는 모두 20번 그룹으로 가도록 등록
ProxySQL Admin> INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup)VALUES(2,1,'^SELECT',20);
# 쿼리 룰 적용
ProxySQL Admin> LOAD MYSQL QUERY RULES TO RUNTIME;
ProxySQL Admin> SAVE MYSQL QUERY RULES TO DISK;
* DB Connection 체킹
: 어느 DB로 접속해서 쿼리를 요청 하는지 확인 하는 스크립트
> vi app_test_conn.sh
#!/bin/bash
while true;
do
mysql -uappuser -papppass -h127.0.0.1 -P16033 -N -e "select @@hostname, now()" 2>&1|grep -v "Warning"
sleep 1
done