靈活強大的MySQL代理中間件ProxySQL應用實戰(1)

一、常見的Mysql中間件介紹

很多人都會把中間件認爲是讀寫分離,其實讀寫分離只是中間件可以提供的一種功能,最主要的功能還是在於他可以分庫分表。下面介紹下常見的開源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]# yum install perl-DBD-mysql
[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海量可視化日誌分析系統,連載更新中,猛戳查看:
《輕鬆玩轉ELK海量可視化日誌分析系統》
靈活強大的MySQL代理中間件ProxySQL應用實戰(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章