myCat基礎(chǔ)(實(shí)現(xiàn)讀寫分離)

MYCAT的主要作用:

1. MYCAT是實(shí)現(xiàn)了MySQL通信協(xié)議的一個(gè)分布式數(shù)據(jù)庫系統(tǒng)中間層。

數(shù)據(jù)庫中間層的作用:數(shù)據(jù)庫讀寫分離、讀負(fù)載均衡、數(shù)據(jù)庫連接池(控制數(shù)據(jù)庫的連接數(shù)量)、屏蔽后端數(shù)據(jù)庫的變更(水平拆分和垂直拆分),對關(guān)系型數(shù)據(jù)庫非關(guān)系型數(shù)據(jù)庫進(jìn)行操作。

什么是中間層

2. 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,MYCAT支持讀負(fù)載均衡,多出現(xiàn)在一主多從的架構(gòu)上,讀操作可以在多個(gè)從服務(wù)器上進(jìn)行均衡。MYCAT還支持后端MySQL主從復(fù)制集群高可用。

讀寫分離原理 一主一從

這里的高可用:指的是可以在配置的時(shí)候,除了主節(jié)點(diǎn)之外,在指定一臺(tái)從節(jié)點(diǎn)也可以支持寫的功能,當(dāng)主節(jié)點(diǎn)宕機(jī)之后,MYCAT會(huì)把寫的SQL路由到我們在配置文件中指定的從節(jié)點(diǎn)上,并且并不支持把其他的從節(jié)點(diǎn)設(shè)置為新的主節(jié)點(diǎn)進(jìn)行主從同步的功能。

未做數(shù)據(jù)拆分

3.實(shí)現(xiàn)數(shù)據(jù)庫的垂直拆分:專庫專用

一個(gè)數(shù)據(jù)庫由很多表的構(gòu)成,每個(gè)表對應(yīng)著不同的業(yè)務(wù),垂直切分是指按照業(yè)務(wù)將表進(jìn)行分類,分布到不同的數(shù)據(jù)庫上面,這樣也就將數(shù)據(jù)或者說壓力分擔(dān)到不同的庫上面,如下圖

數(shù)據(jù)庫的垂直拆分

優(yōu)點(diǎn):

    1. 拆分后業(yè)務(wù)清晰,拆分規(guī)則明確。
    2. 系統(tǒng)之間整合或擴(kuò)展容易。
    3. 數(shù)據(jù)維護(hù)簡單。

缺點(diǎn):

    1. 部分業(yè)務(wù)表無法join,只能通過接口方式解決,提高了系統(tǒng)復(fù)雜度。
    2. 受每種業(yè)務(wù)不同的限制存在單庫性能瓶頸,不易數(shù)據(jù)擴(kuò)展跟性能提高。
    3. 事務(wù)處理復(fù)雜。

4.實(shí)現(xiàn)數(shù)據(jù)庫的水平拆分: 垂直拆分后遇到單機(jī)瓶頸,可以使用水平拆分。

相對于垂直拆分的區(qū)別是:垂直拆分是把不同的表拆到不同的數(shù)據(jù)庫中,而水平拆分是把同一個(gè)表拆到不同的數(shù)據(jù)庫中。


水平拆分

優(yōu)點(diǎn):

    1. 不存在單庫大數(shù)據(jù),高并發(fā)的性能瓶頸。
    2. 對應(yīng)用透明,應(yīng)用端改造較少。     
    3. 按照合理拆分規(guī)則拆分,join操作基本避免跨庫。
    4. 提高了系統(tǒng)的穩(wěn)定性跟負(fù)載能力。

缺點(diǎn):

    1. 拆分規(guī)則難以抽象。
    2. 分片事務(wù)一致性難以解決。
    3. 數(shù)據(jù)多次擴(kuò)展難度跟維護(hù)量極大。
    4. 跨庫join性能較差。

5.兩種方式共同缺點(diǎn)

    1. 引入分布式事務(wù)的問題。
    2. 跨節(jié)點(diǎn)Join 的問題。
    3. 跨節(jié)點(diǎn)合并排序分頁問題。

針對數(shù)據(jù)源管理,目前主要有兩種思路:

   A. 客戶端模式,在每個(gè)應(yīng)用程序模塊中配置管理自己需要的一個(gè)(或者多個(gè))數(shù)據(jù)源,直接訪問各個(gè) 數(shù)據(jù)庫,在模塊內(nèi)完成數(shù)據(jù)的整合。 
    優(yōu)點(diǎn):相對簡單,無性能損耗。   
    缺點(diǎn):不夠通用,數(shù)據(jù)庫連接的處理復(fù)雜,對業(yè)務(wù)不夠透明,處理復(fù)雜。

   B. 通過中間代理層來統(tǒng)一管理所有的數(shù)據(jù)源,后端數(shù)據(jù)庫集群對前端應(yīng)用程序透明;   
    優(yōu)點(diǎn):通用,對應(yīng)用透明,改造少。   
    缺點(diǎn):實(shí)現(xiàn)難度大,有二次轉(zhuǎn)發(fā)性能損失。

拆分原則

    1. 盡量不拆分,架構(gòu)是進(jìn)化而來,不是一蹴而就。(SOA)
    2. 最大可能的找到最合適的切分維度。
    3. 由于數(shù)據(jù)庫中間件對數(shù)據(jù)Join 實(shí)現(xiàn)的優(yōu)劣難以把握,而且實(shí)現(xiàn)高性能難度極大,業(yè)務(wù)讀取  盡量少使用多表Join -盡量通過數(shù)據(jù)冗余,分組避免數(shù)據(jù)垮庫多表join。
    4. 盡量避免分布式事務(wù)。
    5. 單表拆分到數(shù)據(jù)1000萬以內(nèi)。

切分方案

    范圍、枚舉、時(shí)間、取模、哈希、指定等

案例分析

場景:
建立一個(gè)商城訂單系統(tǒng),保存用戶訂單信息。

分析:
電商系統(tǒng)
一號(hào)店或京東類?淘寶或天貓?
實(shí)時(shí)性要求高
存在瞬時(shí)壓力
基本不存在大規(guī)模分析
數(shù)據(jù)規(guī)模?
機(jī)器資源有多少?
維度?商品?用戶?商戶?

方案1:按照用戶取模,
帶來的問題:后續(xù)擴(kuò)容困難

方案2:按用戶ID范圍分片(1-1000萬=分片1,xxx)
帶來的問題:用戶活躍度無法掌握,可能存在熱點(diǎn)問題

方案3:按省份地區(qū)或者商戶取模
數(shù)據(jù)分配不一定均勻

原文鏈接:https://blog.csdn.net/jerome_s/article/details/52492616

MYCAT的基本概念:

1. MYCAT中的數(shù)據(jù)庫——邏輯庫,邏輯表

位于中間層,它屏蔽了分庫、分表后,數(shù)據(jù)庫操作的復(fù)雜性。前端應(yīng)用可以像使用一個(gè)未分庫、分表的數(shù)據(jù)庫一樣來使用分庫、分表的數(shù)據(jù)庫(數(shù)據(jù)庫路由等都是由中間件實(shí)現(xiàn))
user_db是邏輯數(shù)據(jù)庫
db01db02、db03是物理數(shù)據(jù)庫
注意: mycat中只保存邏輯庫的定義,不保存數(shù)據(jù),具體的數(shù)據(jù)存儲(chǔ)在物理數(shù)據(jù)庫中

邏輯庫

邏輯表

2.MYCAY的關(guān)鍵特性:

  1. 支持sql92標(biāo)準(zhǔn):sql92標(biāo)準(zhǔn)是大多數(shù)關(guān)系型數(shù)據(jù)庫都支持的一個(gè)SQL標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)中定義了SQL語句的一些功能和標(biāo)準(zhǔn)的一些事務(wù)的特性,比如說隔離級(jí)別等。
  2. 支持MYSQL集群:一主多從,一主一從,多主多從等。
  3. 支持JDBC連接數(shù)據(jù)庫:可以通過JDBC來連接除了MySQL之外的其他關(guān)系型數(shù)據(jù)庫,比如Oracle,MSSQL,SqlServer,PgSQL等

使用MYCAT

1.安裝MYCATlinux

安裝java環(huán)境(已安裝 忽略
安裝mycat

wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
adduser mycat
tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
mv mycat /usr/local/
cd  /usr/local/
chown mycat:mycat -R mycat
ls -lh
權(quán)限管理
vi /etc/profile
export MYCAT_HOME=/usr/local/mycat
source /etc/profile

2.啟動(dòng)MYCAT

su mycat
cd /usr/local/mycat/bin
sh startup_nowrap.sh

可能會(huì)因?yàn)閮?nèi)存不足而報(bào)錯(cuò),修改啟動(dòng)文件參數(shù)
JAVA_OPTS="-server -Xms1G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G"

mycat進(jìn)程

3.Mycat的相關(guān)配置

配置信息

schema.xml
schema.xml

rule.xml
rule.xml

server.xml
server.xml

4.實(shí)現(xiàn)讀寫分離

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
  <schema name="DEVDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  </schema>

  <dataNode name="dn1" dataHost="node1" database="dev" />
  <dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
          <heartbeat>select user()</heartbeat>
          <writeHost host="49.235.110.134" url="49.235.110.134:3306" user="root" password="root">
                  <readHost host="203.195.224.113" url="203.195.224.113:3306" user="root" password="root" />
          </writeHost>
          <writeHost host="203.195.224.113" url="203.195.224.113:3306" user="root" password="root" />
  </dataHost>
</mycat:schema>

server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="nonePasswordLogin">0</property>
        <property name="useHandshakeV10">1</property>
        <property name="useSqlStat">0</property>
        <property name="useGlobleTableCheck">0</property>

        <property name="sequnceHandlerType">2</property>
        <property name="subqueryRelationshipCheck">false</property>
        <property name="processorBufferPoolType">0</property>
        <!--
                       自定義 開始
        -->
        <property name="serverPort">3300</property>
        <property name="managerPort">9066</property>
        <!--
                       自定義 結(jié)束
        -->
        <property name="handleDistributedTransactions">0</property>
        <property name="useOffHeapForMerge">1</property>
        <property name="memoryPageSize">64k</property>
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <property name="systemReserveMemorySize">384m</property>
        <property name="useZKSwitch">false</property>
        </system>

        <user name="root" defaultAccount="true">
          <property name="password">root</property>
          <property name="schemas">DEVDB</property>
        </user>

        <user name="user">
          <property name="password">user</property>
          <property name="schemas">DEVDB</property>
          <property name="readOnly">true</property>
        </user>
</mycat:server>

測試

mysql -uroot -p -P3300 -h127.0.0.1
mysql> use DEVDB
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> select * from stu;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  5 | lili |  18 |
+----+------+-----+
1 row in set (0.00 sec)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容