備註:文章編寫時間201904-201905期間,後續官方在github的更新沒有被寫入mysql
MySQL服務器配置 [MySQL Server Configuration]git
MySQL服務器的配置在mysql_servers表和mysql_replication_hostgroups表(可選)中。github
友情提醒:在閱讀下部分以前,請確保瞭解了ProxySQL使用的多層配置系統。sql
特別注意:
1)若是沒有運行LOAD MYSQL SERVERS TO RUNTIME,那麼mysql_servers和mysql_replication_hostgroups表中的更改不會生效;
2)若是沒有運行SAVE MYSQL SERVERS TO DISK 保存配置到的磁盤,那麼mysql_servers和mysql_replication_hostgroups表中的更改
將在重啓/崩潰後丟失。數據庫
對mysql_servers和mysql_replication_hostgroups的更改將被視爲編輯配置文件而不會被保存或讓服務從新加載。後端
將MySQL服務器和複製主機組配置信息從MEMORY層數據庫加載到RUNTIME層的數據結構在中:安全
Admin> LOAD MYSQL SERVERS TO RUNTIME; 其餘可被接受的別名操做: Admin> LOAD MYSQL SERVERS TO RUN; Admin> LOAD MYSQL SERVERS FROM MEM; Admin> LOAD MYSQL SERVERS FROM MEMORY;
將MySQL服務器和複製主機組配置信息從MEMORY層數據庫保留到DISK的數據庫上:服務器
Admin> SAVE MYSQL SERVERS TO DISK; 其餘可被接受的別名操做: Admin> SAVE MYSQL SERVERS FROM MEM; Admin> SAVE MYSQL SERVERS FROM MEMORY;
將MySQL服務器和複製主機組配置信息從RUNTIME層數據結構保留到MEMORY數據庫:數據結構
Admin> SAVE MYSQL SERVERS TO MEMORY; 其餘可被接受的別名操做: Admin> SAVE MYSQL SERVERS TO MEM; Admin> SAVE MYSQL SERVERS FROM RUN; Admin> SAVE MYSQL SERVERS FROM RUNTIME;
將MySQL服務器和複製主機組配置信息從DISK層數據庫加載到MEMORY層數據庫:ide
Admin> LOAD MYSQL SERVERS TO MEMORY; 其餘可被接受的別名操做: Admin> LOAD MYSQL SERVERS TO MEM; Admin> LOAD MYSQL SERVERS FROM DISK;
若是要添加新服務器,必須在mysql_servers表中插入新行以記錄相關配置信息。注意,該表有幾列是有默認值的。
如下添加了一個具備全部默認配置的新後端(服務器):
Admin> SELECT * FROM mysql_servers; Empty set (0.00 sec) Admin> INSERT INTO mysql_servers (hostname) VALUES ('127.0.0.1'); Query OK, 1 row affected (0.00 sec) Admin> SELECT * FROM mysql_servers\G *************************** 1. row *************************** hostgroup_id: 0 hostname: 127.0.0.1 port: 3306 gtid_port: 0 status: ONLINE weight: 1 compression: 0 max_connections: 1000 max_replication_lag: 0 use_ssl: 0 max_latency_ms: 0 comment: 1 row in set (0.00 sec)
Admin> SELECT hostgroup_id,hostname,port FROM mysql_servers; +--------------+-----------+------+ | hostgroup_id | hostname | port | +--------------+-----------+------+ | 0 | 127.0.0.1 | 3306 | +--------------+-----------+------+ 1 row in set (0.00 sec) INSERT INTO mysql_servers (hostgroup_id, hostname ,port) VALUES (1, '127.0.0.1' ,24801), (1, '127.0.0.1' ,24802), (1,'127.0.0.1' ,24803); Query OK, 3 rows affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port FROM mysql_servers; +--------------+-----------+-------+ | hostgroup_id | hostname | port | +--------------+-----------+-------+ | 0 | 127.0.0.1 | 3306 | | 1 | 127.0.0.1 | 24801 | | 1 | 127.0.0.1 | 24802 | | 1 | 127.0.0.1 | 24803 | +--------------+-----------+-------+ 4 rows in set (0.00 sec)
Admin> SELECT hostgroup_id,hostname,port,max_connections FROM mysql_servers; +--------------+-----------+-------+-----------------+ | hostgroup_id | hostname | port | max_connections | +--------------+-----------+-------+-----------------+ | 0 | 127.0.0.1 | 3306 | 1000 | | 1 | 127.0.0.1 | 24801 | 1000 | | 1 | 127.0.0.1 | 24802 | 1000 | | 1 | 127.0.0.1 | 24803 | 1000 | +--------------+-----------+-------+-----------------+ 4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET max_connections=10 WHERE hostname='127.0.0.1' AND port=24802; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,max_connections FROM mysql_servers; +--------------+-----------+-------+-----------------+ | hostgroup_id | hostname | port | max_connections | +--------------+-----------+-------+-----------------+ | 0 | 127.0.0.1 | 3306 | 1000 | | 1 | 127.0.0.1 | 24801 | 1000 | | 1 | 127.0.0.1 | 24802 | 10 | | 1 | 127.0.0.1 | 24803 | 1000 | +--------------+-----------+-------+-----------------+ 4 rows in set (0.00 sec)
特別注意:權重僅在主機組內起做用,值越大被分到的流量的概率越多!!
Admin> SELECT hostgroup_id,hostname,port,weight FROM mysql_servers; +--------------+-----------+-------+--------+ | hostgroup_id | hostname | port | weight | +--------------+-----------+-------+--------+ | 0 | 127.0.0.1 | 3306 | 1 | | 1 | 127.0.0.1 | 24801 | 1 | | 1 | 127.0.0.1 | 24802 | 1 | | 1 | 127.0.0.1 | 24803 | 1 | +--------------+-----------+-------+--------+ 4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET weight=1000 WHERE port IN (24803) AND hostgroup_id=1; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,weight FROM mysql_servers; +--------------+-----------+-------+--------+ | hostgroup_id | hostname | port | weight | +--------------+-----------+-------+--------+ | 0 | 127.0.0.1 | 3306 | 1 | | 1 | 127.0.0.1 | 24801 | 1 | | 1 | 127.0.0.1 | 24802 | 1 | | 1 | 127.0.0.1 | 24803 | 1000 | +--------------+-----------+-------+--------+ 4 rows in set (0.00 sec)
此示例顯示如何爲後端配置SSL(一個狀態值而已),(但這不是全局配置SSL,全局請移步SSL configuration)。
Admin> SELECT hostgroup_id,hostname,port,use_ssl FROM mysql_servers; +--------------+-----------+-------+---------+ | hostgroup_id | hostname | port | use_ssl | +--------------+-----------+-------+---------+ | 0 | 127.0.0.1 | 3306 | 0 | | 1 | 127.0.0.1 | 24801 | 0 | | 1 | 127.0.0.1 | 24802 | 0 | | 1 | 127.0.0.1 | 24803 | 0 | +--------------+-----------+-------+---------+ 4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET use_ssl=1 WHERE hostname='127.0.0.1' AND port=3306; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,use_ssl FROM mysql_servers; +--------------+-----------+-------+---------+ | hostgroup_id | hostname | port | use_ssl | +--------------+-----------+-------+---------+ | 0 | 127.0.0.1 | 3306 | 1 | | 1 | 127.0.0.1 | 24801 | 0 | | 1 | 127.0.0.1 | 24802 | 0 | | 1 | 127.0.0.1 | 24803 | 0 | +--------------+-----------+-------+---------+ 4 rows in set (0.00 sec)
Admin> SELECT hostgroup_id,hostname,port,max_replication_lag FROM mysql_servers; +--------------+-----------+-------+---------------------+ | hostgroup_id | hostname | port | max_replication_lag | +--------------+-----------+-------+---------------------+ | 0 | 127.0.0.1 | 3306 | 0 | | 1 | 127.0.0.1 | 24801 | 0 | | 1 | 127.0.0.1 | 24802 | 0 | | 1 | 127.0.0.1 | 24803 | 0 | +--------------+-----------+-------+---------------------+ 4 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET max_replication_lag=30 WHERE hostname='127.0.0.1' AND port=24803; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,max_replication_lag FROM mysql_servers; +--------------+-----------+-------+---------------------+ | hostgroup_id | hostname | port | max_replication_lag | +--------------+-----------+-------+---------------------+ | 0 | 127.0.0.1 | 3306 | 0 | | 1 | 127.0.0.1 | 24801 | 0 | | 1 | 127.0.0.1 | 24802 | 0 | | 1 | 127.0.0.1 | 24803 | 30 | +--------------+-----------+-------+---------------------+ 4 rows in set (0.00 sec)
使用此配置後,只有在主從複製延遲超過30秒的狀況下,SLAVE纔會被自動的暫時忽略。
若是max_replication_lag列設置爲零(SET max_replication_lag = 0),則Monitor模塊根本不會檢查複製延遲,
即便複製延遲超過了閾值。更多信息請參閱參數mysql-monitor_slave_lag_when_null。
mysql_servers表上的主鍵爲(hostgroup_id,hostname,port);這意味着同一服務器能夠存在於兩個不一樣的主機組中。
Admin> SELECT hostgroup_id,hostname,port,weight,max_replication_lag FROM mysql_servers; +--------------+-----------+-------+--------+---------------------+ | hostgroup_id | hostname | port | weight | max_replication_lag | +--------------+-----------+-------+--------+---------------------+ | 0 | 127.0.0.1 | 3306 | 1 | 0 | | 1 | 127.0.0.1 | 24801 | 1 | 0 | | 1 | 127.0.0.1 | 24802 | 1 | 0 | | 1 | 127.0.0.1 | 24803 | 1000 | 30 | +--------------+-----------+-------+--------+---------------------+ 4 rows in set (0.00 sec) Admin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'127.0.0.1',3306); Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,weight,max_replication_lag FROM mysql_servers; +--------------+-----------+-------+--------+---------------------+ | hostgroup_id | hostname | port | weight | max_replication_lag | +--------------+-----------+-------+--------+---------------------+ | 0 | 127.0.0.1 | 3306 | 1 | 0 | | 1 | 127.0.0.1 | 24801 | 1 | 0 | | 1 | 127.0.0.1 | 24802 | 1 | 0 | | 1 | 127.0.0.1 | 24803 | 1000 | 30 | | 1 | 127.0.0.1 | 3306 | 1 | 0 | +--------------+-----------+-------+--------+---------------------+ 5 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET max_replication_lag=30, weight=1000; Query OK, 5 rows affected (0.00 sec) Admin> UPDATE mysql_servers SET weight=1 WHERE hostname='127.0.0.1' AND hostgroup_id=1 AND port=3306; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,weight,max_replication_lag FROM mysql_servers; +--------------+-----------+-------+--------+---------------------+ | hostgroup_id | hostname | port | weight | max_replication_lag | +--------------+-----------+-------+--------+---------------------+ | 0 | 127.0.0.1 | 3306 | 1000 | 30 | | 1 | 127.0.0.1 | 24801 | 1000 | 30 | | 1 | 127.0.0.1 | 24802 | 1000 | 30 | | 1 | 127.0.0.1 | 24803 | 1000 | 30 | | 1 | 127.0.0.1 | 3306 | 1 | 30 | +--------------+-----------+-------+--------+---------------------+ 5 rows in set (0.00 sec)
在上面的示例中,對於hostgroup爲1的組來講,若是配置爲提供讀取流量,則99.95%的流量將發送到權重爲1000的2480一、24802和24803
這3臺服務器上,而0.05%的流量將正常發送到3306上。若是2480一、24802和24803這3臺服務器都不可用,那麼全部的讀取流量都將
發往3306上。
注意:max_replication_lag僅適用於SLAVE節點。若是服務器未啓用複製功能,則Monitor不會執行任何操做。
要啓用壓縮,只需將mysql_servers.compression列設置爲非零值就足夠了。
請注意:
一、壓縮功能僅在將該設置加載到RUNTIME層後新創建的鏈接上生效,以前已有鏈接不生效。
二、這裏的壓縮是指ProxySQL做爲Client與後端MySQL進行通訊時,使用的對數據進行壓縮的功能,相似MySQL客戶端的--compress選項。
MySQL 壓縮協議適合的場景是 MySQL 的服務器端和客戶端之間傳輸的數據量很大,或者可用帶寬不高的狀況,典型的場景有以下兩個 :
1> 查詢大量的數據,帶寬不夠(好比導出數據的時候)
2> 複製的時候 binlog 量太大,啓用 slave_compressed_protocol 參數進行日誌壓縮複製。
Admin> SELECT hostgroup_id,hostname,port,compression FROM mysql_servers; +--------------+-----------+-------+-------------+ | hostgroup_id | hostname | port | compression | +--------------+-----------+-------+-------------+ | 0 | 127.0.0.1 | 3306 | 0 | | 1 | 127.0.0.1 | 24801 | 0 | | 1 | 127.0.0.1 | 24802 | 0 | | 1 | 127.0.0.1 | 24803 | 0 | | 1 | 127.0.0.1 | 3306 | 0 | +--------------+-----------+-------+-------------+ 5 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET compression=1 WHERE hostname='127.0.0.1' AND port=24802 AND hostgroup_id=1; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,compression FROM mysql_servers; +--------------+-----------+-------+-------------+ | hostgroup_id | hostname | port | compression | +--------------+-----------+-------+-------------+ | 0 | 127.0.0.1 | 3306 | 0 | | 1 | 127.0.0.1 | 24801 | 0 | | 1 | 127.0.0.1 | 24802 | 1 | | 1 | 127.0.0.1 | 24803 | 0 | | 1 | 127.0.0.1 | 3306 | 0 | +--------------+-----------+-------+-------------+ 5 rows in set (0.00 sec)
要安全的禁用後端服務器,須要將其狀態更改成 OFFLINE_SOFT 便可。其上活動事務和鏈接仍將可用,但此後不會向該節點發送新流量。
Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | ONLINE | | 1 | 127.0.0.1 | 24802 | ONLINE | | 1 | 127.0.0.1 | 24803 | ONLINE | | 1 | 127.0.0.1 | 3306 | ONLINE | +--------------+-----------+-------+--------+ 5 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostname='127.0.0.1' AND port=24802 AND hostgroup_id=1; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | ONLINE | | 1 | 127.0.0.1 | 24802 | OFFLINE_SOFT | | 1 | 127.0.0.1 | 24803 | ONLINE | | 1 | 127.0.0.1 | 3306 | ONLINE | +--------------+-----------+-------+--------------+ 5 rows in set (0.00 sec)
要當即禁用後端服務器,須要將其狀態更改成 OFFLINE_HARD 便可。此後,全部當前流量將當即終止,而且不會發送新流量到該節點。
Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | ONLINE | | 1 | 127.0.0.1 | 24802 | OFFLINE_SOFT | | 1 | 127.0.0.1 | 24803 | ONLINE | | 1 | 127.0.0.1 | 3306 | ONLINE | +--------------+-----------+-------+--------------+ 5 rows in set (0.01 sec) Admin> UPDATE mysql_servers SET status='OFFLINE_HARD' WHERE hostname='127.0.0.1' AND port=24801 AND hostgroup_id=1; Query OK, 1 row affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | OFFLINE_HARD | | 1 | 127.0.0.1 | 24802 | OFFLINE_SOFT | | 1 | 127.0.0.1 | 24803 | ONLINE | | 1 | 127.0.0.1 | 3306 | ONLINE | +--------------+-----------+-------+--------------+ 5 rows in set (0.00 sec)
要將離線的後端從新啓用,只需將其狀態更改回 ONLINE 就足夠了。
Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | OFFLINE_HARD | | 1 | 127.0.0.1 | 24802 | OFFLINE_SOFT | | 1 | 127.0.0.1 | 24803 | ONLINE | | 1 | 127.0.0.1 | 3306 | ONLINE | +--------------+-----------+-------+--------------+ 5 rows in set (0.00 sec) Admin> UPDATE mysql_servers SET status='ONLINE' WHERE status NOT IN ('ONLINE'); ==>這裏用了NOT,可根據實際狀況修改過濾條件 Query OK, 2 rows affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | ONLINE | | 1 | 127.0.0.1 | 24802 | ONLINE | | 1 | 127.0.0.1 | 24803 | ONLINE | | 1 | 127.0.0.1 | 3306 | ONLINE | +--------------+-----------+-------+--------+ 5 rows in set (0.00 sec)
ProxySQL容許將一個後端服務器完全的刪除,只須要將其從mysql_servers表中徹底刪除便可。
Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | ONLINE | | 1 | 127.0.0.1 | 24802 | ONLINE | | 1 | 127.0.0.1 | 24803 | ONLINE | | 1 | 127.0.0.1 | 3306 | ONLINE | +--------------+-----------+-------+--------+ 5 rows in set (0.00 sec)
注意:雖然能夠直接執行刪除操做,可是爲了操做的平滑、安全,數據的完整、可控,仍是建議先修改狀態讓其軟下線,等待其上執行的全部SQL都結束後再執行後面的刪除動做。
Admin> UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostgroup_id=1 AND port IN (3306,24802,24803); Query OK, 3 rows affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | ONLINE | | 1 | 127.0.0.1 | 24802 | OFFLINE_SOFT | | 1 | 127.0.0.1 | 24803 | OFFLINE_SOFT | | 1 | 127.0.0.1 | 3306 | OFFLINE_SOFT | +--------------+-----------+-------+--------------+ 5 rows in set (0.00 sec) Admin> DELETE FROM mysql_servers WHERE hostgroup_id=1 AND port IN (3306,24802,24803); Query OK, 3 rows affected (0.00 sec) Admin> SELECT hostgroup_id,hostname,port,status FROM mysql_servers; +--------------+-----------+-------+--------+ | hostgroup_id | hostname | port | status | +--------------+-----------+-------+--------+ | 0 | 127.0.0.1 | 3306 | ONLINE | | 1 | 127.0.0.1 | 24801 | ONLINE | +--------------+-----------+-------+--------+ 2 rows in set (0.00 sec)
在ProxySQL內部,直接刪除後端服務和將其設置爲OFFLINE_HARD的方式相同。當執行LOAD MYSQL SERVERS TO RUNTIME時,
Hostgroup_Manager將檢測到後端服務器已被刪除,並在內部將其標記爲OFFLINE_HARD。
完畢!