1. 程式人生 > >Mycat之——讀寫分離+垂直切分+水平切分+er分片+全域性表 測試

Mycat之——讀寫分離+垂直切分+水平切分+er分片+全域性表 測試

今天,給大家帶來一篇基於Mycat的讀寫分離+垂直切分+水平切分+er分片+全域性表 測試 ,我們直接進入主題

一、垂直切分測試

1、schema.xml裡面加入

<schema name="weixin" checkSQLschema="false" sqlMaxLimit="100" dataNode="weixin" />
<schema name="yixin" checkSQLschema="false" sqlMaxLimit="100" dataNode="yixin" />
<schema name="sms" checkSQLschema="false" sqlMaxLimit="100" dataNode="sms" />

<dataNode name="weixin" dataHost="host0" database="weixin" />
<dataNode name="yixin" dataHost="host1" database="yixin" />
<dataNode name="sms" dataHost="host2" database="sms" />

<dataHost name="host0" maxCon="1000" minCon="10" balance="0"
   writeType="0" dbType="mysql" dbDriver="native">
   <heartbeat>select user()</heartbeat>
   <!-- can have multi write hosts -->
   <writeHost host="namenode" url="192.168.168.230:3306" user="root" password="youngsun" />
</dataHost>

<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
   writeType="0" dbType="mysql" dbDriver="native">
   <heartbeat>select user()</heartbeat>
   <!-- can have multi write hosts -->
   <writeHost host="hadoop1" url="192.168.168.231:3306" user="root" password="youngsun" />
</dataHost>

<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
   writeType="0" dbType="mysql" dbDriver="native">
   <heartbeat>select user()</heartbeat>
   <!-- can have multi write hosts -->
   <writeHost host="hadoop2" url="192.168.168.232:3306" user="root" password="youngsun" />
</dataHost>

2、server.xml加入

<user name="test_wyh">
       <property name="password">test</property>
       <property name="schemas">weixin,yixin,sms</property>
</user>

3、遇到問題

1)、Caused by: org.xml.sax.SAXParseException; lineNumber: 106; columnNumber: 16; The content of element type "mycat:schema" must match "(schema*,dataNode*,dataHost*)".
原因:要按照schema、datanode 、datahost的順序放,不能打亂。也就是所有schema要放一起,然後接著才能放datanode。。。。
2)、報1184錯誤,是因為沒有 把datahost主機的許可權授予mycat所在主機。

<writeHost host="hadoop2" url="192.168.168.232:3306" user="root" password="youngsun" />
這裡的 使用者要授予mycat所在主機遠端訪問許可權:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youngsun'

二、水平切分測試

1、分別建立4個庫:user0、user1、user2、user3。我這裡4個庫建在4個獨立的主機上。

 CREATE DATABASE  user0 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2、建立表結構

 在user0~user2建立同樣的表結構,t_user和t_user_class_rel的建表語句參考如下:

DROP TABLE IF EXISTS `t_user_ext`;
CREATE TABLE `t_user_ext` (
 `user_id` int(11) NOT NULL COMMENT '使用者ID',
 `receive_address` varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '收貨地址',
 `create_time` datetime NOT NULL,
 `province_code` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='使用者資訊表';

DROP TABLE IF EXISTS `t_user_class_rel`;
CREATE TABLE `t_user_class_rel` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
 `caller` varchar(16) CHARACTER SET utf8 NOT NULL COMMENT '呼叫方系統表示',
 `province_code` varchar(10) CHARACTER SET utf8 DEFAULT NULL COMMENT '省份編碼',
 `user_id` int(11) NOT NULL COMMENT '使用者ID',
 `class_id` int(11) NOT NULL COMMENT '班級ID',
 `role_type` int(11) DEFAULT NULL COMMENT '使用者在該班的角色(1學生2家長3教師)',
 `create_time` datetime NOT NULL COMMENT '建立時間',
 `modify_time` datetime DEFAULT NULL COMMENT '修改時間',
 PRIMARY KEY (`id`),
 UNIQUE KEY `idx_rel_user_class_id` (`user_id`,`class_id`,`role_type`),
 KEY `idx_rel_user_id` (`user_id`) USING BTREE,
 KEY `idx_rel_class_id` (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

3、新增schema

加了一點內容:不分表的情況測試(只對部分表進行切分。其實這種時候,沒有切分的表,應該是不需要跟已經切分過的表進行關聯,否則就會垮庫join。既然是這樣,那業務就比較獨立了,為什麼不把這部分表垂直切分出去呢?) 總結心得:1、如果某張表進行水平切分了,那麼跟他有事物關聯的表,要麼搞全域性表,要麼進行er分片,不然就會導致垮庫join。而沒有關聯關係的表或者非事物關聯的表,實際上可以垂直切分出去(如果有必要)。2、dataHost可以理解成一個主機組,可以是單機,可以是主從,可以是galera 等搭建起來的叢集。讀寫分離就是在這裡處理的。ha、讀寫分離等都在這裡進行配置,都是針對datahost。

<schema name="test_sharding" checkSQLschema="false" sqlMaxLimit="100">
    <!-- auto sharding by id (long) -->
    <table name="t_user" dataNode="user0,user1,user2,user3" rule="rule_wyh">
        <childTable name="t_user_class_rel" primaryKey="id" joinKey="user_id" parentKey="user_id" />
    </table>
        <!-- 此處測試不分表的情況。要先在這裡配置,然後可以在mycat建立t_user_1表,也可以在user3對應的local建立表。如果這裡沒事先配置,無法在mycat建表,會報錯。這個還可以通過制定預設datanode實現,更簡單,配置方法:在shcema標籤上加上datanode -->
        <table name="t_user_1" dataNode="user3" >
    </table>
</schema>
<dataNode name="user0" dataHost="host0" database="user0" />
<dataNode name="user1" dataHost="host1" database="user1" />
<dataNode name="user2" dataHost="host2" database="user2" />
<dataNode name="user3" dataHost="host3" database="user3" />

4、新增datahost:host3

<dataHost name="host3" maxCon="1000" minCon="10" balance="0"
   writeType="0" dbType="mysql" dbDriver="native">
   <heartbeat>select user()</heartbeat>
   <!-- can have multi write hosts -->
   <writeHost host="ys-fs" url="192.168.168.238:3306" user="root" password="youngsun" />
</dataHost>
在238上授權授權:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youngsun';
flush privileges;

5、配置rule.xml檔案

在schema.xml的檔案內容中可看到t_user表指定的分片規則是rule1,需要在conf/rule.xml檔案中設定rule1的規則為根據user_id進行分片,並按照類“org.opencloudb.route.function.PartitionByLong”的規則進行分片,即將user_id模除1024後每256內分到一個數據庫中,即模除後0~255到user0資料庫庫,256~511到user1資料庫,512~767到user2資料庫,768~1023到user3資料庫。
總結心得:普通取模演算法,連續的id會路由到不同的分片。增大了批量插入的事務控制難度,而固定分片hash演算法根據二進位制則可能會分到連續的分片,減少插入事務事務控制難度。
該檔案的參考內容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/"> 
 <tableRule name="rule_wyh">
    <rule>
      <columns>user_id</columns>
      <algorithm>func_4p</algorithm>
    </rule>
 </tableRule>

 <function name="func_4p" class="org.opencloudb.route.function.PartitionByLong">
    <property name="partitionCount">4</property>
    <property name="partitionLength">256</property>
 </function>
</mycat:rule>

6、配置server.xml檔案

在server.xml檔案中的schemas屬性中新增test_sharding的schema。修改後的檔案如下所示:

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
        <property name="sequnceHandlerType">0</property> 
    </system>
    <user name="test">
       <property name="password">test</property>
       <property name="schemas">weixin,yixin,photo,test_sharding</property>
    </user>
</mycat:server>

7、水平切分測試

重啟MyCAT,使用MySQL客戶端連線後,連線後可在test_sharding資料庫下看到t_user和t_user_class_rel表,
在MySQL客戶端連線的MyCat的test_sharding資料庫的t_user表執行如下插入語句,插入user_id=1、255、256、511、512、1023、1024、50、300、1000的資料:注意insert into 必須帶上欄位名列表,不然報錯插不進去。

INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('1', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('255', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('256', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('511', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('512', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('1023', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('1024', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('50', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('300', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
INSERT INTO  t_user( user_id  , receive_address  , create_time  , province_code  ) VALUES('1000', '廣州市越秀區廣州大道中599號', '2014-07-17 10:53:15', 'GD');
而後在MyCAT的test_sharding資料庫的t_user表執行select檢視記錄執行情況。進入localhost的user0~user3資料庫,檢視資料是否按照之前確定的rule1的規則寫入不同的資料庫。
讀者可在test_sharding資料庫的t_user表執行update和delete等語句,並去分庫檢視執行結果,可得知MyCAT對MySQL客戶端基本透明,對程式也幾乎透明,在select語句執行時,MyCAT會自行去各個分庫按照規則獲取合併結果。
接著測試按照ER關係策略分片的t_user_class_rel表是否按照user_id的分片策略,同樣user_id的資料分佈在同一個user庫的t_user表和t_user_class_rel表。
在MyCAT的test_mycat資料庫的t_user_class_rel表執行如下語句:
INSERT INTO `t_user_class_rel`( `id`  , `caller` , `province_code` , `user_id` , `class_id` , `role_type` , `create_time` , `modify_time`) VALUES ('257', 'eip', 'GD', '2', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
INSERT INTO `t_user_class_rel`( `id`  , `caller` , `province_code` , `user_id` , `class_id` , `role_type` , `create_time` , `modify_time`) VALUES ('1', 'eip', 'GD', '257', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
INSERT INTO `t_user_class_rel`( `id`  , `caller` , `province_code` , `user_id` , `class_id` , `role_type` , `create_time` , `modify_time`) VALUES ('2', 'eip', 'GD', '513', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
INSERT INTO `t_user_class_rel`( `id`  , `caller` , `province_code` , `user_id` , `class_id` , `role_type` , `create_time` , `modify_time`) VALUES ('3', 'eip', 'GD', '769', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
而後在MyCAT的test_mycat資料庫的t_user_class_rel表執行select檢視記錄執行情況。進入localhost的user0~user3資料庫,檢視資料是否按照之前確定的rule1的規則和ER分片策略寫入不同的資料庫。
分片join解決方案心得小結:如果一張表做分片了,其他有一張表要跟這張表做關聯,方案如下:
1) 全域性表(適合做的才做):非跨分片join
2) 另一張表也搞分片:非跨分片join
3) share join(只能2個表join):跨分片join
4) 另一張表裡join用到的欄位冗餘到 已經做了分片的那張表上去:不用join    (該方案可用性不錯)
5) 另一張表裡join用到的欄位 搞成一張全域性表:非跨分片join

三、讀寫分離

MyCAT的讀寫分離機制如下:
1)事務內的SQL,全部走寫節點,除非某個select語句以註釋/*balance*/開頭
2)自動提交的select語句會走讀節點,並在所有可用讀節點中間隨機負載均衡
3)當某個主節點宕機,則其全部讀節點都不再被使用,因為此時,同步失敗,資料已經不是最新的,MyCAT會採用另外一個主節點所對應的全部讀節點來實現select負載均衡。
4)當所有主節點都失敗,則為了系統高可用性,自動提交的所有select語句仍將提交到全部存活的讀節點上執行,此時系統的很多頁面還是能出來資料,只是使用者修改或提交會失敗。

231和233主從配置,233配置成讀庫。

<dataHost name="host1" maxCon="1000" minCon="10" balance="1"
   writeType="0" dbType="mysql" dbDriver="native">
   <heartbeat>select user()</heartbeat>
   <!-- can have multi write hosts -->
   <writeHost host="hadoop1" url="192.168.168.231:3306" user="root" password="youngsun" >
        <readHost host="hadoop3" url="192.168.168.233:3306" user="root" password="youngsun" weight="1" />
   </writeHost>
</dataHost>

相關推薦

Mycat——分離+垂直切分+水平切分+er分片+全域性 測試

今天,給大家帶來一篇基於Mycat的讀寫分離+垂直切分+水平切分+er分片+全域性表 測試 ,我們直接進入主題 一、垂直切分測試 1、schema.xml裡面加入 <schema name="weixin" checkSQLschema="false" sqlM

Mycat——分離與主從切換案例

一、環境準備 軟體版本: 作業系統:CentOS-6.5-x86_64-bin-DVD1.iso JDK版本:jdk1.7.0_80 Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-Linux.tar.gz (下載原始碼

mycat分離+垂直切分+水平切分+er分片+全局 測試

mysql cal style st2 create 提交 org 方法 一起 原文http://blog.163.com/[email protected]/blog/static/172718064201683031639683/ 讀寫分離:利用最基礎的m

Mycat實現分離(一)

mycatMycat介紹Mycat是一個國產中間件產品,作用在應用層和數據庫之間架橋,使應用通過MyCat來對後端數據庫進行管理,是一款國人自主的開源的中間件產品。算是比較優秀的一款,前身是阿裏公司在維護,很多公司也慢慢的在嘗試接入這個產品,但不得不說官方文檔似乎做的不太友好。至於為什麽選擇MyCat可能只有

MySQL主從復制 + Mycat實現分離

date windows repl ron 信息 決定 不用 ati 刪掉 說明:兩臺MySQL服務器都是使用CentOS6.5系統,MySQL版本為mysql-5.7.17 MySQL一主一被實現主從復制 註意:寫包括insert,delete,update 操作;讀只有

haproxy+keepalived+mycat+mysql (分離

haproxy+keepalived+m描述:架構方案: mysql (master/slave) --gtid 方式主備(pos 也可)mycat (master/slave) --xinted 插件時間主備模式haproxy (master/slave) --keepalived 自動切換--keepal

搭建Mycat實現分離

mycat、Linux、讀寫分離、主從同 環境mycat 192.168.43.160 master 192.168.43.109 slave 192.168.43.200 1 服務安裝與配置 (1) [root@

網易cetus分離

cetus 中間件 讀寫分離 一、 簡介 Cetus是由C語言開發的關系型數據庫MySQL的中間件,主要提供了一個全面的數據庫訪問代理功能。Cetus連接方式與MySQL基本兼容,應用程序幾乎不用修改即可通過Cetus訪問數據庫,實現了數據庫層的水平擴展和高可用。Cetus由網易樂得專家技術團隊

mycat配置分離

負載均衡 limit 壓力 防火 開啟 防火墻的設置 lease tar.gz 8.0 現有後端MYSQL架構: MHA1 192.168.1.20 MHA2 192.168.1.30 MHA3

mysql+mycat實現分離

-- sys prop lse 版本 text oss 機制 mys centos7 master slave mycat1.6 client 192.168.41.10 192.168.41.11 192.168.41.12 192.168.41.13

MYSQL分離搭建方案

讀寫分離實現:360 Atlas(代理層實現,無需修改應用程式程式碼) 實現步驟 # 安裝 shell> rpm -i Atlas-2.2.1.el6.x86_64.rpm # 解除安裝 shell> rpm -e Atlas-2.2

Linux 使用Mycat實現分離(基於Mysql的分離

各位同學大家好,今天給大家分享一下用Mycat進行資料庫的讀寫分離,本篇文章是基於上一篇的mysql主從複製。Linux上實現Mysql的主從複製(為Mycat讀寫分離作準備) 在上一篇文章中,我們在兩個伺服器使用同版本的作業系統和mysql: 伺服器1:centos7.3,mysql5.6 伺服器

MySQL - MyCat 實現分離

前言         MyCat是一個徹底開源的,面向企業應用開發的大資料庫叢集,支援事務、ACID、可以替代MySQL的加強版資料庫.其功能有可以視為MySQL叢集的企業級資料庫,用來替代昂貴的Oracle叢集.融合了記憶體快取技術、NoSQL技術、HDFS大資料的

redis叢集主從分離

redis叢集主從之讀寫分離 1、叢集部署 這裡就不詳細贅述如何部署主從叢集了,一般都是使用slaveOf配置來進行初始化配置。 2、與springboot整合實現讀寫分離 通過註解實現呼叫層讀寫分離,然後根據取模運算來確定訪問哪個讀庫 在springcloud配置中心增加red

三十一、索引的弊端分離的引入

                   索引的弊端之讀寫分離的引入 索引=列值+rowid 索引

MySQL主從同步+MyCat資料分離操作筆記

一. Centos7安裝mysql5.7步驟 環境準備: centos7系統 1,網路:192.168.X.130(master),192.168.X.131(slave) 2,連線外網 3,裝epel-release倉庫 4,裝wget/vim等; 5,

MySQL主從複製 + Mycat實現分離

說明:兩臺MySQL伺服器都是使用CentOS6.5系統,MySQL版本為mysql-5.7.17 MySQL一主一被實現主從複製 注意:寫包括insert,delete,update 操作;讀只有select其他操作由主master的二進位制檔案決定。 一.在19

Mysql 實戰——分離方案

Linux環境:Centos 6.8  64-bit Mysql 版本:5.1.7 二、使用Amoeba資料庫代理來實現讀寫分離 Amoeba作為資料庫代理,以中介軟體的形式存在,拓撲圖如下所示:(Amoeba官網的一張圖) 1、下載Amoeba:https:/

mysql叢集搭建分離

1.MySQL-Proxy下載 https://downloads.mysql.com/archives/proxy/ 2.MySQL-Proxy安裝 準備一臺機器作為MySQL-Proxy 上一節,我們在192.168.68.3作為主伺服器,在192.168.68.5作為

mysql主從複製、分離到資料庫水平拆分及庫雜湊

web專案最原始的情況是一臺伺服器只能連線一個mysql伺服器(c3p0只能配置一個mysql),但隨著專案的增大,這種方案明顯已經不能滿足需求了。Mysql主從複製,讀寫分離:上面的方案使用mysql-Proxy代理,分發讀寫請求,寫操作轉發到Mysql主伺服器,讀操作轉發