Proxysql讀寫分離配置

ProxySQL是Percona主推的讀寫分離中間件,下載地址爲:mysql

GitHub源碼地址爲:
1、安裝
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
6032爲管理和監控端口,6033爲對外提供數據庫服務的端口,admin/amin爲默認的管理監控的帳號密碼, 能夠在proxysql.conf文件的admin_variables找到。

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_servers:

定義全部可用的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,實現讀寫分離和讀的負載均衡。

  • mysql_users:

定義鏈接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;
  • mysql_query_rules:

定義讀寫分離規則,能夠看到是經過正則實現的,下列定義表示除了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;
  • 查看相關的統計信息
在進行一系列增刪改查後,能夠經過以下視圖查看統計信息,須要使用監控帳號鏈接proxysql的6032端口.
本例中鏈接方式爲mysql -uproxysql -pproxysql -P6032 -h127.0.0.1 (127.0.0.1爲proxsql所在服務器,我這裏直接在本地查的)
select * from stats_mysql_query_digest_reset;
最後,Proxysql日誌的默認位置爲/var/lib/proxysql/proxysql.log,有異常能夠經過查看日誌尋找緣由。
 
3、總結
本例使用Proxysql實現了MHA的讀寫分離,把VIP設置爲了可讀寫的hostgroup,真實的3臺MHA服務器IP設置爲了可讀的hostgroup,可是在MHA同步延遲較大時可能出現讀取不到最新數據的狀況,須要注意。
相關文章
相關標籤/搜索