① mycat同時操作多個mysql資料庫
用戶製作資料庫的分庫分表,Mycat軟體壓縮包,加壓後即可使用。
多資料庫安裝、mycat部署安裝、資料庫之讀寫分離主從復制、資料庫之雙主多重、資料庫分庫分表。
資料庫集群的方式有多種,前面的介紹的一種是主從復制,讀寫分離,這一種方式在一般的系統已經夠用了,但是對系統可用性要求很高的系統,這樣是會有缺陷的,原因是:主只有一個,萬一主掛了呢?那系統的所有讀操作都將被中斷,系統不能提供寫服務,當重掛了,系統不同提高讀服務,所以無論那一台資料庫掛了,系統都會受到影響。對於高可用的系統,那是不行的,比如:電商系統等等。
② 用Mycat需要注意什麼
實習的時候,在一個項目當中,項目經理要求把原先的MySQL數據連接基於mycat來進行改造 。當時就在想MyCat是什麼東西?為什麼要用它呢?
*一、什麼是MyCat: MyCat是一個開源的分布式資料庫系統,是一個實現了MySQL協議的伺服器,前端用戶可以把它看作是一個資料庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL伺服器通信,也可以用JDBC協議與大多數主流資料庫伺服器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在後端MySQL伺服器里或者其他資料庫里。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat里,都是一個傳統的資料庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度
二、那麼為什麼要用到MyCat呢?
*例如操作系統是對各類計算機硬體的抽象。那麼我們什麼時候需要抽象?假如只有一種硬體的時候,我們需要開發一個操作系統嗎? 再比如一個項目只需要一個人完成的時候不需要leader,但是當需要幾十人完成時,就應該有一個管理者,發揮溝通協調等作用,而這個管理者對於他的上層來說就是對項目組的抽象。 同樣的,當我們的應用只需要一台資料庫伺服器的時候我們並不需要Mycat,而如果你需要分庫甚至分表,這時候應用要面對很多個資料庫的時候,這個時候就需要對資料庫層做一個抽象,來管理這些資料庫,而最上面的應用只需要面對一個資料庫層的抽象或者說資料庫中間件就好了,這就是Mycat的核心作用。 所以可以這樣理解:資料庫是對底層存儲文件的抽象,而Mycat是對資料庫的抽象。*
注意事項:
(1)、原始表的自增主鍵{AUTO_INCREMENT=1446}值,就是之前用掉的值,要去掉。新庫按照新的來
(2)、{CREATE TABLE IF NOT EXISTS `e_impoverish` } 改成 {CREATE TABLE `e_impoverish` (}。mycat沒有判斷是否存在的功能
(3)、DROP TABLE IF EXISTS `onlinenum`; 這種格式是支持的。
(4)、全局表,字典表:可能會在其他表中存有其id欄位的值。所以這些表id也要導過來。
(5)、業務表的id最好也導入過來,避免重新生成導致關聯對不上的情況。
(6)、全局表、跨庫分表都要用全局序列。單庫單業務,不和其他關聯的表;可以用資料庫自帶的自增主鍵。
③ mycat 分庫 之後 查詢語句怎麼寫
cat是怎樣實現分庫分表的?
mycat裡面通過定義路由規則來實現分片表(路由規則裡面會定義分片欄位,以及分片演算法)。分片演算法有多種,你所說的hash是其中一種,還有取模、按范圍分片等等。在mycat裡面,會對所有傳遞的sql語句做路由處理(路由處理的依據就是表是否分片,如果分片,那麼需要依據分片欄位和對應的分片演算法來判斷sql應該傳遞到哪一個、或者哪幾個、又或者全部節點去執行)
2. mycat適用於哪些場景?相對於海量存儲的Nosql的適用場景又如何?
數據量大到單機hold不住,而
④ MYSQL CLUSTER VS MYCAT,哪個更好
根據業務場景來選擇,二者優點:
1、MYSQL CLUSTER,這個是MYSQL的官方集群方案,直接在資料庫級別支持ndb網路節點,自動分片,自動join,單機故障不影響集群;
2、MYCAT,這個是基於阿里巴巴的Cobar方案優化而來,其支持團隊也挺賣力的,支持半自動化分片、join。為什麼叫「半自動化」呢?因為需要DBA對每個表的分片策略進行配置和干涉。個人感覺沒有方案1的傻瓜式分片簡單。
⑤ mysql里的大表用mycat做水平拆分,是不是要先手動分好,再配置mycat
將所有數據都遷移到mycat中,一共有4個資料庫,blog01,blog02,blog_article01,blog_article02。
article,article_tags分別在blog_article01,blog_article02,按照uid進行水平拆分。
user_info表在blog01,link,category,tag在blog02資料庫中。
⑥ mysql分片和分區的區別
當資料庫表中數據量能夠被預測到將會非常大,或者已經擁有龐大的數據時,我們應該選擇分表或者分區(即使用多個資料庫)來解決數據訪問時的性能問題。如果單機的cpu能夠承受站點的並發數,應該選擇分表的方式,因為分表相對簡單,容易實現scale,而且涉及到多表連接時,分區是不能直接使用join的。但如果站點並發數太大,需要多個cpu來訪問多個資料庫是無疑的,這時需要選擇分區的方式。
⑦ mycat 可以支持嵌套分區嗎
可以用。如果分表,主表和子表必須根據關聯條件分配在相同分片中,或者採用全局表策略來避免跨分片join。
⑧ 請教mysql表分區後性能問題
當分片索引不是純整型的字元串時,只接受整型的內置 hash 演算法是無法使用的。為此,stringhash 按照用戶定義的起點和終點去截取分片索引欄位中的部分字元,根據當中每個字元的二進制 unicode 值換算出一個長整型數值,然後就直接調用內置 hash 演算法求解分片路由:先求模得到邏輯分片號,再根據邏輯分片號直接映射到物理分片。
用戶需要在 rule.xml 中定義 partitionLength[] 和 partitionCount[] 兩個數組和 hashSlice 二元組。
在 DBLE 的啟動階段,點乘兩個數組得到模數,也是邏輯分片的數量
並且根據兩個數組的叉乘,得到各個邏輯分片到物理分片的映射表(物理分片數量由 partitionCount[] 數組的元素值之和)
此外根據 hashSlice 二元組,約定把分片索引值中的第 4 字元到第 5 字元(字元串以 0 開始編號,編號 3 到編號 4 等於第 4 字元到第 5 字元)字元串用於 「字元串->整型」的轉換
在 DBLE 的運行過程中,用戶訪問使用這個演算法的表時,WHERE 子句中的分片索引值會被提取出來,取當中的第 4 個字元到第 5 字元,送入下一步
設置一個初始值為 0 的累計值,逐個取字元,把累計值乘以 31,再把這個字元的 unicode 值當成長整型加入到累計值中,如此類推直至處理完截取出來的所有字元,此時的累計值就能夠代表用戶的分片索引值,完成了 「字元串->整型」 的轉換
對上一步的累計值進行求模,得到邏輯分片號
再根據邏輯分片號,查映射表,直接得到物理分片號
與MyCat的類似分片演算法對比
兩種演算法在string轉化為int之後,和 hash 分區演算法相同,區別也繼承了 hash 演算法的區別。
開發注意點
【分片索引】1. 必須是字元串
【分片索引】2. 最大物理分片配置方法是,讓 partitionCount[] 數組和等於 2880
例如:
<property name="partitionLength">1</property><property name="partitionCount">2880</property>
或
<property name="partitionLength">1,1</property><property name="partitionCount">1440,1440</property>
【分片索引】3. 最小物理分片配置方法是,讓 partitionCount[] 數組和等於 1
例如
<property name="partitionLength">2880</property><property name="partitionCount">1</property>
【分片索引】4. partitionLength 和 partitionCount 被當做兩個逗號分隔的一維數組,它們之間的點乘必須在 [1, 2880] 范圍內
【分片索引】5. partitionLength 和 partitionCount 的配置對順序敏感
<property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>
和
<property name="partitionLength">256,512</property><property name="partitionCount">2,1</property>
是不同的分片結果
【分片索引】6. 分片索引欄位長度小於用戶指定的截取長度時,截取長度會安全減少到符合分片索引欄位長度
【數據分布】1. 分片索引欄位截取越長則越有利於數據均勻分布
【數據分布】2. 分片索引欄位的內容重復率越低則越有利於數據均勻分布
運維注意點
【擴容】1. 預先過量分片,並且不改變 partitionCount 和 partitionLength 點乘結果,也不改變截取設置 hashSlice 時,可以避免數據再平衡,只需進行涉及數據的遷移
【擴容】2. 若需要改變 partitionCount 和 partitionLength 點乘結果或改變截取設置 hashSlice 時,需要數據再平衡
【縮容】1. 預先過量分片,並且不改變 partitionCount 和 partitionLength 點乘結果,也不改變截取設置 hashSlice 時,可以避免數據再平衡,只需進行涉及數據的遷移
【縮容】2. 若需要改變 partitionCount 和 partitionLength 點乘結果或改變截取設置 hashSlice 時,需要數據再平衡
配置注意點
【配置項】1. 在 rule.xml 中,可配置項為<property name="partitionLength"> 、<property name="partitionCount"> 和 <property name="hashSlice">
【配置項】2.在 rule.xml 中配置 <property name="partitionLength">標簽
內容形式為:<物理分片持有的虛擬分片數>[,<物理分片持有的虛擬分片數>,...<物理分片持有的虛擬分片數>]
物理分片持有的虛擬分片數必須是整型,物理分片持有的虛擬分片數從左到右與同順序的物理分片數對應,partitionLength 和partitionCount 的點乘結果必須在 [1, 2880] 范圍內
【配置項】3. 在 rule.xml 中配置 <property name="partitionCount">標簽內容形式為:<物理分片數>[,<物理分片數>,...<物理分片數>]
其中物理分片數必須是整型,物理分片數按從左到右的順序與同順序的物理分片持有的虛擬分片數對應,物理分片的編號從左到右連續遞進,partitionLength 和 partitionCount 的點乘結果必須在 [1, 2880] 范圍內
【配置項】4. partitionLength 和 partitionCount 的語義是:持有partitionLength[i] 個虛擬分片的物理分片有 partitionCount[i] 個
例如
<property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>
語義是持有 512 個邏輯分片的物理分片有 1 個,緊隨其後,持有 256 個邏輯分片的物理分片有 2 個
【配置項】5.partitionLength 和 partitionCount 都對書寫順序敏感,
例如
<property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>
分片結果是第一個物理分片持有頭512個邏輯分片,第二個物理分片持有緊接著的256個邏輯分片,第三個物理分片持有最後256個邏輯分片,相對的
<property name="partitionLength">256,512</property><property name="partitionCount">2,1</property>
分片結果則是第一個物理分片持有頭 256 個邏輯分片,第二個物理分片持有緊接著的 256 個邏輯分片,第三個物理分片持有最後 512 個邏輯分片
【配置項】6.partitionLength[] 的元素全部為 1 時,這時候partitionCount 數組和等於 partitionLength 和 partitionCount 的點乘,物理分片和邏輯分片就會一一對應,該分片演算法等效於直接取余
【配置項】7.在 rule.xml 中配置標簽,從分片索引欄位的第幾個字元開始截取到第幾個字元:
若希望從首字元開始截取 k 個字元( k 為正整數),配置的內容形式可以為「 0 : k 」、「 k 」或「 : k 」;
若希望從末字元開始截取 k 個字元( k 為正整數),則配置的內容形式可以為「 -k : 0 」、「 -k 」或「 -k : 」;
若希望從頭第 m 個字元起算截取 n 個字元( m 和 n 都是正整數),則先計算出 i = m - 1 和 j = i + n - 1,配置的內容形式為「 i : j 」;
若希望從尾第 m 個字元起算截取從尾算起的 n 個字元( m 和 n 都是正整數),則先計算出 i = -m + n - 1,配置的內容形式可以為「 -m : i 」;
若希望不截取,則配置的內容形式可以為「 0 : 0 」、「 0 : 」、「 : 0 」或 「 : 」
⑨ mycat中間件在實際開發中經常用到嗎
前身是阿里的cobar,MyCat是一個開源的分布式資料庫系統,是一個實現了MySQL協議的伺服器,前端用戶可以把它看作是一個資料庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL伺服器通信,也可以用JDBC協議與大多數主流資料庫伺服器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在後端MySQL伺服器里或者其他資料庫里。 目前雖然傳統關系資料庫存在一些列的先天弊端,但NoSQL資料庫又將其替代,但是如果傳統資料庫易於擴展和分拆就可以極大的避免單機單庫在數據增刪改查方面的缺陷。MyCat就是為了解決資料庫的分拆和擴展而生的開源分布式資料庫系統。其最終的目標就是低成本地將現有的單機資料庫和應用平滑遷移到「雲」端,解決數據存儲和業務規模迅速增長情況下的數據瓶頸問題。