1、Proxysql 的基礎知識
ProxySQL是一個能夠實現MySQL讀寫分離的輕量級工具。mysql
ProxySQL的特色
- 將全部配置保存寫入到SQLit表中。
- 支持動態加載配置,即通常能夠在線修改配置,但有少部分參數仍是須要重啓來生效。
- 支持query cache。
- 支持對query的路由,能夠針對某個語句進行分配去哪一個實例執行。
- 故障切換。
- 過濾危險的SQL。
- 不支持分表,能夠分庫,可是利用規則配置實現分表。
ProxySQL的管理配置
Proxysql中有四層配置:sql
- runtime:運行中使用的配置文件
- memory:提供用戶動態修改配置文件
- disk:將修改的配置保存到磁盤SQLit表中(即:proxysql.db)
- config:通常不使用它(即:proxysql.cnf)
四層配置圖:數據庫
註釋:centos
- 通常,修改的配置都是在memory層。能夠load到runtime,使配置在不用重啓proxysql的狀況下也能夠生效,也能夠save到disk,將對配置的修改持久化。
- [1] LOAD MYSQL USERS FROM MEMORY 或 LOAD MYSQL USERS TO RUNTIME
[2] SAVE MYSQL USERS TO MEMORY 或 SAVE MYSQL USERS FROM RUNTIME
[3] LOAD MYSQL USERS TO MEMORY 或 LOAD MYSQL USERS FROM DISK
[4] SAVE MYSQL USERS FROM MEMORY 或 SAVE MYSQL USERS TO DISK
[5] LOAD MYSQL USERS FROM CONFIG
2、ProxySQL的安裝
安裝步驟:緩存
$ rpm –ivh proxysql-1.3.9-1-centos67.x86_64.rpm // RPM安裝
$ service proxysql start // 啓動ProxySQL
$ rpm -ql proxysql // 查看配置文件的位置
/etc/init.d/proxysql
/etc/proxysql.cnf
/usr/bin/proxysql
由此得知:proxysql的配置文件在/etc/proxysql.cnf併發
$ mysql -uadmin -padmin -P6032 -h127.0.0.1 // 登陸,從配置文件中找到默認的用戶名和密碼app
ProxySQL的啓動原理:負載均衡
ProxySQL在啓動時,會啓動兩個進程,監聽兩個端口號(6032是管理的端口;6033是對外提供服務的端口),以下圖:工具
啓動解釋:測試
在proxysql初次啓動時,會從配置文件中獲取信息啓動;
在proxysql再次啓動時,首先從proxysql.cnf中找到datadir,獲取proxysql.db的位置,從proxysql.db獲取數據,將其加載到內存memory,而後從內存加載到runtime中,所以這種正常的啓動,不會從配置文件中獲取參數。
由此得知:在線修改時,必定要保存到磁盤,不然再次啓動時丟失配置的數據。
3、配置讀寫分離
機器的信息:
- 主庫:IP:192.168.152.128;port:3306
- 從庫:IP:192.168.152.128;port:3307
- Proxysql安裝在主庫。
如下操做是在main庫下的表操做的!
一、設置讀寫的分組編號(即 hostgroup_id)
- insert into mysql_replication_hostgroups values(1,2,db-128);
- load mysql servers to runtime;save mysql servers to disk;
注:設置1爲寫分組;2爲讀分組;備註:db-128;將其加載到運行中,保存到磁盤。
二、將MySQL實例分配到各個組中:主庫分到寫組;從庫分到讀組。
- insert into mysql_servers(hostgroup_id,hostname,port,transaction_persistent,max_connections) values(1,'192.168.152.128',3306,1,100),(2,'192.168.152.128','3307',1,100);
- load mysql servers to runtime;save mysql servers to disk;
注:
- 若這裏有多個從庫,能夠將其餘從庫的信息添加到讀分組(即:hostgroup_id=2)中。
- 每一個server須要屬於一個組;一個組裏能夠有多個server;一個server能夠屬於多個組。
三、建立帳號,用於對外服務鏈接進來proxysql的帳號
① 在proxysql中建立帳號,在外部使用它鏈接進來時,會在表main.mysql_users中檢查該帳號的相關信息。
- insert into mysql_users(username,password,active,default_hostgroup,default_schema)
values('proxysql','proxysql',1,1,'guolmdb');
- load mysql users to runtime;save mysql users to disk;
注:proxysql/proxysql帳號用於外部鏈接進來使用,默認進入寫分組的guolmdb庫,active=1表明活躍的帳號。
② 修改提供外部鏈接的IP和端口號
- update global_variables set variable_value='192.168.152.128:6033' where variable_name='mysql-interfaces';
- 或 set mysql-interfaces='192.168.152.128:6033';
- save mysql variables to disk;
- > proxysql restart;
注:
- 該變量的值能夠有多個,便可以設置經過多個IP鏈接進來,格式:'IP1:port1;IP2:port2'。
- 修改該變量須要重啓才能生效!
- 有兩種設置變量的方式:set 設置 或 update 設置。
③ 將以上建立的帳號,在MySQL主庫中建立一遍,要否則,proxysql沒有權限鏈接到MySQL。
- GRANT ALL PRIVILEGES ON *.* TO 'monitor'@'%' IDENTIFIED BY 'monitor';
- GRANT ALL PRIVILEGES ON *.* TO 'proxysql'@'%' IDENTIFIED BY 'proxysql';
解釋:
- monitor/ monitor 對應着proxysql的表main. global_variables 的mysql-monitor_username
- proxysql/proxysql 對應着在proxysql中的表main.mysql_users建立的帳戶
注意:
若不在MySQL中建立用戶並賦權限,proxysql鏈接不到MySQL中,在proxysql.log中會報錯:
# tail -100f proxysql.log
2017-11-13 17:02:35 MySQL_Monitor.cpp:412:monitor_connect_thread(): [ERROR] Server 192.168.152.128:3306 is returning "Access denied" for monitoring user
2017-11-13 17:02:35 MySQL_Monitor.cpp:412:monitor_connect_thread(): [ERROR] Server 192.168.152.128:3307 is returning "Access denied" for monitoring user
四、設置讀寫的路由規則
- insert into mysql_query_rules (active,username,match_pattern,schemaname,destination_hostgroup,apply) values(1,'proxysql','^select','guolmdb',2,1);
- load mysql query rules to runtime;save mysql query rules to disk;
解釋:
- 經過帳戶proxysql鏈接進來的,一個以select開頭的SQL並操做guolmdb庫的語句將會被分配到讀分組執行。
注意:
- 這種設置若一個事務爲:begin;select;update;commit;可能會將該事務分配到從庫操做,這樣是錯誤的!
- 爲避免這種錯誤,能夠針對併發高的SQL設置讀的負載均衡。以下操做:
五、測試 配置的讀寫分離是否生效
執行一些操做:
# mysql -uproxysql -pproxysql -P6033 -h192.168.152.128
[guolmdb]>insert into t1 values(1);
[guolmdb]>select * from t1 where id=1;
注:經過對外提供服務的端口號和帳號鏈接進proxysql,進而轉接到主庫上(由於該帳戶默認進入的是主庫)
查看以上的SQL在哪裏執行的:
# mysql -uadmin -padmin -P6032 -h127.0.0.1
[none] >select hostgroup,digest_text from stats_mysql_query_digest;
+-----------+----------------------------------+
| hostgroup | digest_text |
+-----------+----------------------------------+
| 1 | insert into t1 values(?) |
| 2 | select * from t1 where id=? |
+-----------+----------------------------------+
注:查看到剛纔select的語句使用的是讀分組;insert語句使用的是寫分組。
4、總 結
- ProxySQL主要的做用是:在線修改配置使之生效 、Query路由、Query cache。其中,Query路由能夠指定一個SQL放在哪一個數據庫上執行;Query cache能夠針對實時請求很高的SQL,在Query cache中緩存一些時間。
- 通常地,只須要將請求頻繁的查詢語句,作讀的負載均衡,不頻繁的能夠直接在主庫查詢。
- 對ProxySQL作HA:使用兩個ProxySQL,一個對外提供服務,一個作故障切換使用。