ProxySQL簡單實現(xiàn)MGR讀寫分離

一. 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 安裝說明

官方發(fā)行版

官方Docker倉庫

官方手冊

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'

三. 參考

【1】MySQL中間件之ProxySQL(2):初試讀寫分離

【2】Official ProxySQL Documentation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容