1. 程式人生 > >資料庫垂直拆分,水平拆分利器,cobar升級版mycat

資料庫垂直拆分,水平拆分利器,cobar升級版mycat

1,關於Mycat

Mycat情報
基於阿里的開源cobar ,可以用於生產系統中,目前在做如下的一些改進:
非阻塞IO的實現,相對於目前的cobar,併發效能大大提升,而且不會陷入假死狀態
優化執行緒池的分配,目前cobar的執行緒池分配效率不高
修復cobar一些BUG
參考impala中的impala front部分的Java程式碼,實現高效的Map-Reduce,能夠處理上億的大資料量
實現自動分片特性,目前cobar需要手工分片,並有一定的程式設計限制
官方網站:
https://github.com/MyCATApache/
好多文件,大多數都是word的,寫的非常詳細。

https://github.com/MyCATApache/Mycat-doc
Mycat是cobar重新優化開發的版本,和cobar的很多配置都類似。
可以參考之前寫的cobar安裝:
http://blog.csdn.net/freewebsys/article/details/44022421

2,安裝Mycat服務

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    #資料庫名稱是TESTDB,sqlMaxLimit設定limit防止錯誤sql查詢大量資料
    <schema
name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
#自動分庫規則 <!-- auto sharding by id (long) --> <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> #全域性配置表,所有資料均同步到每個資料庫。 <!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> <!-- random sharding using mod sharind rule --> <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long" /> <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> #關聯子表配置,不太明白 <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> <childTable name="order_items" joinKey="order_id" parentKey="id" /> </childTable> <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /> </table> </schema> #配置多個dataNode,制定dataHost和資料庫名稱。 <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> #配置dataHost的讀寫分配。同時mysql也要配置好,Master-Slave或Master-Master <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> <!-- <readHost host="hostS1" url="localhost:3306" user="root" password="123456" /> --> </writeHost> <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> </dataHost> </mycat:schema>

wrapper.conf是mycat的配置檔案啟動引數等
rule.xml 是配置規則xml
還有幾個配置檔案慢慢研究
建立資料庫

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE db2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE db3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

服務啟動:/bin/mycat start
/bin/mycat這個問題同時可以作為service,拷貝到/etc/init.d/目錄下即可。

3,登陸mycat服務和管理端

登陸mycat服務:(埠8066)

# mysql -utest -ptest -h 127.0.0.1 -P8066
Warning: USING a password ON the command line interface can be insecure.
Welcome TO the MySQL monitor.  Commands END WITH ; OR \g.
Your MySQL connection id IS 1
Server version: 5.5.8-mycat-1.3 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2015, Oracle AND/OR its affiliates. ALL rights reserved.

Oracle IS a registered trademark OF Oracle Corporation AND/OR its
affiliates. Other names may be trademarks OF their respective
owners.

TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.

mysql> SHOW DATABASES;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 ROW IN SET (0.02 sec)

mysql> USE TESTDB;
Reading TABLE information FOR completion OF TABLE AND COLUMN names
You can turn off this feature TO GET a quicker startup WITH -A

DATABASE changed
mysql> SHOW TABLES;
+------------------+
| TABLES IN TESTDB |
+------------------+
| company          |
| customer         |
| customer_addr    |
| employee         |
| goods            |
| hotnews          |
| orders           |
| order_items      |
| travelrecord     |
+------------------+
9 ROWS IN SET (0.00 sec)

mysql> CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100));
Query OK, 0 ROWS affected (0.05 sec)

mysql> EXPLAIN CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100));
+-----------+---------------------------------------------------------------------+
| DATA_NODE | SQL                                                                 |
+-----------+---------------------------------------------------------------------+
| dn1       | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
| dn2       | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
| dn3       | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
+-----------+---------------------------------------------------------------------+
3 ROWS IN SET (0.01 sec)

mysql> INSERT INTO company(id,name) VALUES(1,'hp'); INSERT INTO company(id,name) VALUES(2,'ibm'); INSERT INTO company(id,name) VALUES(3,'oracle');
Query OK, 3 ROWS affected (0.37 sec)

Query OK, 3 ROWS affected (0.01 sec)

Query OK, 3 ROWS affected (0.00 sec)

mysql> SELECT * FROM company ;
+----+--------+
| id | name   |
+----+--------+
|  1 | hp     |
|  2 | ibm    |
|  3 | oracle |
+----+--------+
3 ROWS IN SET (0.01 sec)

使用管理端登陸:(埠9066)

#  mysql -utest -ptest -h 127.0.0.1 -P9066
Warning: USING a password ON the command line interface can be insecure.
Welcome TO the MySQL monitor.  Commands END WITH ; OR \g.
Your MySQL connection id IS 2
Server version: 5.5.8-mycat-1.3 [email protected]

Copyright (c) 2000, 2015, Oracle AND/OR its affiliates. ALL rights reserved.

Oracle IS a registered trademark OF Oracle Corporation AND/OR its
affiliates. Other names may be trademarks OF their respective
owners.

TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.

mysql> SHOW @@help;
+--------------------------------------+-----------------------------------+
| STATEMENT                            | DESCRIPTION                       |
+--------------------------------------+-----------------------------------+
| clear @@slow WHERE datanode = ?      | Clear slow SQL BY datanode        |
| clear @@slow WHERE schema = ?        | Clear slow SQL BY schema          |
| KILL @@connection id1,id2,...        | KILL the specified connections    |
| offline                              | CHANGE MyCat STATUS TO OFF        |
| online                               | CHANGE MyCat STATUS TO ON         |
| reload @@config                      | Reload ALL config FROM file       |
| reload @@route                       | Reload route config FROM file     |
| reload @@USER                        | Reload USER config FROM file      |
| ROLLBACK @@config                    | ROLLBACK ALL config FROM memory   |
| ROLLBACK @@route                     | ROLLBACK route config FROM memory |
| ROLLBACK @@USER                      | ROLLBACK USER config FROM memory  |
| SHOW @@backend                       | Report backend connection STATUS  |
| SHOW @@cache                         | Report system cache usage         |
| SHOW @@command                       | Report commands STATUS            |
| SHOW @@connection                    | Report connection STATUS          |
| SHOW @@connection.SQL                | Report connection SQL             |
| SHOW @@DATABASE                      | Report DATABASES                  |
| SHOW @@datanode                      | Report dataNodes                  |
| SHOW @@datanode WHERE schema = ?     | Report dataNodes                  |
| SHOW @@datasource                    | Report dataSources                |
| SHOW @@datasource WHERE dataNode = ? | Report dataSources                |
| SHOW @@heartbeat                     | Report heartbeat STATUS           |
| SHOW @@parser                        | Report parser STATUS              |
| SHOW @@processor                     | Report processor STATUS           |
| SHOW @@router                        | Report router STATUS              |
| SHOW @@server                        | Report server STATUS              |
| SHOW @@SESSION                       | Report front SESSION details      |
| SHOW @@slow WHERE datanode = ?       | Report datanode slow SQL          |
| SHOW @@slow WHERE schema = ?         | Report schema slow SQL            |
| SHOW @@SQL WHERE id = ?              | Report specify SQL                |
| SHOW @@SQL.detail WHERE id = ?       | Report EXECUTE detail STATUS      |
| SHOW @@SQL.EXECUTE                   | Report EXECUTE STATUS             |
| SHOW @@SQL.slow                      | Report slow SQL                   |
| SHOW @@threadpool                    | Report threadPool STATUS          |
| SHOW @@TIME.CURRENT                  | Report CURRENT TIMESTAMP          |
| SHOW @@TIME.startup                  | Report startup TIMESTAMP          |
| SHOW @@version                       | Report Mycat Server version       |
| stop @@heartbeat name:TIME           | Pause dataNode heartbeat          |
| switch @@datasource name:INDEX       | Switch dataSource                 |
+--------------------------------------+-----------------------------------+
39 ROWS IN SET (0.03 sec)

mysql> SHOW @@backend;
+------------+------+---------+-----------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+------------+
| processor  | id   | mysqlId | host            | port | l_port | net_in | net_out | life | closed | borrowed | SEND_QUEUE | schema | txlevel | autocommit |
+------------+------+---------+-----------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+------------+
| Processor0 |   12 |      33 | 127.0.0.1 | 3306 |  42505 |    596 |     501 | 3384 | FALSE  | FALSE    |          0 
.......

17 ROWS IN SET (0.03 sec)

mysql> SHOW @@connection;
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| PROCESSOR  | ID   | HOST      | PORT | LOCAL_PORT | SCHEMA | CHARSET | NET_IN | NET_OUT | ALIVE_TIME(S) | RECV_BUFFER | SEND_QUEUE | txlevel | autocommit |
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| Processor0 |    2 | 127.0.0.1 | 9066 |      35952 | NULL   | utf8    |    156 |    4107 |            40 |        4096 |          0 | NULL    | NULL       |
| Processor0 |    1 | 127.0.0.1 | 8066 |      16525 | TESTDB | utf8    |   2005 |    5132 |          3461 |        4096 |          0 | 3       | TRUE       |
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
2 ROWS IN SET (0.02 sec)

mysql> SHOW @@heartbeat;
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME   | TYPE  | HOST            | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM1 | mysql | 127.0.0.1 | 3306 |       1 |     0 | idle   |   30000 | 0,0,0        | 2015-03-03 14:45:00 | FALSE |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
1 ROW IN SET (0.01 sec)

mysql> SHOW @@datanode;
+------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST        | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1  | localhost1/db1 |     0 | mysql |      0 |    9 |   50 |      27 |          0 |        0 |       0 |            -1 |
| dn2  | localhost1/db2 |     0 | mysql |      0 |    4 |   50 |      26 |          0 |        0 |       0 |            -1 |
| dn3  | localhost1/db3 |     0 | mysql |      0 |    3 |   50 |      17 |          0 |        0 |       0 |            -1 |
+------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
3 ROWS IN SET (0.01 sec)

mysql> SHOW @@cache;
+-------------------------------------+-------+------+--------+------+------+---------------+---------------+
| CACHE                               | MAX   | CUR  | ACCESS | HIT  | PUT  | LAST_ACCESS   | LAST_PUT      |
+-------------------------------------+-------+------+--------+------+------+---------------+---------------+
| SQLRouteCache                       | 10000 |    1 |      8 |    0 |    1 | 1425364473193 | 1425363891040 |
| TableID2DataNodeCache.TESTDB_ORDERS | 50000 |    0 |      0 |    0 |    0 |             0 |             0 |
| ER_SQL2PARENTID                     |  1000 |    0 |      0 |    0 |    0 |             0 |             0 |
+-------------------------------------+-------+------+--------+------+------+---------------+---------------+
3 ROWS IN SET (0.05 sec)

4,總結

初步安裝測試了下mycat元件,還是非常不錯的,確實比起cobar有不少的進步。
同時他們開發團隊也說了,解決了cobar之前存在的問題。
有了全域性表,這樣可以使用join了,同時增加讀寫分離。
規則增加了不少,能滿足大部分需求。
和cobar一樣,mycat可以直接偽裝成一個mysql伺服器,對業務進行垂直拆分,水平拆分。平滑的進行資料擴充套件。
保證在原有系統上進行優化。接下來繼續研究mycat,非常好的解決方案。

相關推薦

資料庫垂直拆分水平拆分利器cobar升級mycat

1,關於Mycat Mycat情報 基於阿里的開源cobar ,可以用於生產系統中,目前在做如下的一些改進: 非阻塞IO的實現,相對於目前的cobar,併發效能大大提升,而且不會陷入假死狀態 優化執行緒池的分配,目前cobar的執行緒池分配效率不

資料庫垂直拆分水平拆分

    當我們使用讀寫分離、快取後,資料庫的壓力還是很大的時候,這就需要使用到資料庫拆分了。     資料庫拆分簡單來說,就是指通過某種特定的條件,按照某個維度,將我們存放在同一個資料庫中的資料分散存放到多個數據庫(主機)上面以

淺談資料庫讀寫分離、垂直拆分水平拆分

一、讀寫分離 二、垂直拆分、水平拆分 1.垂直劃分 (1)按照業務將表進行分類,垂直拆分是把不同的表拆到不同的資料庫中。資料庫專庫專用,比如拆為Products、Users、Deal庫。 缺點: (1)部分業務表無法join,只能通過介面方式解決,提高了系統複雜度。 (2)受

資料庫垂直拆分水平拆分

第一步,首選垂直拆分 一個數據庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分佈到不同的資料庫上面,這樣也就將資料或者說壓力分擔到不同的庫上面 。 比如淘寶中期開始的資料庫端按照業務垂直拆分:按照業務交易資料庫、使用者資料庫、商品資料庫、店鋪資料庫等進行拆分。 採用垂直拆分

mysql表的垂直拆分水平拆分

垂直拆分 垂直拆分是指資料表列的拆分,把一張列比較多的表拆分為多張表 通常我們按以下原則進行垂直拆分: 把不常用的欄位單獨放在一張表; 把text,blob等大欄位拆分出來放在附表中; 經常組合查詢的列

垂直拆分水平拆分

概念介紹 垂直拆分   垂直拆分就是要把表按模組劃分到不同資料庫表中(當然原則還是不破壞第三正規化),這種拆分在大型網站的演變過程中是很常見的。當一個網站還在很小的時候,只有小量的人來開發和維護,各模組和表都在一起,當網站不斷豐富和壯大的時候,也會變成多個子系統來支撐,這時就有按

資料庫表設計、 資料庫分層、myslq水平拆分、oracle表分割槽

資料庫表設計 資料庫表結構設計方法及原則(li)   資料庫設計的三大正規化:為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的正規化。   在實際開發中

資料切分 垂直切分、垂直拆分水平拆分的優缺點

資料切分 垂直切分 關於資料庫的水平切分和垂直切分的一些概念  垂直拆分   垂直拆分就是要把表按模組劃分到不同資料庫表中(當然原則還是不破壞第三正規化),這種拆分在大型網站的演變過程中是很常見的。當一個網站還在很小的時候,只有小量的人來開發和維護,各模組和表都在一起,當網站不斷豐富和壯大的時候

老有問題水平太菜二維數組問題

問題 徐誌摩 我們 外衣 生活 相互 讓我 一段 很多 不知不覺,天空落下了今冬的第三場雪,霏微的雪花像水晶球裏的雪花一樣將我帶入了童話故事裏敗鱗殘甲的冰封世界。疏疏密密的樹杈上被披上了銀色的外衣,枯榮的樹木也如厚積薄發一般沁在冰雪裏,為春天的到來拼命地吮吸著雪水。雪是那樣

用Spider引擎解決資料庫垂直水平拆分的問題

  作者介紹 張秀雲,網名飛鴻無痕,現任職於騰訊,負責騰訊金融資料庫的運維和優化工作。2007年開始從事運維方面的工作,經歷過網路管理員、Linux運維工程師、DBA、分散式儲存運維等多個IT職位。對Linux運維、MySQL資料庫、分散式儲存有豐富的經驗。

MySQL資料庫表如何水平拆分垂直拆分

目前很多網際網路系統都存在單表資料量過大的問題,這就降低了查詢速度,影響了客戶體驗。為了提高查詢速度,我們可以優化sql語句,優化表結構和索引,不過對那些百萬級千萬級的資料庫表,即便是優化過後,查詢速度還是滿足不了要求。這時候我們就可以通過分表降低單次查詢資料量,從而提高

關於資料庫表的水平拆分垂直拆分

最初知道水平垂直分表的時候是剛參加工作不久的時候,知道了這個概念,但是公司使用者量和資料量始終沒上來,所以也沒用到過,知道有一天到了一家新公司後,這些才被應用到實際開發中,這裡我就大概說說關於水平和垂直的拆分.分表的概念還是比較好理解的,就拿本網站的評論表展開講講,源於資料

資料庫分表(水平切分垂直切分)

一:出發點 問題:資料庫中data表增長快,數量級到千萬級,且讀寫頻繁。 解決思路:當前伺服器記憶體不足,增加硬體配置不現實。採用資料庫分表方式(目前暫定月份水平分表)解決。 首先明白sql執行過程:1:接收sql;2:把sql放到佇列中。3:執行sql。4:返回結果。 其

資料庫的分割槽分庫分表水平切分與垂直切分

在整理專案的時候,突然發現對資料庫的水平切分與垂直切分比較模糊,特此學習!參考:https://www.cnblogs.com/bluebluesky/articles/6413831.html1、資料庫分割槽  就是把同一個資料庫裡的表放到不同的伺服器上,負載均衡,但是在使

讀取文本信息拆分文本信息根據拆分的文本信息保存在字典中

img == ttext collect image string num 讀取文本 add using System.Collections;using System.Collections.Generic;using UnityEngine; public cla

終於把joomla 的 protostar 模版的菜單垂直改到水平

-c pin space nta ase -h cal pen resp protostar-applying-menu-class-suffixes-horizontal-vs-vertical-menus.html joomla 3.7.5 附帶的這個template

C#.NET常見問題(FAQ)-如何設置控件水平對齊垂直對齊

分享 交流 alt -s 9.png 按鈕 ges 設置 style 如果要設置一些控件垂直對齊,點擊這個按鈕 ?如果要設置水平對齊,則點擊這個按鈕,選中控件之後點擊左對齊(多個按鈕都試下吧,總歸能對齊到你要的效果的) ?更多教學視頻和資料下載,

apache優化之防盜鏈日誌拆分ab壓力測試

apache 防盜鏈 日誌拆分 ab壓力測試 Apache調優之apache防盜鏈、日誌拆分和ab壓力測試 1、apache防盜鏈盜鏈,全稱是盜取鏈接,假如我們的網站有很多好看的圖片,別人可以查看我們網站圖片的鏈接,然後應用在他的網站上,這樣的話,去訪問他的網站,實際上消耗的是我們的流量(因為

關於數據庫表的水平拆分垂直拆分

技術 執行 不常用 decimal 人的 splay 還需 copyright clas 垂直拆分 垂直拆分是指數據表列的拆分,把一張列比較多的表拆分為多張表 通常我們按以下原則進行垂直拆分: 把不常用的字段單獨放在一張表; 把text,blob等大字段拆分出來放在

江湖蜜集拆分遊戲模式制度解析農場遊戲開發

註冊 好友 江湖 制度 之間 添加 強調 遊戲開發 獎勵 江湖蜜集可以築建15個蜂巢,按地塊顏色以次築建,地塊分為綠色土江湖蜜集可以築建15個蜂巢,按地塊顏色以次築建,地塊分為綠色土巢的基數作為不動產是不可交易的。 綠色土地每塊地築建蜂巢需要倉庫有300只蜜蜂,且養蜂上限為