MySql第三章,分庫分表、MyCat概述及安裝登錄

MySql第三章,分庫分表、MyCat概述及安裝登錄

先下定論,數據庫優化順序:

1、單庫單表;
2、單庫單表主從複製;
3、垂直分庫;
4、水平分區;
5、水平分表;

一、概述

1、爲什麼要分庫分表

數據庫的複製能解決訪問問題(主從複製),並不能解決大規模的併發寫入問題,由於無法進行分佈式部署,而一臺服務器的
資源(CPU、磁盤、內存、I0等)是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。要解決這個問題就要
考慮對數據庫進行分庫分表了。

2、分庫分表的優點

1、解決磁盤系統最大的文件限制

2、減少增量數據寫入時的鎖對查詢的影響,減少長時間查派造成的表鎖,影響寫入操作等鎖競爭的情況,節省排隊的時間開
支,增加吞吐量。

3、由於單表數量下降,常見的查詢操作由於減少了需要掃描的記錄,使得單表單次查詢所需的檢索行數變少,減少了磁盤
I0,時延變短。

3、什麼是分庫–垂直切分

分庫又叫垂直切分,就是把原本存儲於一個庫的表拆分存儲到多個庫上,通常是將表按照功能模塊、關係密切程度劃分出來,
部署到不同的庫上。如果數據庫是因爲表太多而造成海量數據,並且項目的各項業務邏輯劃分清晰、低耦合,那麼規則簡單朋
了、容易實施的首選就是分庫。

[如:將一個電商數據庫拆分爲:user庫、shop庫、ums庫、home庫、promo庫、manager庫等]

分庫的優點是:實現簡單,庫與庫之間界限分明,便於維護。

缺點是不利於頻繁跨庫操作,單表數據量大的問題解決不了。

3.1、分庫思路

基本的思路就是分析業務功能,以及表間的聚合關係,把關係緊密的表放在一起。

   分庫的粒度指的是在做切分時允許幾級的關聯表放在一起,這個問題對應用程序實現有着很大的影響。關聯打斷的越多,
則受影響的join操作越多,應用程序爲此做出的妥協就越大,但單表的路由會越簡單,與業務的關聯性會越小,就越容易使用
統一機制處理。

   實際的粒度掌控需要結合“業務緊密程度”和“表的數據量”兩個因素綜合考慮,一般來說:若劃歸到一起的表關係緊密,且
數據量並不大,增速也非常緩慢,則適宜放在一起,不需要再進行水平切分:若劃歸到一起的表的數據量巨大且增速迅猛,則
勢必要在分庫的基礎上再進行分表,這就意味着原單- -的庫還可能會被拆分成多個庫,這會導致更多的複雜性,-開始最好就
要考慮進去。

4、什麼是分表–水平切分

分表又叫水平切分,是按照一定的業務規則或邏輯,將一個表的數據拆分成多份,分別存儲在多個表結構一樣的表中, 這多
個表可以存在一到多個庫中。

[分表和上一章講的分區很相似,但分區是在同一個庫下的拆分。而分表是爲了將表拆分到多個不同的數據庫而設計的。]
[所以分表一般是和分庫同時進行的,對於沒有分庫的分表是毫無意義的。]

垂直分表:
將本來可以在同一個表的內容,人爲劃分爲多個表。(所謂的本來, 是指按照關係型數據庫的第三範式要求,是應該在同一個
表的。)

水平分表:
也被稱爲數據分片:是把一個表複製成同樣表結構的不同表,然後把數據按照一定的規則劃分,分別存儲到這些表中,從而保
證單表的容量不會太大,提升性能:當然這些結構一樣的表,可以放在一個或多個數據庫中。

分表的優點是:能解決分庫的不足點,但是缺點是實現起來比較複雜,特別是分表規則的劃分,程序的編寫,以及後期的數據庫拆分移植維護。

一般都是先分庫再分表,兩者結合使用,取長補短,這樣能發揮擴展的最大優勢,但是缺點是架構很大,很複雜,應用程序的編寫也比較複雜。

4.1、分表思路

對於垂直分表:
通常是按照業務功能的使用頻次,把主要的、熱門的字段放在一起做爲主要表:然後把不常用的,按照各自的業務屬性進行聚
集,拆分到不同的次要表中:主要表和次要表的關係一般都是一 -對-的。


對於水平分表:
通常是按照具體的業務規則和數據的格式,選擇能夠把數據進行合理拆分的業務數據做爲拆分標準,以此來對數據進行拆分。
常見的一些拆分方式:按業務屬性、按時間、按區間、Hash、 按數據的活躍度、按數據量等,不管採用什麼方式,都要結合
具體的業務場景進行分析和考量。

二、水平分表

1、面臨問題

水平分表的實現面臨一系列問題:切分策略、庫節點路由、表路由、全局主鍵生成、
跨節點排序/分組/分頁/表關聯等操作、多數據源事務處理、數據庫擴容等。

2、相關開源方案

1: MySQL Fabric: 官方產品,非代理方式,目前不太穩定,性能也不夠好,但很有前景,綜合了HA和水平分表的功能,是未來的首選。

2: Atlas: 360開源,代理方式,基於MySQL -Proxy二次開發的,主要支持兩個特性:分表和讀寫分離,但是分表的話只支持單庫多表,事實上是不支持分佈式分表的

3: Cobar: 阿里開源,代理方式,支持分佈式分表,但是不支持單庫分多表,不支持讀寫分離,事務支持也比較麻煩

4、kingshard由小團隊用go語言開發,還需要發展,需要不斷完善。

5、Vitess是Youtube生產在使用,架構很複雜。不支持MySQL原生協議,使用需要大量改造成本。。

6、MaxScale是mariadb (MySQL原作者維護的一個版本) 研發的中間件。

7、MySQLRoute是MySQL官方Oracle公司發佈的中間件。

8: MySQL Proxy: 官方提供,基於MySQL協議接口,主要提供負載平衡,讀寫分離,failover等, 但性能較差,不支持大數據量的分庫分表

9: Amoeba: 支持分數據庫實例,每個數據相同的表,不支持事務;類似MySQL Proxy,相對更簡單

10: Hibernate Shards: 支持分數據庫實例,比較複雜,需事先規劃數據規模,對HQL的支持非常有限

11: mybatis shardbatis: 主要通過插件機制來實現分表,但是插件機制控制不到多數據源的連接:離開插件層又失去了對sql進行集中解析和路由的機會

12:Mycat是開源社區在阿里cobar基礎上進行二次開發,解決了cobar存在的問題,並且加入了許多新的功能在其中。青出於藍而勝子藍。


10: sharding-jdbc

三、MyCat簡述

1、功能作用

1.1、讀寫分離

在這裏插入圖片描述

1.2、數據分片

垂直拆分(分庫)、 水平拆分(分表)、 垂直+水平拆分(分庫分表)

在這裏插入圖片描述

1.3、多數據源整合

在這裏插入圖片描述

2、原理

Mycat的原理中最重要的-一個動詞是“攔截”,它攔截了用戶發送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分
片分析、路由分析、讀寫分離分析、緩存分析等,然後將此SQL發往後端的真實數據庫,並將返回的結果做適當的處理I最終再
返回給用戶。

這種方式把數據庫的分佈式從代碼中解耦出來,程序員察覺不出來後臺使用Mycat還是MySQL。

在這裏插入圖片描述

3、安裝

3.1、mycat安裝

##一般安裝包 下載  至  opt 目錄下
##解壓後,安裝的文件 放至 /usr/local

1、下載
wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

2、解壓 
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat /usr/local

3、主要配置文件
schema.xml		定義邏輯庫,表、分片節點等內容【節點】
rule.xml		定義分片規則【規則】
server.xml		定義用戶以及系統相關變量,如端口等

3.2、server.xml配置

##mycat對外暴露的邏輯MySQL,name爲用戶名、password爲用戶密碼、schemas爲邏輯數據庫名稱

<user name="mycat">
    <property name="password">mycat</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>

3.3、schema.xml配置

其中:

schema:mycat對外暴露的邏輯庫

dataNode:MySQL對應的數據庫

dataHost:MySql對應的主從名稱

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

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>

    	<!--指定庫名-->
        <dataNode name="dn1" dataHost="host1" database="mycatdb" />
        <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
            	<!--寫節點-->
                <writeHost host="hostM1" url="192.168.0.111:3306" user="root"
                                   password="admin123">
                    <!--讀節點-->    
                    <readHost host="hostS1" url="192.168.0.107:3306" user="root" password="admin123" />
                </writeHost>
        </dataHost>

</mycat:schema>

4、啓動

##mycat bin目錄

##控制檯啓動------能看到啓動日誌,方便定位問題
./mycat console

##後臺啓動
./mycat start

5、登錄

##1、登錄後臺管理窗口---維護

mysql -umycat -pmycat -P 9066 -h 192.168.0.111		##在server.xml中設置的賬號密碼

[常用命令:show database;   show @@help;]

##2、登錄數據窗口
mysql -umycat -pmycat -P 8066 -h 192.168.0.111

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章