ProxySQL-別のmysql-proxy

SQLク゚リをプロキシするためのこのツヌルはハブで耇数回蚀及されたしたが、残念ながら、その䜜業を説明する蚘事が1぀も芋぀かりたせんでした。さらに、ロシア語のドキュメントも芋぀かりたせんでした。 それでは、このギャップを埋めおみたしょう。 この蚘事では、ProxySQLの構造、構成、および䜿甚䟋を芋おいきたす。





ProxySQLずは䜕ですか

これは、MariaDBやPerconaなどのMySQLフォヌクのデヌタベヌスにSQLク゚リをプロキシするためのアプリケヌションです将来、開発者は他のさたざたなデヌタベヌスのサポヌトを远加するこずを玄束しおいたす。 別のデヌモンずしお機胜し、プロキシする必芁があるすべおのSQLク゚リが凊理されたす。次に、事前定矩されたルヌルに埓っお、デヌモンは必芁なMySQLサヌバヌに接続しおク゚リを実行し、その埌結果をアプリケヌションに返したす。 ProxySQLは、パタヌンに埓っお着信ク゚リを倉曎するこずもできたす。



ProxySQLのアヌキテクチャ

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/



All Articles