一掏父、MyCat
? ? 1.簡介
????????MyCat是目前最流行的基于Java語言編寫的數(shù)據(jù)庫中間件鸯匹,是要給實(shí)現(xiàn)了MySQL協(xié)議的服器渺氧,前端用戶可以把它看作是一個(gè)數(shù)據(jù)庫代理洞渔,用MySQL客戶端工具和命令行訪問嫂沉,而其后端可以用MySQL原生協(xié)議與多個(gè)MySQL服務(wù)器通信稽寒,也可以同JDBC協(xié)議與大多數(shù)主流數(shù)據(jù)庫服務(wù)器通信,其核心功能是分庫分表趟章,配合數(shù)據(jù)庫的主從模式還可以實(shí)現(xiàn)讀寫分離
????????MyCat 是基于阿里開源的 Cobar 產(chǎn)品而研發(fā)杏糙,Cobar 的穩(wěn)定性、可靠性蚓土、優(yōu)秀的架構(gòu)和 性能以及眾多成熟的使用案例使得 MyCat 變得非常的強(qiáng)大宏侍。????
????????MyCat 發(fā)展到目前的版本,已經(jīng)不是一個(gè)單純的 MySQL 代理了蜀漆,它的后端可以支持 MySQL谅河、SQL Server、Oracle确丢、DB2旧蛾、PostgreSQL 等主流數(shù)據(jù)庫,也支持 MongoDB 這種新型 NoSQL 方式的存儲蠕嫁,未來還會支持更多類型的存儲锨天。而在最終用戶看來,無論是那種存儲方 式剃毒,在 MyCat 里病袄,都是一個(gè)傳統(tǒng)的數(shù)據(jù)庫表,支持標(biāo)準(zhǔn)的 SQL 語句進(jìn)行數(shù)據(jù)的操作赘阀,這樣一來益缠,對前端業(yè)務(wù)系統(tǒng)來說,可以大幅降低開發(fā)難度基公,提升開發(fā)速度幅慌。
????????MyCat 官網(wǎng):http://www.mycat.io/
? ? 2.MyCate的優(yōu)勢
????數(shù)據(jù)量級
????????單一的 MySQL 其數(shù)據(jù)存儲量級和操作量級有限. Mycat 可以管理若干 MySQL 數(shù)據(jù)庫,同時(shí)實(shí)現(xiàn)數(shù)據(jù)的存儲和操作.
????開源性質(zhì)
????????Mycat 是 java 編寫的中間件. 開源,免費(fèi). 有非常多的人和組織對 Mycat 實(shí)行開發(fā),維護(hù),管理,更新. Mycat 版本提升較快,可以跟隨環(huán)境發(fā)展.如果有問題,可以快速解決. Mycat有開源網(wǎng)站和開源社區(qū).且有官方發(fā)布的電子書籍. Mycat 是阿里原應(yīng)用 corba 轉(zhuǎn)型而來的.
????市場應(yīng)用
????????2015 年左右,Mycat 在互聯(lián)網(wǎng)應(yīng)用中占比非常高.
? ??使用MyCat后的結(jié)構(gòu)圖
二、MyCat中的概念
? ??1.切分:邏輯上的切分轰豆,在物理層面胰伍,是使用多庫【database】齿诞,多表【table】實(shí)現(xiàn)的切分
????2.縱向切分/垂直切分:就是把原本存儲于一個(gè)庫的數(shù)據(jù)存儲到多個(gè)庫上
????????由于對數(shù)據(jù)的讀寫都是對一個(gè)庫進(jìn)行操作,所以單庫并不能解決大規(guī)模并發(fā)寫入的問題
????????例如:我們會建立定義數(shù)據(jù)庫workDB骂租、商品數(shù)據(jù)庫payDB祷杈、用戶數(shù)據(jù)庫userDB、日期數(shù)據(jù)庫logDB等渗饮,分別用戶存儲項(xiàng)目數(shù)據(jù)定義表但汞、商品定義表、用戶數(shù)據(jù)表互站、日志數(shù)據(jù)表等私蕾。
????優(yōu)點(diǎn):
????????1)減少增量數(shù)據(jù)寫入時(shí)的鎖對查詢的影響;
????????2)由于單表數(shù)量下降胡桃,常見的操作由于減少了需要掃描的記錄踩叭,使得單表單詞查詢所需的檢索行數(shù)變少,減少了磁盤IO,時(shí)延變短标捺。
? ? 2.橫向切分/水平切分:把原本存儲于一個(gè)表的數(shù)據(jù)分塊存儲到多個(gè)表上,當(dāng)一個(gè)表中的數(shù)據(jù)量過大時(shí)揉抵,我們可以把該表的數(shù)據(jù)按照某種規(guī)則進(jìn)行劃分亡容,然后存儲到多個(gè)結(jié)構(gòu)相同的表,和不同的庫上冤今。
????例如闺兢,我們 userDB 中的 userTable 中數(shù)據(jù)量很大,那么可以把 userDB 切分為結(jié)構(gòu)相同 的多個(gè) userDB:part0DB戏罢、part1DB 等屋谭,再將userDB 上的 userTable,切分為很多userTable: userTable0龟糕、userTable1等桐磁,然后將這些表按照一定的規(guī)則存儲到多個(gè) userDB 上。
????優(yōu)點(diǎn):
????????1)單表的并發(fā)能力提高了讲岁,磁盤 I/O 性能也提高了我擂。
????????2)如果出現(xiàn)高并發(fā)的話,總表可以根據(jù)不同的查詢缓艳,將并發(fā)壓力分到不同的小表里面校摩。? 缺點(diǎn):無法實(shí)現(xiàn)表連接查詢
????????邏輯庫—Schema:MyCat中定義的database是邏輯存在的,在物理上是不存在的阶淘,主要是針對縱向切分提供的概念衙吩。
? ??????邏輯表—table:MyCat中定義的table是邏輯存在的,在物理上是不存在的溪窒,主要是針對橫向切分提供的概念坤塞。
????????數(shù)據(jù)主機(jī)—dataHost:物理MySQL存放的主機(jī)地址冯勉,可以使用主機(jī)名,IP尺锚,域名定義珠闰。
? ??????數(shù)據(jù)節(jié)點(diǎn)—dataNode:配置物理的database,數(shù)據(jù)保存的物理節(jié)點(diǎn)就是瘫辩,database
? ??????分片規(guī)則:當(dāng)控制數(shù)據(jù)的時(shí)候伏嗜,如何訪問物理database和table,就是訪問dataHost和dataNode的算法
????????在MyCat處理具體的數(shù)據(jù)CRUD的時(shí)候伐厌,如何訪問dataHost和dataNode的算法
????????如:哈希算法承绸,crc32算法等。
? ??常用工具的默認(rèn)端口:
????????MySQL 默認(rèn)端口是3306
????????Mycat 默認(rèn)端口是8066
????????tomcat 默認(rèn)端口是8080
????????Oracle 默認(rèn)端口是1521
????????nginx 默認(rèn)端口是80
????????http 協(xié)議默認(rèn)端口80
????????redis 默認(rèn)端口6379
三挣轨、讀寫分離
? ? 1.讀寫分離原理:需要搭建主從模式军熏,讓主數(shù)據(jù)庫(master)處理事務(wù)性增、刪卷扮、改操作(INSERT荡澎、UPDATE、DELETE)晤锹,而從數(shù)據(jù)庫(slave)處理SELECT查詢操作
????主從備份:就是一種主備模式的數(shù)據(jù)庫應(yīng)用
????????主庫(Master)數(shù)據(jù)和從庫/備庫(Slave)數(shù)據(jù)完全一致摩幔,實(shí)現(xiàn)數(shù)據(jù)的多重備份,保證數(shù)據(jù)的安全
????????可以在Master【InnoDB】和Slave[MyISAM]中使用不同的數(shù)據(jù)庫引擎鞭铆,實(shí)現(xiàn)讀寫的分離
????主從備份目的:
????????1.保證數(shù)據(jù)安全或衡,盡量避免數(shù)據(jù)丟失的可能
????????2.實(shí)現(xiàn)讀寫分離,使用不同的數(shù)據(jù)庫引擎车遂,實(shí)現(xiàn)讀寫分離封断,提高所有的操作效率,InnoDB使用DML語法操作舶担,MyISAM使用DQL語法操作
????主從備份模式實(shí)現(xiàn)數(shù)據(jù)同步
????????所有對 Master 的操作,都會同步到 Slave 中. 如果 Master 和 Salve 天生上環(huán)境不同 , 那么對 Master的操作 , 可能會在Slave中出現(xiàn)錯(cuò)誤
????如:
????????在創(chuàng)建主從模式之前 ,Master有 database : db1, db2, db3. Slave有database:db1, db2.
????????創(chuàng)建主從模式 . 現(xiàn)在的情況Master和 Slave天生不同
????????主從模式創(chuàng)建成功后 , 在Master中 drop
????????database db3. Slave中拋出數(shù)據(jù)庫 SQL異常. 后續(xù)所有的命令不能同步 .
????????一旦出現(xiàn)錯(cuò)誤 . 只能重新實(shí)現(xiàn)主從模式
????????主從模式下的邏輯圖:
四坡疼、創(chuàng)建主從模式
????1.首先準(zhǔn)備準(zhǔn)備兩個(gè)虛擬機(jī),配置好基本環(huán)境衣陶,兩個(gè)分別安裝好mysql數(shù)據(jù)庫回梧,這里的主庫使用192.168.199.129環(huán)境,從庫使用192.168.199.133
????2.Master【主庫】配置
????????2.1修改/ect/my.cnf文件祖搓,配置server_id狱意,和log_bin的值,然后重啟mysql
????????2.2訪問mysql拯欧,執(zhí)行命令详囤,直接創(chuàng)建從節(jié)點(diǎn)用戶,然后刷新權(quán)限
????????grant all privileges on *.* to 'myslave'@'192.168.199.133'identified by 'myslave' with grant option;
????????2.3查看用戶藏姐,查看Master信息????切換到mysql數(shù)據(jù)庫隆箩,查看用戶信息
????????show master status;查看Master信息
????3.Slave【從庫】配置
????????3.1先修改/etc/my.cnf配置文件,添加唯一標(biāo)識server_id羔杨,唯一標(biāo)識的值要大于Master庫的值
????????3.2然后重啟mysql服務(wù)捌臊,配置Slave,首先停止Slave兜材,配置主庫信息理澎,再啟動Slave
????配置Slave
????????執(zhí)行命令配置從庫信息:change????master????to????master_host=’ip’,master_user=’username’,master_password=’password’,master_log_file=’log_file_name‘;
????????3.3可以使用show slave status \G曙寡;查看Slave配置
????4.測試主從糠爬,注意:主庫中的數(shù)據(jù)庫和表以及從庫中的數(shù)據(jù)庫和表要相同
????????然后在主庫中添加數(shù)據(jù),會自動同步到從庫中
????????在從庫中查看
五举庶、安裝MyCat
????1.下載MyCat For Linux的tar包
????2.解壓并指定位置
????3.啟動測試
六执隧、MyCat的分片規(guī)則以及分庫注意事項(xiàng)
????以 500 萬為單位,實(shí)現(xiàn)分片規(guī)則.
????????邏輯庫 A 對應(yīng) dataNode - db1 和 db2. 1-500 萬保存在 db1 中, 500 萬零 1 到 1000 萬保存在 db2 中,1000 萬零 1 到 1500 萬保存在 db1 中.依次類推
? ??????crc32slot的分片規(guī)則:在 CRUD 操作時(shí),根據(jù)具體數(shù)據(jù)的 crc32 算法計(jì)算,數(shù)據(jù)應(yīng)該保存在哪一個(gè) dataNode 中
????配置分片規(guī)則時(shí)需要注意:
????????1)<columns>id</columns>中推薦配置主鍵列
????????2)所有的 tableRule 只能使用一次。如果需要為多個(gè)表配置相同的分片規(guī)則户侥,那么需要在此重新定義該規(guī)則镀琉。
????????3)在 crc32Slot 算法中的分片數(shù)量一旦給定,MyCat 會將該分片數(shù)量和 slor 的取值范圍保存到文中蕊唐。在次修改分片數(shù)量時(shí)是不會生效的屋摔,需要將該文件刪除。文件位置位于 conf 目錄中的 ruledata 目錄中
????使用MyCat分庫時(shí)需要注意:
????????1)使用 MyCat 實(shí)現(xiàn)分庫時(shí)刃泌,先在 MyCat 中定義邏輯庫與邏輯表凡壤,然后在 MyCat 的鏈接 中執(zhí)行創(chuàng)建表的命令必須要在 MyCat 中運(yùn)行署尤。因?yàn)?MyCat 在創(chuàng)建表時(shí)耙替,會在表中添加一個(gè) 新的列,列名為_slot曹体。
????????2)使用 MyCat 插入數(shù)據(jù)時(shí)俗扇,語句中必須要指定所有的列。即便是一個(gè)完全項(xiàng)插入也不 允許省略列名箕别。
? ??在MyCat中配置分庫
????然后在rule.xml中配置