Mycat 讀寫分離 數據庫分庫分表 中間件 安裝部署,簡單使用

Mycat 數據庫分庫分表中間件,國內最活躍的、性能最好的開源數據庫中間件,網上頗有多相關資源,也能夠直接訪問Mycat官網。html

http://www.mycat.io/java

環境

MySql-Master:192.168.252.121
MySql-Slave:192.168.252.122

Mycat:192.168.252.123

MySql 主從複製

參考個人另外一篇文章-搭建 MySQL 5.7.19 主從複製node

在 MySql-Master:192.168.252.121 建庫,測試主從複製是否可用mysql

CREATE DATABASE `db_1`;
CREATE DATABASE `db_2`;
CREATE DATABASE `db_3`;

Mycat 安裝部署

cd /opt
tar -zxvf Mycat-server-1.6.5-release-20171029183033-linux.tar.gz -C /usr/local/

更好看目錄結構,下tree(可選)linux

yum -y install tree
tree /usr/local/mycat/
/usr/local/mycat/
├── bin
│   ├── dataMigrate.sh
│   ├── init_zk_data.sh
│   ├── mycat
│   ├── rehash.sh
│   ├── startup_nowrap.sh
│   ├── wrapper-linux-ppc-64
│   ├── wrapper-linux-x86-32
│   └── wrapper-linux-x86-64
├── catlet
├── conf
│   ├── autopartition-long.txt
│   ├── auto-sharding-long.txt
│   ├── auto-sharding-rang-mod.txt
│   ├── cacheservice.properties
│   ├── dbseq.sql
│   ├── ehcache.xml
│   ├── index_to_charset.properties
│   ├── log4j2.xml
│   ├── migrateTables.properties
│   ├── myid.properties
│   ├── partition-hash-int.txt
│   ├── partition-range-mod.txt
│   ├── rule.xml
│   ├── schema.xml
│   ├── sequence_conf.properties
│   ├── sequence_db_conf.properties
│   ├── sequence_distributed_conf.properties
│   ├── sequence_time_conf.properties
│   ├── server.xml
│   ├── sharding-by-enum.txt
│   ├── wrapper.conf
│   ├── zkconf
│   │   ├── autopartition-long.txt
│   │   ├── auto-sharding-long.txt
│   │   ├── auto-sharding-rang-mod.txt
│   │   ├── cacheservice.properties
│   │   ├── ehcache.xml
│   │   ├── index_to_charset.properties
│   │   ├── partition-hash-int.txt
│   │   ├── partition-range-mod.txt
│   │   ├── rule.xml
│   │   ├── schema.xml
│   │   ├── sequence_conf.properties
│   │   ├── sequence_db_conf.properties
│   │   ├── sequence_distributed_conf-mycat_fz_01.properties
│   │   ├── sequence_distributed_conf.properties
│   │   ├── sequence_time_conf-mycat_fz_01.properties
│   │   ├── sequence_time_conf.properties
│   │   ├── server-mycat_fz_01.xml
│   │   ├── server.xml
│   │   └── sharding-by-enum.txt
│   └── zkdownload
│       └── auto-sharding-long.txt
.....
省略更多

7 directories, 95 files

安裝 JDK

下載Linux環境下的jdk1.8,請去(官網)中下載jdk的安裝文件git

我在百度雲盤分下的連接:http://pan.baidu.com/s/1jIFZF9s 密碼:u4n4github

上傳在 /opt 目錄算法

解壓sql

cd /opt
tar zxvf jdk-8u144-linux-x64.tar.gz
mv jdk1.8.0_144/ /lib/jvm

配置環境變量mongodb

vi /etc/profile
#jdk
export JAVA_HOME=/lib/jvm
export JRE_HOME=${JAVA_HOME}/jre   
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib   
export PATH=${JAVA_HOME}/bin:$PATH

使環境變量生效

source /etc/profile

驗證

[root@localhost ~]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

環境變量

設置 MYCAT_HOME 的變量

export PATH=${JAVA_HOME}/bin:${MYCAT_HOME}/lib:$PATH
export MYCAT_HOME=/usr/local/mycat/

使環境變量生效

source /etc/profile

配置 JDK 路徑

告訴 Mycat 須要使用哪一個 JDK

vim wrapper.conf
#********************************************************************
# Wrapper Properties
#********************************************************************
# Java Application
wrapper.java.command=/lib/jvm/bin/java
wrapper.working.dir=..

wrapper.conf jvm調優參數,不合理,需改進

# Java Additional Parameters
#wrapper.java.additional.1=
wrapper.java.additional.1=-DMYCAT_HOME=.
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:MaxPermSize=64M
wrapper.java.additional.4=-XX:+AggressiveOpts
wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G
wrapper.java.additional.6=-Dcom.sun.management.jmxremote
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984
wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.10=-Xmx4G
wrapper.java.additional.11=-Xms1G

jvm參數調優,以16G內存服務器爲例

# Java Additional Parameters
#wrapper.java.additional.1=
wrapper.java.additional.1=-DMYCAT_HOME=.
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:MaxPermSize=64M
wrapper.java.additional.4=-XX:+AggressiveOpts
#堆內存適度大小,直接映射內存儘量大,兩種一塊兒佔據服務器的1/2-2/3的內存
wrapper.java.additional.5=-XX:MaxDirectMemorySize=6G
wrapper.java.additional.6=-Dcom.sun.management.jmxremote
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984
wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false
#不管擴展仍是縮減新生代空間或老年代空間都須要進行Full GC,而Full GC會下降程序的吞吐量並致使更長的延遲。
wrapper.java.additional.10=-Xmx4G
wrapper.java.additional.11=-Xms4G

配置 Mycat

配置文件很是多.若是隻是簡單配置在不一樣的服務器上進行讀寫分離只須要配置兩個文件 server.xmlschema.xml

schema.xml 中定義邏輯庫,表、分片節點等內容
rule.xml 中定義分片規則
server.xml 中定義用戶以及系統相關變量,如端口等

server.xml

server.xml 幾乎保存了全部 mycat 須要的系統配置信息。其在代碼內直接的映射類爲 System Config 類。

vim server.xml
<user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">test_schema</property>
    
    <!-- 表級 DML 權限設置 -->
    <!--
    <privileges check="false">
        <schema name="test_schema" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>
     -->         
</user>


<user name="user">
    <property name="password">user</property>
    <property name="schemas">test_schema</property>
    <property name="readOnly">true</property>
</user>

server.xml 中的標籤本就很少,這個標籤主要用於定義登陸 mycat 的用戶和權限。

例如上面的例子中,我定義了一個用戶,用戶名爲 root 、密碼也爲 123456,可訪問的 schema 也只有 test_schema 一個 邏輯庫。

官方完整的默認配置 server.xml

Mycat 系統配置

<system>
    <property name="nonePasswordLogin">0</property>
    <!-- 0爲須要密碼登錄、1爲不須要密碼登錄 ,默認爲0,設置爲1則須要指定默認帳戶-->
    <property name="useHandshakeV10">1</property>
    <property name="useSqlStat">0</property>
    <!-- 1爲開啓實時統計、0爲關閉 -->
    <property name="useGlobleTableCheck">0</property>
    <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->
    <property name="sequnceHandlerType">2</property>
    <property name="subqueryRelationshipCheck">false</property>

    <!-- 子查詢中存在關聯查詢的狀況下,檢查關聯字段中是否有分片字段 .默認 false -->
    <!-- <property name="useCompression">1</property>-->

    <!--1爲開啓mysql壓縮協議-->
    <!-- <property name="fakeMySQLVersion">5.6.20</property>-->

    <!--設置模擬的MySQL版本號-->
    <!-- <property name="processorBufferChunk">40960</property> -->

    <!--
    <property name="processors">1</property>
    <property name="processorExecutor">32</property>
     -->

    <!--默認爲type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
    <property name="processorBufferPoolType">809600000</property>

    <!--默認是65535 64K 用於sql解析時最大文本長度 -->
    <!--<property name="maxStringLiteralLength">65535</property>-->
    <!--<property name="sequnceHandlerType">1</property>-->
    <!--<property name="backSocketNoDelay">1</property>-->
    <!--<property name="frontSocketNoDelay">1</property>-->
    <!--<property name="processorExecutor">16</property>-->


    <property name="serverPort">8066</property>
    <property name="managerPort">9066</property>
    <!--默認本機-->
    <property name="idleTimeout">3800000</property>
    <property name="bindIp">0.0.0.0</property>
    <property name="frontWriteQueueSize">4096</property>
    <property name="processors">32</property>

    <!--
     分佈式事務開關,0爲不過濾分佈式事務,1爲過濾分佈式事務
    (若是分佈式事務內只涉及全局表,則不過濾),2爲不過濾分佈式事務,可是記錄分佈式事務日誌
    -->

    <property name="handleDistributedTransactions">0</property>

    <!--off heap for merge/order/group/limit 1開啓   0關閉-->
    <property name="useOffHeapForMerge">1</property>
    <!--單位爲m-->
    <property name="memoryPageSize">64k</property>
    <!--單位爲k-->
    <property name="spillsFileBufferSize">1k</property>
    <property name="useStreamOutput">0</property>
    <!--單位爲m-->
    <property name="systemReserveMemorySize">384m</property>
    <!--是否採用zookeeper協調切換  -->
    <property name="useZKSwitch">false</property>
    <!-- XA Recovery Log日誌路徑 -->
    <!--<property name="XARecoveryLogBaseDir">./</property>-->
    <!-- XA Recovery Log日誌名稱 -->
    <!--<property name="XARecoveryLogBaseName">tmlog</property>-->
</system>

schema.xml

schema 標籤用於定義 My Cat 實例中的邏輯庫,My Cat 能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配
置。可使用 schema 標籤來劃分這些不一樣的邏輯庫。

vim schema.xml
<?xml version="1.0" ?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 設置表的存儲方式.schema name="test_schema" 與 server.xml中的 test_schema 設置一致  -->
    <schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100">
        <table name="test_one" primaryKey="id" dataNode="dn$1-3" rule="sharding-by-date"/>
    </schema>

    <!-- 設置dataNode 對應的數據庫,及 mycat 鏈接的地址dataHost -->
    <dataNode name="dn1" dataHost="dh_test" database="db_1"/>
    <dataNode name="dn2" dataHost="dh_test" database="db_2"/>
    <dataNode name="dn3" dataHost="dh_test" database="db_3"/>

    <!-- mycat 邏輯主機dataHost對應的物理主機.其中也設置對應的mysql登錄信息 -->
    <dataHost name="dh_test" maxCon="1000" minCon="10" balance="0" writeType="0"
              dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
        <!--<heartbeat>select user()</heartbeat>-->
        <heartbeat>show slave status</heartbeat>
        <writeHost host="hostM1" url="192.168.252.121:3306" user="root" password="mima">
            <readHost host="hostS2" url="192.168.252.122:3306" user="root" password="mima"/>
        </writeHost>
    </dataHost>

</mycat:schema>

如上所示的配置就配置了1個邏輯庫,邏輯庫的概念和 MYSQL 數據庫中 Database 的概念相同,咱們在查詢這個邏輯庫中表的時候須要切換到該邏輯庫下才能夠查詢到所須要的表。

schema 標籤

用於定義 My Cat 實例中的邏輯庫,My Cat 能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配
置。可使用 schema 標籤來劃分這些不一樣的邏輯庫。

data Node 屬性

該屬性用於綁定邏輯庫到某個具體的 database 上,1.3 版本若是配置了 data Node,則不能夠配置分片表,
1.4 能夠配置默認分片,只須要配置須要分片的表便可

data Host 標籤

做爲 Schema.xml 中最後的一個標籤,該標籤在 mycat 邏輯庫中也是做爲最底層的標籤存在,直接定義了具體的數據庫實例、讀寫分離配置和心跳語句。如今咱們就解析下這個標籤。

name 屬性

惟一標識 data Host 標籤,供上層的標籤使用。

max Con 屬性

指定每一個讀寫實例鏈接池的最大鏈接。也就是說,標籤內嵌套的 write Host、read Host 標籤都會使用這個屬性的值來實例化出鏈接池的最大鏈接數。

min Con 屬性

指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小。

balance 屬性

負載均衡類型,目前的取值有 3 種:

1.balance="0", 不開啓讀寫分離機制,全部讀操做都發送到當前可用的 write Host 上。
2.balance="1",所有的 read Host 與 stand by write Host 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,而且 M1 與 M2 互爲主備),正常狀況下,M2,S1,S2 都參與 select 語句的負載
均衡。
3.balance="2",全部讀操做都隨機的在 write Host、readhost 上分發。
4.balance="3",全部讀請求隨機的分發到 wiriter Host 對應的 readhost 執行,writer Host 不負擔讀壓
力,注意 balance=3 只在 1.4 及其之後版本有,1.3 沒有。

write Type 屬性

負載均衡類型,目前的取值有 3 種:

  1. write Type="0", 全部寫操做發送到配置的第一個 write Host,第一個掛了切到還生存的第二個write Host,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .
  2. write Type="1",全部寫操做都隨機的發送到配置的 write Host,1.5 之後廢棄不推薦。

**switch Type 屬性

-1 表示不自動切換
1 默認值,自動切換
2 基於 My SQL 主從同步的狀態決定是否切換

db Type 屬性

指定後端鏈接的數據庫類型,目前支持二進制的 mysql 協議,還有其餘使用 JDBC 鏈接的數據庫。例如:mongodb、oracle、spark 等。

db Driver 屬性

指定鏈接後端數據庫使用的 Driver,目前可選的值有 native 和 JDBC。使用 native 的話,由於這個值執行的是二進制的 mysql 協議,因此可使用 mysql 和 maridb。其餘類型的數據庫則須要使用 JDBC 驅動來支持。

從 1.6 版本開始支持 postgresql 的 native 原始協議。

若是使用 JDBC 的話須要將符合 JDBC 4 標準的驅動 JAR 包放到 MYCATlib 目錄下,並檢查驅動 JAR 包中包括以下目錄結構的文件:META-INFservicesjava.sql.Driver。在這個文件內寫上具體的 Driver 類名,例如:com.mysql.jdbc.Driver。

switch Type 屬性

-1 表示不自動切換
1 默認值,自動切換
2 基於 My SQL 主從同步的狀態決定是否切換 心跳語句爲 show slave status
3 基於 My SQL galary cluster 的切換機制(適合集羣)(1.4.1) 心跳語句爲 show status like ‘wsrep%’.

temp Read Host Available 屬性

若是配置了這個屬性 write Host 下面的 read Host 仍舊可用,默認 0 可配置(0、1)

rule.xml

rule.xml 裏面就定義了咱們對錶進行拆分所涉及到的規則定義。咱們能夠靈活的對錶使用不一樣的分片算法,或者對錶使用相同的算法但具體的參數不一樣。這個文件裏面主要有 table Rule 和 function 這兩個標籤。在具體使用過程當中能夠按照需求添加 table Rule 和 function。

vim rule.xml
<tableRule name="sharding-by-date">
    <rule>
        <columns>create_time</columns>
        <algorithm>sharding-by-date-day</algorithm>
    </rule>
</tableRule>

<function name="sharding-by-date-day" class="io.mycat.route.function.PartitionByDate">
    <property name="dateFormat">yyyy-MM-dd</property>
    <property name="sBeginDate">2017-11-15</property>
    <property name="sEndDate">2017-11-17</property>
    <property name="sPartionDay">1</property>
</function>

這個標籤訂義表規則。
定義的表規則,在 schema.xml:

tableRule name="sharding-by-date"

<schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100">
    <table name="test_one" primaryKey="id" dataNode="dn$1-3" rule="sharding-by-date"/>
</schema>

啓動 Mycat

/usr/local/mycat/bin
./mycat start

查看日誌

啓動 mycat 的日誌

less /usr/local/mycat/logs/wrapper.log

訪問 mycat 的日誌

less /usr/local/mycat/logs/mycat.log

使用 Mycat

登陸 Mycat 切換到 test_schema 邏輯庫

mysql -uroot -p123456 -h192.168.252.123 -P 8066

建立庫/表

mysql> use test_schema;
Database changed
mysql> show tables;
+-----------------------+
| Tables in test_schema |
+-----------------------+
| test_one              |
+-----------------------+
1 row in set

mysql>

只須要在 Mycat 服務器執行如下腳本,就會自動同步到 MySql-Master:192.168.252.121 MySql-Slave:192.168.252.122

mysql> CREATE TABLE `test_one` (
    `id` BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `name` VARCHAR (50) DEFAULT NULL COMMENT '名稱',
    `remark` VARCHAR (500) DEFAULT NULL COMMENT '備註',
    `create_time` datetime DEFAULT NULL COMMENT '建立時間',
    PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COMMENT = '測試';

Query OK, 0 rows affected

登陸 Mycat 管理端

mysql -uroot -p123456 -h192.168.252.123 -P 9066

RS_CODE 爲 1 表示心跳正常,--查看讀寫分離的機器配置狀況

mysql> show @@datanode;
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST      | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1  | dh_test/db_1 |     0 | mysql |      0 |    3 | 1000 |      11 |          0 |        0 |       0 |            -1 |
| dn2  | dh_test/db_2 |     0 | mysql |      0 |    3 | 1000 |       7 |          0 |        0 |       0 |            -1 |
| dn3  | dh_test/db_3 |     0 | mysql |      0 |    4 | 1000 |      26 |          0 |        0 |       0 |            -1 |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
3 rows in set

mysql> show @@heartbeat;
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME   | TYPE  | HOST            | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM1 | mysql | 192.168.252.121 | 3306 |       1 |     0 | idle   |       0 | 2,3,3        | 2017-11-17 16:54:26 | false |
| hostS2 | mysql | 192.168.252.122 | 3306 |       1 |     0 | idle   |       0 | 2,2,2        | 2017-11-17 16:54:26 | false |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
2 rows in set

mysql>

測試分片

按日期(天)分片

登陸 Mycat 管理端

mysql -uroot -p123456 -h192.168.252.123 -P 9066

RS_CODE 爲 1 表示心跳正常,--查看讀寫分離的機器配置狀況

mysql> show @@datanode;
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST      | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1  | dh_test/db_1 |     0 | mysql |      0 |    3 | 1000 |      11 |          0 |        0 |       0 |            -1 |
| dn2  | dh_test/db_2 |     0 | mysql |      0 |    3 | 1000 |       7 |          0 |        0 |       0 |            -1 |
| dn3  | dh_test/db_3 |     0 | mysql |      0 |    4 | 1000 |      26 |          0 |        0 |       0 |            -1 |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
3 rows in set

配置按日期(天)分片,2017-11-15,2017-11-16,2017-11-17 ,一天一個分片,執行完一下的 sql 能夠發現數據 ,會按照分片規則進入不一樣的,分片,數據庫

rule.xml

<tableRule name="sharding-by-date">
    <rule>
        <columns>create_time</columns>
        <algorithm>sharding-by-date-day</algorithm>
    </rule>
</tableRule>

<function name="sharding-by-date-day" class="io.mycat.route.function.PartitionByDate">
    <property name="dateFormat">yyyy-MM-dd</property>
    <property name="sBeginDate">2017-11-15</property>
    <property name="sEndDate">2017-11-17</property>
    <property name="sPartionDay">1</property>
</function>

name 屬性指定惟一的名字,用於標識不一樣的表規則。

內嵌的 rule 標籤則指定對物理表中的哪一列進行拆分和使用什麼路由算法。

columns 內指定要拆分的列名字。

algorithm 使用 function 標籤中的 name 屬性。鏈接表規則和具體路由算法。固然,多個表規則能夠鏈接到同一個路由算法上。table 標籤內使用。讓邏輯表使用這個規則進行分片。

配置說明:

  • columns :標識將要分片的表字段
  • algorithm :分片函數
  • dateFormat :日期格式
  • sBeginDate :開始日期
  • sEndDate:結束日期
  • sPartionDay :分區天數,即默認從開始日期算起,分隔 5 天一個分區

schema.xml

<?xml version="1.0" ?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- 設置表的存儲方式.schema name="test_schema" 與 server.xml中的 test_schema 設置一致  -->
    <schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100">
        <table name="test_one" primaryKey="id" dataNode="dn$1-3" rule="sharding-by-date"/>
    </schema>

    <!-- 設置dataNode 對應的數據庫,及 mycat 鏈接的地址dataHost -->
    <dataNode name="dn1" dataHost="dh_test" database="db_1"/>
    <dataNode name="dn2" dataHost="dh_test" database="db_2"/>
    <dataNode name="dn3" dataHost="dh_test" database="db_3"/>

    <!-- mycat 邏輯主機dataHost對應的物理主機.其中也設置對應的mysql登錄信息 -->
    <dataHost name="dh_test" maxCon="1000" minCon="10" balance="0" writeType="0"
              dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
        <!--<heartbeat>select user()</heartbeat>-->
        <heartbeat>show slave status</heartbeat>
        <writeHost host="hostM1" url="192.168.252.121:3306" user="root" password="mima">
            <readHost host="hostS2" url="192.168.252.122:3306" user="root" password="mima"/>
        </writeHost>
    </dataHost>

</mycat:schema>

登陸 Mycat 服務端

mysql -uroot -p123456 -h192.168.252.123 -P 8066
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_1', '2017-11-15 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_2', '2017-11-16 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_3', '2017-11-17 00:00:00');

在 MySql-Master 執行 ,查看分片是否均勻

mysql -uroot -p123456 -h192.168.252.121 -P 3306
mysql> select min(create_time),max(create_time) from db_1.test_one;
+---------------------+---------------------+
| min(create_time)    | max(create_time)    |
+---------------------+---------------------+
| 2017-11-15 00:00:00 | 2017-11-15 00:00:00 |
+---------------------+---------------------+
1 row in set

mysql> select min(create_time),max(create_time) from db_2.test_one;
+---------------------+---------------------+
| min(create_time)    | max(create_time)    |
+---------------------+---------------------+
| 2017-11-16 00:00:00 | 2017-11-16 00:00:00 |
+---------------------+---------------------+
1 row in set

mysql> select min(create_time),max(create_time) from db_3.test_one;
+---------------------+---------------------+
| min(create_time)    | max(create_time)    |
+---------------------+---------------------+
| 2017-11-17 00:00:00 | 2017-11-17 00:00:00 |
+---------------------+---------------------+
1 row in set

mysql>

天然月分片

在 MySql-Master:192.168.252.121 建庫,測試主從複製是否可用

CREATE DATABASE `db_1`;
CREATE DATABASE `db_2`;
CREATE DATABASE `db_3`;
CREATE DATABASE `db_4`;
CREATE DATABASE `db_5`;
CREATE DATABASE `db_6`;
CREATE DATABASE `db_7`;
CREATE DATABASE `db_8`;
CREATE DATABASE `db_9`;
CREATE DATABASE `db_10`;
CREATE DATABASE `db_11`;
CREATE DATABASE `db_12`;

登陸 Mycat 管理端

mysql -uroot -p123456 -h192.168.252.123 -P 9066

查看分片狀況

mysql> show @@datanode;
+------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST       | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1  | dh_test/db_1  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn10 | dh_test/db_10 |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn11 | dh_test/db_11 |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn12 | dh_test/db_12 |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn2  | dh_test/db_2  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn3  | dh_test/db_3  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn4  | dh_test/db_4  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn5  | dh_test/db_5  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn6  | dh_test/db_6  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn7  | dh_test/db_7  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn8  | dh_test/db_8  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
| dn9  | dh_test/db_9  |     0 | mysql |      0 |    0 | 1000 |       0 |          0 |        0 |       0 |            -1 |
+------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
12 rows in set

mysql>

rule.xml

按月份列分區 ,每一個天然月一個分片

<tableRule name="sharding-by-month">
    <rule>
        <columns>create_time</columns>
        <algorithm>partbymonth</algorithm>
    </rule>
</tableRule>

<function name="partbymonth" class="io.mycat.route.function.PartitionByMonth">
    <property name="dateFormat">yyyy-MM-dd</property>
    <property name="sBeginDate">2017-01-01</property>
</function>

配置說明:

  • columns 分片字段,字符串類型
  • dateFormat : 日期字符串格式
  • sBeginDate : 開始日期

schema.xml

<?xml version="1.0" ?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 設置表的存儲方式.schema name="test_schema" 與 server.xml中的 test_schema 設置一致  -->
    <schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100">
        <table name="test_one" primaryKey="id" dataNode="dn$1-12" rule="sharding-by-month"/>
    </schema>

    <!-- 設置dataNode 對應的數據庫,及 mycat 鏈接的地址dataHost -->
    <dataNode name="dn1"  dataHost="dh_test" database="db_1"  />
    <dataNode name="dn2"  dataHost="dh_test" database="db_2"  />
    <dataNode name="dn3"  dataHost="dh_test" database="db_3"  />
    <dataNode name="dn4"  dataHost="dh_test" database="db_4"  />
    <dataNode name="dn5"  dataHost="dh_test" database="db_5"  />
    <dataNode name="dn6"  dataHost="dh_test" database="db_6"  />
    <dataNode name="dn7"  dataHost="dh_test" database="db_7"  />
    <dataNode name="dn8"  dataHost="dh_test" database="db_8"  />
    <dataNode name="dn9"  dataHost="dh_test" database="db_9"  />
    <dataNode name="dn10" dataHost="dh_test" database="db_10" />
    <dataNode name="dn11" dataHost="dh_test" database="db_11" />
    <dataNode name="dn12" dataHost="dh_test" database="db_12" />

    <!-- mycat 邏輯主機dataHost對應的物理主機.其中也設置對應的mysql登錄信息 -->
    <dataHost name="dh_test" maxCon="1000" minCon="10" balance="0" writeType="0"
              dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
        <!--<heartbeat>select user()</heartbeat>-->
        <heartbeat>show slave status</heartbeat>
        <writeHost host="hostM1" url="192.168.252.121:3306" user="root" password="mima">
            <readHost host="hostS2" url="192.168.252.122:3306" user="root" password="mima"/>
        </writeHost>
    </dataHost>

</mycat:schema>

登陸 Mycat 服務端

mysql -uroot -p123456 -h192.168.252.123 -P 8066

只須要在 Mycat 服務器執行如下腳本,就會自動同步到 MySql-Master:192.168.252.121 MySql-Slave:192.168.252.122

mysql> CREATE TABLE `test_one` (
    `id` BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    `name` VARCHAR (50) DEFAULT NULL COMMENT '名稱',
    `remark` VARCHAR (500) DEFAULT NULL COMMENT '備註',
    `create_time` datetime DEFAULT NULL COMMENT '建立時間',
    PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COMMENT = '測試';

Query OK, 0 rows affected
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_1',  '2017-01-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_2',  '2017-02-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_3',  '2017-03-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_4',  '2017-04-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_5',  '2017-05-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_6',  '2017-06-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_7',  '2017-07-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_8',  '2017-08-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_9',  '2017-09-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_10', '2017-10-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_11', '2017-11-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '測試數據', '會分片到 db_12', '2017-12-10 00:00:00');

在 MySql-Master 執行 ,查看分片是否均勻

mysql -uroot -p123456 -h192.168.252.121 -P 3306
select min(create_time),max(create_time) from db_1.test_one;
select min(create_time),max(create_time) from db_2.test_one;
select min(create_time),max(create_time) from db_3.test_one;
select min(create_time),max(create_time) from db_4.test_one;
select min(create_time),max(create_time) from db_5.test_one;
select min(create_time),max(create_time) from db_6.test_one;
select min(create_time),max(create_time) from db_7.test_one;
select min(create_time),max(create_time) from db_8.test_one;
select min(create_time),max(create_time) from db_9.test_one;
select min(create_time),max(create_time) from db_10.test_one;
select min(create_time),max(create_time) from db_11.test_one;
select min(create_time),max(create_time) from db_12.test_one;

注意

啓動MyCAT以前,須要先檢查一些配置:

Mysql的主從複製是否正常,這個檢查我在文章開頭,搭建 MySQL 5.7.19 主從複製,文章連接裏面有介紹

java的版本須要是1.7或以上;

Mysql的配置文件須要加一行lower_case_table_names = 1在[mysqld]欄目中,這個設置爲Mysql大小寫不敏感,不然可能會發生表找不到的問題;

在示例的2個數據 MySql-Master 和 MySql-Slave 上,新建3個數據庫 test_one,test_two,test_three, 如不新建,可能提示找不到數據庫ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0(這個提示不夠友好,是在運行很長一段時間後才提示);

添加 MYCAT_HOME 環境變量指向解壓的mycat目錄,主要是爲了一些bin目錄下的腳本的使用。

Contact

  • 做者:鵬磊
  • 出處:http://www.ymq.io
  • Email:admin@souyunku.com
  • 版權歸做者全部,轉載請註明出處
  • Wechat:關注公衆號,搜雲庫,專一於開發技術的研究與知識分享

關注公衆號-搜雲庫

相關文章
相關標籤/搜索