ProxySQL是Percona主推的讀寫分離中間件,下載地址爲:mysql
1:下載
wget https://www.percona.com/downloads/proxysql/proxysql-1.4.5/binary/redhat/6/x86_64/proxysql-1.4.5-1.1.el6.x86_64.rpm
2:安裝
rpm -ivh proxysql-1.4.5-1.1.el6.x86_64.rpm
3:啓動
service proxysql start/stop/status
2、配置git
--登陸Proxysql管理和監控界面(也是使用Mysql協議,端口是6032,不加-h會自動使用本地sock連到3306的mysql端口,因此必需要加上-h參數) mysql -uadmin -padmin -P6032 -h127.0.0.1
maingithub
是默認的數據庫名,表裏存放後端db實例、用戶驗證、路由規則等信息。表名以 runtime_開頭的表示proxysql當前運行的配置內容,不能經過dml語句修改,只能修改對應的不以 runtime_ 開頭的(在內存)裏的表,而後 LOAD 使其生效, SAVE 使其存到硬盤以供下次重啓加載。sql
disk數據庫
是持久化到硬盤的配置,sqlite數據文件。後端
stats服務器
是proxysql運行抓取的統計信息,包括到後端各命令的執行次數、流量、processlist、查詢種類彙總/執行時間,等等。app
monitor 負載均衡
存儲 monitor 模塊收集的信息,主要是對後端db的健康/延遲檢查。加密
Proxysql登陸管理和監控界面後,不須要使用use database_name;的命令,直接查詢下列表便可。
主要的表信息:
其中最重要的是mysql_servers,mysql_users,mysql_query_rules這3個表,其餘表不多修改。這3個最重要的表的內容也能夠在/etc/proxysql.conf中修改,但只是第一次初始化時有用,之後的修改和初始化信息都是存儲在sqllite文件中的,建議不要對/etc/proxysql.conf作任何修改。
定義全部可用的mysql數據庫IP,hostgroup_id能夠自定義,只需將讀和寫的組設爲不同的hostgroup_id便可。
本例中是在MHA環境下配置的,5九、60、61爲MHA的3個節點,其中59目前爲master,200爲MHA的VIP(公共IP)。
在配置完mysql_users後,ProxySQL爲每一個mysql_servers表中定義的hostname建立一個默認的鏈接放入鏈接池中,能夠經過查看stats_mysql_connection_pool表獲知。
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(100,'10.0.1.59',3306,1,1000,10,'test my proxysql');
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(100,'10.0.1.60',3306,1,1000,10,'test my proxysql');
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(100,'10.0.1.61',3306,1,1000,10,'test my proxysql');
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)
values(1000,'10.0.1.200',3306,1,1000,10,'test my proxysql');
這裏把MHA的3個節點的IP--59,60,61的hostgroup_id設爲100,將MHA的VIP--200的hostgroup_id設置爲1000,實現讀寫分離和讀的負載均衡。
定義鏈接proxysql的數據庫帳戶和密碼,首先須要此帳號在mysql庫中存在,這裏使用已經存在的帳leo,能夠看到這個帳號既能鏈接mysql也能鏈接proxysql的6033端口。
default_hostgroup能夠設爲上邊定義的1000,這樣全部鏈接到MHA所在服務器的6033端口的客戶端會話都會默認轉發到hostgroup 1000上,可是若是設置了任何mysql_query_rules,那麼只要有select操做就會按mysql_query_rules的規則轉發,因此若是你設置了mysql_query_rules,那麼select @@hostname;查到的可能不會是hostgroup爲1000的節點,由於這也屬於select語句。本例中hostgroup爲1000的是MHA的VIP,proxysql自動鏈接到MHA的VIP上,即始終默認鏈接到master庫,執行任何語句都會根據mysql_query_rules的規則轉發。
通常會話都不會只執行select或者只執行DML操做,所以default_hostgroup可設可不設。
insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('leo','leo',1,1000,1); --須要注意的是這裏的password是明文密碼,可使用以下方式加密一下。 save mysql users to mem; --而後就能夠看到mysql_users裏的密碼變成了密文。
建議再定義一個監控帳號,以下:
mysql> GRANT SUPER,REPLICATION CLIENT ON *.* TO 'proxysql' IDENTIFIED BY 'proxysql';
而後mysql -uadmin -padmin -h127.0.0.1 -P6032進入管理和監控界面:
set mysql-monitor_username='proxysql';
set mysql-monitor_password='proxysql';
--此帳號也能夠不配置直接使用默認的admin:admin,區別是默認的admin:admin權限很大,且只能在本地登陸,而本身設置的proxysql帳戶只能看到監控信息。
最後再load並在sqlite中保存上述各類修改:
load mysql servers to runtime;
load mysql users to runtime;
load mysql variables to runtime;
save mysql servers to disk;
save mysql users to disk;
save mysql variables to disk;
定義讀寫分離規則,能夠看到是經過正則實現的,下列定義表示除了select for update,其餘的select一概轉發到hostgroup_id爲100的虛擬節點上,也就說讀操做負載均衡的分配到5九、60、61三個庫上。其餘操做使用默認的hostgroup_id爲1000的庫,也就是MHA的master庫。
關於mysql_query_rules各個字段的解釋參考:https://github.com/sysown/proxysql/wiki/Main-(runtime)#mysql_query_rules
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply)
VALUES(1,'^SELECT.*FOR UPDATE$',1000,1);
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply)
VALUES(1,'^SELECT',100,1);
--load並在sqlite中保存上述修改。
load mysql query rules to runtime;
save mysql query rules to disk;
select * from stats_mysql_query_digest_reset;