Mycat實現 分庫分表+讀寫分離(基於主從配置)
阿新 • • 發佈:2019-02-20
前兩篇文章分別講解了分庫分表 和主從配置
2.為了實現分庫分表+讀寫分離 配置了倆個dataHost節點 節點中均有writeHost和readHost節點配置讀路徑與寫路徑3.balance屬性改為了3
我們可以看到分庫分表是沒有問題的 寫入的節點都是我們定義好的wirteHost查詢
下面來介紹 分庫分表+讀寫分離(基於主從配置)
簡單的架構圖:配置:
cd進入到mycat的conf目錄下 檢視 server.xml rule.xml schema.xml 三個配置檔案server.xml 與之前的配置基本沒有變化rule.xml 為了配合測試 新增了根據hash分片規則<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="useSqlStat">1</property> <property name="useGlobleTableCheck">0</property> <property name="sequnceHandlerType">2</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> <user name="root"> <property name="password">123456</property> <property name="schemas">m2</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">m2</property> <property name="readOnly">true</property> </user> </mycat:server>
schema.xml 新增加了一張order表<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="sharding-by-murmur"> <rule> <columns>order_id</columns> <algorithm>murmur</algorithm> </rule> </tableRule> <tableRule name="mod-long"> <rule> <columns>id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash"> <property name="seed">0</property><!-- 預設是 0--> <property name="count">2</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片--> <property name="virtualBucketTimes">160</property><!-- 一個實際的資料庫節點被對映為這麼多虛擬 節點,預設是 160 倍,也就是虛擬節點數是物理節點數的 160 倍--> </function> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">2</property> </function> </mycat:rule>
這裡提一點 比較前面分庫分表的配置 我們這裡改動的配置又以下幾點:1.新增一張按照hash分片的order表<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 設定表的儲存方式.schema name="TESTDB" 與 server.xml中的 TESTDB 設定一致 --> <schema name="m2" checkSQLschema="false" sqlMaxLimit="100"> <table name="users" primaryKey="id" dataNode="node_db01,node_db02" rule="mod-long" /> <table name="order" primaryKey="id" dataNode="node_db01,node_db02" rule="sharding-by-murmur"/> </schema> <!-- 設定dataNode 對應的資料庫,及 mycat 連線的地址dataHost --> <dataNode name="node_db01" dataHost="dataHost01" database="m2" /> <dataNode name="node_db02" dataHost="dataHost02" database="m2" /> <!-- mycat 邏輯主機dataHost對應的物理主機.其中也設定對應的mysql登陸資訊 --> <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="m1" url="127.0.0.1:3310" user="root" password="123456"> <readHost host="m2" url="127.0.0.1:3311" user="root" password="123456"/> </writeHost> </dataHost> <dataHost name="dataHost02" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="s1" url="127.0.0.1:3312" user="root" password="123456"> <readHost host="s2" url="127.0.0.1:3313" user="root" password="123456"/> </writeHost> </dataHost> </mycat:schema>
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
`id` int(11) NOT NULL,
`order_id` varchar(64) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL,
`price` decimal(10,0) DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.為了實現分庫分表+讀寫分離 配置了倆個dataHost節點 節點中均有writeHost和readHost節點配置讀路徑與寫路徑3.balance屬性改為了3
負載均衡型別,目前的取值有 3種: 1. balance="0", 不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost上。 2. balance="1",全部的readHost與 stand by writeHost 參與 select語句的負載均衡,簡單的說,當雙 主雙從模式(M1->S1,M2->S2,並且 M1與 M2互為主備),正常情況下,M2,S1,S2都參與 select語句的負載 均衡。 3. balance="2",所有讀操作都隨機的在writeHost、readhost上分發。 4. balance="3",所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost 不負擔讀壓 力,注意balance=3只在1.4及其以後版本有,1.3沒有。4。switchType屬性改為了 -1(自己選擇哦)
-1 表示不自動切換
1 預設值,自動切換
2 基於MySQL主從同步的狀態決定是否切換
心跳語句為 show slave status
3 基於MySQL galary cluster的切換機制(適合叢集)(1.4.1)
心跳語句為 show status like ‘wsrep%’.
到此,mycat配置已經完了 使用cmd進入bin目錄 執行startup_nowrap.bat 測試
首先將conf目錄下的log4j2.xml中level級別改為debug 方便檢視sql執行的節點1.使用mavicat連線mycat2.插入兩條資料INSERT INTO `order`(id,order_id,name,price) VALUES(1,'123abc','木頭',13.1)
INSERT INTO `order`(id,order_id,name,price) VALUES(3,'321efd','木頭',13.1)
我們檢視 debug資訊我們可以看到分庫分表是沒有問題的 寫入的節點都是我們定義好的wirteHost查詢
SELECT * FROM `order`;
我們可以看到 查詢的時候 走的是我們定義的readHost中的節點 如此 大功告成!!!