各位兄弟們,時隔多日老張又與你們見面啦。每次與你們見面,都會有好消息告訴你們,此次也不例外。前段時間出版了《MySQL王者晉級之路》一書,反響還不錯。爭取今年再出版一本MongoDB運維實戰的書籍,供給那些想要學習NoSQL的同窗們做爲工做中的參考。node
如今正遇上世界盃,老張最喜歡的球隊是葡萄牙——最愛C羅,喜歡他那種在比賽中好強不服輸的精神。咱們作技術也是同樣,不要由於一點困難,就放棄了當初的夢想。只有不斷努力,提高本身,才能在更好的平臺上實現自我價值。mysql
今兒,老張給你們介紹一款MySQL的一款中間件的產品——ProxySQL,它是靈活強大的MySQL代理層。像C羅同樣的強大,能夠實現讀寫分離,支持Query路由功能,支持動態指定某個SQL進行cache,支持動態加載配置、故障切換和一些SQL的過濾功能。還有一些同類產品好比DBproxy、MyCAT、OneProxy等。但通過反覆對比和測試以後,決定給你們介紹一款性能不諳的MySQL中間件產品ProxySQL。
有關ProxySQL更多的詳細信息可訪問:
https://github.com/sysown/proxysql/wiki。
接下來經過實戰來全面瞭解一下ProxySQL的特性和使用場景,先介紹一下環境,咱們的系統是CentOS6.7,MySQL版本是5.7.14,準備一主兩從架構來配合ProxySQL。git
環境配置: 192.168.56.100 Master(node1) server-id:3306100 192.168.56.101 Slave1(node2) server-id:3306101 192.168.56.102 Slave2(node3) server-id:3306102 192.168.56.103 Proxysql中間件 server-id:3306103
注:兩個從庫都要開啓read_only=on。github
實驗架構:sql
ProxySQL的安裝與啓動
首先要安裝一些依賴的軟件包,配置好Yum源進行安裝便可。
在192.168.56.103上執行以下操做:數據庫
yum -y install perl-DBD-MySQL yum -y install perl-DBI yum -y install perl-Time-HiRes yum -y install perl-IO-Socket-SSL
ProxySQL軟件包的兩個下載地址。
GitHub官網:https://github.com/sysown/proxysql/releases。
percona官網:https://www.percona.com/downloads/proxysql/。
安裝ProxySQL:後端
rpm -ivh proxysql-1.3.9-1-centos67.x86_64.rpm
配置文件路徑爲/etc/proxysql.cnf。centos
啓動ProxySQL:服務器
service proxysql start
注:6032是ProxySQL的管理端口號,6033是對外服務的端口號。架構
管理用戶名和密碼都是默認的admin。
關閉ProxySQL:
service proxysql stop
查看安裝版本:
管理員登陸命令:/usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032
可見有四個庫:main、disk、stats和monitor。分別說明一下這四個庫的做用。
main:內存配置數據庫,即MEMORY,表裏存放後端db實例、用戶驗證、路由規則等信息。main庫中有以下信息:
庫下的主要表:
mysql_servers—後端能夠鏈接MySQL服務器的列表。
mysql_users—配置後端數據庫的帳號和監控的帳號。
mysql_query_rules—指定Query路由到後端不一樣服務器的規則列表。
注:表名以runtime_開頭的表示ProxySQL當前運行的配置內容,不能經過DML語句修改。只能修改對應的不以 runtime開頭的表,而後「LOAD」使其生效,「SAVE」使其存到硬盤以供下次重啓加載。
disk庫—持久化磁盤的配置。
stats庫—統計信息的彙總。
monitor庫—一些監控的收集信息,包括數據庫的健康狀態等。
配置ProxySQL監控
首先在master(192.168.56.100)上建立ProxySQL的監控帳戶和對外訪問帳戶並賦予權限。
命令以下:
create user 'monitor'@'192.168.56.%' identified by 'monitor'; grant all privileges on *.* to 'monitor'@'192.168.56.%' with grant option; create user 'zs'@'192.168.56.%' identified by 'zs'; grant all privileges on *.* to 'zs'@'192.168.56.%' with grant option; flush privileges;
ProxySQL的多層配置系統
ProxySQL有一套很完整的配置系統,方便DBA對線上的操做。整套配置系統分爲三層,最頂層爲RUNTIME,中間層爲MEMORY和最底層,也就是持久層的DISK和CONFIG FILE。
配置結構:
RUNTIME:表明ProxySQL當前生效的正在使用的配置,沒法直接修改這裏的配置,必需要從下一層「load」進來。
MEMORY:MEMORY這一層上面鏈接RUNTIME層,下面鏈接持久化層。在這層能夠正常操做ProxySQL配置,隨便修改,不會影響生產環境。修改一個配置通常都是先在MEMORY層完成,而後確認正常以後再加載到RUNTIME和持久化到磁盤上。
DISK和CONFIG FILE:持久化配置信息,重啓後內存中的配置信息會丟失,因此須要將配置信息保留在磁盤中。重啓時,能夠從磁盤快速加載回來。
介紹完這三層配置系統以後,用超管用戶登陸ProxySQL來添加主從服務器列表。
命令以下:
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.56.100',3306); insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.56.101',3306); insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.56.102',3306); load mysql servers to runtime; save mysql servers to disk;
登陸ProxySQL以後,凡是進行任何操做,都須要運行load to runtime,從memory加載到runtime。而後再執行save to disk持久化到磁盤。
加載完成以後,三臺機器都是ONLINE狀態。
接下來繼續爲ProxySQL配置監控帳號,命令以下:
set mysql-monitor_username='monitor'; set mysql-monitor_password='monitor'; load mysql variables to runtime; save mysql variables to disk;
以後驗證監控信息:
監控信息都已正常,沒有任何報錯。
配置ProxySQL主從分組信息
這裏會用到一張表mysql_replication_hostgroups:
裏面的writer_hostgroup是寫入組的編號,reader_hostgroup是讀取組的編號。實驗中使用10做爲寫入組,20做爲讀取組編號。
insert into mysql_replication_hostgroups values (10,20,'proxy'); load mysql servers to runtime; save mysql servers to disk;
ProxySQL會根據server的read_only的取值將服務器進行分組。read_only=0的server,master被分到編號爲10的寫組,read_only=1的server,slave則被分到編號爲20的讀組。
配置對外訪問帳號,默認指定主庫,並對該用戶開啓事務持久化保護。
注:mysql_users表中的transaction_persistent字段默認爲0
建議在建立完用戶以後設置爲1,避免發生髒讀、幻讀等現象命令以下:
insert into mysql_users(username,password,default_hostgroup) values ('zs','zs',10); update mysql_users set transaction_persistent=1 where username='zs'; load mysql users to runtime; save mysql users to disk;
驗證登陸的服務器就是主庫:
注:對外端口號須要指定爲6033。
配置讀寫分離策略
配置讀寫分離策略須要使用mysql_query_rules表。表中的match_pattern字段就是表明設置的規則,destination_hostgroup字段表明默認指定的分組,apply表明真正執行應用規則。
把全部以select開頭的語句所有分配到編號爲20的讀組中。select for update 會產生一個寫鎖,對數據查詢的實效性要求高,把它分配到編號爲10的寫組中,其餘全部操做都會默認路由到寫組中。
命令以下:
insert into mysql_query_rules(active,match_pattern,destination_hostgroup, apply) VALUES(1,'^SELECT.*FOR UPDATE$',10,1); insert into mysql_query_rules(active,match_pattern,destination_hostgroup, apply) VALUES(1,'^SELECT',20,1); load mysql query rules to runtime; save mysql query rules to disk; ```** **測試讀寫分離** 經過建立的對外帳戶zs,鏈接ProxySQL登陸數據庫。 命令以下: `/usr/local/mysql/bin/mysql -uzs -pzs -h 192.168.56.103 -P 6033`` **查看zs庫下tt的數據:**  而後再登陸管理端口,經過查詢stats_mysql_query_digest這張表來監控查詢狀態,命令以下: select * from stats_mysql_query_digest;  可見這條select語句自動路由到編號爲20的讀組,即slave庫上。 而後繼續測試,經過ProxySQL登陸到數據庫: `/usr/local/mysql/bin/mysql -uzs -pzs -h 192.168.56.103 -P 6033` 執行select * from zs.tt for update和update tt set name='ff' where score=100的語句操做:   這時再登陸管理端口,監控查詢狀態,發現都已經成功路由到了編號爲10的寫組,即主庫,證實讀寫分離設置成功。   讀寫分離設置成功以後,咱們能夠調整權重,讓某臺機器承受更多的讀操做。這些技巧均可以用在運維ProxySQL上面。 調整192.168.56.102 node2節點的查詢權重,讓更多的讀請求路由到這臺機器上面。 命令以下: update mysql_servers set weight=10 where hostname='192.168.56.102'; load mysql servers to runtime; save mysql servers to disk; 
做爲苦逼DBA的咱們,不管是初學者仍是已經從業多年的「老司機」,都不要急於去把每一個MySQL集羣架構搭建出來。在學習的過程當中,一些同窗老是存在一個誤區,就是以爲我會搭建全部的數據庫架構就很是厲害了。其實並非這樣的,架構搭建並非咱們的最終目的,做爲DBA要先了解清楚本身公司的現有業務,看看公司的業務場景適合什麼樣的架構,要作好相應的數據庫架構設計。瞭解好該架構的優缺點,以及在從此應用中可能出現的問題,提早作好能解決問題的預案。知己知彼,注重細節,才能避免沒日沒夜地加班熬夜處理那些不應發生的問題。
下面總結了五條MySQL架構設計中的經驗。
(1)根據公司現有業務設計合理架構。
(2)選擇成熟的架構方案。
(3)因地制宜,根據實際設備狀況作出選擇。
(4)考慮方案的可行性。
(5)越簡單越好,越適合公司越好。
老張我就但願寫任何東西,均可以給你們一些啓示。在工做中,能夠幫助到各位就夠了!技術須要分享,咱們一塊兒努力工做,讓家人過得更好!
最後說句題外話,老張近期應邀在51CTO博客上線專欄《練一套正宗的MySQL降龍十八掌》,你們感興趣能夠戳連接瞭解一下。