日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mycat1.6之注解多租户

發(fā)布時間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mycat1.6之注解多租户 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

Mycat1.6之注解&多租戶 博客分類: sql 永久鏈接:?http://gaojingsong.iteye.com/blog/2338725 預覽文章: 【Mycat1.6之注解&多租戶】? ?

永久鏈接:?http://gaojingsong.iteye.com/blog/2338725

預覽文章: 【Mycat1.6之注解&多租戶】?

一、Mycat之分片--節(jié)點--主機

分片節(jié)點(dataNode)

數(shù)據(jù)切分后,一個大表被分到不同的分片數(shù)據(jù)庫上面,每個表分片所在的數(shù)據(jù)庫就是分片節(jié)(dataNode)。

?

節(jié)點主機(dataHost)

數(shù)據(jù)切分后,每個分片節(jié)點(dataNode)不一定都會獨占一臺機器,同一機器上面可以有多個分片數(shù)據(jù)庫,

這樣一個或多個分片節(jié)點(dataNode)所在的機器就是節(jié)點主機(dataHost),為了規(guī)避單節(jié)點主機并發(fā)數(shù)限

制,盡量將讀寫壓力高的分片節(jié)點(dataNode)均衡的放在不同的節(jié)點主機(dataHost)

?

分片規(guī)則(rule)

前面講了數(shù)據(jù)切分,一個大表被分成若干個分片表,就需要一定的規(guī)則,這樣按照某種業(yè)務規(guī)則把數(shù)據(jù)分到

某個分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難度。

?

全局序列號(sequence)

數(shù)據(jù)切分后,原有的關系數(shù)據(jù)庫中的主鍵約束在分布式條件下將無法使用,因此需要引入外部機制保證數(shù)據(jù)

唯一性標識,這種保證全局性的數(shù)據(jù)唯一標識的機制就是全局序列號(sequence)。

?

二、Mycat之多租戶

多租戶技術或稱多重租賃技術,是一種軟件架構技術,它是在探討與實現(xiàn)如何于多用戶的環(huán)境下共用相同的

系統(tǒng)或程序組件,并且仍可確保各用戶間數(shù)據(jù)的隔離性。在云計算時代,多租戶技術在共用的數(shù)據(jù)中心以單一系統(tǒng)架構與服務提供多數(shù)客戶端相同甚至可定制化的服務,并且仍然可以保障客戶的數(shù)據(jù)隔離。目前各種各樣的云計算服務就是這類技術范疇,例如阿里云數(shù)據(jù)庫服務(RDS)、阿里云服務器等等。

多租戶在數(shù)據(jù)存儲上存在三種主要的方案,分別是:

獨立數(shù)據(jù)庫

這是第一種方案,即一個租戶一個數(shù)據(jù)庫,這種方案的用戶數(shù)據(jù)隔離級別最高,安全性最好,但成本也高。

優(yōu)點:

為不同的租戶提供獨立的數(shù)據(jù)庫,有助于簡化數(shù)據(jù)模型的擴展設計,滿足不同租戶的獨特需求;

如果出現(xiàn)故障,恢復數(shù)據(jù)比較簡單。

缺點:

增大了數(shù)據(jù)庫的安裝數(shù)量,隨之帶來維護成本和購置成本的增加。

這種方案與傳統(tǒng)的一個客戶、一套數(shù)據(jù)、一套部署類似,差別只在于軟件統(tǒng)一部署在運營商那里。如果面對

的是銀行、醫(yī)院等需要非常高數(shù)據(jù)隔離級別的租戶,可以選擇這種模式,提高租用的定價。如果定價較低,產(chǎn)品走低價路線,這種方案一般對運營商來說是無法承受的。

?

共享數(shù)據(jù)庫,隔離數(shù)據(jù)架構

這是第二種方案,即多個或所有租戶共享 Database,但是每個租戶一個 Schema

優(yōu)點:

為安全性要求較高的租戶提供了一定程度的邏輯數(shù)據(jù)隔離,并不是完全隔離;每個數(shù)據(jù)庫可以支持更多的租

戶數(shù)量。

缺點:

如果出現(xiàn)故障,數(shù)據(jù)恢復比較困難,因為恢復數(shù)據(jù)庫將牽扯到其他租戶的數(shù)據(jù);

如果需要跨租戶統(tǒng)計數(shù)據(jù),存在一定困難。

?

共享數(shù)據(jù)庫,共享數(shù)據(jù)架構

這是第三種方案,即租戶共享同一個 Database、同一個 Schema,但在表中通過 TenantID 區(qū)分租戶的數(shù)

據(jù)。這是共享程度最高、隔離級別最低的模式。

優(yōu)點:

三種方案比較,第三種方案的維護和購置成本最低,允許每個數(shù)據(jù)庫支持的租戶數(shù)量最多。

缺點:

隔離級別最低,安全性最低,需要在設計開發(fā)時加大對安全的開發(fā)量;

數(shù)據(jù)備份和恢復最困難,需要逐表逐條備份和還原。

如果希望以最少的服務器為最多的租戶提供服務,并且租戶接受以犧牲隔離級別換取降低成本,這種方案最

適合。

?

?

?

三、Mycat多租戶解決方案:

通過注解方式在配置多個 schema 情況下,指定走哪個配置的 schema。

Mycat多租戶實現(xiàn)原理

1)web 部分修改:

a.在用戶登錄時,在線程變量(ThreadLocal)中記錄租戶的 id

b.修改 jdbc 的實現(xiàn):在提交 sql 時,從 ThreadLocal 中獲取租戶 id, 添加 sql 注釋,把租戶的 schema

放到注釋中。例如:/*!mycat : schema = test_01 */ sql ;

?

2)DB層代理轉發(fā):

在 db 前面建立 proxy 層,代理所有 web 過來的數(shù)據(jù)庫請求。proxy 層是用 mycat 實現(xiàn)的,web 提交

的 sql 過來時在注釋中指定 schema, proxy 層根據(jù)指定的 schema 轉發(fā) sql 請求。

/*!mycat : schema = test_01 */ sql ;

?

四、Mycat注解介紹

MyCat 對自身不支持的 Sql 語句提供了一種解決方案——在要執(zhí)行的 SQL 語句前添加額外的一段由注解

SQL 組織的代碼,這樣 Sql 就能正確執(zhí)行,這段代碼稱之為“注解”。注解的使用相當于對 mycat 不支持的 sql語句做了一層透明代理轉發(fā),直接交給目標的數(shù)據(jù)節(jié)點進行 sql 語句執(zhí)行,其中注解 SQL 用于確定最終執(zhí)行 SQL的數(shù)據(jù)節(jié)點。注解的形式是:

/*!mycat: sql=注解 Sql 語句*/

注解的使用方式是:

/*!mycat: sql=注解 Sql 語句*/真正執(zhí)行 Sql

使用時將=號后的“注解 Sql 語句”替換為需要的 Sql 語句即可,后面會提到具體的用法。

?

注解原理

MyCat 執(zhí)行 SQL 語句的流程是先進行 SQL 解析處理,解析出分片信息(路由信息)后,然后到該分片對應的物理庫上去執(zhí)行;若傳入的 SQL 語句 MyCat 無法解析,則 MyCat 不會去執(zhí)行;而注解則是告訴 MyCat 按照注解內的 SQL(稱之為注解 SQL)去進行解析處理,解析出分片信息后,將注解后真正要執(zhí)行的 SQL 語句(稱之為原始 SQL)發(fā)送到該分片對應的物理庫上去執(zhí)行。

?

注解使用示例

注解支持的'!'不被 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 端執(zhí)行存儲創(chuàng)建表或存儲過程為:

存儲過程:

/*!mycat: sql=select 1 from test */ CREATE PROCEDURE `test_proc`() BEGIN END ;

表:

/*!mycat: sql=select 1 from test */create table test2(id int);

注意注解中語句是節(jié)點的表請?zhí)鎿Q成自己表如 select 1 from 表 ,注解內語句查出來的數(shù)據(jù)在哪個分片,數(shù)

據(jù)在那個節(jié)點往哪個節(jié)點建.

2. 特殊語句自定義分片:

/*!mycat: sql=select 1 from test */insert into t_user(id,name) select id,name from t_user2;

3. 讀寫分離

配置了 Mycat 讀寫分離后,默認查詢都會從讀節(jié)點獲取數(shù)據(jù),但是有些場景需要獲取實時數(shù)據(jù),如果從讀節(jié)

點獲取數(shù)據(jù)可能因延時而無法實現(xiàn)實時,Mycat 支持通過注解/*balance*/來強制從寫節(jié)點查詢數(shù)據(jù):

a. 事務內的 SQL,默認走寫節(jié)點,以注解/*balance*/開頭,則會根據(jù) schema.xml 的 dataHost 標簽屬性的

balance=“1”或“2”去獲取節(jié)點

b. 非事務內的 SQL,開啟讀寫分離默認根據(jù) balance=“1”或“2”去獲取,以注解/*balance*/開頭則會走寫節(jié)

點解決部分已經(jīng)開啟讀寫分離,但是需要強一致性數(shù)據(jù)實時獲取的場景走寫節(jié)點

/*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.讀寫分離數(shù)據(jù)源選擇

/*!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只支持特定的注解,具體需要看不同版本,參照相關的文檔構建實驗環(huán)境來進行驗證。

?

http://blog.csdn.net/gaojingsong/article/details/53244260

轉載于:https://my.oschina.net/xiaominmin/blog/1598284

總結

以上是生活随笔為你收集整理的Mycat1.6之注解多租户的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。