一. ProxySQL
1.1簡介
ProxySQL是MySQL、Percona Server、MariaDB的高性能、高可用中間件,能實現(xiàn)的功能包括:
- 允許動態(tài)更新配置。
- 允許回滾無效的配置。
- 最基本的讀/寫分離,且方式有多種。
- 可定制基于用戶、基于schema、基于語句的規(guī)則對SQL語句進行路由。換句話說,規(guī)則很靈活。基于schema和與語句級的規(guī)則,可以實現(xiàn)簡單的sharding。
- 可緩存查詢結(jié)果。雖然ProxySQL的緩存策略比較簡陋,但實現(xiàn)了基本的緩存功能,絕大多數(shù)時候也夠用了。此外,作者已經(jīng)打算實現(xiàn)更豐富的緩存策略。
- 監(jiān)控后端節(jié)點。ProxySQL可以監(jiān)控后端節(jié)點的多個指標,包括:ProxySQL和后端的心跳信息,后端節(jié)點的read-only/read-write,slave和master的數(shù)據(jù)同步延遲性(replication lag)。
1.2 安裝說明
1.3 ProxySQL配置系統(tǒng)
1.3.1 配置系統(tǒng)
ProxySQL是通過多級配置系統(tǒng)實現(xiàn)的,允許盡可能多地動態(tài)修改配置項,而無需重新啟動ProxySQL進程。修改配置后將配置從運行時移動到內(nèi)存,并根據(jù)需要持久保存到磁盤。
+-------------------------+
| RUNTIME |
+-------------------------+
/|\ |
| |
| |
| \|/
+-------------------------+
| MEMORY |
+-------------------------+ _
/|\ | |\
| | \ proxysql --initial
| | \
| \|/ \
+-------------------------+ +-------------------------+
| DISK | | CONFIG FILE |
+-------------------------+ +-------------------------+
RUNTIME表示處理請求的線程使用的ProxySQL的內(nèi)存中數(shù)據(jù)結(jié)構(gòu),包含:
全局變量中定義的實際值
分組為主機組的后端服務(wù)器列表
可以連接到代理的MySQL用戶列表
MEMORY表示一個內(nèi)存數(shù)據(jù)庫,該數(shù)據(jù)庫通過與MySQL兼容的接口公開。用戶可以使用MySQL客戶端連接到此接口,并查詢各種ProxySQL配置表/數(shù)據(jù)庫,包含:
mysql_servers: ProxySQL連接的后端服務(wù)器節(jié)點表
mysql_users: 連接到ProxySQL的用戶及其授權(quán)表。請注意,ProxySQL也將使用相同的憑據(jù)連接到后端服務(wù)器!
mysql_query_rules:定義ProxySQL路由到后端服務(wù)器的查詢規(guī)則表
global_variables:代理配置全局變量表(MySQL變量和ADMIN變量)
DISK:磁盤上的SQLite3數(shù)據(jù)庫,默認位置為$(DATADIR)/proxysql.db,主要用于持久化保存配置。
CONFIG FILE:ProxySQL初始啟動時讀取的配置文件。
1.3.2 加載保存
激活配置更改(RUNTIME)以及保存更改到磁盤(DISK),任何更改在未加載到RUNITME之前,都不會生效。
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;
二. 配置ProxySQL
2.1. 實驗環(huán)境
mysql 8.0 默認使用caching_sha2_password授權(quán)插件,為了避免因通過中間件認證后端服務(wù)器時發(fā)生錯誤,這里使用的mysql版本為 5.7.29。關(guān)于組復(fù)制請參照這里。
| 系統(tǒng) | 默認角色 | 主機名 | IP | 軟件版本 |
|---|---|---|---|---|
| CentOS 7 | ProxySQL | proxy.mgr.com | 172.16.10.60 | ProxySQL 2.0.10 |
| CentOS 7 | Master | d1.mgr.com | 172.16.10.59 | mysql 5.7.29 |
| CentOS 7 | Node1 | d2.mgr.com | 172.16.10.58 | mysql 5.7.29 |
| CentOS 7 | Node2 | d3.mgr.com | 172.16.10.57 | mysql 5.7.29 |
2.2 讀寫分離
2.2.1 初始化ProxySQL
[root@proxy ~]# proxysql --initial
ProxySQL讀取proxysql.cnf文件并加載到內(nèi)存數(shù)據(jù)庫,啟動后會監(jiān)聽兩個端口,默認為6032和6033。6032端口是ProxySQL的管理端口;6033是ProxySQL對外提供服務(wù)的端口。
2.2.2 連接ProxySQL管理端口
[root@proxy ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1 --prompt 'admin> '
2.2.3 添加后端服務(wù)器到主機組
admin> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.59',3306);
admin> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.58',3306);
admin> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.57',3306);
ProxySQL內(nèi)部使用的SQLite3數(shù)據(jù)庫引擎,所以這里可以不用USE或"."來選擇數(shù)據(jù)庫對象。
查看并加載到RUNTIME ,保存到disk
admin> select * from mysql_servers\G;
admin> load mysql servers to runtime;
admin> save mysql servers to disk;
2.2.4 添加監(jiān)控后端服務(wù)器賬戶
添加節(jié)點之后,還需要監(jiān)控后端節(jié)點。對于后端是主從復(fù)制的環(huán)境來說,這是必須的,因為ProxySQL需要通過每個節(jié)點的read_only值來自動調(diào)整它們是屬于讀組還是寫組。
-
后端MySQL Server上創(chuàng)建
admin> create user monitor@'172.16.%.%' identified by 'P@ssword1!'; admin> grant all on *.* to monitor@'172.16.%.%'; -
ProxySQL添加連接后端服務(wù)器器監(jiān)控賬號
admin> set mysql-monitor_username='monitor'; admin> set mysql-monitor_password='P@ssword1!'; -
加載到RUNTIME ,保存到DISK
admin> load mysql variables to runtime; admin> save mysql variables to disk; -
查看監(jiān)控結(jié)果
查看連接日志
admin> select * from mysql_server_connect_log;查看ping節(jié)點日志
admin> select * from mysql_server_ping_log;
2.2.5 添加讀寫組
在ProxySQL上添加寫組(10),讀組(20)
admin> insert into mysql_replication_hostgroups(writer_hostgroup,reader_hostgroup) values(10,20);
查看后端服務(wù)器MySQL server所在組(默認都在10寫組)
admin> select hostgroup_id,hostname,port,status,weight from mysql_servers;
加載到RUNTIME并保存到disk
admin> load mysql servers to runtime;
admin> save mysql servers to disk;
一加載后Monitor模塊就會開始監(jiān)控后端的read_only值,當監(jiān)控到read_only值后,就會按照read_only的值將某些節(jié)點自動移動到讀/寫組。
在ProxySQL上查看加載后后端服務(wù)器讀寫組
admin> select hostgroup_id,hostname,port,status,weight from mysql_servers;
2.2.6 配置mysql_users
客戶端連接到ProxySQL與ProxySQL連接到MySQL Server使用同樣的賬號,主要用來接受客戶端的連接以及操作MySQL Server。
在MySQL Server上配置后端proxysql用戶
mysql> create user proxysql@'172.16.%.%' identified by 'proxysql';
mysql> grant all on *.* to proxysql@'172.16.%.%';
在ProxySQL上添加ProxySQL用戶
admin> insert into mysql_users(username,password,default_hostgroup) values('proxysql','proxysql',10);
加載到RUNTIME ,保存到DISK
admin> load mysql users to runtime;
admin> save mysql users to disk;
查看ProxySQL用戶表
admin> select * from mysql_users\G;
2.2.7 配置讀寫分離規(guī)則
將select語句分配到hostgroup_id=20的讀組,其他分配到10寫組。由于select語句中有一個特殊語句SELECT...FOR UPDATE它會申請寫鎖,所以應(yīng)該路由到hostgroup_id=10的寫組。
admin> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1), (2,1,'^SELECT',20,1);
加載到RUNTIME ,保存到DISK
admin> load mysql query rules to runtime;
admin> save mysql query rules to disk;
驗證,多次執(zhí)行觀察server_id值變化
[root@proxy ~]# mysql -uproxysql -p'proxysql' -P6033 -h127.0.0.1 -e 'select @@server_id'