mycat 使用 (主從 + 讀寫分離)

mycat 使用


mycat 源碼地址前端

mycat 概述

是一個開源的分佈式數據庫系統,一個實現了 MySQL 協議的的 Server。前端用戶能夠把它看做是一個數據庫代理,用 MySQL客戶端工具和命令行訪問,而其後端能夠用 MySQL 原生(Native)協議與多個 MySQL服務器通訊,也能夠用 JDBC 協議與大多數主流數據庫服務器通訊。其核心功能是 分表分庫,即將一個大表水平分割爲 N 個小表,存儲在後端 MySQL 服務器裏或者其餘數據庫裏。mysql

數據切分

指經過某種特定的條件,將存放在同一個數據庫中的數據分散存放到多個數據庫(主機)上面,以達到分散單臺設備負載的效果。linux

  • 水平切分 按照某個字段的某種規則來分散到多個庫之中,每一個表中包含一部分數據。
  • 垂直切分 按照業務將表進行分類,分佈到不一樣的數據庫上面,這樣也就將數據或者說壓力分擔到不一樣的庫上面。

應用場景

  • 單純的讀寫分離,此時配置最爲簡單
  • 分表分庫
  • 多租戶應用,每一個應用一個庫,但應用程序只鏈接mycat,從而不改造程序自己,實現多租戶化
  • 報表系統,藉助於mycat的分表能力,處理大規模報表的統計
  • 替代hbase,分析大數據
  • 做爲海量數據實時查詢的一種簡單有效方案

不適應場景

參考地址git

  • 非分片字段查詢 mycat中的路由結果是經過分片字段分片方法肯定的。
  • 分頁排序 爲處理有偏移量的排序分頁,經過改寫SQL解決結果集錯誤,資源消耗會隨偏移量增大而增長。
  • 任意表JOIN 兩張表關聯數據可能分佈在不一樣的DB節點上,在單獨分片DB中查詢得不到正確結果。
  • 分佈式事務 Mycat並無根據二階段提交協議實現XA事務,而是隻保證 prepare 階段數據一致性的弱XA事務

環境搭建

windows下使用

github 參考地址github

  1. 下載地址,選擇合適版本下載。
  2. 直接運行 startup_nowrap.bat

linux 下使用

暫略sql

三大配置文件

在安裝目錄中conf文件夾下存放。數據庫

  1. server.xml:是mycat服務器參數調整和用戶受權的配置文件。
  2. schema.xml:管理着 MyCat 的邏輯庫(schema)、表、分片規則、DataNode 以及 DataSource
  3. rule.xml:是分片規則的配置文件。分片規則的具體參數信息單獨存放爲文件,也在這個目錄下,配置文件修改須要重啓mycat。

mycat 高可用與集羣(主從 + 讀寫分離)

  1. mysql節點開啓主從複製的配置方案windows

    • 主數據庫master修改後端

      • 修改my.ini(mysql配置文件)後,重啓mysql。(mysql安裝目錄中沒有,若是是windows系統則可能在C盤隱藏目錄ProgramData下)
      [mysqld]
      log-bin=mysql-bin # 開啓二進制日誌
      server-id=1 # 設置server-id
      
      # 默認記錄全部庫操做
      # 不一樣步哪些數據庫  
      binlog-ignore-db = mysql  
      binlog-ignore-db = test  
      binlog-ignore-db = information_schema  
      
      # 只同步哪些數據庫,除此以外,其餘不一樣步  
      binlog-do-db = game
      • 建立受權用戶
      CREATE USER '用戶名'@'從數據庫Ip' IDENTIFIED BY '密碼'; # 建立用戶
      GRANT REPLICATION SLAVE ON *.* TO '用戶名'@'從數據庫IP'; # 分配權限
      flush privileges;   # 刷新權限
      • 查看master狀態,記錄二進制文件名和位置
      SHOW MASTER STATUS;
    • 從數據庫slave修改緩存

      • 修改my.ini(mysql配置文件)後,重啓mysql。
      [mysqld]
      server-id=2 #設置server-id,必須惟一
      • 執行同步SQL語句(須要主服務器主機名,登錄憑據,二進制文件的名稱和位置)
      CHANGE MASTER TO
      MASTER_HOST='主數據庫IP',
      MASTER_USER='用戶名',
      MASTER_PASSWORD='密碼',
      MASTER_LOG_FILE='mysql-bin.000003', -- 由上,查看master狀態獲得
      MASTER_LOG_POS=73; -- 由上,查看master狀態獲得
      • 啓動slave同步進程
      start slave; # 開啓
      stop slave;  # 關閉
      • 查看slave狀態
      show slave status\G;

      Slave_IO_RunningSlave_SQL_Running都爲YES時表示主從同步設置成功。

    • 注意事項

      • 初始化配置時,主庫與從庫表結構/數據需一致
      • 從庫同步主庫事務操做與二進制文件的名稱和位置有關
  2. 修改mycat配置文件schema.xml,配置邏輯庫

    • 主節點配置爲mycat的dataHost裏的writeNode
    • 從節點配置爲mycat的dataHost裏的readNode
    <mycat:schema xmlns:mycat="http://io.mycat/">
    	<!-- 邏輯庫配置 -->
    	<schema name="DB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/> 
    	<!-- 節點配置 -->
    	<dataNode name="dn1" dataHost="host01" database="testdb" />
    	<!-- 數據庫實例:讀寫分離的配置 -->
    	<dataHost name="host01" maxCon="1000" minCon="10" balance="1" 
          writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat> 
        <!-- 主庫 master 配置,可多個-->
        <writeHost host="hostM1" url="192.168.20.113:3306" user="test" password="!QAZ2wsx"> 
            <!-- 從庫 slave 配置,可多個 -->          
            <readHost host="hostS1" url="192.168.20.107:3306" user="test" password="!QAZ2wsx" />
        </writeHost> 
        <!--主故障,頂替寫節點,主正常是分擔讀壓力--> 
        <!-- 
            <writeHost host="hostS2" url="" user="root" password="" > </writeHost> 
        -->
    </dataHost> 
    </mycat:schema>
  3. 修改mycat配置文件server.xml,添加 mycat 用戶

    <user name="root" defaultAccount="true">
    		<property name="password">123456</property>
    		<property name="schemas">DB1</property>
    	</user>
    
    	<user name="user">
    		<property name="password">user</property>
    		<property name="schemas">DB1</property>
    		<property name="readOnly">true</property>
    	</user>
  4. 使用徹底與mysql相同。(PS:注意mycat默認端口號是8066

相關問題

  • 鏈接時報錯 ERROR 1129 (00000): #HY000Host ‘192.168.31.242’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

    緣由是同一個ip在短期內產生太多中斷的數據庫鏈接而致使阻塞。在mysql終端執行 mysqladmin -u root -p flush-hosts清除緩存後可進行鏈接。(致使緣由需自行查找解決)

  • 報錯 ... connect error MySQLConnection ... Unknown charsetIndex:255

    修改mycat字符集配置文件index_to_charset.properties,添加255=utf8mb4,重啓服務。

  • 報錯 ... Access denied for user ...

    檢查用戶權限;檢查 dataNode 上配置實體庫(database 值)是否存在;

其它輕量級組件

  • sharding-jdbc:朋友推薦的輕量級組件,需集成到程序中,待研究。
相關文章
相關標籤/搜索