Global Azure Bootcamp 2015 Curitiba, Open Source e Microsoft Azure
雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場
-
Upload
twmvc -
Category
Technology
-
view
168 -
download
4
Transcript of 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場
http://mvc.tw
臺北場Microsoft Azure 資料存取策略
Dino Wang
http://mvc.tw
雲端資料上的存取策略• 資料庫
• 分散式快取
• 儲存體 / CDN (Content Delivery Network)
• 諸多適⽤用於其他不同情境的服務• Notification Hub
• Queue
• …
http://mvc.tw
資料存取必須有策略性
• 我們都知道要重視使用者體驗
• 低延遲、回應快,不是永遠靠大型機器來扛下
• 也得在乎帳單上的費用
• 大家應該會使用計算機試算在 Azure 上大概要花多少錢
• Auto-scaling 萬靈丹(?)
• SQL Database DTU
http://mvc.tw
一個真實的雲使用案例當上了雲之後的整體服務量變大
• 第一階段:用得很爽,網站頂得住使用量
• Take action: 爽爽喝咖啡,翹腳捻鬍鬚
• 第二階段:雖然服務還能跑,但回應開始變慢
• Take action: 雲端的機器怎麼那麼弱,自動 (或手動) 加開機器擋流量吧
• 第三階段:開始出現無法建立資料庫連結,網站幾乎動不了
• Take action: 重新 deploy、順便找朋友 (或到論壇) 開罵雲端服務不夠好
• Take action: 開始看 SQL Database 更高等級費用怎麼算 (然後又開始譙)
• Or take action: 樂意的話,可以找我個案研究一下(爆)
http://mvc.tw
一個真實的雲使用案例
• 雲端有 auto-scaling 很好啊
• 效率低的程式需要比較多的執行個體 à 成本失控
• 任意增加執行個體 à 也只是死得更快而已
• 使用雲端不是找個墊背的來挨罵而已 :P
http://mvc.tw
那麼雲端資料存取怎麼樣做才好
• 三字訣「少、多、懶」
• 應該經常思考 Azure SQL Database 的本質
• SQL Database 屬公共設施,與他人共用
• 別吃米不知米價,每一級的 Database 價差並不算小
• 當然也可以選擇雲端包養,只是成本高昂 …
VM + SQL Server (licensed) = Dedicated Service
這是我的觀察啦 …
http://mvc.tw
什麼「少」• 欄位拿得少,只拿必要的,大家都知道的基本功
• 試圖讓發出的 SQL 查詢變少
http://mvc.tw
什麼「多」• 相同(類似) 的東西一次拿足、多拿一點點無所謂
• 考慮 使用量多 以及 命中快取 為基礎的開發企圖
http://mvc.tw
這麼說好像有點玄
• 舉個 這頁、上頁和下頁 的例子
http://mvc.tw
http://mvc.tw
http://mvc.tw
SANDBOX
http://mvc.tw
適用情境
• 複合查詢的做法有它適用的情境
• 這頁、上頁和下頁的例子雖然做到了減少單一頁面
的查詢量,但配合頁面快取 (output cache) 的配置,
才是真正完整的考量 (企圖)
http://mvc.tw
BUT
• 但若會造成太過複雜的 SQL 還是要避免 …(爆)
來看一個負面例子
http://mvc.tw
延伸:電商購物車優惠網站有數十個優惠專案,優惠條件設定在資料庫中
SD 規劃出一個 method 抓出只和購物車商品相關的
優惠專案來進行計算,好在執行個體上執行優惠運算
優點:只拿購物車需要的優惠專案設定
缺點:每個顧客的購物車內容肯定不同,發出的 SQL
查詢執行計畫可能很複雜,且無法造成一樣的結果
http://mvc.tw
延伸:電商購物車優惠優惠專案數量有限,不如讓執行的 SQL 簡單點,且
造成能夠快取的結果
那就查詢現在作用中的所有優惠條件吧,由執行個體
去過濾需要的優惠條件(執行個體重一點,資料庫輕
一點)
少:少一點查詢的複雜性
多:多一點的快取命中率
http://mvc.tw
兼顧成本與效能的考量跟資料庫比起來,執行個體的成本會比較便宜
因執行個體可以輕易的 scale-out
資料庫要做類似的事情代價極為高昂
讓頻繁存取的查詢減少資料庫的運算,是不錯的主意
http://mvc.tw
ORM 玩家請注意• Navigation Property
• 有機會對 DB 造成巨大的影響
• 惡名昭彰的 ORM Select N+1 問題
(在有限的執行個體上造成查詢量爆炸性的增加)
http://mvc.tw
SELECT N+1 可能的場景
http://mvc.tw
SELECT N+1 可能的場景• 文 article à 圖 image 會有啥問題?
@model IEnumerable<Article>
foreach (var article in Model){
// 1 to N relation var image = article.Images.FirstOrDefault();
// or even … 1 to 1 relation var image = article.Image;…
}
http://mvc.tw
SELECT N+1 可能的場景
• 只需要一道 SQL 查詢就取回文章列表
• 但實際上卻執行了 N+1 道 SQL
• N = 處理的文章數量
http://mvc.tw
SELECT N+1 可能的場景
http://mvc.tw
N+1 問題就像是
http://mvc.tw
DB的角度看 SELECT N+1
⋯咱不幹了
http://mvc.tw
解法:EAGER LOADING
• Navigation Property 的使用有機會對 DB 造成巨大的影響
• 惡名昭彰的 ORM Select N+1 問題
(在有限的執行個體上造成查詢量爆炸性的增加)
• Entity Framework:使用 .Include() 避免 Lazy load
• LINQ to SQL:使用 .LoadWith<T> 避免 Lazy load
• 應用其他查詢技巧
• 寫完 LINQ 不要太過自信,善用手邊工具測試
• SQL Profiler
• LINQPad (好物!)
• Azure SQL Database 「管理」功能
http://mvc.tw
PORTAL 上的資料庫效能資訊
由 Portal 進入資料庫「管理」功能
http://mvc.tw
PORTAL 上的資料庫效能資訊
查詢效能以及預設檢視
http://mvc.tw
佳化的關鍵
• 相同的一段時間內,如果發現有
• 1 萬條資料庫耗時 100 ms CPU 的查詢
• 100 條資料庫耗時 10 s CPU 的查詢
• 誰會是立即提升網站效能的關鍵?
http://mvc.tw
搞清楚誰是真正的消費者
強烈建議排序「執行計數」
http://mvc.tw
TRADE OFF效能調校有時候會面臨效能 與 架構上的取捨,請自
行斟酌。
http://mvc.tw
資料存取之道
http://mvc.tw
網 站快 取
(我常在思考在生活上的快取倒底好不好 XD)
http://mvc.tw
分散式快取再降低資料庫負擔、提升網頁回應速度
• 頁面快取
• 資料快取
分散式架構,讓快取保存在專責主機上
• 一致性 (integrity)
• 利於擴展 (scale-out)
http://mvc.tw
AZURE 快取服務的選擇性
In-Role Cache
Managed Cache Service
Redis Cache
http://mvc.tw
快取即服務 CACHE AS A SERVICE
Azure Redis Cache
• 基於開放原始碼專案 Redis 的專責快取服務
• 能提供可用性達 99.9% 的服務水準協議(SLA)
• 提供 Basic、Standard 兩種規模與計費方式,容後介紹細節
• 可用快取空間可高達 53GB
http://mvc.tw
REDIS CACHE
微軟建議 Azure 用戶所有的新開發的應
用系統未來皆採用 Redis Cache。
http://blogs.technet.com/b/azuretw/archive/2014
/08/09/azure-cache.aspx
http://mvc.tw
AZURE TAIWAN USER GROUP
http://mvc.tw
什麼是 REDIS CACHE開放原始碼專案,非常流行的 No-SQL 資料庫
• 既有非常多種語言程式庫的支援
不止是傳統式鍵值對 (key-value) 的快取
• 支援豐富、高效能的資料類型
hashes、lists、sets、sorted sets
• 支援高效率的操作方式
append、increase、decrease、…
• 支援 pub/sub pattern
http://mvc.tw
AZURE REDIS CACHE 的優點
由微軟整合,提供具有高可用性的穩定服務
• 2014-09 推出正式版
免自行架設,不需處理繁複的容錯設定
http://mvc.tw
AZURE REDIS 快取服務的種類基本 Basic
• 單一快取節點
• 共用 或 專用
標準 Standard
• 具備兩個快取節點
• 提供複寫服務 (master/slave replication)
• 提供可用性高達 99.9% 的 SLA
http://mvc.tw
如何建立 AZURE REDIS 快取• 一律於新 Portal 建立
https://portal.azure.com/
http://mvc.tw
重要的 MAXMEMORY 原則設定
• 一旦快取服務面臨「記憶體用盡」時的處理原則
原則 說明
NoEviction 直接回傳錯誤
VolatileTTL 在過期項⽬目中尋找,清除存活時間最接近項⽬目
AllKeysRandom 隨機回收項⽬目
VolatileRandom 隨機回收過期項⽬目
AllKeysLRU 在所有項⽬目中尋找,清除最近最少使⽤用的項⽬目
VolatileLRU 在過期項⽬目中尋找,清除最近最少使⽤用的項⽬目
http://mvc.tw
MAXMEMORY TERMS
LRU
• Least Recently Used
• 近期 少使用為優先排除的
演算法
TTL
• Time To Live
• 存活時間優先演算法
http://mvc.tw
在 ASP.NET 網站程式
應用 AZURE REDIS CACHE
http://mvc.tw
網站如何應用 REDIS CACHE
• ASP.NET Session State (out-of-proc)
• ASP.NET OutputCache
自訂 Data Cache 機制
• 分散式快取替代本機快取 ObjectCache, WebCache, ...
http://mvc.tw
ASP.NET SESSION• Session 是 Web 應用程式經常需要使用到的儲存體
• 優點:ASP.NET Web 應用程式存取非常方便
• 缺點:應用程式產生內部「狀態」
• In-Proc:停留在某一部主機上,造成 Web Farm 架構瓶頸
• Out-of-Proc:付出通訊成本,但換得應用程式延展性
http://mvc.tw
REDISSESSIONSTATEPROVIDER• NuGet
• web.config
http://mvc.tw
ASP.NET OUTPUTCACHE• OutputCache 是頁面快取技術
• 避免反覆跑異動性低的頁面
http://mvc.tw
REDISOUTPUTCACHEPROVIDER• NuGet
• web.config
http://mvc.tw
MSDN / ASP.NET REDISPROVIDERS
• RedisSessionStateProvider
https://msdn.microsoft.com/en-
us/library/azure/dn690522.aspx
• RedisOutputCacheProvider
https://msdn.microsoft.com/en-
us/library/azure/dn798898.aspx
http://mvc.tw
自訂 DATA CACHE• 適用於複雜、規模更大的網站
• 透過 API 自行管理資料快取
http://mvc.tw
STACKEXCHANGE.REDIS 是基礎
• StackExchange.Redis
OR
StackExchange.Redis.StrongName
• ConnectionMultiplexer
• 建立與 redis server 之間的連線
http://mvc.tw
CONNECTIONMULTIPLEXER
只需建立一次,同一個 instance 服務本機所有操作
• Thread-Safe 執行緒安全的設計
• TCP/IP 連線建立的問題
勿每次操作時都再次建立 ConnectionMultiplexer
• 耗盡 TCP port
http://mvc.tw
REDIS RESOURCESRedis for Windows – MSOpenTechhttp://msopentech.com/opentech-projects/redis/
https://github.com/MSOpenTech/redis
Redis Desktop Manager – RedisDesktop.comhttps://github.com/uglide/RedisDesktopManager
http://mvc.tw
REDIS FOR WINDOWSRedis 的 Windows 版可執行檔與其他平台版本完全
相同
執⾏行檔 功能說明
redis-‐server redis啟動程式,設定檔 redis.windows.conf
redis-‐benchmark 執⾏行效能測試程式
redis-‐cli 指令列程式,可下達 redis commands
redis-‐check-‐dump 資料匯出程式
redis-‐check-‐aof 資料修復程式
http://mvc.tw
REDIS DESKTOP MANAGER
• GUI 圖形界面應用程式
• 開放原始碼, 目前是 0.7.6 版
• 可以方便的方式檢閱快取資料
http://mvc.tw
REDIS COMMANDS
• http://redis.io/commands
http://mvc.tw
講個秘訣一個 Redis instance 中預設開啟 16 個 db,可將不同
性質的資料放置於個別的 db
• Data Cache (db=0)
• ASP.NET Session (db=1)
• ASP.NET OutputCache (db=2)
http://mvc.tw
REDISSESSIONSTATEPROVIDER• NuGet
• web.config
http://mvc.tw
REDISOUTPUTCACHEPROVIDER• NuGet
• web.config
http://mvc.tw
使用 COMMANDS 清理快取redis-‐cli.exe –h xxxx.redis.cache.windows.net –a "…"
flushall
select [n]
flushdb
http://mvc.tw
使用 STACKEXCHANGE.REDIS APIvar config = "xxxx.redis.cache.windows.net,ssl=false,allowAdmin=true,password=……";
using (var connection = ConnectionMultiplexer.Connect(config))
{
connection.GetEndPoints().ToList().ForEach(x =>
{
connection.GetServer(x).FlushAllDatabases();
// 或
//connection.GetServer(x).FlushDatabase();
});
}
http://mvc.tw
http://skilltree.my
http://demoshop.tw http://www.hexdigits.com https://fb.me/studyazure
http://cacafly.com
主辦單位
合作伙伴
協辦單位
http://mvc.tw
• 本投影片所包含的商標與文字皆屬原著作者所有。• 本投影片使用的圖片皆從網路搜尋。• 本著作係採用姓名標示-非商業性-相同方式分享 3.0 台灣 (中華民國) 授權條款授權。
謝謝各位