靈活強大的MySQL代理中間件ProxySQL應用實戰(1)
很多人都會把中間件認為是讀寫分離,其實讀寫分離只是中間件可以提供的一種功能,最主要的功能還是在於他可以分庫分表。下面介紹下常見的開源mysql中間件。
- DBProxy是由美團點評公司技術工程部DBA團隊(北京)開發維護的一個基於MySQL協議的數據中間層。它在奇虎360公司開源的Atlas基礎上,修改了部分bug,並且添加了很多特性。
- Atlas是由奇虎360公發的基於MySQL協議的數據庫中間件產品,它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了若幹Bug,並增加了很多功能特性。目前該產品在360內部得到了廣泛應用。
- Cobar是阿裏巴巴B2B開發的關系型分布式系統,管理將近3000個MySQL實例。 在阿裏經受住了考驗,後面由於作者的走開的原因cobar沒有人維護 了,阿裏也開發了tddl替代cobar。
- MyCAT是社區愛好者在阿裏cobar基礎上進行二次開發,解決了cobar當時存 在的一些問題,並且加入了許多新的功能在其中。目前MyCAT社區活躍度很高,目前已經有一些公司在使用MyCAT。總體來說支持度比較高,也會一直維護下去。
- MySQL Route是現在MySQL 官方Oracle公司發布出來的一個中間件。
二、proxySQL簡介
ProxySQL是一個高性能的、高可用性MySQL中間件,優點如下:
> 幾乎所有的配置均可在線更改(其配置數據基於SQLite存儲),無需重啟proxysql > 強大的規則路由引擎,支持讀寫分離、查詢重寫、sql流量鏡像 > 詳細的狀態統計,相當於有了統一的查看sql性能和sql語句統計的入口 > 自動重連和重新執行機制,若一個請求在鏈接或執行過程中意外中斷,proxysql會根據其內部機制重新執行該操作 > query cache功能:比mysql自帶QC更靈活,可多維度控制哪類語句可以緩存 > 支持連接池(connection pool)。 > 支持分庫、分表 > 支持負載均衡 > 自動下線後端DB,根據延遲超過閥值、ping 延遲超過閥值、網絡不通或宕機都會自動下線節點。
下面重點介紹下ProxySQL的基礎和應用案例。
三、proxySQL的下載與安裝
1、下載proxySQL
proxySQL的官網是http://www.proxysql.com/ ,可以從官網提供的github下載proxySQL軟件,地址為:https://github.com/sysown/proxysql/releases, 也可以在percona站點進行下載,下載地址為:https://www.percona.com/downloads/proxysql/。
目前最新的proxySQL版本是proxysql-1.4.8。下面將以此版本為主進行介紹。
2、安裝proxySQL
proxySQL提供了源碼包和rpm包兩種安裝方式,這裏選擇rpm方式進行安裝,過程如下:
[root@proxysql mysql]# rpm -ivh proxysql-1.4.8-1-centos7.x86_64.rpm
這樣,proxySQL就安裝完成了。
3、proxySQL的目錄結構
ProxySQL安裝好的數據目錄在/var/lib/proxysql/,配置文件目錄是/etc/proxysql.cnf。啟動腳本是/etc/init.d/proxysql。啟動proxysql之後,在/var/lib/proxysql/下面可以看到如下文件:
proxysql.db:此文件是SQLITE的數據文件,proxysql配置,如後端數據庫的賬號、密碼、路由等存儲在這個數據庫裏面。
proxysql.log:此文件是日誌文件。
proxysql.pid:此文件是是進程pid文件。
需要註意的是:proxysql.cnf是ProxySQL的一些靜態配置項,用來配置一些啟動選項,sqlite的數據目錄等等。此配置文件只在第一次啟動的時候讀取進行初始化,後面只讀取proxysql.db文件。
ProxySQL在啟動後,會啟動管理端口和客戶端端口,可以在配置文件/etc/proxysql.cnf中看到管理和客戶端的端口信息,默認管理的端口是6032,賬號和密碼都是admin,後面可以動態修改,並且管理端口只能通過本地連接;客戶端默認端口是6033,賬號和密碼可以通過管理接口去進行設置。
四、proxySQL庫表功能介紹
1、庫、表說明
首先啟動proxysql ,執行如下命令:
[root@proxysql app1]# /etc/init.d/proxysql start
Starting ProxySQL: DONE!
然後登錄proxysql的管理端口6302,執行如下操作:
[root@proxysql app1]# mysql -uadmin -padmin -h127.0.0.1 -P6032
MySQL [(none)]> 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.00 sec)
proxySQL默認有五個數據庫,對每個庫的功能介紹如下:
* main庫:內存配置數據庫,表裏存放後端db實例、用戶驗證、路由規則等信息。表名以 runtime_開頭的表示proxysql當前運行的配置內容,不能通過dml語句修改,只能修改對應的不以 runtime_ 開頭的(在內存)裏的表,然後LOAD使其生效, SAVE使其存到硬盤以供下次重啟加載。
* disk庫:是持久化到硬盤的配置庫,對應/var/lib/proxysql/proxysql.db文件,也就是sqlite的數據文件。
* stats庫:是proxysql運行抓取的統計信息庫,包括到後端各命令的執行次數、流量、processlist、查詢種類匯總/執行時間等等。
* monitor庫:存儲monitor模塊收集的信息,主要是對後端db的健康、延遲檢查。
下面依次介紹下每個庫中常用的一些表的含義和功能。
2、main庫
登錄到proxySQL的管理端口,然後通過如下命令可查看main庫裏面的表,操作如下:
MySQL [(none)]> show tables from main;
常用的幾個表介紹如下:
global_variables
設置變量,包括監聽的端口、管理賬號等。
mysql_replication_hostgroups:
監視指定主機組中所有服務器的read_only值,並且根據read_only的值將服務器分配給寫入器或讀取器主機組。ProxySQL monitor模塊會監控hostgroups後端所有servers 的read_only 變量,如果發現從庫的read_only變為0、主庫變為1,則認為角色互換了,自動改寫mysql_servers表裏面 hostgroup關系,達到自動 Failover 效果。
mysql_servers
設置後端MySQL的表
mysql_users
配置後端數據庫的程序賬號和監控賬號。
scheduler
調度器是一個類似於cron的實現,集成在ProxySQL中,具有毫秒的粒度。通過腳本檢測來設置ProxySQL。
3、stats庫
登錄到proxySQL的管理端口,然後通過如下命令可查看stats庫裏面的表,操作如下:
MySQL [(none)]> show tables from stats;
常用的幾個表介紹如下:
? stats_mysql_commands_counters
統計各種SQL類型的執行次數和時間,通過參數mysql-commands_stats控制開關,默認是ture。
? stats_mysql_connection_pool
連接後端MySQL的連接信息。
? stats_mysql_processlist
類似MySQL的show processlist的命令,查看各線程的狀態。
? stats_mysql_query_digest
表示SQL的執行次數、時間消耗等。通過變量mysql-query_digests控制開關,默認是開。
? stats_mysql_query_rules
路由命中次數統計。
4、monitor庫
登錄到proxySQL的管理端口,然後通過如下命令可查看monitor庫裏面的表,操作如下:
MySQL [(none)]> show tables from monitor;
常用的幾個表介紹如下:
? mysql_server_connect_log
連接到所有MySQL服務器以檢查它們是否可用,該表用來存放檢測連接的日誌。
? mysql_server_ping_log
使用mysql_ping API ping後端MySQL服務器,檢查它們是否可用,該表用來存放ping的日誌。
? mysql_server_replication_lag_log
後端MySQL服務主從延遲的檢測。
覺得不過癮,後續還有一些列文章在等著呢:
原新浪網、阿裏雲(原萬網)系統架構師,Linux暢銷書《循序漸進linux》作者、51CTO博客博客專家博主、51CTO特級講師,我的最新專欄: 輕松玩轉ELK海量可視化日誌分析系統,連載更新中,猛戳查看:
http://blog.51cto.com/cloumn/detail/14
靈活強大的MySQL代理中間件ProxySQL應用實戰(1)