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)行主從同步的功能蛤奥。
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ù)上面蚀同,如下圖
優(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ù)中
2.MYCAY的關(guān)鍵特性:
- 支持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í)別等桃纯。
- 支持MYSQL集群:一主多從,一主一從披坏,多主多從等态坦。
- 支持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
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"
3.Mycat的相關(guān)配置
schema.xml
rule.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)