ProxySQLãšã¯äœã§ããïŒ
ããã¯ãMariaDBãPerconaãªã©ã®MySQLãã©ãŒã¯ã®ããŒã¿ããŒã¹ã«SQLã¯ãšãªããããã·ããããã®ã¢ããªã±ãŒã·ã§ã³ã§ãïŒå°æ¥ãéçºè ã¯ä»ã®ããŸããŸãªããŒã¿ããŒã¹ã®ãµããŒããè¿œå ããããšãçŽæããŠããŸãïŒã å¥ã®ããŒã¢ã³ãšããŠæ©èœãããããã·ããå¿ èŠããããã¹ãŠã®SQLã¯ãšãªãåŠçãããŸãã次ã«ãäºåå®çŸ©ãããã«ãŒã«ã«åŸã£ãŠãããŒã¢ã³ã¯å¿ èŠãªMySQLãµãŒããŒã«æ¥ç¶ããŠã¯ãšãªãå®è¡ãããã®åŸçµæãã¢ããªã±ãŒã·ã§ã³ã«è¿ããŸãã ProxySQLã¯ããã¿ãŒã³ã«åŸã£ãŠçä¿¡ã¯ãšãªãå€æŽããããšãã§ããŸãã
ProxySQLã®ã¢ãŒããã¯ãã£
ProxySQLã¯ããªãè€éã§ãããã·ã¹ãã ã®æ§æãç°¡åã§ãã
- 倧èŠæš¡ãªã·ã¹ãã ã«ãšã£ãŠéèŠãªèªåæ§æå€æŽãå®è¡ããŸãã ããã¯ãMySQLã®ãããªç®¡çã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠè¡ãããŸãã
- ã»ãšãã©ã®å€æŽã¯ãProxySQLããŒã¢ã³ãåèµ·åããã«ã©ã³ã¿ã€ã ã¢ãŒãã§è¡ãããšãã§ããŸãã
- çªç¶äœãã誀ã£ãŠèšå®ãããå Žåãå€æŽãããŒã«ããã¯ããã®ã¯ç°¡åã§ãã
ããã¯ã3ã€ã®å±€ã«åå²ãããå€å±€æ§æã·ã¹ãã ã䜿çšããŠå®çŸãããŸãã
ã©ã³ã¿ã€ã å±€-ãã®æ§æå±€ã¯ProxySQLããŒã¢ã³ã«ãã£ãŠçŽæ¥äœ¿çšãããã¯ãšãªããããã·ããããã®ãã¹ãŠã®æ§ææ å ±ãå«ãŸããŠããŸãã
ã¬ã€ã€ãŒã¡ã¢ãª-ãŸãã¯ã¡ã€ã³ã¬ã€ã€ãŒã¯ãã¡ã¢ãªå ã«ããSQLite3ããŒã¿ããŒã¹ã§ãããæ§ææ å ±ãšæ§æèªäœãæäŸããããã«äœ¿çšãããŸãã èšå®ã¯ãSQLã³ãã³ãã䜿çšããŠæšæºã®MySQLã¯ã©ã€ã¢ã³ããä»ããŠè¡ãããŸãã
ã¬ã€ã€ãŒãã£ã¹ã¯-ããã¯éåžžã®SQLite3ãã¡ã€ã«ã§ãã¡ã¢ãªãŒã¬ã€ã€ãŒãä»ããŠå ¥åãããïŒãŠãŒã¶ãŒã«ããïŒããŒã¿ãä¿åãããŸã
ç¢ºèª file-ProxySQLæ§æãã¡ã€ã«ïŒproxysql.cnfïŒã¯åæåæã«äœ¿çšãããSQLite3ããŒã¿ããŒã¹ã®æ€çŽ¢ã«é¢ããæ å ±ã管çã€ã³ã¿ãŒãã§ãŒã¹ã«é¢ããæ å ±ãããã³ããŒã¢ã³ã®åææ§æãå«ãŸããŸãã
ã¬ã€ã€ãŒéã§æ§æã移åããããã®ç®¡çã³ãã³ããããã€ããããŸãã
ã¡ã¢ãªïŒã¬ã€ã€ãŒ2ïŒãšã©ã³ã¿ã€ã éã§ãŠãŒã¶ãŒæ§æïŒUSERSïŒã移åããã«ã¯ïŒ
MySQL [(none)]> LOAD MYSQL USERS FROM MEMORY MySQL [(none)]> LOAD MYSQL USERS TO RUNTIME
ã©ã³ã¿ã€ã ããã¡ã¢ãªãžïŒ
MySQL [(none)]> SAVE MYSQL USERS TO MEMORY MySQL [(none)]> SAVE MYSQL USERS FROM RUNTIME
ãã£ã¹ã¯ïŒã¬ã€ã€ãŒ3ïŒããã¡ã¢ãªãž
MySQL [(none)]> LOAD MYSQL USERS TO MEMORY MySQL [(none)]> LOAD MYSQL USERS FROM DISK
ã¡ã¢ãªïŒã¬ã€ã€ãŒ2ïŒãããã£ã¹ã¯ïŒã¬ã€ã€ãŒ3ïŒãž
MySQL [(none)]> SAVE MYSQL USERS FROM MEMORY MySQL [(none)]> SAVE MYSQL USERS TO DISK
ãã£ã¹ã¯ïŒã¬ã€ã€ãŒ3ïŒããã¡ã¢ãªïŒã¬ã€ã€ãŒ2ïŒãž
LOAD MYSQL USERS FROM CONFIG
ä»ã®ããŒãã«/å€æ°ã«ã€ããŠãåãæ¹æ³ã§ç§»åã§ããŸãã å©çšå¯èœãªãªã¹ãïŒ
ã¯ãšãªã«ãŒã«-ãããã·ã®ã¯ãšãªã
å€æ°-MySQLãµãŒããŒã®å€æ°ãšç®¡çèšå®ã
èšçœ®
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«æ°ãããéçºäžã§ãããããæè¯ã®ãªãã·ã§ã³ã¯ãœãŒã¹ã³ãŒãããåéããããšã§ããããã¯githubïŒ github.com/sysown/proxysqlã§å ¥æã§ããŸãã
RedHatïŒCentOSïŒããã³DebianïŒUbuntuïŒçšã«ãã€ããªããã±ãŒãžãã³ã³ãã€ã«ãããŸããïŒ github.com/sysown/proxysql/releases
CentOS 7ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
rpm -ihv https://github.com/sysown/proxysql/releases/download/v1.2.0i/proxysql-1.2.0-1-centos7.x86_64.rpm
ã€ã³ã¹ããŒã«åŸãconfã ãã¡ã€ã«ã¯/etc/proxysql.cnfã«ãããŸã
ãæ°ã«å ¥ãã®ãšãã£ã¿ãŒã§éããŸãã
datadir="/var/lib/proxysql" admin_variables= { admin_credentials="admin:admin" # mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock" # refresh_interval=2000 # debug=true admin-stats_credentials=stats:stats # . ( ) } mysql_variables= { threads=4 # max_connections=2048 # , . default_query_delay=0 default_query_timeout=36000000 have_compress=true # poll_timeout=2000 interfaces="127.0.0.1:3306;/tmp/proxysql.sock" default_schema="information_schema" stacksize=1048576 # backend-. server_version="5.1.30" connect_timeout_server=10000 monitor_history=60000 monitor_connect_interval=200000 monitor_ping_interval=200000 ping_interval_server=10000 ping_timeout_server=200 commands_stats=true sessions_sort=true }
datadir-SQLite3ããŒã¿ããŒã¹ãã¡ã€ã«ã®å Žæãããã©ã«ã/ var / lib / proxysql
admin_variables-管çã€ã³ã¿ãŒãã§ã€ã¹ã®èšå®
mysql_variables-çä¿¡mysqlã¯ãšãªãµãŒããŒã®ã°ããŒãã«å€æ°ãå«ãŸããŸãã
mysqlã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠããã¯ãšã³ããµãŒããŒãšãã®ä»ã®èšå®ãè¿œå ããŸãã
æåã®èµ·åãšåæå
èšå®ãåæåããŸãã
åæåã¯ãconfãããµãŒããŒèšå®ã転éããŸãã ãã¡ã€ã«ïŒã¬ã€ã€ãŒ3ïŒãã¡ã¢ãªïŒã¬ã€ã€ãŒ2ïŒã®SQLite3ããŒã¿ããŒã¹ã«ä¿åããã¡ã¢ãªãŒïŒã¬ã€ã€ãŒ2ïŒã«ä¿åããããã¹ãŠã®èšå®ããªã»ãããããã¡ã€ã«ããã£ã¹ã¯ïŒã¬ã€ã€ãŒ3ïŒã«ååå€æŽããŸãã
proxysql --initial
ãªã³ã¶ãã©ã€ã§ProxySQLãæ§æããïŒã©ã³ã¿ã€ã ïŒ
ãã®å Žã§ProxySQLãèšå®ããã«ã¯ãæšæºã®mysqlã¯ã©ã€ã¢ã³ãã䜿çšããŸãã
mysql -h 127.0.0.1 -P6032 -uadmin -p Enter password: MySQL [(none)]>
ããã§ç®¡çè ã«ãªããŸããã ã€ã³ã¿ãŒãã§ãŒã¹ã ã©ããªããŒãã«ãããã®ãââèŠãŠã¿ãŸãããïŒ
MySQL [(none)]> show tables; +--------------------------------------+ | tables | +--------------------------------------+ | global_variables | | mysql_collations | | mysql_query_rules | | mysql_replication_hostgroups | | mysql_servers | | mysql_users | | runtime_mysql_query_rules | | runtime_mysql_replication_hostgroups | | runtime_mysql_servers | | runtime_scheduler | | scheduler | +--------------------------------------+ 11 rows in set (0.00 sec)
mysql_servers-ããã¯ãšã³ããµãŒããŒã®ãªã¹ããå«ã
mysql_users-ProxySQLããã³ããã¯ãšã³ããµãŒããŒã«ã¢ã¯ã»ã¹ã§ãããã¹ãŠã®ãŠãŒã¶ãŒã®ãªã¹ããå«ãŸããŸãã
mysql_query_rules-ãããã·ãééããSQlã¯ãšãªããã£ãã·ã¥ããªãã€ã¬ã¯ãã眮æããããã®ãã¹ãŠã®ã«ãŒã«ã
global_variables-ProxySQL MySQLãµãŒããŒã®ã°ããŒãã«å€æ°ïŒæ§æãã¡ã€ã«ã§æ§æããïŒãšç®¡çèšå®ãå«ãŸããŸãã
mysql_replication_hostgroups-ã¯ãšãªã«ãŒã«ãé çªã«é©çšãããããã¯ãšã³ããæ¥ç¶ããããã¹ãã°ã«ãŒãã®ãªã¹ãã
mysql_query_rules-ãããã·ã«ãŒã«ã®ã¯ãšãªã
ããã¯ãšã³ããè¿œå ããŸãããæåã«ãmysql_serversãmysql_replication_hostgroupsãããã³mysql_query_rulesããŒãã«ã空ã§ããããšã確èªããŠãã ããã
MySQL [(none)]> SELECT * FROM mysql_servers; Empty set (0.00 sec) MySQL [(none)]> SELECT * from mysql_replication_hostgroups; Empty set (0.00 sec) MySQL [(none)]> SELECT * from mysql_query_rules; Empty set (0.00 sec)
å®éãå¿ èŠãªããŒãã«ã¯ç©ºã§ãã è¿œå ããåã«ããããã·ã®å¯Ÿè±¡ãšå Žæã決å®ããå¿ èŠããããŸãã2å°ã®ãµãŒããŒãè¿œå ãã1å°ã¯æžã蟌ã¿ïŒINSERTãUPDATEãªã©ïŒã2å°ç®ã¯ããŒã¿ã®èªã¿åãïŒSELECTïŒã®ã¿ãè¡ããŸããç°ãªããµãŒããŒéã§èªã¿åã/æžã蟌ã¿ãåæ£ããã¹ã¬ãŒãã ãããè¡ãã«ã¯ã2ã€ã®ãã¹ãã°ã«ãŒããäœæããŸãã
ããã¯ãšã³ããµãŒããŒãè¿œå ããŸãã
ããŒã¿ããŒã¹ã«æžã蟌ã¿ããã¹ãã°ã«ãŒã1ã«ããæåã®ãµãŒããŒïŒ
MySQL [(none)]> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (0,'192.168.100.2',3307);
2çªç®ã®ãµãŒããŒã¯ã¹ã¬ãŒãçšã«æ§æãããŠãããèªã¿åãã®ã¿ãè¡ããã°ã«ãŒã2ã«é 眮ããŸãã
MySQL [(none)]> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'192.168.100.3',3307); Query OK, 1 row affected (0.01 sec) MySQL [(none)]> SELECT * FROM mysql_servers; +--------------+---------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+ | hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | +--------------+---------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+ | 0 | 192.168.100.2 | 3307 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | 1 | 192.168.100.3 | 3307 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | +--------------+---------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+ 2 rows in set (0.00 sec)
mysql_replication_hostgroupsããŒãã«ã«ã¯2ã€ã®ãã£ãŒã«ãããããæåã®ãã£ãŒã«ãã¯writer_hostgroupã§ããããã«ã¯ããã¹ããæžã蟌ãŸããã°ã«ãŒãã®çªå·ãå«ãŸããŸãã reader_hostgroupã§-èªã¿åãçšã
2ã€ã®ãã¹ãã°ã«ãŒãïŒ1,2ïŒãmysql_replication_hostgroupsããŒãã«ã«è¿œå ããŸãã
MySQL [(none)]> INSERT INTO mysql_replication_hostgroups VALUES (1,2); Query OK, 1 row affected (0.00 sec) MySQL [(none)]> SELECT * FROM mysql_replication_hostgroups; +------------------+------------------+ | writer_hostgroup | reader_hostgroup | +------------------+------------------+ | 1 | 2 | +------------------+------------------+ 1 row in set (0.00 sec)
次ã«ãããã¯ãšã³ããµãŒããŒãšãã¹ãã°ã«ãŒãã«é¢ããããŒã¿ãã¡ã¢ãªããã©ã³ã¿ã€ã ã«è»¢éããŠãããããããã«æå¹ã«ãªãããã«ããŸãã
MySQL [(none)]> LOAD MYSQL SERVERS TO RUNTIME; Query OK, 0 rows affected (0.00 sec)
ããŒã¿ããã£ã¹ã¯ïŒã¬ã€ã€ãŒ3ïŒã«ä¿åããŸãã
MySQL [(none)]> SAVE MYSQL SERVERS TO DISK; Query OK, 0 rows affected (0.00 sec)
ã¯ãšãªããããã·ããããã®ã«ãŒã«ãè¿œå ããŸããããã«ã¯ãããŒãã«mysql_query_rulesããããŸãã
ããŒãã«ã®æ§é ã¯æ¬¡ã®ãšããã§ãã
CREATE TABLE mysql_query_rules ( rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0, username VARCHAR, schemaname VARCHAR, flagIN INT NOT NULL DEFAULT 0, match_pattern VARCHAR, negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0, flagOUT INT, replace_pattern VARCHAR, destination_hostgroup INT DEFAULT NULL, cache_ttl INT CHECK(cache_ttl > 0), reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL, timeout INT UNSIGNED, delay INT UNSIGNED, apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 )
rule_id-ã«ãŒã«çªå·
ã¢ã¯ãã£ã-ã«ãŒã«ã¯æå¹ã0-ãªã
ãŠãŒã¶ãŒåãšã¹ããŒãå-NULL以å€ã®å Žåãã«ãŒã«ã¯ãæ¥ç¶ã®ãŠãŒã¶ãŒå/ã¹ããŒãåã®äžèŽãæ£ããå Žåã«ã®ã¿å®è¡ãããŸã
flagINãflagOUTãé©çš-ãããã®ãã©ã°ã«ããââããã«ãŒã«ã®ãã§ãŒã³ããäœæã§ããŸãã å®éã«ã¯ãç§ã¯ãŸã ãããã䜿çšããå¿ èŠã¯ãããŸããã§ããã®ã§ãä»ã®ãšããå ¬åŒææžããå ã®ããã¹ããæäŸããŸãã誰ããæ£ããæ確ã«ç¿»èš³ã§ããå Žåã¯ãé¡ãããŸãã ãããã«ããã次ã ã«é©çšããããã«ãŒã«ã®ãã§ãŒã³ããäœæã§ããŸãã å ¥åãã©ã°å€ã¯0ã«èšå®ãããflagIN = 0ã®ã«ãŒã«ã®ã¿ãæåã«èæ ®ãããŸãã ç¹å®ã®ã¯ãšãªã«äžèŽããã«ãŒã«ãèŠã€ãããšãflagOUTãè©äŸ¡ãããNOT NULLã®å ŽåãflagOUTã§æå®ããããã©ã°ã§ã¯ãšãªã«ãã©ã°ãç«ãŠãããŸãã flagOUTãflagINãšç°ãªãå Žåãã¯ãšãªã¯çŸåšã®ãã§ãŒã³ãçµäºããflagINãæ°ããå ¥åãã©ã°ãšããŠæã€æ°ããã«ãŒã«ãã§ãŒã³ã«å ¥ããŸãã ããã¯ãäžèŽããã«ãŒã«ããªããªãããapplyã1ã«èšå®ããããŸã§çºçããŸãïŒã€ãŸãããããæåŸã«é©çšãããã«ãŒã«ã§ãïŒ
match_pattern-æ£èŠè¡šçŸããã®äžã«ããã«ãŒã«ããããã·ãããŸãã
replace_pattern-ãããã·ããããªã¯ãšã¹ããŸãã¯ãã®äžéšã眮ãæããæ£èŠè¡šçŸã
destination_hostgroup-ã«ãŒã«ãé©çšãããã°ã«ãŒãã®ãã¹ãçªå·ã
cache_ttl-ãªã¯ãšã¹ãããã£ãã·ã¥ãããç§æ°ã
åæ¥ç¶-ãŸã 䜿çšãããŠããŸãã
timeout-match_patternãŸãã¯replace_patternãå®è¡ããããã®ã¿ã€ã ã¢ãŠãããªã¯ãšã¹ãã«ããã«æéããããå Žåã匷å¶çµäºãããŸãã
delay-ããã¯ãšã³ãèŠæ±ãå®è¡ããããŸã§ã®é 延ãããšãã°ãSELECTèŠæ±ãINSERT / UPDATEã®çŽåŸã«è€è£œã®ããã®æéãäžããå Žåã«åœ¹ç«ã¡ãŸãã
mysql_query_rulesããŒãã«ã«3ã€ã®ã«ãŒã«ãè¿œå ããŸã
MySQL [(none)]> INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) VALUES(1,1,'^SELECT .* FOR UPDATE$',1,1); MySQL [(none)]> INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) VALUES(1,1,'^SELECT',2,1); MySQL [(none)]> INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) VALUES(1,1,'.*',1,1);
æåã®ã«ãŒã«ã¯ããã¹ãŠã®SELECT UPDATEã¯ãšãªããã¹ã¿ãŒãµãŒããŒã«ãªãã€ã¬ã¯ãããŸã
2çªç®ã®ã«ãŒã«ã¯ããã¹ãŠã®SELECTã¹ã¬ãŒããµãŒããŒãªã¯ãšã¹ãããªãã€ã¬ã¯ãããŸã
æåŸã«ã3çªç®ã®ã«ãŒã«ã¯ä»ã®ãã¹ãŠã®èŠæ±ããã¹ã¿ãŒãµãŒããŒã«ãªãã€ã¬ã¯ãããŸãã
ãŠãŒã¶ãŒ
次ã«ãmysql_usersããŒãã«ã«ãŠãŒã¶ãŒãè¿œå ããŸãã ProxySQLã«ã¯ãæ¥ç¶ãããŠãããã¹ãŠã®ãµãŒããŒã«ååšãããã¹ãŠã®ãŠãŒã¶ãŒãå¿ èŠã§ãã äž¡æ¹ã®ãã¹ãã°ã«ãŒãã®ã«ãŒããŠãŒã¶ãŒãè¿œå ããèŠæ±ïŒ
MySQL [(none)]> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('root','password',1); Query OK, 1 row affected (0.00 sec) MySQL [(none)]> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('root','password',0); Query OK, 1 row affected (0.00 sec)
å€æŽãã©ã³ã¿ã€ã ã«è»¢éãããã£ã¹ã¯ã«ä¿åããŸãã
MySQL [(none)]> LOAD MYSQL USERS FROM MEMORY MySQL [(none)]> LOAD MYSQL USERS TO RUNTIME MySQL [(none)]> SAVE MYSQL USERS FROM MEMORY MySQL [(none)]> SAVE MYSQL USERS TO DISK MySQL [(none)]> LOAD MYSQL QUERY RULES FROM MEMORY MySQL [(none)]> LOAD MYSQL QUERY RULES TO RUNTIME MySQL [(none)]> SAVE MYSQL QUERY RULES FROM MEMORY MySQL [(none)]> SAVE MYSQL QUERY RULES TO DISK
ãããã«
äžèšã®æé ã®åŸãMaster-Slaveã¬ããªã±ãŒã·ã§ã³çšã«ProxySQLãæ§æããŸããã ãã¡ãããããã¯ProxySQLã®ãã¹ãŠã®æ©èœã§ã¯ãããŸããããšãããããã¹ãŠã®ããã¯ãšã³ãããããŠãã¡ããããèªäœã®åªããç£èŠãå®è¡ã§ããŸãã
åç §ïŒ
ãªããµã€ãïŒ http : //www.proxysql.com/
ãªãã ããã¥ã¡ã³ãïŒ https : //github.com/sysown/proxysql/tree/master/doc
ProxySQLã䜿çšããŠãã¹ã¿ãŒã¹ã¬ãŒãã¬ããªã±ãŒã·ã§ã³ãæ§æããæ§æãã¡ã€ã«ããæ§æããïŒ http ://unix-admin.su/scalable-mysql-cluster/