GitHub地址:https://github.com/sysown/proxysql
官網地址:https://www.proxysql.com/
Percona主推的讀寫分離中間件,下載地址:
https://www.percona.com/downloads/proxysql/
一、安裝
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
二、配置
登錄Proxysql管理和監控界面(也是使用Mysql協議,端口是6032,不加-h在某些環境下會自動使用本地sock連到3306的mysql端口,所以建議要加上-h參數)
mysql -uadmin -padmin -P6032 -h127.0.0.1
6032為管理和監控端口,6033為對外提供數據庫服務的端口,admin/amin為默認的管理監控的賬號密碼(只能本地登錄),可以在proxysql.conf文件的admin_variables找到。

可以通過查看global_variables表來獲取proxysql的各種參數,在其中你可以找到其默認自帶的2個管理用戶admin、stats,其默認db schema分別為main、stats,這兩個用戶一個可以用於進行proxysql一個可以用於觀察stats,這倆賬戶唯一的區別就是admin權限大,stats權限小點,兩者都只能本地登錄。
此外還需要再定義一個監控賬號,因為默認的admin和stats管理賬號都是屬於proxysql的不能用於后端mysql連接,我們需要一個賬號用於ping后端的mysql以及檢測mysql主從延遲。
這個監控賬號雖然是在后端數據庫真實存在的(既可以通過6033端口連接),但其實他是個管理賬號,所以他很特殊,因為它既可以通過6032端口連到proxysql的管理界面,也可以通過6033端口連到后端的mysql業務庫。平時我們既不會用他連6032(因為有stats管理賬戶)也不會用他連mysql業務庫(權限受限)。但是如果你不想從本地登錄還想查看proxysql的統計信息,那么可以使用此賬戶遠程連接到6032的管理端口,此賬戶的管理權限等同於stats賬戶。
# 首先后端mysql主庫添加賬戶:
mysql> GRANT SUPER,REPLICATION CLIENT ON *.* TO 'proxysql' IDENTIFIED BY 'proxysql';
# 然后設置proxysql對應的管理賬戶:
mysql -uadmin -padmin -h127.0.0.1 -P6032
set mysql-monitor_username='proxysql';
set mysql-monitor_password='proxysql';
關於proxysql配置,最重要的是mysql_servers,mysql_users,mysql_query_rules,其他表很少修改:
這3個最重要的表的內容也可以在/etc/proxysql.conf中修改,但只是第一次初始化時使用,以后的修改和初始化信息都是通過disk庫實現的(存儲在sqllite庫中),目前建議不要對/etc/proxysql.conf和proxysql-admin.conf做任何修改。
- mysql_servers:
本例中是在MHA環境下配置的,59、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');
- mysql_users:
frontend和backend字段默認都為1,標識了賬戶既是屬於proxysql server的賬戶,也是可以用於連接后端mysql server的賬戶。雖然proxysql文檔說未來版本會把前端賬戶和后端賬戶分隔以便后端賬戶可以完全對proxysql的client們隔離,但目前前后端賬戶還是重合的。
insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent)
values('leo','leo',1,1000,1);
# 需要注意的是插入時設置的password是明文密碼,可以使用如下方式加密一下:
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS FROM RUNTIME;
SAVE MYSQL USERS TO DISK;
# 其原理如下:
參數admin-hash_passwords為true時,密碼在load入runtime時會被自動hash,所以load mysql users to runtime可以實現密碼hash
save mysql users from runtime等價於save mysql users to mem,意思是main庫的mysql_users表里記載的密碼也更新下
最后save mysql users to disk是將hash密碼寫入硬盤
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:
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);
# mysql_query_rules表的主鍵是自增的rule_id,匹配規則的應用順序是按rule_id升序來的,所以可以把精細的匹配規則前置,模糊的匹配規則后置。
# load to runtime生效並在sqlite中保存上述修改。
load mysql query rules to runtime;
save mysql query rules to disk;
re_modifiers字段進行設置,默認的匹配規則是大小寫不敏感的。
select * from stats_mysql_query_digest_reset;
# 以上視圖與stats_mysql_query_digest的結構與內容一樣,區別在於查詢以上視圖后統計信息會被清空。