ProxySQL官檔翻譯__04_ProxySQL配置之MySQL服務器配置

04_ProxySQL配置之MySQL服務器配置

備註:文章編寫時間201904-201905期間,後續官方在github的更新沒有被寫入mysql

MySQL服務器配置 [MySQL Server Configuration]git

1、在ProxySQL中配置後端MySQL服務器[Configuring Backend MySQL Servers in ProxySQL]

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的更改將被視爲編輯配置文件而不會被保存或讓服務從新加載。後端

2、將mysql服務器配置從MEMORY層複製到RUNTIME層 [Copying mysql servers from memory to runtime]

將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;

3、將mysql服務器配置從MEMORY層持久化到DISK層[Copying mysql servers from memory to disk]

將MySQL服務器和複製主機組配置信息從MEMORY層數據庫保留到DISK的數據庫上:服務器

Admin> SAVE MYSQL SERVERS TO DISK;

其餘可被接受的別名操做:
Admin> SAVE MYSQL SERVERS FROM MEM;

Admin> SAVE MYSQL SERVERS FROM MEMORY;

4、將mysql服務器配置從RUNTIME層拷貝到MEMORY層[Copying mysql servers from runtime to 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;

5、將mysql服務器從DISK層複製到MEMORY層[Copying mysql servers from disk to memory]

將MySQL服務器和複製主機組配置信息從DISK層數據庫加載到MEMORY層數據庫:ide

Admin> LOAD MYSQL SERVERS TO MEMORY;

其餘可被接受的別名操做:
Admin> LOAD MYSQL SERVERS TO MEM;

Admin> LOAD MYSQL SERVERS FROM DISK;

6、新增服務器[Adding a new server]

若是要添加新服務器,必須在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)

7、將新服務器添加到主機組[Adding new servers to a hostgroup]

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)

8、配置與後端的鏈接數限制[Limiting the number of connections to a backend]

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)

9、經過改變後端的權重來肯定流量的優先級[Prioritizing traffic by changing the weight of a backend]

特別注意:權重僅在主機組內起做用,值越大被分到的流量的概率越多!!

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)

10、對特定後端使用SSL鏈接[Using SSL connections for a specific backend]

此示例顯示如何爲後端配置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)

11、配置自動忽略(有複製延時的SLAVE)的延時閥值 [Automatically shunning slaves with replication lag]

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。

12、將同一個服務器添加到兩個不一樣的主機組[Adding a server to two different hostgroups]

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不會執行任何操做。

十3、在後端服務器上啓用壓縮[Enable compression on a backend server]

要啓用壓縮,只需將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)

十4、安全的禁用後端服務器[Gracefully disabling a backend server]

要安全的禁用後端服務器,須要將其狀態更改成 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)

十5、即刻禁用後端服務器[Immediately disabling a backend server]

要當即禁用後端服務器,須要將其狀態更改成 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)

十6、從新啓用脫機/禁用的後端服務器[Re-enabling an offline / disabled backend server]

要將離線的後端從新啓用,只需將其狀態更改回 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)

十7、刪除後端服務器[Removing a backend server]

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。

完畢!

相關文章
相關標籤/搜索