Mycat1.6之注解多租户
2019獨角獸企業重金招聘Python工程師標準>>>
Mycat1.6之注解&多租戶 博客分類: sql 永久鏈接:?http://gaojingsong.iteye.com/blog/2338725 預覽文章: 【Mycat1.6之注解&多租戶】? ?永久鏈接:?http://gaojingsong.iteye.com/blog/2338725
預覽文章: 【Mycat1.6之注解&多租戶】?
一、Mycat之分片--節點--主機
分片節點(dataNode)
數據切分后,一個大表被分到不同的分片數據庫上面,每個表分片所在的數據庫就是分片節(dataNode)。
?
節點主機(dataHost)
數據切分后,每個分片節點(dataNode)不一定都會獨占一臺機器,同一機器上面可以有多個分片數據庫,
這樣一個或多個分片節點(dataNode)所在的機器就是節點主機(dataHost),為了規避單節點主機并發數限
制,盡量將讀寫壓力高的分片節點(dataNode)均衡的放在不同的節點主機(dataHost)。
?
分片規則(rule)
前面講了數據切分,一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把數據分到
某個分片的規則就是分片規則,數據切分選擇合適的分片規則非常重要,將極大的避免后續數據處理的難度。
?
全局序列號(sequence)
數據切分后,原有的關系數據庫中的主鍵約束在分布式條件下將無法使用,因此需要引入外部機制保證數據
唯一性標識,這種保證全局性的數據唯一標識的機制就是全局序列號(sequence)。
?
二、Mycat之多租戶
多租戶技術或稱多重租賃技術,是一種軟件架構技術,它是在探討與實現如何于多用戶的環境下共用相同的
系統或程序組件,并且仍可確保各用戶間數據的隔離性。在云計算時代,多租戶技術在共用的數據中心以單一系統架構與服務提供多數客戶端相同甚至可定制化的服務,并且仍然可以保障客戶的數據隔離。目前各種各樣的云計算服務就是這類技術范疇,例如阿里云數據庫服務(RDS)、阿里云服務器等等。
多租戶在數據存儲上存在三種主要的方案,分別是:
獨立數據庫
這是第一種方案,即一個租戶一個數據庫,這種方案的用戶數據隔離級別最高,安全性最好,但成本也高。
優點:
為不同的租戶提供獨立的數據庫,有助于簡化數據模型的擴展設計,滿足不同租戶的獨特需求;
如果出現故障,恢復數據比較簡單。
缺點:
增大了數據庫的安裝數量,隨之帶來維護成本和購置成本的增加。
這種方案與傳統的一個客戶、一套數據、一套部署類似,差別只在于軟件統一部署在運營商那里。如果面對
的是銀行、醫院等需要非常高數據隔離級別的租戶,可以選擇這種模式,提高租用的定價。如果定價較低,產品走低價路線,這種方案一般對運營商來說是無法承受的。
?
共享數據庫,隔離數據架構
這是第二種方案,即多個或所有租戶共享 Database,但是每個租戶一個 Schema。
優點:
為安全性要求較高的租戶提供了一定程度的邏輯數據隔離,并不是完全隔離;每個數據庫可以支持更多的租
戶數量。
缺點:
如果出現故障,數據恢復比較困難,因為恢復數據庫將牽扯到其他租戶的數據;
如果需要跨租戶統計數據,存在一定困難。
?
共享數據庫,共享數據架構
這是第三種方案,即租戶共享同一個 Database、同一個 Schema,但在表中通過 TenantID 區分租戶的數
據。這是共享程度最高、隔離級別最低的模式。
優點:
三種方案比較,第三種方案的維護和購置成本最低,允許每個數據庫支持的租戶數量最多。
缺點:
隔離級別最低,安全性最低,需要在設計開發時加大對安全的開發量;
數據備份和恢復最困難,需要逐表逐條備份和還原。
如果希望以最少的服務器為最多的租戶提供服務,并且租戶接受以犧牲隔離級別換取降低成本,這種方案最
適合。
?
?
?
三、Mycat多租戶解決方案:
通過注解方式在配置多個 schema 情況下,指定走哪個配置的 schema。
Mycat多租戶實現原理
1)web 部分修改:
a.在用戶登錄時,在線程變量(ThreadLocal)中記錄租戶的 id
b.修改 jdbc 的實現:在提交 sql 時,從 ThreadLocal 中獲取租戶 id, 添加 sql 注釋,把租戶的 schema
放到注釋中。例如:/*!mycat : schema = test_01 */ sql ;
?
2)DB層代理轉發:
在 db 前面建立 proxy 層,代理所有 web 過來的數據庫請求。proxy 層是用 mycat 實現的,web 提交
的 sql 過來時在注釋中指定 schema, proxy 層根據指定的 schema 轉發 sql 請求。
/*!mycat : schema = test_01 */ sql ;
?
四、Mycat注解介紹
MyCat 對自身不支持的 Sql 語句提供了一種解決方案——在要執行的 SQL 語句前添加額外的一段由注解
SQL 組織的代碼,這樣 Sql 就能正確執行,這段代碼稱之為“注解”。注解的使用相當于對 mycat 不支持的 sql語句做了一層透明代理轉發,直接交給目標的數據節點進行 sql 語句執行,其中注解 SQL 用于確定最終執行 SQL的數據節點。注解的形式是:
/*!mycat: sql=注解 Sql 語句*/
注解的使用方式是:
/*!mycat: sql=注解 Sql 語句*/真正執行 Sql
使用時將=號后的“注解 Sql 語句”替換為需要的 Sql 語句即可,后面會提到具體的用法。
?
注解原理
MyCat 執行 SQL 語句的流程是先進行 SQL 解析處理,解析出分片信息(路由信息)后,然后到該分片對應的物理庫上去執行;若傳入的 SQL 語句 MyCat 無法解析,則 MyCat 不會去執行;而注解則是告訴 MyCat 按照注解內的 SQL(稱之為注解 SQL)去進行解析處理,解析出分片信息后,將注解后真正要執行的 SQL 語句(稱之為原始 SQL)發送到該分片對應的物理庫上去執行。
?
注解使用示例
注解支持的'!'不被 mysql 單庫兼容,
注解支持的'#'不被 mybatis 兼容
新增加 mycat 字符前綴標志 Hintsql:"/** mycat: */"
從 1.6 開始支持三種注解方式:
/*#mycat:db_type=master*/ select * from travelrecord
/*!mycat:db_type=slave*/ select * from travelrecord
/**mycat:db_type=master*/ select * from travelrecord
1. Mycat 端執行存儲創建表或存儲過程為:
存儲過程:
/*!mycat: sql=select 1 from test */ CREATE PROCEDURE `test_proc`() BEGIN END ;
表:
/*!mycat: sql=select 1 from test */create table test2(id int);
注意注解中語句是節點的表請替換成自己表如 select 1 from 表 ,注解內語句查出來的數據在哪個分片,數
據在那個節點往哪個節點建.
2. 特殊語句自定義分片:
/*!mycat: sql=select 1 from test */insert into t_user(id,name) select id,name from t_user2;
3. 讀寫分離
配置了 Mycat 讀寫分離后,默認查詢都會從讀節點獲取數據,但是有些場景需要獲取實時數據,如果從讀節
點獲取數據可能因延時而無法實現實時,Mycat 支持通過注解/*balance*/來強制從寫節點查詢數據:
a. 事務內的 SQL,默認走寫節點,以注解/*balance*/開頭,則會根據 schema.xml 的 dataHost 標簽屬性的
balance=“1”或“2”去獲取節點
b. 非事務內的 SQL,開啟讀寫分離默認根據 balance=“1”或“2”去獲取,以注解/*balance*/開頭則會走寫節
點解決部分已經開啟讀寫分離,但是需要強一致性數據實時獲取的場景走寫節點
/*balance*/ select a.* from customer a where a.company_id=1;
4. 多表 ShareJoin
/*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.id, b.name as tit from customer a,company b on
a.company_id=b.id;
5.讀寫分離數據源選擇
/*!mycat:db_type=master*/ select * from travelrecord
/*!mycat:db_type=slave*/ select * from travelrecord
/*#mycat:db_type=master*/ select * from travelrecord
/*#mycat:db_type=slave*/ select * from travelrecord
6、多租戶使用
?
備注:并非所有的注解Mycat都支持,Mycat只支持特定的注解,具體需要看不同版本,參照相關的文檔構建實驗環境來進行驗證。
?
http://blog.csdn.net/gaojingsong/article/details/53244260
轉載于:https://my.oschina.net/xiaominmin/blog/1598284
總結
以上是生活随笔為你收集整理的Mycat1.6之注解多租户的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArcGIS Engine 中的多线程使
- 下一篇: 使用Hystrix守护应用(3)