ProxySql安裝
- 下載proxysql安裝包
https://github.com/sysown/proxysql/releases/tag/v2.0.5
或
https://repo.proxysql.com/ProxySQL/
- 安裝RPM包
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL ##安裝依賴
rpm -ivh proxysql-2.0.5-1-centos7.x86_64.rpm
- 啓動服務
/etc/init.d/proxysql start
啓動後會監聽兩個端口,默認爲6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL對外提供服務的端口。
- 登入proxysql
mysql -uadmin -p admin -h 127.0.0.1 -P 6032 ##proxysql默認用戶密碼爲admin
- 在proxysql中添加mysql節點
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'139.196.52.45',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'139.196.52.45',3307);
- 修改後,加載到RUNTIME,並保存到disk。
load mysql servers to runtime;
save mysql servers to disk;
- 查看節點狀態
select * from mysql_servers\G
監控後端MySQL節點
- 在master上執行
添加節點之後,還需要監控後端節點。對於後端是主從複製的環境來說,這是必須的,因爲ProxySQL需要通過每個節點的read_only
值來自動調整它們是屬於讀組還是寫組。
首先在後端master節點上創建一個用於監控的用戶名(只需在master上創建即可,因爲會複製到slave上),這個用戶名只需具有USAGE
權限即可。如果還需要監控複製結構中slave是否嚴重延遲於master(先混個眼熟:這個俗語叫做"拖後腿",術語叫做"replication lag"),則還需具備replication client
權限。這裏直接賦予這個權限
create user proxysql@'%' identified by 'proxysql';
grant replication client on *.* to proxysql@'%';
FLUSH PRIVILEGES;
- 回到ProxySQL上配置監控
set mysql-monitor_username='proxysql';
set mysql-monitor_password='proxysql';
- 加載到RUNTIME,並保存到disk
load mysql variables to runtime;
save mysql variables to disk;
- 驗證監控結果:ProxySQL監控模塊的指標都保存在monitor庫的log表中
以下是連接是否正常的監控(對connect指標的監控):(在前面可能會有很多connect_error,這是因爲沒有配置監控信息時的錯誤,配置後如果connect_error的結果爲NULL則表示正常)
select * from mysql_server_connect_log;
以下是對心跳信息的監控(對ping指標的監控):
select * from mysql_server_ping_log;
- 指定寫組的id爲10,讀組的id爲20
此處可能報錯,可以刪除/var/lib/proxysql/proxysql.db文件,將所有修改填入/etc/proxysql.conf(只有第一次啓動程序時生效或者proxysql.db文件不存在時)中,重啓proxysql。
insert into mysql_replication_hostgroups values(10,20);
- 在該配置加載到RUNTIME生效之前,先查看下各mysql server所在的組
select hostgroup_id,hostname,port,status,weight from mysql_servers;
- 將剛纔
mysql_replication_hostgroups
表的修改加載到RUNTIME生效
load mysql servers to runtime;
save mysql servers to disk;
- 在master節點上執行,創建用戶
grant all on *.* to proxysqluser@'%' identified by 'proxysqluser@';
- 回到ProxySQL,配置mysql_users表,將剛纔的用戶添加到該表中
insert into mysql_users(username,password,default_hostgroup) values('proxysqluser','proxysqluser',10);
load mysql users to runtime;
save mysql users to disk;
- 查看用戶狀態
select * from mysql_users\G
************************* 1. row ***************************
username: proxyuser
password: proxyuser
active: 1 *# 注意本行*
use_ssl: 0
default_hostgroup: 10
default_schema: NULL
schema_locked: 0
transaction_persistent: 1 *# 注意本行*
fast_forward: 0
backend: 1
frontend: 1
max_connections: 10000
只有
active=1
的用戶纔是有效的用戶。至於
transaction_persistent
字段,當它的值爲1時,表示事務持久化:當某連接使用該用戶開啓了一個事務後,那麼在事務提交/回滾之前,所有的語句都路由到同一個組中,避免語句分散到不同組(更進一步的,它會自動禁用multiplexing,讓同一個事務的語句從同一個連接路由出去,保證路由到同一個組的同一個節點)。在以前的版本中,默認值爲0,不知道從哪個版本開始,它的默認值爲1。我們期望的值爲1,所以在繼續下面的步驟之前,先查看下這個值,如果爲0,則執行下面的語句修改爲1。
配置路由規則
- 插入兩個規則,目的是將select語句分離到hostgroup_id=20的讀組,但由於select語句中有一個特殊語句SELECT…FOR UPDATE它會申請寫鎖,所以應該路由到hostgroup_id=10的寫組。
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),
(2,1,'^SELECT',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
select … for update規則的rule_id必須要小於普通的select規則的rule_id,因爲ProxySQL是根據rule_id的順序進行規則匹配的。
測試路由規則
- 測試查詢路由
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
從服務器的server_id設置爲2,此處select查詢已路由到slave處
- 測試寫操作。這裏以事務持久化進行測試。
mysql -uproxysqluser -pproxysqluser -P6033 -h127.0.0.1 -e '\
start transaction;\
select @@server_id;\
commit;\
select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 3 |
+-------------+
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
- 查看路由信息
SELECT hostgroup hg,
sum_time,
count_star,
digest_text
FROM stats_mysql_query_digest
ORDER BY sum_time DESC;
主從監控
- 將主庫加入讀組中
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(10,'139.196.52.45',3306,1,1000,10,'test proxysql');
- 設置從庫權重(要高於主庫)
update mysql_servers set weight=9 where hostgroup_id=20 and hostname='139.196.52.45' and port=3307;
- 查看狀態
select * from mysql_servers;
- 加載並保存
load mysql servers to runtime;
save mysql servers to disk;
mysql_servers表示加載前的,runtime_mysql_servers可以查看加載後的。
- 設置監控賬號權限
GRANT SUPER, REPLICATION CLIENT ON *.* TO 'proxysql'@'%' IDENTIFIED BY PASSWORD '*BF27B4C7AAD278126E228AA8427806E870F64F39';
- 設置監控閾值
UPDATE mysql_servers SET max_replication_lag=5;
- 加載並保存
load mysql servers to runtime;
save mysql servers to disk;