docker配置mysql 中间件 ProxySQL
之前我們配置了mysql 一主二從模式,本文將利用mysql中間件ProxySQL 實現讀寫分離。
首先下載鏡像
docker pull proxysql/proxysql在home目錄下創建proxysql/proxysql.cnf,內容如下
datadir="/var/lib/proxysql" admin_variables= {admin_credentials="admin:admin;radmin:radmin" ##管理端賬號密碼mysql_ifaces="0.0.0.0:6032" } mysql_variables= {threads=4max_connections=2048default_query_delay=0default_query_timeout=36000000have_compress=truepoll_timeout=2000interfaces="0.0.0.0:6033"default_schema="information_schema"stacksize=1048576server_version="5.5.30"connect_timeout_server=3000monitor_username="monitor" ##監控賬號monitor_password="monitor" ##監控密碼monitor_history=600000monitor_connect_interval=60000monitor_ping_interval=10000monitor_read_only_interval=1500monitor_read_only_timeout=500ping_interval_server_msec=120000ping_timeout_server=500commands_stats=truesessions_sort=trueconnect_retries_on_failure=10 } docker run -p 16032:6032 -p 16033:6033 -p 16070:6070 --name=proxysql -d -v /home/proxysql/proxysql.cnf:/etc/proxysql.cnf proxysql/proxysql生成容器后,我們進入之前mysql 3個容器中任意一個
docker exec -it mysql-master /bin/bashroot@8c6fba5006e3:/# mysql -h服務器ip -P16032 -uradmin -pradmin --prompt "ProxySQL Admin>" mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.5.30 (ProxySQL Admin Module)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.ProxySQL Admin>進入proxysql admin管理窗口后,
ProxySQL Admin>show databases; +-----+---------------+-------------------------------------+ | seq | name | file | +-----+---------------+-------------------------------------+ | 0 | main | | | 2 | disk | /var/lib/proxysql/proxysql.db | | 3 | stats | | | 4 | monitor | | | 5 | stats_history | /var/lib/proxysql/proxysql_stats.db | +-----+---------------+-------------------------------------+ 5 rows in set (0.01 sec)ProxySQL Admin>?可見有五個庫: main、disk、stats 、monitor 和 stats_history?
main: 內存配置數據庫,即 MEMORY,表里存放后端 db 實例、用戶驗證、路由規則等信息。main 庫中有如下信息:
庫下的主要表:?
mysql_servers: 后端可以連接 MySQL 服務器的列表?
mysql_users: 配置后端數據庫的賬號和監控的賬號。?
mysql_query_rules: 指定 Query 路由到后端不同服務器的規則列表。
注: 表名以 runtime_開頭的表示 ProxySQL 當前運行的配置內容,不能通過 DML 語句修改。
只能修改對應的不以 runtime 開頭的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盤以供下次重啟加載。?
disk?:持久化的磁盤的配置?
stats: 統計信息的匯總?
monitor:一些監控的收集信息,比如數據庫的健康狀態等?
stats_history: 這個庫是 ProxySQL 收集的有關其內部功能的歷史指標
接下來我們配置proxysql所需賬戶
在 Master? 的MySQL 上創建 ProxySQL 的監控賬戶和對外訪問賬戶
?注意 mysql8.0.x 用戶認證的方式需要修改為?mysql_native_password?
需要在my.cnf 加上這個用戶認證方式,再來創建用戶
proxysql配置
整套配置系統分為三層:頂層為 RUNTIME ,中間層為 MEMORY , 底層也就是持久層 DISK 和 CONFIG FILE 。
RUNTIME : 代表 ProxySQL 當前生效的正在使用的配置,無法直接修改這里的配置,必須要從下一層 “load” 進來。?
MEMORY: MEMORY 層上面連接 RUNTIME 層,下面連接持久層。這層可以正常操作 ProxySQL 配置,隨便修改,不會影響生產環境。修改一個配置一般都是現在 MEMORY 層完成的,確認正常之后在加載達到 RUNTIME 和 持久化的磁盤上。
DISK 和 CONFIG FILE:持久化配置信息,重啟后內存中的配置信息會丟失,所需要將配置信息保留在磁盤中。重啟時,可以從磁盤快速加載回來。
在不同層次間移動配置
為了將配置持久化到磁盤或者應用到 runtime,在管理接口下有一系列管理命令來實現它們。?
要重新配置 MySQL 用戶,可執行下面的其中一個命令:
?要處理 MySQL server:
1、LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME將 MySQL server 從內存數據庫中加載到 runtime。 2、SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME將 MySQL server 從 runtime 持久化到內存數據庫中。 3、LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK從磁盤數據庫中加載 MySQL server 到內存數據庫。 4、SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK從內存數據庫中將 MySQL server 持久化到磁盤數據庫中。 5、LOAD MYSQL SERVERS FROM CONFIG從配置文件中加載 MySQL server 到內存數據庫中要處理 MySQL 的查詢規則(mysql query rules):
1、 LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME將 MySQL query rules 從內存數據庫加載到 runtime 數據結構。 2、 SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME將 MySQL query rules 從 runtime 數據結構中持久化到內存數據庫。 3、 LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK從磁盤數據庫中加載 MySQL query rules 到內存數據庫中。 4、 SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK將 MySQL query rules 從內存數據庫中持久化到磁盤數據庫中。 5、 LOAD MYSQL QUERY RULES FROM CONFIG從配置文件中加載 MySQL query rules 到內存數據庫中。要處理 MySQL 變量(MySQL variables):
1、 LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME將 MySQL variables 從內存數據庫加載到 runtime 數據結構。 2、 SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME將 MySQL variables 從 runtime 數據結構中持久化到內存數據中。 3、 LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK從磁盤數據庫中加載 MySQL variables 到內存數據庫中。 4、 SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK將 MySQL variables 從內存數據庫中持久化到磁盤數據庫中。 5、 LOAD MYSQL VARIABLES FROM CONFIG從配置文件中加載 MySQL variables 到內存數據庫中。要處理管理變量(admin variables):
1、 LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME將 admin variables 從內存數據庫加載到 runtime 數據結構。 2、 SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME將 admin variables 從 runtime 持久化到內存數據庫中。 3、 LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK從磁盤數據庫中加載 admin variables 到內存數據庫中。 4、 SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK將 admin variables 從內存數據庫中持久化到磁盤數據庫。 5、 LOAD ADMIN VARIABLES FROM CONFIG從配置文件中加載 admin variables 到內存數據庫中。?一般在內存那層修改 ,然后保存到運行系統,保存到磁盤數據庫系統
load xxx to runtime; save xxx to disk;管理配置
disk -> 是sqlite3 數據庫 ,默認位置是$DATADIR/proxysql.db( /var/lib/proxysql/proxysql.db) config file 是一個傳統配置文件:一般不更改 在內存中動態更改配置,如果重啟,沒進行持久化(save) 則會丟失。三則之間關系:
-
proxysql 啟動時,首先去找/etc/proxysql.cnf 找到它的datadir,如果datadir下有proxysql.db 就加載proxysql.db的配置
-
如果啟動proxysql時帶有--init標志,會用/etc/proxsql.cnf的配置,把Runtime,disk全部初始化一下
-
在調用是調用--reload?會把/etc/proxysql.cnf 和disk 中配置進行合并。如果沖突需要用戶干預。disk會覆蓋config file。
關于傳統的配置文件?
傳統配置文件默認路徑為/etc/proxysql.cnf,也可以在二進制程序proxysql上使用-c或–config來手動指定配置文件。?
默認情況下:幾乎不需要手動去配置proxysql.cnf。
端口號,管理proxysql用戶密碼,可以在這里修改
?這里有幾個最常用的命令:如何讓修改的配置生效(runtime),以及如何持久化到磁盤上(disk)。
記住,只要不是加載到 runtime,修改的配置就不會生效。
LOAD MYSQL USERS TO RUNTIME; 將內存數據庫中的配置加載到 runtime 數據結構 SAVE MYSQL USERS TO DISK; 將內存數據庫中的 MySQL 用戶持久化到磁盤數據庫中。 LOAD MYSQL SERVERS TO RUNTIME; 將 MySQL server 從內存數據庫中加載到 runtime。 SAVE MYSQL SERVERS TO DISK; 從內存數據庫中將 MySQL server 持久化到磁盤數據庫中。 LOAD MYSQL QUERY RULES TO RUNTIME; 將 MySQL query rules 從內存數據庫加載到 runtime 數據結構。 SAVE MYSQL QUERY RULES TO DISK; 將 MySQL query rules 從內存數據庫中持久化到磁盤數據庫中。 LOAD MYSQL VARIABLES TO RUNTIME; 將 MySQL variables 從內存數據庫加載到 runtime 數據結構。 SAVE MYSQL VARIABLES TO DISK; 將 MySQL variables 從內存數據庫中持久化到磁盤數據庫中。 LOAD ADMIN VARIABLES TO RUNTIME; 將 admin variables 從內存數據庫加載到 runtime 數據結構。 SAVE ADMIN VARIABLES TO DISK; 將 admin variables 從內存數據庫中持久化到磁盤數據庫。只有加載到 runtime 狀態時才會去做最后的有效性驗證。在保存到內存數據庫或持久化到磁盤上時,都不會發生任何警告或錯誤。當加載到 runtime 時,如果出現錯誤,將恢復為之前保存得狀態,這時可以去檢查錯誤日志。
配置 ProxySQL 主從分組信息
用到 這個表 mysql_replication_hostgroup,表結構信息如下
ProxySQL Admin>show create table mysql_replication_hostgroups\G; *************************** 1. row ***************************table: mysql_replication_hostgroups Create Table: CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0),check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only','read_only|innodb_read_only','read_only&innodb_read_only')) NOT NULL DEFAULT 'read_only',comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup)) 1 row in set (0.01 sec)ERROR: No query specifiedProxySQL Admin>writer_hostgroup?和reader_hostgroup?寫組和讀組都要大于0且不能相同,我的環境下,寫組定義與10,讀組定義為20
創建組
ProxySQL Admin>insert into mysql_replication_hostgroups ( writer_hostgroup, reader_hostgroup, comment) values (10,20,'proxy'); Query OK, 1 row affected (0.01 sec)ProxySQL Admin>load mysql servers to runtime; Query OK, 0 rows affected (0.01 sec)ProxySQL Admin>save mysql servers to disk; Query OK, 0 rows affected (0.02 sec)ProxySQL Admin>use main Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changed ProxySQL Admin>select * from mysql_replication_hostgroups; +------------------+------------------+------------+---------+ | writer_hostgroup | reader_hostgroup | check_type | comment | +------------------+------------------+------------+---------+ | 10 | 20 | read_only | proxy | +------------------+------------------+------------+---------+ 1 row in set (0.00 sec)ProxySQL Admin>select * from runtime_mysql_replication_hostgroups; +------------------+------------------+------------+---------+ | writer_hostgroup | reader_hostgroup | check_type | comment | +------------------+------------------+------------+---------+ | 10 | 20 | read_only | proxy | +------------------+------------------+------------+---------+ 1 row in set (0.00 sec)ProxySQL Admin>use disk; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changed ProxySQL Admin>select * from mysql_replication_hostgroups; +------------------+------------------+------------+---------+ | writer_hostgroup | reader_hostgroup | check_type | comment | +------------------+------------------+------------+---------+ | 10 | 20 | read_only | proxy | +------------------+------------------+------------+---------+ 1 row in set (0.00 sec)ProxySQL Admin>?ProxySQL 會根據server 的read _only 的取值將服務器進行分組。 read_only=0 的server,master被分到編號為10的寫組,read_only=1 的server,slave則被分到編號20的讀組
添加主從服務器節點
用到mysql_servers 這個表
ProxySQL Admin>insert into mysql_servers(hostgroup_id,hostname,port) values(10,'MYSQL-MASTER節點ip',3306); Query OK, 1 row affected (0.01 sec)ProxySQL Admin>insert into mysql_servers(hostgroup_id,hostname,port) values(20,'從節點1ip',3306); Query OK, 1 row affected (0.01 sec)ProxySQL Admin>insert into mysql_servers(hostgroup_id,hostname,port) values(20,'從節點2ip',3306); Query OK, 1 row affected (0.01 sec)ProxySQL Admin>load mysql servers to runtime; Query OK, 0 rows affected (0.00 sec)ProxySQL Admin>save mysql servers to disk; Query OK, 0 rows affected (0.03 sec)roxySQL Admin>select * from mysql_servers; +--------------+------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | hostgroup_id | hostname | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment | +--------------+------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | 20 | 172.18.0.3 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 20 | 172.18.0.4 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 10 | 172.18.0.2 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | +--------------+------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ 3 rows in set (0.00 sec)ProxySQL監控 MySQL 后端節點
為 ProxySQL 配置監控賬號ProxySQL Admin>UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username'; Query OK, 1 row affected (0.00 sec)ProxySQL Admin>UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password'; Query OK, 1 row affected (0.00 sec)修改后,保存到runtime和disk ProxySQL Admin>load mysql variables to runtime; Query OK, 0 rows affected (0.00 sec)ProxySQL Admin>save mysql variables to disk; Query OK, 147 rows affected (0.01 sec)驗證監控信息,ProxySQL 監控模塊的指標都保存在monitor庫的log表中 以下是連接是否正常的監控,對connect指標的監控 ,在前面可能會有很多connect_error,這是因為沒有配置監控信息時的錯誤,配置后如果connect_error的結果為NULL則表示正常ProxySQL Admin>select * from monitor.mysql_server_connect_log; +------------+------+------------------+-------------------------+---------------+ | hostname | port | time_start_us | connect_success_time_us | connect_error | +------------+------+------------------+-------------------------+---------------+ | 172.18.0.2 | 3306 | 1637812649307891 | 639 | NULL | | 172.18.0.3 | 3306 | 1637812649763677 | 654 | NULL | | 172.18.0.4 | 3306 | 1637812650219452 | 645 | NULL | | 172.18.0.4 | 3306 | 1637812709307967 | 649 | NULL | | 172.18.0.3 | 3306 | 1637812709818585 | 598 | NULL | | 172.18.0.2 | 3306 | 1637812710329212 | 709 | NULL | | 172.18.0.2 | 3306 | 1637812769308026 | 650 | NULL | | 172.18.0.4 | 3306 | 1637812769751543 | 653 | NULL | | 172.18.0.3 | 3306 | 1637812770195036 | 748 | NULL | | 172.18.0.2 | 3306 | 1637812829308104 | 654 | NULL | | 172.18.0.3 | 3306 | 1637812830036258 | 659 | NULL | | 172.18.0.4 | 3306 | 1637812830764335 | 615 | NULL | | 172.18.0.2 | 3306 | 1637812889308177 | 660 | NULL | | 172.18.0.4 | 3306 | 1637812889823761 | 668 | NULL | | 172.18.0.3 | 3306 | 1637812890339321 | 744 | NULL | | 172.18.0.3 | 3306 | 1637812949308279 | 633 | NULL | | 172.18.0.2 | 3306 | 1637812949738104 | 668 | NULL | | 172.18.0.4 | 3306 | 1637812950167964 | 737 | NULL | | 172.18.0.4 | 3306 | 1637813009308331 | 635 | NULL | | 172.18.0.3 | 3306 | 1637813009759778 | 685 | NULL | | 172.18.0.2 | 3306 | 1637813010211269 | 700 | NULL | | 172.18.0.3 | 3306 | 1637813069308387 | 681 | NULL | | 172.18.0.2 | 3306 | 1637813070045728 | 715 | NULL | | 172.18.0.4 | 3306 | 1637813070783034 | 638 | NULL | | 172.18.0.2 | 3306 | 1637813129308453 | 656 | NULL | | 172.18.0.4 | 3306 | 1637813129816893 | 632 | NULL | | 172.18.0.3 | 3306 | 1637813130325287 | 688 | NULL | | 172.18.0.2 | 3306 | 1637813189308496 | 671 | NULL | | 172.18.0.4 | 3306 | 1637813189760137 | 641 | NULL | | 172.18.0.3 | 3306 | 1637813190211775 | 1804 | NULL | | 172.18.0.4 | 3306 | 1637813200164931 | 594 | NULL | | 172.18.0.2 | 3306 | 1637813200584629 | 671 | NULL | | 172.18.0.3 | 3306 | 1637813201004303 | 640 | NULL | +------------+------+------------------+-------------------------+---------------+ 33 rows in set (0.01 sec)對心跳信息的監控(對ping 指標的監控)ProxySQL Admin>select * from mysql_server_ping_log limit 10; +------------+------+------------------+----------------------+------------+ | hostname | port | time_start_us | ping_success_time_us | ping_error | +------------+------+------------------+----------------------+------------+ | 172.18.0.3 | 3306 | 1637812629304013 | 114 | NULL | | 172.18.0.4 | 3306 | 1637812629382784 | 114 | NULL | | 172.18.0.2 | 3306 | 1637812629461550 | 121 | NULL | | 172.18.0.3 | 3306 | 1637812639304079 | 118 | NULL | | 172.18.0.2 | 3306 | 1637812639418117 | 128 | NULL | | 172.18.0.4 | 3306 | 1637812639532121 | 127 | NULL | | 172.18.0.3 | 3306 | 1637812649304116 | 116 | NULL | | 172.18.0.4 | 3306 | 1637812649432345 | 118 | NULL | | 172.18.0.2 | 3306 | 1637812649560548 | 129 | NULL | | 172.18.0.4 | 3306 | 1637812659304223 | 120 | NULL | +------------+------+------------------+----------------------+------------+ 10 rows in set (0.01 sec)看看read_only的日志監控 ProxySQL Admin>select * from mysql_server_read_only_log limit 10; +------------+------+------------------+-----------------+-----------+-------+ | hostname | port | time_start_us | success_time_us | read_only | error | +------------+------+------------------+-----------------+-----------+-------+ | 172.18.0.2 | 3306 | 1637812638650747 | 288 | 0 | NULL | | 172.18.0.3 | 3306 | 1637812638666669 | 226 | 0 | NULL | | 172.18.0.4 | 3306 | 1637812638682602 | 183 | 0 | NULL | | 172.18.0.4 | 3306 | 1637812640150809 | 278 | 0 | NULL | | 172.18.0.3 | 3306 | 1637812640161781 | 202 | 0 | NULL | | 172.18.0.2 | 3306 | 1637812640172786 | 182 | 0 | NULL | | 172.18.0.4 | 3306 | 1637812641650944 | 283 | 0 | NULL | | 172.18.0.2 | 3306 | 1637812641662389 | 204 | 0 | NULL | | 172.18.0.3 | 3306 | 1637812641673840 | 191 | 0 | NULL | | 172.18.0.2 | 3306 | 1637812643150982 | 244 | 0 | NULL | +------------+------+------------------+-----------------+-----------+-------+ 10 rows in set (0.00 sec)Monitor 模塊就會開始監控后端的read_only值,當監控到read_only值,就會按照read_only的值將某些節點自動移到讀寫組為 ProxySQL 配置對外訪問賬號
SQL 請求所使用的用戶配置,都需要在 MySQL 節點創建上。在之前步驟中:配置ProxySQL 賬戶,我創建的對外訪問賬戶是:用戶:proxysql,密碼:123456?
ProxySQL Admin>show create table mysql_users\G; *************************** 1. row ***************************table: mysql_users Create Table: CREATE TABLE mysql_users (username VARCHAR NOT NULL,password VARCHAR,active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0,default_hostgroup INT NOT NULL DEFAULT 0,default_schema VARCHAR,schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0,transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1,fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0,backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1,frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1,max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000,attributes VARCHAR CHECK (JSON_VALID(attributes) OR attributes = '') NOT NULL DEFAULT '',comment VARCHAR NOT NULL DEFAULT '',PRIMARY KEY (username, backend),UNIQUE (username, frontend)) 1 row in set (0.00 sec)ERROR: No query specifiedProxySQL Admin>insert into mysql_users (username,password,default_hostgroup) values ('proxysql','123456',10); Query OK, 1 row affected (0.00 sec)ProxySQL Admin>load mysql users to runtime; Query OK, 0 rows affected (0.01 sec)ProxySQL Admin>save mysql users to disk; Query OK, 0 rows affected (0.01 sec)ProxySQL Admin>select * from mysql_users\G; *************************** 1. row ***************************username: proxysqlpassword: 123456active: 1 #是否啟用該賬戶,為0表示禁用use_ssl: 0default_hostgroup: 10default_schema: NULLschema_locked: 0 transaction_persistent: 1 #事務透明化fast_forward: 0backend: 1frontend: 1max_connections: 10000 #用戶鏈接10000,可以修改attributes: comment: 1 row in set (0.01 sec)ERROR: No query specifiedProxySQL Admin>mysql_users 表有不少字段,最主要的三個字段username,password,default_hostgroup?
username: 前端鏈接ProxySQL ,以及ProxySQL 將SQL 語句路由給MySQL所使用的的用戶名?
password:用戶名對應的密碼,。可以是明文密碼,也可以是hash密碼。如果想使用hash密碼,可以先在某個MySQL節點上執行select password(PASSWORD),然后將加密結果復制到該字段。?
default_hostgroup:該用戶名默認的路由目標。例如,指定root用戶的該字段值為10時,則使用 proxysql 用戶發送的SQL語句默認情況下將路由到hostgroup_id=10 組中的某個節點。?
我這里 hostgroup_id = 10的組中只有一個節點就是 master :172.18.0.2
配置讀寫分離策略:路由規則
注意:我這只是試驗,只是配置了幾個簡單的路由規則,實際情況配置路由規則,不應該是就根據所謂的讀、寫操作來進行讀寫分離,而是從收集(慢日志)的各項指標找出壓力大,執行頻繁的語句單獨寫規則,做緩存等等。比如 先在測試幾個核心sql語句,分析性能提升的百分比,在逐漸慢慢完善路由規則。?
生產中使用讀寫分離?:建議基于hash code 值做讀寫分離,不要建太多的規則
和查詢規則有關的表有兩個:mysql_query_rules和mysql_query_rules_fast_routing?
表mysql_query_rules_fast_routing是mysql_query_rules的擴展,并在以后評估快速路由策略和屬性(僅在ProxySQL 1.4.7+中可用)。
介紹一下改表mysql_query_rules的幾個字段:?
active:是否啟用這個規則,1表示啟用,0表示禁用?
match_pattern?字段就是代表設置規則?
destination_hostgroup?字段代表默認指定的分組,?
apply?代表真正執行應用規則。
7.1 創建規則
這里我創建兩個規則:?
1、把所有以select 開頭的語句全部分配到讀組中,讀組編號是20?
2、把 select .. for update 語句,這是一個特殊的select語句,會產生一個寫鎖(排他鎖),把他分到編號為10 的寫組中,其他所有操作都會默認路由到寫組中
select … for update規則的rule_id必須要小于普通的select規則的rule_id,因為ProxySQL是根據rule_id的順序進行規則匹配的?!?/p>
測試讀寫分離
現在mster上創建一個庫,然后生成幾條數據
root@8c6fba5006e3:/# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 107 Server version: 8.0.27 MySQL Community Server - GPLCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> create database kkke; Query OK, 1 row affected (0.01 sec)mysql> use kkke; Database changed mysql> create table bete1(id int primary key auto_increment,name varchar(16)); Query OK, 0 rows affected (0.03 sec)mysql> insert into bete1 values(1,'zzj'),(2,'yjdd'),(3,'4446f'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0mysql> exit測試讀?
通過proxysql 連接看看讀操作,是否路由給了讀組:
只要是select 操作都分給了讀組
如果想在 ProxySQL 中查看SQL請求路由信息stats_mysql_query_digest
ProxySQL Admin>select hostgroup,schemaname,username,digest_text,count_star from stats_mysql_query_digest; +-----------+--------------------+----------+------------------------------------------------------+------------+ | hostgroup | schemaname | username | digest_text | count_star | +-----------+--------------------+----------+------------------------------------------------------+------------+ | 20 | kkke | proxysql | select @@server_id | 2 | | 10 | kkke | proxysql | insert into bete1 values(?,?) | 2 | | 10 | kkke | proxysql | insert into values(?,?) | 1 | | 20 | information_schema | proxysql | select @@server_id | 10 | | 20 | information_schema | proxysql | SELECT DATABASE() | 3 | | 10 | information_schema | proxysql | select @@version_comment limit ? | 9 | | 10 | yinghuo | proxysql | SHOW FULL TABLES WHERE Table_type != ? | 1 | | 10 | yinghuo | proxysql | SELECT @@character_set_database,@@collation_database | 1 | | 10 | information_schema | proxysql | SHOW DATABASES | 1 | | 10 | information_schema | proxysql | SHOW VARIABLES LIKE ? | 2 | | 10 | information_schema | proxysql | SET NAMES utf8 | 2 | +-----------+--------------------+----------+------------------------------------------------------+------------+ 11 rows in set (0.00 sec)count_start 統計sql 語句次數,可以分析哪些 sql ,頻繁執行
讀寫分離設置成功后,還可以調權重,比如讓某臺機器承受更多的讀操作?
列:
update mysql_servers set weight=10 hostname='172.18.0.4'; load mysql servers to runtime; save mysql servers to disk;總結
以上是生活随笔為你收集整理的docker配置mysql 中间件 ProxySQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纪中暑假培训 :Date:7 终章-剑之
- 下一篇: LoadRunner-登陆web tou