docker安裝mycat並實現mysql讀寫分離和分庫分表


1.部署mysql主從復制,參考我的博客《docker部署mysql主從復制

 

2.拉取docker鏡像

docker pull longhronshens/mycat-docker

 

3.mycat相關配置

 

一、創建配置文件夾

mkdir -p /usr/local/mycat/conf
cd /usr/local/mycat/conf

 

二、vim /usr/local/mycat/conf/server.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!--mycat相關配置-->
<system>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">0</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">true</property>
</system>
<!--以下設置為應用訪問帳號權限
,root賬號,root密碼-->
 <user name="root">
<property name="password">root</property>
<!-- 下面標簽填寫的內容需要和schema.xml配置文件內的一致,如果有兩個或者兩個以上的值,可用逗號分開,但是在schema.xml配置文件內,必須用兩個schema標簽來進行分開填寫 -->
<property name="schemas">test</property>
</user>
</mycat:server>

 

三、vim /usr/local/mycat/conf/schema.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--
    schema是數據庫設置,此數據庫為邏輯數據庫
        name邏輯數據庫名,與server.xml中的schema對應
        checkSQLschema數據庫前綴相關設置,建議看文檔,這里暫時設為false
        sqlMaxLimit指select時默認的limit,避免查詢全表
    table標簽,這些數據表為邏輯數據表
        name表名,物理數據庫中表名
        dataNode表存儲到哪些節點,多個節點用逗號分隔。節點為下文dataNode設置的name
        primaryKey主鍵字段名,自動生成主鍵時需要設置
        autoIncrement是否自增
        rule分片規則名,具體規則下文rule.xml詳細介紹
    -->
    <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
        <table name="tb_user" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4" rule="userrule"/>
        <table name="tb_category" primaryKey="id" dataNode="dn1,dn2,dn3,dn4" rule="categoryrule"/>
    </schema>
    <!--
    dataNode是分片信息,也就是分庫相關配置
        name節點名,與table中dataNode對應
        dataHost物理數據庫名,與dataHost中name對應
        database物理數據庫中數據庫名
    -->
    <dataNode name="dn1" dataHost="localhost1" database="db1"/>
    <dataNode name="dn2" dataHost="localhost1" database="db2"/>
    <dataNode name="dn3" dataHost="localhost1" database="db3"/>
    <dataNode name="dn4" dataHost="localhost1" database="db4"/>
    <!--
    dataHost是物理數據庫,真正存儲數據的數據庫
    name屬性唯一標識dataHost標簽,供上層的標簽使用
    maxCon屬性指定每個讀寫實例連接池的最大連接。也就是說,標簽內嵌套的
    minCon屬性指定每個讀寫實例連接池的最小連接,初始化連接池的大小
    balance均衡負載的方式
        balance="0":不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost 上,即讀請求僅發送到writeHost上。
        balance="1":讀請求隨機分發到當前writeHost對應的readHost和standby的writeHost上。即全部的readHost與stand by writeHost 參與
                    select 語句的負載均衡,簡單的說,當雙主雙從模式(M1 ->S1 , M2->S2,並且 M1 與 M2 互為主備),正常情況下, M2,S1,
                    S2 都參與 select 語句的負載均衡
        balance="2":讀請求隨機分發到當前dataHost內所有的writeHost和readHost上。即所有讀操作都隨機的在writeHost、 readhost 上分發。
        balance="3":讀請求隨機分發到當前writeHost對應的readHost上。即所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,
                    writerHost不負擔讀壓力,注意 balance=3 只在 1.4 及其以后版本有,1.3 沒有。
    writeType寫入方式
        writeType="0":所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost,重新啟動后已切換后的為准,切換記錄在配置文件中:dnindex.properties .
        writeType="1":所有寫操作都隨機的發送到配置的 writeHost。
        writeType="2":沒實現。
    dbType數據庫類型,指定后端連接的數據庫類型,目前支持二進制的mysql協議,還有其他使用JDBC連接的數據庫。例如:mongodb、oracle、spark等
    dbDriver屬性指定連接后端數據庫使用的,目前可選的值有native和JDBC。使用native的話,因為這個值執行的是二進制的mysql協議,所以可以使用mysql和maridb,其他類型的數據庫則需要使用JDBC驅動來支持。從1.6版本開始支持postgresql的native原始協議
    switchType主從切換(雙主failover)
        switchType="-1":不自動切換
        switchType="1":默認值,自動切換
        switchType="2":基於MySQL主從同步的狀態來決定是否切換。需修改heartbeat語句(即心跳語句):show slave status;
        switchType="3":基於Mysql Galera Cluster(集群多節點復制)的切換機制。需修改heartbeat語句(即心跳語句):show status like 'wsrep%'
    heartbeat心跳檢測語句,注意語句結尾的分號要加
    writeHost、readHost這兩個標簽都指定后端數據庫的相關配置給mycat,用於實例化后端連接池,writeHost指定寫實例、readHost指定讀實例,組着這些讀寫實例來滿足系統的要求。
    -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostM1" url="172.17.0.2:3306" user="root" password="123456">
            <readHost host="hostS2" url="172.17.0.3:3306" user="root" password="123456"/>
        </writeHost>
    </dataHost>
</mycat:schema>

  

 

四、vim /usr/local/mycat/conf/rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<!--
name指定唯一的名字,用於標識不同的表規則
rule指定對物理表中的哪一列進行拆分和使用什么路由算法。columns 指定要拆分的列名字。algorithm 使用function標簽中的name屬性,連接表規則和具體路由算法
-->
<tableRule name="userrule">
<rule>
<columns>id</columns>
<algorithm>partition-by-long</algorithm>
</rule>
</tableRule>
<tableRule name="categoryrule">
<rule>
<columns>id</columns>
<algorithm>partition-by-jump-consistent-hash</algorithm>
</rule>
</tableRule>

<!--
name指定算法的名字。
class指定路由算法具體的類名字。
property為具體算法需要用到的一些屬性
-->

<!--
枚舉法分片
mapFile標識配置文件名稱,與rule.xml同級
type默認值為00表示Integer,非零表示String,根據tableRule->rule->columns而定
defaultNode 默認節點:小於0表示不設置默認節點,大於等於0表示設置默認節點
默認節點的作用:枚舉分片時,如果碰到不識別的枚舉值,就讓它路由到默認節點。如果不配置默認節點(defaultNode值小於0表示不配置默認節點),碰到不識別的枚舉值就會報錯,like thiscan’t find datanode for sharding column:column_name val:ffffffff
-->
<function name="partition-by-file-map" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-by-file-map.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>
<!--
固定分片hash算法
該分片規則,就取id的二進制低10位,然后和1111111111相與得到一個結果,例如
1111轉為二進制為10001010111,低10位為:0001010111,和1111111111相與后為:1010111=87
8888轉為二進制為10001010111000,低10位:1010111000,和1111111111相與后:1010111000=696
partitionCount分區的數量,值為逗號隔開的相加
partitionLength分片范圍列表,每個分區的長度,總長為1024(二進制1111111111就是1024)
平均分為4分片,因為partitionCount*partitionLength=1024,所以partitionCount=4partitionLength=256
-->
<function name="partition-by-long" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">4</property>
<property name="partitionLength">256</property>
</function>
<!--
范圍約定,如果不在范圍內,則不可插入
mapFile標識配置文件名稱,與rule.xml同級
如:
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2

0-10000000=0
10000001-20000000=1
-->
<function name="auto-partition-by-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">auto-partition-by-long.txt</property>
</function>
<!--
求模法
-->
<function name="partition-by-mod" class="io.mycat.route.function.PartitionByMod">
<property name="count">4</property>
</function>
<!--
日期列分區法
配置中配置了開始日期,分區天數,即默認從開始日期算起,分隔10天一個分區
-->
<function name="partition-by-date" class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2014-01-01</property>
<property name="sPartionDay">10</property>
</function>
<!--
一致性hash
count要分片的數據庫節點數量,必須指定,否則沒法分片
virtualBucketTimes一個實際的數據庫節點被映射為這么多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160
-->
<function name="partition-by-murmur-hash" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property>
<property name="count">2</property>
<property name="virtualBucketTimes">160</property>
</function>
<!--
跳增一致性哈希分片
totalBuckets指定節點個數
-->
<function name="partition-by-jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
<property name="totalBuckets">4</property>
</function>
</mycat:rule>
 

 

五、vim /usr/local/mycat/conf/sequence_conf.properties

TB_USER.HISIDS= TB_USER.MINID=1 TB_USER.MAXID=20000 TB_USER.CURID=1

 

 

4.啟動mycat

一、在mysql主機mysql-master建4個數據庫db1,db2,db3,db4(不要操作從機)

 

二、創建文件,這兩個文件是分片規則用的,現在沒有用到對應的規則,文件內容為空

touch /usr/local/mycat/conf/partition-by-file-map.txt
touch /usr/local/mycat/conf/auto-partition-by-long.txt

 

三、創建mycat容器

docker run --name mycat \
-v /usr/local/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml \
-v /usr/local/mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml \
-v /usr/local/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml \
-v /usr/local/mycat/conf/sequence_conf.properties:/usr/local/mycat/conf/sequence_conf.properties \
-v /usr/local/mycat/conf/partition-by-file-map.txt:/usr/local/mycat/conf/partition-by-file-map.txt \
-v /usr/local/mycat/conf/auto-partition-by-long.txt:/usr/local/mycat/conf/auto-partition-by-long.txt \
--privileged=true \
-p 8066:8066 -p 9066:9066 \
-e MYSQL_ROOT_PASSWORD=root -d longhronshens/mycat-docker

 

三、用navicat連接mycat測試

 

5.測試mycat分庫分表與主從復制

用navicat連接mycat,打開test數據庫,執行如下命令后,查看mycat和mysql主從數據庫是否有相應數據產生

CREATE TABLE `tb_user` (
	`id` BIGINT (20) NOT NULL AUTO_INCREMENT,
	`username` VARCHAR (50) CHARACTER
SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶名',
 `password` VARCHAR (32) CHARACTER
SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密碼,加密存儲',
 `phone` VARCHAR (20) CHARACTER
SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注冊手機號',
 `email` VARCHAR (50) CHARACTER
SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注冊郵箱',
 `created` datetime (0) NOT NULL,
 `updated` datetime (0) NOT NULL,
 PRIMARY KEY (`id`) USING BTREE,
 UNIQUE INDEX `username` (`username`) USING BTREE,
 UNIQUE INDEX `phone` (`phone`) USING BTREE,
 UNIQUE INDEX `email` (`email`) USING BTREE
) ENGINE = INNODB AUTO_INCREMENT = 54 CHARACTER
SET = utf8 COLLATE = utf8_general_ci COMMENT = '用戶表' ROW_FORMAT = Compact;

 

CREATE TABLE `tb_category` (
	`id` VARCHAR (5) CHARACTER
	SET utf8 COLLATE utf8_general_ci NOT NULL,
	`name` VARCHAR (200) CHARACTER
SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名字',
 `sort_order` INT (4) NOT NULL DEFAULT 1 COMMENT '排列序號,表示同級類目的展現次序,如數值相等則按名稱次序排列。取值范圍:大於零的整數',
 `created` datetime (0) NULL DEFAULT NULL,
 `updated` datetime (0) NULL DEFAULT NULL,
 PRIMARY KEY (`id`) USING BTREE,
 INDEX `updated` (`updated`) USING BTREE
) ENGINE = INNODB CHARACTER
SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

  

INSERT INTO `tb_user` (
	id,
	username,
	PASSWORD,
	phone,
	email,
	created,
	updated
)
VALUES
	(
		7,
		'zhangsan',
		'e10adc3949ba59abbe56e057f20f883e',
		'13488888888',
		'aa@a',
		'2015-04-06 17:03:55',
		'2015-04-06 17:03:55'
	);

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM