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

MYCAT的主要作用:

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

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

什么是中間層

2. 實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫分離镐躲,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路由到我們?cè)谂渲梦募兄付ǖ膹墓?jié)點(diǎn)上入录,并且并不支持把其他的從節(jié)點(diǎn)設(shè)置為新的主節(jié)點(diǎn)進(jìn)行主從同步的功能蛤奥。

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

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

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

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

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

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

缺點(diǎn):

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

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

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


水平拆分

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

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

缺點(diǎn):

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

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

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

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

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

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

拆分原則

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

切分方案

    范圍间唉、枚舉绞灼、時(shí)間、取模呈野、哈希低矮、指定等

案例分析

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

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

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

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

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

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

MYCAT的基本概念:

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

位于中間層皂甘,它屏蔽了分庫(kù)玻驻、分表后,數(shù)據(jù)庫(kù)操作的復(fù)雜性偿枕。前端應(yīng)用可以像使用一個(gè)未分庫(kù)璧瞬、分表的數(shù)據(jù)庫(kù)一樣來(lái)使用分庫(kù)、分表的數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)路由等都是由中間件實(shí)現(xiàn))
user_db是邏輯數(shù)據(jù)庫(kù)
db01渐夸、db02嗤锉、db03是物理數(shù)據(jù)庫(kù)
注意: mycat中只保存邏輯庫(kù)的定義,不保存數(shù)據(jù)墓塌,具體的數(shù)據(jù)存儲(chǔ)在物理數(shù)據(jù)庫(kù)中

邏輯庫(kù)

邏輯表

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

  1. 支持sql92標(biāo)準(zhǔn):sql92標(biāo)準(zhǔn)是大多數(shù)關(guān)系型數(shù)據(jù)庫(kù)都支持的一個(gè)SQL標(biāo)準(zhǔn)档冬,這個(gè)標(biāo)準(zhǔn)中定義了SQL語(yǔ)句的一些功能和標(biāo)準(zhǔn)的一些事務(wù)的特性,比如說(shuō)隔離級(jí)別等桃纯。
  2. 支持MYSQL集群:一主多從,一主一從披坏,多主多從等态坦。
  3. 支持JDBC連接數(shù)據(jù)庫(kù):可以通過(guò)JDBC來(lái)連接除了MySQL之外的其他關(guān)系型數(shù)據(jù)庫(kù),比如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>

測(cè)試

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伞梯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帚屉,更是在濱河造成了極大的恐慌谜诫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攻旦,死亡現(xiàn)場(chǎng)離奇詭異喻旷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)牢屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門且预,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)槽袄,“玉大人,你說(shuō)我怎么就攤上這事锋谐”槌撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵涮拗,是天一觀的道長(zhǎng)乾戏。 經(jīng)常有香客問我,道長(zhǎng)三热,這世上最難降的妖魔是什么鼓择? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮康铭,結(jié)果婚禮上惯退,老公的妹妹穿的比我還像新娘。我一直安慰自己从藤,他們只是感情好催跪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夷野,像睡著了一般懊蒸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悯搔,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天骑丸,我揣著相機(jī)與錄音,去河邊找鬼妒貌。 笑死通危,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灌曙。 我是一名探鬼主播菊碟,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼在刺!你這毒婦竟也來(lái)了逆害?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚣驼,失蹤者是張志新(化名)和其女友劉穎魄幕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颖杏,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纯陨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片队丝。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡馁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出机久,到底是詐尸還是另有隱情臭墨,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布膘盖,位于F島的核電站胧弛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侠畔。R本人自食惡果不足惜结缚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望软棺。 院中可真熱鬧红竭,春花似錦、人聲如沸喘落。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瘦棋。三九已至稀火,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赌朋,已是汗流浹背凰狞。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沛慢,地道東北人赡若。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像团甲,于是被迫代替她去往敵國(guó)和親斩熊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容