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)行主從同步的功能。

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)到不同的庫上面,如下圖

優(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ù)庫
db01、db02、db03是物理數(shù)據(jù)庫
注意: mycat中只保存邏輯庫的定義,不保存數(shù)據(jù),具體的數(shù)據(jù)存儲(chǔ)在物理數(shù)據(jù)庫中


2.MYCAY的關(guān)鍵特性:
- 支持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í)別等。
- 支持MYSQL集群:一主多從,一主一從,多主多從等。
- 支持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

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>
測試
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)