[Docker MySQL] Proxy Layer ๊ตฌ์ถํ๊ธฐ
๊ฐ์
์ด์ ๊ฒ์๊ธ [Docker MySQL] Orchestrator๋ฅผ ์ด์ฉํ High Availability(HA) ๊ตฌ์ถํ๊ธฐ์์ ๋ง์คํฐ ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ ๋ง์คํฐ ์๋ฒ๋ก ์น๊ฒฉ์ํค๋ ๊ณผ์ ์ ์๋ํํ๋ Orchestrator๋ฅผ ํ์ฉํ ๊ณ ๊ฐ์ฉ์ฑ(High Availability, HA) ๊ตฌ์ฑ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ง์คํฐ ์๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๋๊ธฐํ๋๊ฒ ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ง์คํฐ ์๋ฒ์ ๋ถํ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ถ์ฐ์ํฌ ์ ์์์ต๋๋ค.
ํ์ง๋ง, HA ๊ตฌ์ฑ๋ง์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB ์๋ฒ ์ฌ์ด์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๋ณด์๋ ์ฅ์ ๊ฐ ๋ฐ์ํ db001์ด ๋ง์คํฐ DB๋ก ์ค์ ๋์ด ์๋ค๋ฉด, db001์ ๋ฌธ์ ๊ฐ ์๊ฒจ db002๊ฐ ์๋ก์ด ๋ง์คํฐ๊ฐ ๋์์ ๋์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ db001์ ๋ฐ๋ผ๋ณด๋๋ก ์ค์ ๋์ด ์๊ณ , db001์ ์ ์ํ๋ ค๊ณ ๊ณ์ ์๋ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ฒ์๊ธ์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB ์๋ฒ ์ฌ์ด์ ํ๋ก์ ์ญํ ์ ํด์ฃผ๋ ๋ ์ด์ด๋ฅผ ๊ตฌ์ฑํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๋ณ๊ฒฝ์ด๋ ์ฌ์์ ์์ด ์๋์ผ๋ก ๋ณ๊ฒฝ๋ ๋ง์คํฐ DB๋ก ์ฐ๊ฒฐํ๊ณ , READ์ WRITE ์์ฒญ์ ๋ฐ๋ผ ๋ถ์ฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
Proxy Layrer ๊ตฌ์ฑ
๋๋ ํ ๋ฆฌ ๋ฐ ํ์ผ ์ค์
๋จผ์ proxySQL์ ๊ตฌ์ฑํ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
mkdir -p /db/proxysql/data /db/proxysql/conf
chmod 777 /db/proxysql /db/proxysql/data /db/proxysql/conf
์ง๊ธ๊น์ง ์ด์ ๋ด์ฉ๋ค ๊ทธ๋๋ก ์ ๋ฐ๋ผ์๋ค๋ฉด, ์์ ๊ฐ์ด ๋๋ ํ ๋ฆฌ๊ฐ ๊ตฌ์ฑ๋์์ ๊ฒ๋๋ค.
๋ค์์ผ๋ก, /db/proxysql/conf ๋๋ ํ ๋ฆฌ์ cnf ํ์์ ํ์ผ์ ์์ฑํ๊ณ , ์ค์ ๋ด์ฉ์ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด, /db/proxysql/conf/proxysql.cnf ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๋ด์ฉ์ ์์ฑํฉ๋๋ค.
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
}
์ฌ๊ธฐ์ ProxySQL์ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ, ๊ด๋ฆฌ์ ๊ณ์ ์ ๋ณด, MySQL ์ธํฐํ์ด์ค ๋ฐ ํฌํธ ์ค์ ๋ฑ์ ์ง์ ํ ์ ์์ผ๋ฉฐ, ์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด proxysql.cnf์ ๊ถํ์ 644๋ก ์ง์ ํฉ๋๋ค.
chmod 644 proxysql.cnf
๊ฐ ์ค์ ํญ๋ชฉ์ ๋ํด ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- datadir="/var/lib/proxysql": ProxySQL์ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ง์
- admin_variables: ๊ด๋ฆฌ์ ๊ณ์ ์ ๋ํ ์ค์ ์ ์ง์ ํ๋ ์น์
- admin_credentials="admin:admin;radmin:radmin": ๊ด๋ฆฌ์ ๊ณ์ ์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ . ์ฌ๊ธฐ์๋ "admin" ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ "admin"์ผ๋ก ์ค์ ํ๊ณ , "radmin" ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ "radmin"์ผ๋ก ์ค์ ํจ
- mysql_ifaces="0.0.0.0:6032": ProxySQL ๊ด๋ฆฌ ์ธํฐํ์ด์ค์ IP ์ฃผ์์ ํฌํธ๋ฅผ ์ค์ . ์ฌ๊ธฐ์๋ ๋ชจ๋ IP ์ฃผ์์์ 6032 ํฌํธ๋ก ์ ์ํ ์ ์๋๋ก ์ค์ ํจ
- mysql_variables: MySQL ์๋ฒ์ ๋ํ ์ค์ ์ ์ง์ ํ๋ ์น์
- threads=4: ProxySQL์์ ์ฌ์ฉํ ์ฐ๋ ๋ ์
- max_connections=2048: ProxySQL์์ ํ์ฉํ ์ต๋ ๋์ ์ ์ ์
- default_query_delay=0: ์ฟผ๋ฆฌ ์คํ์ ๋ํ ๋๋ ์ด๋ฅผ ์ค์ .
- default_query_timeout=36000000: ์ฟผ๋ฆฌ ์คํ์ ๋ํ ํ์์์ ์๊ฐ์ ์ค์ (๋ฐ๋ฆฌ ์ด)
- have_compress=true: ์์ถ์ ์ง์ํ๋์ง ์ฌ๋ถ๋ฅผ ์ค์
- poll_timeout=2000: ProxySQL์ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํด๋งํ๋ ์ฃผ๊ธฐ๋ฅผ ์ค์ (๋ฐ๋ฆฌ ์ด)
- interfaces="0.0.0.0:6033": ProxySQL์ MySQL ์ธํฐํ์ด์ค์ IP ์ฃผ์์ ํฌํธ๋ฅผ ์ค์ . ์ฌ๊ธฐ์๋ ๋ชจ๋ IP ์ฃผ์์์ 6033 ํฌํธ๋ก ์ ์ํ ์ ์๋๋ก ์ค์ ํจ
- default_schema="information_schema": ๊ธฐ๋ณธ ์คํค๋ง๋ฅผ ์ค์
- stacksize=1048576: ProxySQL์ ์คํ ํฌ๊ธฐ๋ฅผ ์ค์
- server_version="5.5.30": ProxySQL์ด ์ฌ์ฉํ MySQL ์๋ฒ์ ๋ฒ์ ์ ์ค์
- connect_timeout_server=3000: MySQL ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ ํ์์์ ์๊ฐ์ ์ค์ (๋ฐ๋ฆฌ ์ด)
- monitor_username="monitor": Monitor ์ ์ ์ ์ฌ์ฉ์ ์ด๋ฆ์ ์ค์
- monitor_password="monitor": Monitor ์ ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์
- monitor_history=600000: Monitor ์ ์ ์ ์ด๋ ฅ์ ์ ์ฅํ๋ ์๊ฐ์ ์ค์ (๋ฐ๋ฆฌ ์ด)
- monitor_connect_interval=60000: Monitor ์ ์ ๊ฐ MySQL ์๋ฒ์์ ์ฐ๊ฒฐ์ ํ์ธํ๋ ์ฃผ๊ธฐ๋ฅผ ์ค์ (๋ฐ๋ฆฌ ์ด)
- monitor_ping_interval=10000: Monitor ์ ์ ๊ฐ MySQL ์๋ฒ์ ํ์ ๋ณด๋ด๋ ์ฃผ๊ธฐ๋ฅผ ์ค์ (๋ฐ๋ฆฌ ์ด)
- monitor_read_only_interval=1500: Monitor ์ ์ ๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋๋ก ์ ํํ๋ ์ฃผ๊ธฐ๋ฅผ ์ค์ (๋ฐ๋ฆฌ ์ด)
- monitor_read_only_timeout=500: Monitor ์ ์ ๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋๋ก ์ ํ๋๊ธฐ๊น์ง์ ํ์์์ ์๊ฐ์ ์ค์ (๋ฐ๋ฆฌ ์ด)
- ping_interval_server_msec=120000: MySQL ์๋ฒ์ ๋ํ ํ์ ๋ณด๋ด๋ ์ฃผ๊ธฐ๋ฅผ ์ค์ (๋ฐ๋ฆฌ ์ด)
- ping_timeout_server=500: MySQL ์๋ฒ์ ๋ํ ํ ์๋ต์ ํ์์์ ์๊ฐ์ ์ค์ (๋ฐ๋ฆฌ ์ด)
- commands_stats=true: ์ฟผ๋ฆฌ ์คํ์ ๋ํ ํต๊ณ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ธฐ๋ฅ์ ํ์ฑํ
- sessions_sort=true: ์ธ์ ์ ์ ๋ ฌํ์ฌ ๊ฐ์ฅ ๋ถํ๊ฐ ์ ์ ์๋ฒ์ ์ฐ์ ์ ์ผ๋ก ์ฐ๊ฒฐํ๋๋ก ํจ
- connect_retries_on_failure=10: MySQL ์๋ฒ์ ์ฐ๊ฒฐ ์๋ ์ค ์คํจํ ๊ฒฝ์ฐ ์ฌ์๋ ํ์๋ฅผ ์ค์
์์ ์ค์ ์ ํตํด ProxySQL์ MySQL ์๋ฒ์์ ์ฐ๊ฒฐ ๋ฐ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ ๋ณ๊ฒฝ๋ ๋ง์คํฐ DB๋ก ์ฐ๊ฒฐํ ์ ์๊ฒ ๋ฉ๋๋ค.
ProxySQL ์ปจํ ์ด๋ ์คํ
ProxySQL ์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
docker run -i -t --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
๊ทธ๋ฆฌ๊ณ docker ps ๋ช ๋ น์ด๋ฅผ ํตํด ProxySQL ์ปจํ ์ด๋๊ฐ ์ ์์ ์ผ๋ก ์คํ ์ค์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
ProxySQL ๊ด๋ฆฌ ์ธํฐํ์ด์ค ์ ์ ํ์ธ
ProxySQL ๊ด๋ฆฌ ์ธํฐํ์ด์ค์ ์ ์ํ๊ธฐ ์ํด์๋ MySQL ํด๋ผ์ด์ธํธ๊ฐ ํ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ProxySQL์๋ MySQL ํด๋ผ์ด์ธํธ๊ฐ ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ProxySQL ์ปจํ ์ด๋์ ์ ์ํ ํ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ์์ ํ์ธํ ์ ์์ต๋๋ค. ์ฃผ์ํด์ผ ํ ์ ์ ํฌํธ ๋ฒํธ๋ฅผ ๋ํ๋ด๋ -P ์ต์ ์ ๋๋ฌธ์๋ก ์์ฑํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฌธ์๋ก ์์ฑํ๋ฉด ์ ์์ด ๋์ง ์์ต๋๋ค.
docker exec -it proxysql mysql -h 127.0.0.1 -P 6032 -u radmin -pradmin
์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด proxysql ์ปจํ ์ด๋์ ์ ์ํ์ฌ MySQL ํด๋ผ์ด์ธํธ๋ฅผ ์คํํ๊ณ , 127.0.0.1 ์ฃผ์์ 6032 ํฌํธ๋ฅผ ํตํด ProxySQL ๊ด๋ฆฌ ์ธํฐํ์ด์ค์ ์ ์ํฉ๋๋ค. proxysql.cnf์ ๋ช ์ํ๋ radmin ์ฌ์ฉ์๋ก ์ ์ํ๋ฉฐ, ๋น๋ฐ๋ฒํธ๋ radmin์ ๋๋ค. ์ด๋ฅผ ํตํด ProxySQL ๊ด๋ฆฌ ์ธํฐํ์ด์ค์ ์ ์์ ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค.
ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑ
ํ ์คํธ๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์ ์ ProxySQL์ฉ ๋ชจ๋ํฐ๋ง ์ ์ ๋ฅผ ์์ฑํ ํ, ProxySQL ํธ์คํธ ๊ทธ๋ฃน์ DB ์๋ฒ ์ ๋ณด๋ฅผ ์ ๋ ฅํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ฐ์ํฌ ์ ์๋ ํ๊ฒฝ์ ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
docker exec -it -uroot db001 /bin/bash
mysql -uroot -p
CREATE DATABASE testdb DEFAULT CHARACTER SET utf8;
USE testdb;
CREATE TABLE insert_test(
hostname VARCHAR(5) NOT NULL,
insert_time DATETIME NOT NULL
);
์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์ ์์ฑ
CREATE USER appuser@'%' IDENTIFIED BY 'apppass';
GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO appuser@'%';
FLUSH PRIVILEGES;
ProxySQL์ฉ ๋ชจ๋ํฐ๋ง ์ ์ ์์ฑ
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%';
FLUSH PRIVILEGES;
ProxySQL ํธ์คํธ ๊ทธ๋ฃน์ DB ์๋ฒ ์ ๋ณด ์ ๋ ฅ
-- Write ํธ์คํธ ๊ทธ๋ฃน์ db001 ์๋ฒ ์ ๋ณด ์
๋ ฅ
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, 'db001', 3306);
-- Read ํธ์คํธ ๊ทธ๋ฃน์ db001, db002, db003 ์๋ฒ ์ ๋ณด ์
๋ ฅ
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);
-- Replication ๊ด๋ จ ์ค์
INSERT INTO mysql_replication_hostgroups VALUES (10, 20, 'read_only', '');
-- ๋ณ๊ฒฝ๋ ์ค์ ์ ์ ์ฉ
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ ๋ณด ์ ๋ ฅ
-- ์ดํ๋ฆฌ์ผ์ด์
์ ์ ์ ๋ณด ์
๋ ฅ
INSERT INTO mysql_users(username, password, default_hostgroup, transaction_persistent)
VALUES ('appuser', 'apppass', 10, 0);
-- ๋ณ๊ฒฝ๋ ์ค์ ์ ์ ์ฉ
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
์ฟผ๋ฆฌ ๋ฃฐ ์ ๋ณด ์ ๋ ฅ
-- ์ฟผ๋ฆฌ ๋ฃฐ ์ ๋ณด ์
๋ ฅ
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup)
VALUES (1, 1, '^SELECT.*FOR UPDATE$', 10);
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup)
VALUES (2, 1, '^SELECT', 20);
-- ๋ณ๊ฒฝ๋ ์ค์ ์ ์ ์ฉ
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
์์ ๊ฐ์ ์์๋ก ์์ ์ ์ํํ๋ฉด, ํ ์คํธ ํ๊ฒฝ์ด ๊ตฌ์ฑ๋ฉ๋๋ค. ProxySQL์ ํตํด ์ฟผ๋ฆฌ๊ฐ ๋ถ์ฐ๋๋์ง ํ์ธํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์์ ์์๋๋ก ์์ ์ ์งํํด์ผ ํฉ๋๋ค. ProxySQL์ ์ค์ ๊ฐ์ด ์ ๋๋ก ๋ค์ด๊ฐ๋์ง ํ์ธํ๊ธฐ ์ํด์๋ ์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด mysql_servers, mysql_users, mysql_query_rules ํ ์ด๋ธ์์ ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค.
SELECT * FROM mysql_servers;
SELECT * FROM mysql_users;
SELECT rule_id, active, match_pattern, destination_hostgroup, apply FROM mysql_query_rules;
Connect ํ ์คํธ ์คํฌ๋ฆฝํธ ์์ฑ(app_test_conn.sh)
#!/bin/bash
while true;
do
mysql -uappuser -papppass -h{docker_host:ip} -P16033 -N -e "SELECT @@hostname, NOW()" 2>&1 | grep -v "Warning"
sleep 1
done
Insert ํ ์คํธ ์คํฌ๋ฆฝํธ ์์ฑ(app_test_insert.sh)
#!/bin/bash
for i in {1..30};
do
mysql -uappuser -papppass -h{docker_host:ip} -P16033 -N -e "INSERT INTO testdb.insert_test SELECT @@hostname,now()" 2>&1| grep -v "Warning"
sleep 1
done
์ ์คํฌ๋ฆฝํธ๋ค์ ํ ์คํธ๋ฅผ ์ํ ๊ฐ๋จํ ์์์ ๋๋ค. app_test_conn.sh๋ ํ๋ก์ ํฌํธ(16033)๋ฅผ ํตํด ProxySQL์ ์ ์ํ์ฌ SELECT ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ณ , ์ํํ ์ปจํ ์ด๋์ ํธ์คํธ๋ค์๊ณผ ํ์ฌ ์๊ฐ์ ์ถ๋ ฅํฉ๋๋ค. app_test_insert.sh๋ ํ๋ก์ ํฌํธ๋ฅผ ํตํด ProxySQL์ ์ ์ํ์ฌ 30๋ฒ์ INSERT ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
{docker_host:ip} ๋ถ๋ถ์๋ ๋ณธ์ธ์ ๋์ปค ํธ์คํธ IP๋ฅผ ์ ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.
ํ ์คํธ ํ์ธ
app_test_conn.sh ์คํ ๊ฒฐ๊ณผ
sh app_test_conn.sh
์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ app_test_conn.sh ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด, 3๋์ MySQL ์๋ฒ์์ ์์ ์ด ๋ถ์ฐ๋์ด ์ฒ๋ฆฌ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๊ฐ๊ฐ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์๋ ํธ์คํธ๋ค์๊ณผ ํ์ฌ ์๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
app_test_insert.sh ์คํ ๊ฒฐ๊ณผ
sh app_test_insert.sh
์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ app_test_insert.sh ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ , db001์ ์ ์ํ์ฌ ํ ์ด๋ธ์ ์กฐํํด ๋ณด๋ฉด ๋ชจ๋ INSERT ์ฟผ๋ฆฌ๊ฐ db001์ ํตํด์๋ง ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ProxySQL์ด ์ค์ ๋ ๋๋ก Write ํธ์คํธ ๊ทธ๋ฃน(db001)์ผ๋ก ๋ชจ๋ ์ฐ๊ธฐ ์์ ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ํ ์คํธ๋ฅผ ํตํด app_test_conn.sh์์๋ ์ฟผ๋ฆฌ๊ฐ 3๋์ MySQL ์๋ฒ๋ก ๋ถ์ฐ๋์ด ์ฒ๋ฆฌ๋๊ณ , app_test_insert.sh์์๋ ๋ชจ๋ INSERT ์ฟผ๋ฆฌ๊ฐ db001์ ํตํด์๋ง ์ํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ProxySQL์ ํตํด ์ฟผ๋ฆฌ๊ฐ ์ ์ ํ๊ฒ ๋ถ์ฐ๋๋ ํ๊ฒฝ์ด ๊ตฌ์ฑ๋์์์ ๋ํ๋ ๋๋ค.
Fail Over Test
Failover ํ ์คํธ๋ฅผ ์งํํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ฎฌ๋ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- insert_test ํ ์ด๋ธ ๋ฐ์ดํฐ ์ด๊ธฐํ
- app_test_insert.sh ์คํ
- app_test_insert.sh ์คํ ๋์ค db001 ์ปจํ ์ด๋ ์ธ์์ ์ผ๋ก ์ค๋จ(Failover ์ํฉ ์ฐ์ถ)
- select ์ฟผ๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ํ์ธ
์ ์๋ฎฌ๋ ์ด์ ํ ์คํธ๋ฅผ ๋ณด๋ฉด db001์์๋ง INSERT๊ฐ ๋๋ค๊ฐ db001์ด ์ค๋จ๋ ์ดํ์๋ db002๋ก๋ถํฐ INSERT๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ProxySQL์ ํตํด Failover๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋์ผํ ์ ์ ์ ๋ณด๋ฅผ ์ ์งํ๊ณ ๊ณ์ํด์ ์ฌ์ฉํ ์ ์์์ ๋ํ๋ ๋๋ค.
Failover ํ ์คํธ๋ฅผ ํตํด ProxySQL์ด ์ ์ ํ ๋์ํ์ฌ Master ์๋ฒ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ ์์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
์ฌ๊ธฐ๊น์ง Proxy Layer ๊ตฌ์ถ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB ์๋ฒ ์ฌ์ด์ ํ๋ก์ ์ญํ ์ ํด์ฃผ๋ ๋ ์ด์ด๋ฅผ ๊ตฌ์ฑํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ๊ด๋ฆฌ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ฅ์ ๋ณต๊ตฌ ๋ฑ์ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค. ProxySQL์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์๊ณผ ์ฟผ๋ฆฌ ๋ถ์ฐ์ ๊ด๋ฆฌํ๊ณ , Failover ์ํฉ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค๋จ๋์ง ์๊ณ ์๋ํ ์ ์๋๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
์ด์ ๊ธ
- [Docker MySQL] Master-Slave Replication(๋ณต์ ) ๊ตฌ์ถํ๊ธฐ
- [Docker MySQL] Orchestrator๋ฅผ ์ด์ฉํ High Availability(HA) ๊ตฌ์ถํ๊ธฐ
์ฐธ๊ณ