讀寫分離中間件-——ProxySql

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;  
發佈了65 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章