Mycat的實踐一:初始Mycat

Mycat

Mycat簡介

1. 一個完全開源的,面向企業應用開發的大數據庫集羣
2. 支持事務、ACID、能夠替代MySQL的增強版數據庫
3. 一個能夠視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣
4. 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
5. 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
6. 一個新穎的數據庫中間件產品

目前最新版本

1.6

長期規劃2.0

1. 徹底實現分佈式事務,徹底的支持分佈式。
2. 經過Mycat web(eye)完成可視化配置,及智能監控,自動運維。
3. 經過mysql 本地節點,完整的解決數據擴容難度,實現自動擴容機制,解決擴容難點。
4. 支持基於zookeeper的主從切換及Mycat集羣化管理。
5. 經過Mycat Balance 替代第三方的Haproxy,LVS等第三方高可用,完整的兼容Mycat集羣節點的動態上下線。
6. 接入Spark等第三方工具,解決數據分析及大數據聚合的業務場景。
7. 經過Mycat智能優化,分析分片熱點,提供合理的分片建議,索引建議,及數據切分實時業務建議。

總結

Mycat 是一個數據庫的中間件,支持各類常規的MySQL、Oracle、DB二、SQL Server、PostgreSQL的支持,支持分庫分表等分佈式下的業務架構,讓前端開發能夠幾乎透明.

簡單初始部署

本案例咱們將會初始一個同主機下三個分庫(mycat-db1,mycat-db2,mycat-db3)經過mycat中間件,前端鏈接mycat操做

準備

# win下部署、正式環境建議linux部署

1. JDK
2. Mysql
3. mycat1.6 win 源碼

JDK安裝

# wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-windows-x64.exe
一路next安裝

#配置 JDK 環境
JAVA_HOME:C:\Program Files\Java\jdk1.8.0_162
CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
PATH:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

# DEBUG
java -version

mysql

這部分安裝就不說了
我這邊安裝的是mysql5.6版本

初始化三個分庫

# 此操做在當前機的mysql上操做(再也不mycat)
# mysql -uroot -p
CREATE DATABASE IF NOT EXISTS mycat-db1 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS mycat-db2 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS mycat-db3 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;

# 三個分庫各自建立表travelrecord
CREATE TABLE `travelrecord` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(22) NOT NULL DEFAULT '',
  `time` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

# 模擬數據
INSERT INTO `mycat-db1`.`travelrecord` (`name`, `time`) VALUES ('qkl', '0');
INSERT INTO `mycat-db1`.`travelrecord` (`name`, `time`) VALUES ('andy', '0');
INSERT INTO `mycat-db2`.`travelrecord` (`name`, `time`) VALUES ('zgq', '0');
INSERT INTO `mycat-db3`.`travelrecord` (`name`, `time`) VALUES ('pcb', '0');

mycat conf/server.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <property name="useSqlStat">0</property>  <!-- 1爲開啓實時統計、0爲關閉 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->

        <property name="sequnceHandlerType">2</property>
      <!--  <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-->
        <property name="processorBufferPoolType">0</property>
        <!--默認是65535 64K 用於sql解析時最大文本長度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</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">300000</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">1m</property>

        <!--
            單位爲k
        -->
        <property name="spillsFileBufferSize">1k</property>

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

        <!--
            單位爲m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否採用zookeeper協調切換  -->
        <property name="useZKSwitch">true</property>


    </system>

    <!-- 這部分是咱們經過客戶端鏈接須要設置的賬號密碼 -->
    <user name="root">
        <property name="password">123456</property>
        <property name="schemas">TESTDB</property>
        
        <!-- 表級 DML 權限設置 -->
        <!--         
        <privileges check="false">
            <schema name="TESTDB" 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">TESTDB</property>
        <property name="readOnly">true</property>
    </user>

</mycat:server>

mycat conf/schema.xml配置

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

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 真實對應的讀寫的數據庫 -->
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="root">
        </writeHost>
    </dataHost>

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="mycat-db1" />
    <dataNode name="dn2" dataHost="localhost1" database="mycat-db2" />
    <dataNode name="dn3" dataHost="localhost1" database="mycat-db3" />
</mycat:schema>

啓動

bin/startup_nowrap.bat

# 啓動成功最後顯示
# MyCAT Server startup successfully. see logs in logs/mycat.log

客戶端測試

客戶端鏈接管理

我這邊是經過navicat鏈接
# mysql -uroot -p123456 -p 9066
鏈接賬號密碼:root/123456 -> server.xml配置可得

show @@help;
show @@sysparam;

客戶端鏈接

我這邊是經過navicat鏈接
# mysql -uroot -p123456 -p 8066
鏈接賬號密碼:root/123456 -> server.xml配置可得

操做

use TESTDB;

# select
select * from travelrecord;

# output:
+----+------+------+
| id | name | time |
+----+------+------+
|  1 | qkl  |    0 |
|  2 | andy |    0 |
|  1 | pcb  |    0 |
|  1 | zgq  |    0 |
+----+------+------+
4 rows in set

# update
update travelrecord set name='andy2' where id = 2;

# insert
insert into travelrecord(name, time) values('tony', 0);
# 出錯
#[Err] 1064 - bad insert sql (sharding column:ID not provided,INSERT INTO travelrecord (name, time)
VALUES ('test', 0)

總結

咱們利用mycat作了一個單點mysql的多分庫下支持簡單查詢的實踐,能夠正常查詢不過在咱們進行插入的時間遇到了問題

下一節咱們將利用Mycat的全局序列號解決利用mycat的插入問題

繼續閱讀:Mycat的實踐二:全局序列號前端

相關文章
相關標籤/搜索