Mysql中間件應用之使用ProxySQL進行數據庫讀寫分離

這裏使用ProxySQL

  • 兩個版本:官方版和percona版,
  • percona版是基於官方版基礎上修改,C++語言開發,輕量級但性能優異(支持處理千億級數據)
  • 具有中間件所需的絕大多數功能,包括:

多種方式的讀/寫分離
定製基於用戶、基於schema、基於語句的規則對SQL語句進行路由
緩存查詢結果
後端節點監控
官方站點:https://proxysql.com/
官方手冊:https://github.com/sysown/proxysql/wiki

架構圖

Mysql中間件應用之使用ProxySQL進行數據庫讀寫分離

環境準備

  • 實現讀寫分離前,先實現主從複製
  • 注意:slave節點需要設置read_only=1
主機 系統 ip
ProxySQL centos7 192.168.64.140
masterr centos7 192.168.64.142
slave centos7 192.168.64.143

1.實現142,143主從複製

  • 142主
修改配置 
vim /etc/my.cnf
[mysqld]
server_id=142                                                                                                  
binlog_format=row 建議

查看位置信息
root:~ # mysql -e "show master logs;"
+------------------+-----------+
| Log_name     | File_size |
+------------------+-----------+
| mysql-bin.000001 |     30343   |
| mysql-bin.000002 |   1038814 |
| mysql-bin.000003 |       245     |
| mysql-bin.000004 |       400     |
+------------------+-----------+

root:~ # systemctl start mariadb.service 
root:~ # mysql -e "grant replication slave on *.* to repluser@'192.168.64.%' identified by 'centos';"
  • 143從
修改配置 
vim /etc/my.cnf
[mysqld]
server_id=143                                                                                                      
read_only #必須加,ProxySQL通過此來判斷誰是讀服務器

配置同步信息
mysql>CHANGE MASTER TO   
MASTER_HOST='192.168.64.142',  
MASTER_USER='repluser',   
MASTER_PASSWORD='centos',   
MASTER_PORT=3306,   
MASTER_LOG_FILE='mysql-bin.000004',   
MASTER_LOG_POS=400;

啓動複製thread
mysql>start slave;
mysql>show slave status\G
  • 主從已搭建完畢
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.64.142
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 245
               Relay_Log_File: localhost-relay-bin.000007
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes       #線程都已開啓
            Slave_SQL_Running: Yes
            ............
             Master_Server_Id: 142
1 row in set (0.00 sec)

2.配置ProxySQL

1.ProxySQL安裝(需yum源)

cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF

root:~ # yum clean all
root:~ # yum repolist
proxysql_repo/7   ProxySQL YUM repository     15

root:~ # yum install -y proxysql mariadb
root:~ # rpm -ql proxysql
/etc/init.d/proxysql   #啓動腳本
/etc/proxysql.cnf  #配置文件
/usr/bin/proxysql  #啓動程序
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl

2.配置ProxySQL

  • 數據庫說明:

    main 是默認的”數據庫”名,表裏存放後端db實例、用戶驗證、路由規則等信息。
    表名以 runtime開頭的表示proxysql當前運行的配置內容,不能通過dml語句修改,
    只能修改對應的不以 runtime
    開頭的(在內存)裏的表,然後 LOAD 使其生效,
    SAVE 使其存到硬盤以供下次重啓加載
    disk 是持久化到硬盤的配置,sqlite數據文件
    stats 是proxysql運行抓取的統計信息,包括到後端各命令的執行次數、流量、
    processlist、查詢種類彙總/執行時間,等等
    monitor 庫存儲 monitor 模塊收集的信息,主要是對後端db的健康/延遲檢查

  • 1.添加監控節點
    root:~ # mysql -uadmin -padmin -P6032 -h127.0.0.1  #連接至本機ProxySQL的數據庫
    MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.64.142',3306);
    MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.64.143',3306);
    MySQL [(none)]> select * from mysql_servers;

    Mysql中間件應用之使用ProxySQL進行數據庫讀寫分離

  • 2.添加監控後端節點的用戶。ProxySQL通過每個節點的read_only值來自動調整它們是屬於讀組還是寫組

  • 在master142上執行
    MySQL> grant replication client on *.* to monitor@'192.168.8.%' identified by 'centos';
  • ProxySQL上配置監控
    MySQL [(none)]> set mysql-monitor_username='monitor';
    MySQL [(none)]> set mysql-monitor_password='centos';
  • 加載到RUNTIME,並保存到disk
    MySQL [(none)]> load mysql variables to runtime;
    MySQL [(none)]> save mysql variables to disk;

    監控模塊的指標保存在monitor庫的log表中

  • 查看監控連接是否正常的 (對connect指標的監控):(如果connect_error的結果爲NULL則表示正常)
MySQL> select * from mysql_server_connect_log;
  • 查看監控心跳信息 (對ping指標的監控):
MySQL> select * from mysql_server_ping_log;
  • 查看read_only和replication_lag的監控日誌
MySQL> select * from mysql_server_read_only_log;
MySQL> select * from mysql_server_replication_lag_log;

3.設置分組

需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:
writer_hostgroup,reader_hostgroup,comment, 指定寫組的id爲10,讀組的id爲20

MySQL> insert into mysql_replication_hostgroups values(10,20,"test");
將mysql_replication_hostgroups表的修改加載到RUNTIME生效
MySQL> load mysql servers to runtime;
MySQL> save mysql servers to disk;
MySQL [(none)]> select * from mysql_servers;

Mysql中間件應用之使用ProxySQL進行數據庫讀寫分離

4.配置發送SQL語句的用戶

在master節點上創建訪問用戶

MySQL> grant all on *.* to sqluser@'192.168.64.%' identified by 'fscx';

在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認
組設置爲寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫

MySQL> insert into mysql_users(username,password,default_hostgroup)values('sqluser','fscx',10);
MySQL> load mysql users to runtime;
MySQL> save mysql users to disk;

使用sqluser用戶測試是否能路由到默認的10寫組實現讀、寫數據

mysql -usqluser -pfscx -P6033 -h127.0.0.1 -e 'select @@server_id'
mysql -usqluser -pfscx -P6033 -h127.0.0.1 -e 'create database testdb'
mysql -usqluser -pfscx testdb -P6033 -h127.0.0.1 -e 'create table t(id int)

Mysql中間件應用之使用ProxySQL進行數據庫讀寫分離

5.在proxysql上配置路由規則,實現讀寫分離

與規則有關的表:mysql_query_rules和mysql_query_rules_fast_routing,後者是前者的擴展表,1.4.7之後支持
插入路由規則:將select語句分離到20的讀組,select語句中有一個特殊語句
SELECT...FOR UPDATE它會申請寫鎖,應路由到10的寫組

MySQL&gt; 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);
MySQL&gt; load mysql query rules to runtime;
MySQL&gt; load mysql query rules to runtime;

注意:因ProxySQL根據rule_id順序進行規則匹配,select ... for update規則的
rule_id必須要小於普通的select規則的rule_id

6.客戶端測試

  • 測試讀操作是否路由給20的讀組
    Mysql中間件應用之使用ProxySQL進行數據庫讀寫分離
  • 測試寫操作,以事務方式進行測試

Mysql中間件應用之使用ProxySQL進行數據庫讀寫分離

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章