基於MyCat構建MySQL分佈式集羣

本文由 dbaplus 社羣授權轉載。

什麼是MyCat

MyCat是一個開源的分佈式數據庫中間件,是一個實現了MySQL協議的服務器,前端用戶可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL服務器通信,也可以用JDBC協議與大多數主流數據庫服務器通信,其核心功能是分表分庫,即將一個大表水平分割爲N個小表,存儲在後端MySQL服務器裏或者其他數據庫裏。

MyCat通過定義表的分片規則來實現分片,每個表格可以捆綁一個分片規則,每個分片規則指定一個分片字段並綁定一個函數,來實現動態分片算法。

  1. Schema:邏輯庫,與MySQL中的Database(數據庫)對應,一個邏輯庫中定義了所包括的Table。
  2. Table:邏輯表,即物理數據庫中存儲的某一張表,與傳統數據庫不同,這裏的表格需要聲明其所存儲的邏輯數據節點DataNode。在此可以指定表的分片規則。
  3. DataNode:MyCat的邏輯數據節點,是存放table的具體物理節點,也稱之爲分片節點,通過DataSource來關聯到後端某個具體數據庫上。
  4. DataSource:定義某個物理庫的訪問地址,用於捆綁到Datanode上。
  5. 分片規則:前面講了數據切分,一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把數據分到某個分片的規則就是分片規則,數據切分選擇合適的分片規則非常重要,將極大的避免後續數據處理的難度。

測試MySQL分佈式集羣架構

本次測試環境部署集羣架構爲MyCat 1.6.5(2個節點)+MySQL 8.0.11(5個節點)。

MySQL節點安裝與配置

首先在5個數據庫節點中安裝MySQL 8.0.11,參考MySQL的官方文檔,8.0.11的安裝與5.7安裝基本上是一樣的。安裝MySQL軟件後,每個MySQL數據庫都創建一個數據庫名稱爲szabm。篇幅所限,MySQL的安裝和配置過程就此略過。

但是值得注意的是,使用參考常規方法安裝完數據庫,其中最重的一個配置是“lower_case_table_names=1”,表示不區分大小寫。如果不配置該參數,容易由於大小寫問題而找不到表。

安裝Java

1、下載軟件

從Java的官網下載Java的二進制包,本次下載的版本是jdk-8u152-linux-x64.tar.gz。

注:必須JDK7或更高版本。

2、解壓軟件

使用tar命令解壓上傳好的二進制軟件包,爲了方便管理,創建一個Java的軟鏈接。

tar -xzvf jdk-8u152-linux-x64.tar.gz
ln -s jdk1.8.0_152 java

3、配置Java環境變量

參考實際的Java安裝目錄,配置環境變量,如下僅供參考。

export JAVA_HOME=/gpdb/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH

安裝MySQL客戶端

1、下載軟件

從MySQL的官網下載二進制包的軟件,本次由於後端要部署MySQL數據庫,因此直接下載了服務端當客戶端使用,本次下載爲mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz。

2、解壓軟件

使用tar命令解壓上傳的MySQL二進制軟件包,爲了方便管理,創建了一個MySQL的軟鏈接。

tar -xzvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz
ln -s mysql-8.0.11-linux-glibc2.12-x86_64 mysql

3、配置MySQL環境變量

MySQL客戶端的環境變量,只需要配置bin目錄路徑即可。

export PATH=$PATH:$/gpdb/mysql/bin

MyCat軟件安裝

1、下載軟件

從MyCat的官網下載MyCat軟件,本次使用的是很久之前下載的MyCat 1.6.5版本。

2、解壓軟件

使用tar命令解壓軟件,解壓之後,直接在當前目錄生成一個MyCat的目錄。

tar -xzvf MyCat-server-1.6.5-release-20180122220033-linux.tar.gz

3、配置環境變量

運行MyCat需要配置MYCAT_HOME環境變量,和bin目錄。

export MYCAT_HOME=/gpdb/MyCat
export PATH=$PATH:$MYCAT_HOME/bin

4、啓動MyCat

1)啓動MyCat

使用MyCat start命令啓動MyCat服務。MyCat默認爲服務端口是8066,管理端口是9066。

MyCat start

執行完成在$MYCAT_HOME目錄下的logs目錄,查看wrapper.log日誌文件,成功啓動提示如下:

STATUS | wrapper  | 2018/07/02 18:20:04 | Launching a JVM...
INFO   | jvm 1    | 2018/07/02 18:20:04 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2018/07/02 18:20:04 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2018/07/02 18:20:04 | 
INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN No appenders could be found for logger (io.MyCat.memory.MyCatMemory).
INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN Please initialize the log4j system properly.
INFO   | jvm 1    | 2018/07/02 18:20:06 | log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
INFO   | jvm 1    | 2018/07/02 18:20:10 | MyCat Server startup successfully. see logs in logs/MyCat.log

2)啓動遇到的問題

本次測試中遇到啓動MyCat失敗,提示內存參數存在問題。於是進入到$MYCAT_HOME/conf目錄下,找到wrapper.conf文件,找到內存的相關參數。

2018-06-29 14:53:02.257  INFO [WrapperSimpleAppMain] (io.MyCat.MyCatServer.startup(MyCatServer.java:329)) - Startup processors ...,total processors:32,aio thread pool size:64    
 each process allocated socket buffer pool  bytes ,a page size:2097152  a page's chunk number(PageSize/ChunkSize) is:512  buffer page's number is:640
2018-06-29 14:53:02.257  INFO [WrapperSimpleAppMain] (io.MyCat.MyCatServer.startup(MyCatServer.java:330)) - sysconfig params:SystemConfig [processorBufferLocalPercent=100, frontSocketSoRcvbuf=1048576, frontSocketSoSndbuf=4194304, backSocketSoRcvbuf=4194304, backSocketSoSndbuf=1048576, frontSocketNoDelay=1, backSocketNoDelay=1, maxStringLiteralLength=65535, frontWriteQueueSize=2048, bindIp=0.0.0.0, serverPort=8066, managerPort=9066, charset=utf8, processors=32, processorExecutor=64, timerExecutor=2, managerExecutor=2, idleTimeout=1800000, catletClassCheckSeconds=60, sqlExecuteTimeout=300, processorCheckPeriod=1000, dataNodeIdleCheckPeriod=300000, dataNodeHeartbeatPeriod=10000, clusterHeartbeatUser=_HEARTBEAT_USER_, clusterHeartbeatPass=_HEARTBEAT_PASS_, clusterHeartbeatPeriod=5000, clusterHeartbeatTimeout=10000, clusterHeartbeatRetry=10, txIsolation=3, parserCommentVersion=50148, sqlRecordCount=10, bufferPoolPageSize=2097152, bufferPoolChunkSize=4096, bufferPoolPageNumber=640, maxResultSet=524288, bigResultSizeSqlCount=10, bufferUsagePercent=80, flowControlRejectStrategy=0, clearBigSqLResultSetMapMs=600000, defaultMaxLimit=100, sequnceHandlerType=2, sqlInterceptor=io.MyCat.server.interceptor.impl.DefaultSqlInterceptor, sqlInterceptorType=select, sqlInterceptorFile=/gpdb/MyCat/logs/sql.txt, mutiNodeLimitType=0, mutiNodePatchSize=100, defaultSqlParser=druidparser, usingAIO=0, packetHeaderSize=4, maxPacketSize=16777216, MyCatNodeId=1]
2018-06-29 14:53:03.319 ERROR [WrapperSimpleAppMain] (io.MyCat.MyCatStartup.main(MyCatStartup.java:62)) - 2018-06-29 14:53:03 startup error
java.lang.NumberFormatException: Size must be specified as bytes (b), kibibytes (k), mebibytes (m), gibibytes (g), tebibytes (t), or pebibytes(p). E.g. 50b, 100k, or 250m.
Failed to parse byte string: -375809638B
        at io.MyCat.memory.unsafe.utils.JavaUtils.byteStringAs(JavaUtils.java:223) ~[MyCat-server-1.6.5-release.jar:?]

通過查閱相關文件對內存參數的多次嘗試,最終開啓如下兩個參數,才成功啓動服務。

# Initial Java Heap Size (in MB)
wrapper.java.initmemory=16

# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=4096

MyCat配置文件

1、MyCat配置文件說明

MyCat的配置文件全部存儲在$MYCAT_HOME/conf目錄下,主要是3個文件,全部採用xml格式編寫。

  • server.xml:MyCat服務器參數調整和用戶授權的配置文件。
  • schema.xml:是邏輯庫定義和表以及分片定義的配置文件。
  • rule.xml:是分片規則的配置文件,分片規則的具體一些參數信息單獨存放爲文件。

注:配置文件修改,需要重啓MyCat或者通過9066端口reload。

2、MyCat配置文件架構

MyCat配置文件變更

1、變更MyCat端口

MyCat的默認服務端口是8066,爲了保證與MySQL的常用端口保持一致,本次測試中將端口變更爲3306。特別注意的是在server.xml配置文件,這一段的配置是註釋的,因此無論如何更改端口號,不除掉註釋是不會生效的。本次測試中直接將服務端口號複製出來新增一行。

<!--
                        <property name="serverPort">3306</property> <property name="managerPort">9066</property> 
                        <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
                        <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->

本次採用在server.xml文件新增一行參數配置。

                <property name="serverPort">3306</property> <property name="managerPort">9066</property>

2、增加MyCat用戶

登陸MyCat的用戶都是存儲在server.xml配置文件的尾部,最好的辦法是直接複製一個用戶,然後進行相關變更。

參考如下:

        <user name="test">
                <property name="password">123456</property>
                <property name="schemas">szabm </property>
                <property name="readOnly">false</property>
        </user>

本次新增了個test用戶,密碼是“123456”,能夠訪問的數據庫是“szabm”,具有讀寫權限。這裏用戶訪問的數據庫必須在schema.xml文件中配置。

3、增加MyCat數據庫

MyCat中的數據庫一般通稱爲邏輯數據庫,一般建議與後端的MySQL數據庫實際名稱保持一致。server.xml用戶配置的邏輯數據庫必須與schema.xml中的邏輯數據庫保持一致。在啓動MyCat是會自動進行檢查,必須保持一致。

本次在測試在schema.xml配置了1個szabm的邏輯數據庫,包含4個測試表(abm_acct_balance,abm_counter,abm_realtime_fee,abm_resource_present,表名必須與後端的MySQL數據庫實際表名保持一致)。每個表存儲在5個數據節點(ceph3,ceph4,ceph5,ceph6,ceph7),每個表一個分片規則。

 <schema name="szabm7" checkSQLschema="false" sqlMaxLimit="100">
 <!-- auto sharding by id (long) -->
      <table name="abm_acct_balance" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7"  rule="abm_acct_balance-rule" />
      <table name="abm_counter" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_counter_rule" />
      <table name="abm_realtime_fee" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_realtime_fee_rule" />
      <table name="abm_resource_present" dataNode="ceph3,ceph4,ceph5,ceph6,ceph7" rule="abm_resource_present_rule" />
        </schema>

4、增加MyCat數據節點

MyCat中的數據節點就是邏輯的數據存儲節點,表與數據節點之間爲1對多的關係。每個邏輯節點對應一個後端的邏輯主機和實際數據庫,即邏輯節點,邏輯主機,實際數據庫之間全部爲一一對應的關係,數據庫名稱爲同一個,是後端MySQL數據庫的實際數據庫名稱。

本次的測試參考節點如下:

        <dataNode name="ceph3" dataHost="ceph3db" database="szabm" />
        <dataNode name="ceph4" dataHost="ceph4db" database="szabm" />
        <dataNode name="ceph5" dataHost="ceph5db" database="szabm" />
        <dataNode name="ceph6" dataHost="ceph6db" database="szabm" />
        <dataNode name="ceph7" dataHost="ceph7db" database="szabm" />

本次配置了5個邏輯數據節點,對應5個邏輯主機,對應的是後端同一個數據庫szabm7。

5、增加MyCat分片規則

MyCat的分片規則,表明該表按什麼算法規則進行分節點數據存儲。現在MySQL支持多種的分片規則,本次的分片規則採用最簡單的求模取餘。

        <tableRule name="abm_acct_balance-rule">
                <rule>
                        <columns>ACCT_BALANCE_ID</columns>
                        <algorithm>mod-long_abm</algorithm>
                </rule>
        </tableRule>
        <tableRule name="abm_counter_rule">
                <rule>
                        <columns>COUNTER_ID</columns>
                        <algorithm>mod-long_abm</algorithm>
                </rule>
        </tableRule>
        <tableRule name="abm_realtime_fee_rule">
                <rule>
                        <columns>SUBSID</columns>
                        <algorithm>mod-long_abm</algorithm>
                </rule>
        </tableRule>
        <tableRule name="abm_resource_present_rule">
                <rule>
                        <columns>RESOURCE_ID</columns>
                        <algorithm>mod-long_abm</algorithm>
                </rule>
        </tableRule>
        <function name="mod-long_abm" class="io.MyCat.route.function.PartitionByMod">
                <!-- how many data nodes -->
                <property name="count">5</property>
        </function>

MyCat服務驗證

1、檢查MyCat服務的端口狀態

在使用MySQL客戶端登陸驗證之前,可以先檢查MyCat的服務端口和管理端口是否存在。

參考命令如下:

netstat -an | grep 8066
netstat -an | grep 9066

2、使用MySQL客戶端連接MyCat服務

可以使用MySQL客戶端連接MyCat服務,特別注意端口是8066。

參考命令如下:

mysql -uuser -puser -h127.0.0.1 -P8066

注:由於本次安裝的客戶端是8.0.11版本,發現不兼容MyCat 1.6.5版本,所以後面將MySQL的客戶端變更爲5.7.20後能夠正常訪問。

作者介紹

梁銘圖,新炬網絡首席架構師,十多年數據庫運維、數據庫設計、數據治理以及系統規劃建設經驗,擁有Oracle OCM、Togaf企業架構師(鑑定級)、IBM CATE等認證,曾獲dbaplus年度MVP以及華爲雲MVP等榮譽,並參與數據資產管理國家標準的編寫工作。在數據庫運維管理和架構設計、運維體系規劃、數據資產管理方面有深入研究。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650791953&idx=2&sn=0491614a1b3da23f3b41c300fa35e0e1&chksm=f3f95584c48edc9219a104014e3a442907caf6144398ce86ef0e6d9c130f6c48893bdfe8cb41&scene=27#wechat_redirect

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