1. 程式人生 > >mysq通過ProxySQL實現讀寫分離

mysq通過ProxySQL實現讀寫分離

127.0.0.1 rac 方式 https 特殊 lib 客戶端 端口號 oracl

mysq通過ProxySQL實現讀寫分離

常見的讀寫分離應用

    Oracle:mysql-proxy
    qihoo:Atlas
    美團:dbproxy
    網易:cetus
    amoeba
    阿裏巴巴:cobar 基於amoeba研發
    Mycat:基於cobar實現
    ProxySQL

ProxySQL:MySQL中間件

  • 版本:
    • 官方版
    • percona版:percona公司基於官方版本用C++語言開發,性能更優
  • 特點:具有中間件所需的絕大多數功能,包括:
    • 多種方式的讀/寫分離
    • 定制基於用戶、基於schema、基於語句的規則對SQL語句進行路由
    • 緩存查詢結果
    • 後端節點監控

      官方站點:https://proxysql.com/

ProxySQL安裝:

  • 準備:

    • 實現讀寫分離前,先實現主從復制

      註:slave服務器 配置文件中必須為 read_only=1,ProxySQL通過read_only=1參數,確定哪個是salve服務器

  • 基於YUM倉庫安裝:

    [ [email protected] ~]# cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
    [proxysql_repo]
    name= ProxySQL YUM repository
    baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
    gpgcheck=1
    gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
    EOF
  • 基於RPM下載安裝:https://github.com/sysown/proxysql/releases

  • ProxySQL的組成:

    • 服務腳本:/etc/init.d/proxysql
    • 配置文件:/etc/proxysql.cnf
    • 主程序:/usr/bin/proxysql
    • 基於SQLITE的數據庫文件:/var/lib/proxysql/
  • 啟動ProxySQL:service proxysql start

    • 啟動後會監聽兩個默認端口:
      • 6032:ProxySQL的管理端口
      • 6033:ProxySQL對外提供服務的端口
  • 使用mysql客戶端連接到ProxySQL的管理端口6032,默認管理員用戶和密碼都是admin

    [ [email protected] ~]# mysql -uadmin -padmin -p6032 -hhost
  • ProxySQL實現讀寫分離:

    內置了SQLite小型數據庫,裏面存儲了proxysql的設置

    • 內置的數據庫說明:
    • main:是默認的數據庫名,表裏面存放後端db實例,用戶驗證,路由規則等信息,表名以runtime_開頭表示ProxySQL當前運行的配置內容,不能通過dml語句修改,只能修改對應的不以runtime_開頭的表,然後LOAD使其生效,save使其保存到硬盤一共下次重啟加載
    • disk:是持久化到停盤的配置,sqlite數據文件
    • stats:是ProxySQL運行抓取到的統計信息,包括到後端各命令的執行次數、流量、processlist、查詢種類匯總/執行時間、等等
    • monnitor:庫存儲monitor模塊收集的信息,主要是對後端db的健康/延遲檢查
      註:監控模塊的指標存在log表中
    - 說明:
        1. 在main和monitor數據庫中的表,runtime_開頭的是運行時的配置,不能修改,只能修改非runtime_表
        2. 修改後必須執行LOAD … TO RUNTIME才能加載到RUNTIME生效
        3. 執行save … to disk 才將配置持久化保存到磁盤,即保存在proxysql.db文件中
        4. global_variables 有許多變量可以設置,其中就包括監聽的端口、管理賬號等   
        參考: https://github.com/sysown/proxysql/wiki/Global-variables

配置- ProxySQL:

  • 向ProxySQL中的main庫中指定mysql節點(不需要使用use main也可以):
    1. 查看指定的表結構:
        select * from sqlite_master where name=‘mysql_servers‘\G 
    2. 添加所有參與主從復制的主機: 
        insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘172.22.45.131‘,3306);  
         insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘172.22.45.132‘,3306);  
    3. 加載到runtime中使其生效:
        load mysql servers to runtime;
    4. 保存到硬盤中:
        save mysql servers to disk;
    字段說明:  
        hostgroup_id:分組id,用來實現區分讀組和寫組,後續可通過ProxySQL程序自動判斷  
        hostname:主從服務器的地址  
        port:主從服務器監聽的端口號
  • master和slave節點操作:
    • 添加監控後端節點的用戶,ProxySQL通過每個節點的read_only值來自動調整它們是屬於讀組還是寫組
      • 主從節點創建用戶:
        grant replication client on *.* to [email protected]‘172.22.45.%‘ identified by ‘centos‘; #用來實現proxysql連接主從節點
  • ProxySQL上配置監控:

    set mysql-monitor_username=‘monitor‘;
    set mysql-monitor_password=‘centos‘;
    load mysql variables to runtime;
    save mysql variables to disk;   
    
    查看監控連接是否正常:
        select * from mysql_server_connect_log;
    查看監控心跳信息(對ping指標的監控):
        select * from mysql_server_ping_log;
    查看read_only和replication_lag的監控日誌
        select * from mysql_server_read_only_log;
        select * from mysql_server_replication_lag_log;
  • 設置分組信息:
    • 需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:writer_hostgroup,reader_hostgroup,comment, 指定寫組的id為10,讀組的id為20
      insert inot mysql_replication_hostgroups values(10,20,‘test‘);
      load mysql servers to runtime;
      save mysql servers to disk;
      # Monitor模塊監控後端的read_only值,按照read_only的值將節點自動移動到讀/寫組
      查看主從服務器的分組信息:
      select hostgroup_id,hostname,port,status,weight from mysql_servers; 
      +--------------+---------------+------+--------+--------+
      |        hostgroup_id | hostname      | port | status | weight |
      +--------------+---------------+------+--------+--------+
      | 10           | 172.22.45.131 | 3306 | ONLINE | 1      |
      | 20           | 172.22.45.132 | 3306 | ONLINE | 1      |
      +--------------+---------------+------+--------+--------+
  • 配置發送SQL語句的用戶:
    • 在master節點上創建訪問用戶
      grant all on *.* to [email protected]‘host‘ identified by ‘centos‘; #用來讓用戶連接proxy使用
    • 在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認組設置為寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫
      insert into mysql_users(username,password,default_hostgroup)values(‘sqluser‘,‘magedu‘,10);
      load mysql servers to runtime;
      save mysql servers to disk;
    • 測試:目前由於沒有設置讀寫分離的路由規則,則所有的讀寫語句都到默認的分組10中實現
      mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select @@server_id‘
      +-------------+
      | @@server_id |
      +-------------+
      |         131 |
      +-------------+
      mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘create database testdb‘
      mysql -usqluser -pcentos testdb -P6033 -h127.0.0.1 -e ‘create table t(id int)‘
  • 配置讀寫分離的路由規則:

    與規則有關的表:mysql_query_rules和mysql_query_rules_fast_routing,後者是前者的擴展表,1.4.7之後支持
    插入路由規則:將select語句分離到20的讀組,select語句中有一個特殊語句SELECT...FOR UPDATE它會申請寫鎖,應路由到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;
    #註意:因ProxySQL根據rule_id順序進行規則匹配,select ... for update規則的 rule_id必須要小於普通的select規則的rule_id

  • 測試讀操作是否路由給20的讀組
        mysql -usqluser -pmagedu -P6033 -h127.0.0.1 -e ‘select @@server_id‘
            +-------------+
            | @@server_id |
            +-------------+
            |         131 |
            +-------------+
  • 測試寫操作,以事務方式進行測試
    mysql -usqluser -pcentos -P6033 -h172.22.45.133 -e ‘start transaction;select @@server_id;commit;select @@server_id‘
        +-------------+
        | @@server_id |
        +-------------+
        |         131 |
        +-------------+
        +-------------+
        | @@server_id |
        +-------------+
        |         132 |
        +-------------+
    mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘insert testdb.t values (1)‘
    mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select id from testdb.t‘
  • 路由的信息:查詢stats庫中的stats_mysql_query_digest表
    SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

mysq通過ProxySQL實現讀寫分離