利用ProxySQL實現MySQL的讀寫分離

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設置讀的負載均衡。以下操做:
    • 查看錶 stats_mysql_query_digest,找到併發高的SQL對應的字段digest。
    • 在main.mysql_query_rules中設置路由規則時,將查詢到的digest,添加到路由表的字段digest中。
    • 官網相關博客:http://proxysql.com/blog/configure-read-write-split

五、測試 配置的讀寫分離是否生效

執行一些操做:

# 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,一個對外提供服務,一個作故障切換使用。
相關文章
相關標籤/搜索