實現MySQL/MariaDB讀寫分離的中間件--MySQLRouter和Proxysql

實驗前準備:
要實現MySQL/MariaDB的讀寫分離,首先要準備好MySQL/MariaDB主從複製架構:
主服務器:172.16.75.1,寫操做服務器
兩臺從服務器:172.16.75.2和172.16.74.2,讀操做服務器
除主從複製架構外,還須要準備一臺佈置中間件的主機,這裏是172.16.74.1html

172.16.75.1主服務器中/etc/my.cnf中[mysqld]配置段配置:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log_bin=/var/lib/mysql/binlog
server_id=101
innodb_file_per_table=ON
skip_name_resolve=ON
sync_binlog=1
innodb_flush_log_at_trx_commit=1
relay_log=/var/lib/mysql/slavelog前端

172.16.75.2從服務器中/etc/my.cnf中[mysqld]配置段配置:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=201
relay_log=/var/lib/mysql/slavelog
set @@global.read_only=ON
sync_binlog=1
innodb_flush_log_at_trx_commit=1mysql

172.16.74.2從服務器中/etc/my.cnf中[mysqld]配置段配置:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=301
relay_log=/var/lib/mysql/slavelog
set @@global.read_only=ON
sync_binlog=1
innodb_flush_log_at_trx_commit=1git

爲了試驗的精確性,四臺主機均關閉防火牆以及排除SELinux的影響。github

1、MySQL Router實現MySQL/MariaDB讀寫分離:正則表達式

MySQLRouter通常不用於生產環境當中,端口實現讀寫分離,須要在應用程序端配置端口,會形成一系列問題,因此,測試環境中體驗一下就能夠了算法

原理:MySQL Router可以分析來自於前端應用程序或客戶端發送來的SQL請求是讀請求仍是寫請求,從而決定該SQL請求是發送給後端的Master仍是Slave,以及發送給哪一個Master或者哪一個Slave;sql

MySQL Router實現路由功能,要經過一個的特有的模塊routing.so模塊實現
MySQL Router讀寫分離的實現方式:經過不一樣的端口接收用戶的請求,從而實現簡單的讀寫分離;並且對於讀請求的調度算法,只能使用默認的RR(輪詢)算法數據庫

安裝方法:
從MySQL官方站點獲取安裝包:https://dev.mysql.com/downloads/router/vim

安裝:[root@mysqlrouter ~]# yum install mysql-router-2.1.6-1.el7.x86_64.rpm
啓動:[root@mysqlrouter ~]# systemctl start mysqlrouter.service
查看啓動狀態:

[root@mysqlrouter ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.16.74.1:40081 :
LISTEN 0 128 172.16.74.1:40082 :

在 /etc/mysqlrouter/mysqlrouter.conf 中配置以下:
[root@mysqlrouter ~]# vim /etc/mysqlrouter/mysqlrouter.conf

[DEFAULT]
logging_folder = /var/log/mysqlrouter/
plugin_folder = /usr/lib64/mysqlrouter
runtime_folder = /var/run/mysqlrouter
config_folder = /etc/mysqlrouter

[logger]
level = info

[keepalive]
interval = 60

[routing:masters]
#主服務器配置段#
#Router監聽的前端SQL請求的地址和端口40081(非著名端口號便可)#
bind_address = 172.16.74.1:40081
#定義routing規則的轉發目標地址及端口號(能夠監聽多個寫服務器)#
destinations = 172.16.75.1:3306
#模式:只寫#
mode = read-write
#爲防止網絡緣由影響超時錯判,因此講鏈接超時時間設置爲2s(大於1s便可)#
connect_timeout = 2

[routing:slaves]
#從服務器配置段#
#監聽#
bind_address = 172.16.74.1:40082
destinations = 172.16.75.2:3306,172.16.74.2:3306
#模式:只讀#
mode = read-only
connect_timeout = 1

注意:目前的MySQL Router 2.1.6版本中,能夠實現後端服務器的健康狀態檢測;一旦發現後端的Master或Slave不可用,則會將其暫時移除出可調度列表;而檢測到服務可用以後,再自動添加進可調度列表;

而後在主服務器Master中受權測試用戶,此次測試用來體現MySQL Router基於端口實現路由轉發
MariaDB [mysql]> grant all on . to 'test'@'172.16.74.%' identified by '123';
刷新受權表:
MariaDB [mysql]> flush privileges;

測試讀寫分離:
[root@mysqlrouter ~]# mysql -utest -h172.16.74.1 -P40081 -p123 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 101 |
+-------------+
[root@mysqlrouter ~]# mysql -utest -h172.16.74.1 -P40082 -p123 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 201 |
+-------------+

2、使用ProxySQL實現MySQL/MariaDB讀寫分離:
功能強大的MySQL中間件;
官方站點:http://www.proxysql.com
官方的github:https://github.com/sysown/proxysql/releases/tag/v1.4.9

Percona ProxySQL的文檔手冊:https://www.percona.com/doc/percona-xtradb-cluster/5.7/howtos/proxysql.html

ProxySQL是使用C++語言開發的,輕量級的產品,但性能很是好,功能不少,幾乎可以知足中間件所需的絕大多數的功能,主要包括:
1.讀/寫分離,且支持多種方式;
2.能夠定義基於用戶、基於Schema、基於SQL語句的規則對SQL語句進行路由轉發;規則很靈活;
3.基於schema和語句級別的規則,能夠實現簡單的數據庫分片功能;(Sharding)
4.能夠經過查詢緩存來緩存查詢結果;
5.監控後端服務器節點:後端服務器的心跳信息,後端服務器的read-only/read-write信息,Slave和Master的數據同步的延遲性(replication lag);

獲取安裝程序包:
兩個發行版本:
官方的ProxySQL
Percona的ProxySQL

經過官方站點或官方的github項目,或Percona官方及Percona資源的鏡像站點;

安裝ProxySQL:[root@proxysql ~]# yum install proxysql
啓動和關閉服務:[root@proxysql ~]# service proxysql start/stop

驗證服務啓動的結果:
[root@proxysql ~]# ss -tnlp
    LISTEN     0      128               *:6032                          *:*                   users:(("proxysql",pid=35296,fd=23))
    LISTEN     0      128               *:6033                          *:*                   users:(("proxysql",pid=35296,fd=22))
    LISTEN     0      128               *:6033                          *:*                   users:(("proxysql",pid=35296,fd=21))
    LISTEN     0      128               *:6033                          *:*                   users:(("proxysql",pid=35296,fd=20))
    LISTEN     0      128               *:6033                          *:*                   users:(("proxysql",pid=35296,fd=19))

看到上述結果,說明proxysql服務啓動成功;

登陸方式:
    可使用mysql客戶端工具鏈接到proxysql的管理接口,該管理接口有默認的管理員帳戶和密碼,都是admin;
    [root@localhost ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.5.30 (ProxySQL Admin Module)

    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MySQL [(none)]>

實驗中所涉及到的庫表的含義:
默認狀況下,ProxySQL提供了幾個庫,每一個庫都有各自的意義;查看全部庫的方法:
MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name | file |
+-----+---------------+-------------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
| 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+

主要介紹main庫和monitor庫相關的表的功能;
                MySQL [main]> show tables from main;
                +--------------------------------------------+
                | tables                                     |
                +--------------------------------------------+
                | global_variables                           |
                | mysql_collations                           |
                | mysql_group_replication_hostgroups         |
                | mysql_query_rules                          |
                | mysql_query_rules_fast_routing             |
                | mysql_replication_hostgroups               |
                | mysql_servers                              |
                | mysql_users                                |
                | proxysql_servers                           |
                | runtime_checksums_values                   |
                | runtime_global_variables                   |
                | runtime_mysql_group_replication_hostgroups |
                | runtime_mysql_query_rules                  |
                | runtime_mysql_query_rules_fast_routing     |
                | runtime_mysql_replication_hostgroups       |
                | runtime_mysql_servers                      |
                | runtime_mysql_users                        |
                | runtime_proxysql_servers                   |
                | runtime_scheduler                          |
                | scheduler                                  |
                +--------------------------------------------+

                MySQL [main]> show tables from monitor;
                +------------------------------------+
                | tables                             |
                +------------------------------------+
                | mysql_server_connect_log           |
                | mysql_server_group_replication_log |
                | mysql_server_ping_log              |
                | mysql_server_read_only_log         |
                | mysql_server_replication_lag_log   |
                +------------------------------------+

            注意:
                1.全部的以"runtime_"開頭的表都是運行時的配置,是不能修改的。要完成ProxySQL的配置,僅能修改那些不是以"runtime_"開頭的表;
                2.在執行表的修改以後,必須手動的將修改結果同步至運行時環境和持久化保存到磁盤;
                    LOAD ... TO RUNTIME;
                        將指定的表中的修改結果同步至運行時環境;

                    SAVE ... TO DISK;
                        將指定的表中的修改結果同步至磁盤以實現持久化存儲;

                        注意:「...」表示表名,去掉真實表名中的"_"符號用空白字符代替;

                        示例:修改了msyql_servers表,
                            load mysql servers to runtime;
                            save mysql servers to disk;

        mysql_servers表中有不少個字段,每一個字段都有十分重要的意義;
            MySQL [main]> show create table mysql_servers;
            字段                              數據類型        是否爲空        字段默認值
            hostgroup_id                INT                 NOT NULL        DEFAULT 0,
            hostname                        VARCHAR         NOT NULL        
            port                                INT                 NOT NULL        DEFAULT 3306,
            status                          VARCHAR         NOT NULL        DEFAULT 'ONLINE',
            weight                          INT                 NOT NULL        DEFAULT 1,
            compression                 INT                 NOT NULL        DEFAULT 0,
            max_connections         INT                 NOT NULL        DEFAULT 1000,
            max_replication_lag INT                 NOT NULL        DEFAULT 0,
            use_ssl                         INT                 NOT NULL        DEFAULT 0,
            max_latency_ms          INT                 NOT NULL        DEFAULT 0,
            comment                         VARCHAR         NOT NULL        DEFAULT '',

        各字段的含義:
            hostgroup_id:
                後端MySQL實例所在的服務器所在的主機組的編號;注意:一臺主機可能有多種角色,可能存在於多個主機組中;
            hostname:
                後端的MySQL實例所在的服務器監聽的IP地址;該字段沒有默認值,意味着在添加一個新的後端服務器節點時,必須指定該字段的值;
            port:
                後端的MySQL實例所在的服務器監聽的端口號;默認值爲3306,一般使用默認值便可;
            status:
                後端MySQL服務器的運行時狀態,有四種狀態值:'ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD'
                    ONLINE:此狀態表示後端MySQL服務器節點徹底正常;
                    SHUNNED:此狀態表示後端MySQL服務器節點暫時被ProxySQL自動忽略,可能的緣由是在一個較短期內發生了大量的鏈接錯誤,也多是Slave端與Master端之間的數據延遲過大;
                    OFFLINE_SOFT:此狀態表示ProxySQL不會再向此服務器轉發任何請求,但此服務器上還沒有完成的事務會繼續執行,直到全部事務執行完畢以後,會進入"非活躍狀態";graceful stop;
                    'OFFLINE_HARD:此狀態表示ProxySQL不會再向此服務器轉發任何請求,同時此服務器上正在執行的事務當即中斷結束,ProxySQL也會臨時將其移除出主機組,經常使用於維護操做;
            weight:對應後端服務器在主機組中的權重,權重值越高,ProxySQL就會向其轉發越多的請求;默認值爲1;
            compression:標記ProxySQL和後端MySQL服務器之間創建的鏈接中,是否會先壓縮數據,再傳輸;默認值爲0;
                若是該字段值爲0,則不壓縮傳輸;
                若是該字段值大於0,則壓縮後傳輸;
            max_connections:表示ProxySQL與後端MySQL服務器之間容許創建的最大鏈接數;一旦達到最大值,即便後端服務器的權重值再大,也不會再創建新的鏈接;默認值爲1000,表示每一個後端MySQL服務器最多同時接受1000個來自於ProxySQL的鏈接;
                經過合理的定義該字段的值,能夠避免後端MySQL服務器超負荷運轉;
            max_replication_lag:用於表示後端的SLave端在複製時延後於Master多長時間,若是超出該字段定義的上限值,proxySQL會暫時忽略此服務器,直到Slave的複製內容遇上Master爲止(數據一致);
            use_ssl:表示是否容許ProxySQL和後端MySQL服務器之間基於SSL協議創建鏈接;
            max_latency_ms:監控模塊按期向後端MySQL服務器發起ping(SELECT)檢查操做的延遲時間;
            comment:註釋信息,說明信息,能夠隨意定義的內容,主要起輔助提示做業;

向ProxySQL插入監控節點:
MySQL [main]> insert into mysql_servers (hostgroup_id,hostname,port) values (10,'172.16.75.3',3306),(10,'172.16.75.4',3306),(10,'172.16.75.5',3306);

監控後端的MySQL節點:
添加節點完成以後,更重要的是監控各後端節點;後端必須是主從複製的環境;而ProxySQL會讀取後端MySQL服務器的read_only服務器參數的值,以區分該服務器節點是屬於"讀組"仍是"寫組";

在後端的Master服務器上建立一個用於監控功能的用戶,該用戶僅須要有"USAGE"權限便可;若是想要監控在複製結構中Slave端是否與Master端存在驗證的延遲或滯後的狀態,即replication lag狀態,還須要讓該監控用戶具有"REPLICARION CLIENT"權限;

**建立監控用戶的方法:**
    在Master端執行下列SQL語句:
        MariaDB [(none)]> grant replication client,replication slave on *.* to 'mmonitor'@'172.16.74.%' identified by '123';

    在ProxySQL端執行下列SQL語句:
        MySQL [main]> set mysql-monitor_username='mmonitor';
        MySQL [main]> set mysql-monitor_password='qhdlink';

        其實是在修改global_variables表中對應的變量的值,因此能夠直接使用UPDATE語句來修改對應的字段的值:
            UPDATE global_variables SET variable_value='mmonitor' WHERE variable_name='mysql-monitor_username';
            UPDATE global_variables SET variable_value='qhdlink' WHERE variable_name='mysql-monitor_password';

讓此前添加的後端MySQL服務器節點及用於監控各節點的用戶生效:
    MySQL [main]> load mysql servers to runtime;
    MySQL [main]> save mysql servers to disk;
    MySQL [main]> load mysql variables to runtime;
    MySQL [main]> save mysql variables to disk;

驗證監控的結果:
ProxySQL監控模塊的指標都保存在monitor庫的各log表中;
若是想查看鏈接是否正常的監控信息,在mysql_server_connect_log表中
MySQL [(none)]> select * from mysql_server_connect_log limit 3;
+-------------+------+------------------+-------------------------+---------------+
| hostname | port | time_start_us | connect_success_time_us | connect_error |
+-------------+------+------------------+-------------------------+---------------+
| 172.16.74.2 | 3306 | 1533700332922373 | 1945 | NULL |
| 172.16.75.1 | 3306 | 1533700332933127 | 1689 | NULL |
| 172.16.75.2 | 3306 | 1533700332944270 | 50012 | NULL |
+-------------+------+------------------+-------------------------+---------------+
3 rows in set (0.00 sec)

可能會看到一些connect_error信息,這是由於此前並無設置正確的用於監控的用戶帳戶信息;在成功的配置監控用戶以後,connect_error自動的值應該是"NULL",表示鏈接正常;

    若是想查看後端MySQL服務器的心跳信息的監控,在mysql_server_ping_log表中;
    MySQL [(none)]> select * from mysql_server_ping_log limit 3;
    +-------------+------+------------------+----------------------+------------+
    | hostname    | port | time_start_us    | ping_success_time_us | ping_error |
    +-------------+------+------------------+----------------------+------------+
    | 172.16.74.2 | 3306 | 1533700268376052 | 649                  | NULL       |
    | 172.16.75.1 | 3306 | 1533700268377872 | 602                  | NULL       |
    | 172.16.75.2 | 3306 | 1533700268379770 | 824                  | NULL       |
    +-------------+------+------------------+----------------------+------------+
    3 rows in set (0.00 sec)

    因爲還沒有對後端MySQL服務器進行明確的節點分組,因此mysql_server_read_only_log和mysql_server_replication_lag_log都是空的;

    要想定義後端MySQL服務器的分組,在mysql_replication_hostgroups表中添加對應組的ID便可;
         writer_hostgroup
         reader_hostgroup

    默認mysql_replication_hostgroups表是空表,想要定義讀組和寫組的ID,須要向該表中插入數據:
        MySQL [main]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,2);

    **  注意:應該保證插入的組的ID應該與此前插入的主機所定義的組ID相同;**

    此時並不能當即生效,查看mysql_servers表中各主機所屬組的時候,看到的是舊的數據;
            MySQL [main]> select hostgroup_id,hostname,port from mysql_servers;
            +--------------+-------------+------+
            | hostgroup_id | hostname    | port |
            +--------------+-------------+------+
            | 10           | 172.16.75.1 | 3306 |
            | 10           | 172.16.75.2 | 3306 |
            | 10           | 172.16.74.2 | 3306 |
            +--------------+-------------+------+

    將此前修改的內容加載到runtime以後,才能使其生效;
        MySQL [main]> load mysql servers to runtime;
        MySQL [main]> save mysql servers to disk;

    再查看主機分組的信息:
        MySQL [main]> select hostgroup_id,hostname,port from mysql_servers;
        +--------------+-------------+------+
        | hostgroup_id | hostname    | port |
        +--------------+-------------+------+
        | 10           | 172.16.75.1 | 3306 |
        | 2             | 172.16.75.2 | 3306 |
        | 2             | 172.16.74.2 | 3306 |
        +--------------+-------------+------+

    Monitor模塊會根據後端MySQL服務器上的read_only服務器變量的值判斷並將對應的節點自動移動到讀組或寫組中;

    在monitor庫的mysql_server_read_only_log表中就會有後端MySQL服務器的read_only屬性;
    MySQL [main]> select * from mysql_server_read_only_log limit 3;
    +-------------+------+------------------+-----------------+-----------+-------+
    | hostname    | port | time_start_us    | success_time_us | read_only | error |
    +-------------+------+------------------+-----------------+-----------+-------+
    | 172.16.75.1 | 3306 | 1533627317448205 | 2403            | 0         | NULL  |
    | 172.16.75.2 | 3306 | 1533627317449233 | 2670            | 1         | NULL  |
    | 172.16.74.2 | 3306 | 1533627317450825 | 2213            | 1         | NULL  |
    +-------------+------+------------------+-----------------+-----------+-------+

管理mysql_users
上述全部配置都是與後端MySQL服務器節點相關的,除此以外,ProxySQL還能夠配置與SQL語句相關的內容,包括:發送SQL請求的用戶,SQL語句路由規則,SQL的查詢緩存,SQL語句的重寫等;

發送SQL請求的用戶的相關配置:
    root
    sqlsender

在後端的Master服務器上建立對應用戶帳戶:
    MariaDB [(none)]> grant all on *.* to 'root'@'172.16.74.%' identified by '123';
    MariaDB [(none)]> grant all on *.* to 'sqlsender'@'172.16.74.%' identified by '123';

在ProxySQL上,須要向mysql_users表中添加用戶帳戶;
    MySQL [main]> insert into mysql_users (username,password,default_hostgroup) values ('root','123',10),('sqlsender','123',2); 

    添加用戶以後,須要將修改後的數據加載至runtime及持久化存儲至磁盤:
        MySQL [main]> load mysql users to runtime;
        MySQL [main]> save mysql users to disk;

    注意:在向mysql_users表中添加用戶時,至少要指定username,password和default_hostgroup三個字段;
        username:前端鏈接到ProxySQL以及ProxySQL將SQL語句路由至MySQL時所使用的用戶名;
        password:用戶對應的密碼,能夠是明文保存,也可使用hash加密的密碼存放,若是想要使用hash密碼,須要藉助於PASSWORD('password_string')函數;
        default_hostgroup:用於爲用戶名設置默認的路由目標;

        其餘的字段的含義:
        active:對應的用戶是否爲有效用戶;
        transaction_persistent:是否啓用事務持久化,若是值爲1,意味着當某鏈接使用該用戶開啓了一個事務以後,此事務在提交或回滾以前,全部的語句都被路由到同一組中,以免同一事務的SQL語句分散到不一樣組,從而引起數據混亂或事務沒法正常提交執行;默認值爲1;此字段在較早的proxySQL版本中有默認值爲0的狀況,若是出現此類狀況,在添加用戶時必須手動設置其值爲1,而不使用默認值;

    查看mysql_users表的內容:

MySQL [(none)]> select * from mysql_users;
+-----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
+-----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| root | 123 | 1 | 0 | 10 | NULL | 0 | 1 | 0 | 1 | 1 | 10000 |
| sqlsender | 123 | 1 | 0 | 2 | NULL | 0 | 1 | 0 | 1 | 1 | 10000 |
+-----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
2 rows in set (0.00 sec)

使用主機172.16.74段的任意主機(這裏使用172.16.74.1),測試基於用戶帳戶的讀寫分離機制,讀請求訪問由結果可知默認的訪問後臺讀服務器是隨機訪問而不是輪詢方式訪問:
[root@mysqlrouter ~]# mysql -uroot -h172.16.75.2 -P6033 -p123456 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 101 |
+-------------+

[root@mysqlrouter ~]# mysql -usqlsender -h172.16.75.2 -P6033 -p123456 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 201 |
+-------------+

[root@mysqlrouter ~]# mysql -usqlsender -h172.16.75.2 -P6033 -p123456 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 301 |
+-------------+

基於SQL語句實現讀寫分離
須要添加路由規則:
與查詢規則有關的表有兩個:
mysql_query_rules
mysql_query_rules_fast_routing

mysql_query_rules_fast_routing是mysql_query_rules的擴展表,在proxysql 1.4.7之後纔出現,支持快速路由表

    mysql_query_rules經常使用的配置字段:
        rule_id:規則編號,自動增加的整數,能夠不指定;
        active:規則是否有效,默認值爲0,表示無效,須要在定義規則時,將其設置爲1;
        match_digest:定義規則的具體匹配內容;由正則表達式元字符組成,用來匹配SQL語句;
        destination_hostgroup:對於符合規則的請求,設置目標主機組,從而實現路由轉發;
        apply:是否有效提交;默認值爲0,表示無效,須要在定義規則時,將其值設置爲1;

添加查詢路由規則:
    MySQL [none]> insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) values (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',2,1);

查看新建立的路由規則:
MySQL [(none)]> select * from mysql_query_rules\G;

1. row
rule_id: 1
active: 1
username: NULL
schemaname: NULL
flagIN: 0
client_addr: NULL
proxy_addr: NULL
proxy_port: NULL
digest: NULL
match_digest: ^SELECT.*FOR UPDATE$
match_pattern: NULL
negate_match_pattern: 0
re_modifiers: CASELESS
flagOUT: NULL
replace_pattern: NULL
destination_hostgroup: 10
cache_ttl: NULL
reconnect: NULL
timeout: NULL
retries: NULL
delay: NULL
next_query_flagIN: NULL
mirror_flagOUT: NULL
mirror_hostgroup: NULL
error_msg: NULL
OK_msg: NULL
sticky_conn: NULL
multiplex: NULL
log: NULL
apply: 1
comment: NULL
2. row
rule_id: 2
active: 1
username: NULL
schemaname: NULL
flagIN: 0
client_addr: NULL
proxy_addr: NULL
proxy_port: NULL
digest: NULL
match_digest: ^SELECT
match_pattern: NULL
negate_match_pattern: 0
re_modifiers: CASELESS
flagOUT: NULL
replace_pattern: NULL
destination_hostgroup: 2
cache_ttl: NULL
reconnect: NULL
timeout: NULL
retries: NULL
delay: NULL
next_query_flagIN: NULL
mirror_flagOUT: NULL
mirror_hostgroup: NULL
error_msg: NULL
OK_msg: NULL
sticky_conn: NULL
multiplex: NULL
log: NULL
apply: 1
comment: NULL
2 rows in set (0.00 sec)

ERROR: No query specified

將規則的修改加載值runtime並持久化存儲至磁盤:
MySQL [main]> load mysql query rules to runtime;
MySQL [main]> save mysql query rules to disk;

測試事務持久化:
在Master主服務器的MySQL交互模式中:
先建立數據庫mytest:
MariaDB [mysql]> use mytest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mytest]> show tables;
+------------------+
| Tables_in_mytest |
+------------------+
| t1 |
+------------------+
1 row in set (0.00 sec)

[root@mysqlrouter ~]# mysql -uroot -h172.16.74.1 -P6033 -p123 -e 'set @@autocommit=0;\
start transaction;\
use mytest;\
insert into t1 values (1000),(2000);\
select @@server_id;\
commit;\
'
+-------------+
| @@server_id |
+-------------+
| 101 |
+-------------+

測試proxysql基於SQL請求實現讀寫分離:
-P指定6032是管理端口,指定6033是查詢端口

[root@proxysql ~]# mysql -usqlsender -h172.16.74.1 -P6033 -p123 -e 'select @@server_id for update;'
+-------------+
| @@server_id |
+-------------+
| 101 |
+-------------+

[root@proxysql ~]# mysql -uroot -h172.16.74.1 -P6033 -p123 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 101 |
+-------------+

[root@mysqlrouter ~]# mysql -usqlsender -h172.16.74.1 -P6033 -p123 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 201 |
+-------------+

[root@mysqlrouter ~]# mysql -usqlsender -h172.16.74.1 -P6033 -p123 -e 'select @@server_id;'
+-------------+
| @@server_id |
+-------------+
| 301 |
+-------------+

修改proxysql默認端口的辦法:
proxysql一旦啓動起來,其數據庫文件已經造成的狀況下,配置文件的內容將會被跳過,要是想修改內容的話,必須在運行時環境設置,而且保存到文件才能夠。

步驟:
先在運行時環境(proxysql的交互模式中)設置以下:
MySQL [(none)]> set mysql-interfaces='0.0.0.0:3306';
Query OK, 1 row affected (0.01 sec)

MySQL [(none)]> save mysql variables to disk;
Query OK, 95 rows affected (0.03 sec)

MySQL [(none)]> select @@mysql-interfaces;
+--------------------+
| @@mysql-interfaces |
+--------------------+
| 0.0.0.0:3306       |
+--------------------+
1 row in set (0.00 sec)

而後重啓proxysql服務就能夠了
[root@mysqlrouter ~]# service proxysql stop
Shutting down ProxySQL: DONE!
[root@mysqlrouter ~]# service proxysql start
Starting ProxySQL: DONE!
查看監聽端口狀態:
[root@mysqlrouter ~]# ss -tnlp
State      Recv-Q Send-Q                                         Local Address:Port                                                        Peer Address:Port              
LISTEN     0      128                                                        *:3306                                                                   *:*                   users:(("proxysql",pid=36322,fd=22))
LISTEN     0      128                                                        *:3306                                                                   *:*                   users:(("proxysql",pid=36322,fd=21))
LISTEN     0      128                                                        *:3306                                                                   *:*                   users:(("proxysql",pid=36322,fd=20))
LISTEN     0      128                                                        *:3306                                                                   *:*                   users:(("proxysql",pid=36322,fd=19))
LISTEN     0      128                                                        *:111                                                                    *:*                   users:(("rpcbind",pid=758,fd=8))
LISTEN     0      128                                                        *:6032                                                                   *:*                   users:(("proxysql",pid=36322,fd=23))

至此,MySQLRouter和Proxysql實現MySQL/MariaDB讀寫分離部署完成。

相關文章
相關標籤/搜索