雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

64
http://mvc.tw 臺北場 Microsoft Azure 資料存取策略 Dino Wang

Transcript of 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

Page 1: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

臺北場Microsoft Azure 資料存取策略

Dino Wang

Page 2: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

雲端資料上的存取策略• 資料庫

• 分散式快取

• 儲存體 / CDN (Content Delivery Network)

• 諸多適⽤用於其他不同情境的服務• Notification Hub

• Queue

• …

Page 3: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

資料存取必須有策略性

• 我們都知道要重視使用者體驗

• 低延遲、回應快,不是永遠靠大型機器來扛下

• 也得在乎帳單上的費用

• 大家應該會使用計算機試算在 Azure 上大概要花多少錢

• Auto-scaling 萬靈丹(?)

• SQL Database DTU

Page 4: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

一個真實的雲使用案例當上了雲之後的整體服務量變大

• 第一階段:用得很爽,網站頂得住使用量

• Take action: 爽爽喝咖啡,翹腳捻鬍鬚

• 第二階段:雖然服務還能跑,但回應開始變慢

• Take action: 雲端的機器怎麼那麼弱,自動 (或手動) 加開機器擋流量吧

• 第三階段:開始出現無法建立資料庫連結,網站幾乎動不了

• Take action: 重新 deploy、順便找朋友 (或到論壇) 開罵雲端服務不夠好

• Take action: 開始看 SQL Database 更高等級費用怎麼算 (然後又開始譙)

• Or take action: 樂意的話,可以找我個案研究一下(爆)

Page 5: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

一個真實的雲使用案例

• 雲端有 auto-scaling 很好啊

• 效率低的程式需要比較多的執行個體 à 成本失控

• 任意增加執行個體 à 也只是死得更快而已

• 使用雲端不是找個墊背的來挨罵而已 :P

Page 6: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

那麼雲端資料存取怎麼樣做才好

• 三字訣「少、多、懶」

• 應該經常思考 Azure SQL Database 的本質

• SQL Database 屬公共設施,與他人共用

• 別吃米不知米價,每一級的 Database 價差並不算小

• 當然也可以選擇雲端包養,只是成本高昂 …

VM + SQL Server (licensed) = Dedicated Service

這是我的觀察啦 …

Page 7: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

什麼「少」• 欄位拿得少,只拿必要的,大家都知道的基本功

• 試圖讓發出的 SQL 查詢變少

Page 8: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

什麼「多」• 相同(類似) 的東西一次拿足、多拿一點點無所謂

• 考慮 使用量多 以及 命中快取 為基礎的開發企圖

Page 9: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

這麼說好像有點玄

• 舉個 這頁、上頁和下頁 的例子

Page 10: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

Page 11: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

Page 12: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

SANDBOX

Page 13: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

適用情境

• 複合查詢的做法有它適用的情境

• 這頁、上頁和下頁的例子雖然做到了減少單一頁面

的查詢量,但配合頁面快取 (output cache) 的配置,

才是真正完整的考量 (企圖)

Page 14: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

BUT

• 但若會造成太過複雜的 SQL 還是要避免 …(爆)

來看一個負面例子

Page 15: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

延伸:電商購物車優惠網站有數十個優惠專案,優惠條件設定在資料庫中

SD 規劃出一個 method 抓出只和購物車商品相關的

優惠專案來進行計算,好在執行個體上執行優惠運算

優點:只拿購物車需要的優惠專案設定

缺點:每個顧客的購物車內容肯定不同,發出的 SQL

查詢執行計畫可能很複雜,且無法造成一樣的結果

Page 16: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

延伸:電商購物車優惠優惠專案數量有限,不如讓執行的 SQL 簡單點,且

造成能夠快取的結果

那就查詢現在作用中的所有優惠條件吧,由執行個體

去過濾需要的優惠條件(執行個體重一點,資料庫輕

一點)

少:少一點查詢的複雜性

多:多一點的快取命中率

Page 17: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

兼顧成本與效能的考量跟資料庫比起來,執行個體的成本會比較便宜

因執行個體可以輕易的 scale-out

資料庫要做類似的事情代價極為高昂

讓頻繁存取的查詢減少資料庫的運算,是不錯的主意

Page 18: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

ORM 玩家請注意• Navigation Property

• 有機會對 DB 造成巨大的影響

• 惡名昭彰的 ORM Select N+1 問題

(在有限的執行個體上造成查詢量爆炸性的增加)

Page 19: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

SELECT N+1 可能的場景

Page 20: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

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;…

}

Page 21: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

SELECT N+1 可能的場景

• 只需要一道 SQL 查詢就取回文章列表

• 但實際上卻執行了 N+1 道 SQL

• N = 處理的文章數量

Page 22: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

SELECT N+1 可能的場景

Page 23: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

N+1 問題就像是

Page 24: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

DB的角度看 SELECT N+1

⋯咱不幹了

Page 25: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

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 「管理」功能

Page 26: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

PORTAL 上的資料庫效能資訊

由 Portal 進入資料庫「管理」功能

Page 27: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

PORTAL 上的資料庫效能資訊

查詢效能以及預設檢視

Page 28: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

佳化的關鍵

• 相同的一段時間內,如果發現有

• 1 萬條資料庫耗時 100 ms CPU 的查詢

• 100 條資料庫耗時 10 s CPU 的查詢

• 誰會是立即提升網站效能的關鍵?

Page 29: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

搞清楚誰是真正的消費者

強烈建議排序「執行計數」

Page 30: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

TRADE OFF效能調校有時候會面臨效能 與 架構上的取捨,請自

行斟酌。

Page 31: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

資料存取之道

Page 32: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

網 站快 取

(我常在思考在生活上的快取倒底好不好 XD)

Page 33: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

分散式快取再降低資料庫負擔、提升網頁回應速度

• 頁面快取

• 資料快取

分散式架構,讓快取保存在專責主機上

• 一致性 (integrity)

• 利於擴展 (scale-out)

Page 34: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

AZURE 快取服務的選擇性

In-Role Cache

Managed Cache Service

Redis Cache

Page 35: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

快取即服務 CACHE AS A SERVICE

Azure Redis Cache

• 基於開放原始碼專案 Redis 的專責快取服務

• 能提供可用性達 99.9% 的服務水準協議(SLA)

• 提供 Basic、Standard 兩種規模與計費方式,容後介紹細節

• 可用快取空間可高達 53GB

Page 36: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

REDIS CACHE

微軟建議 Azure 用戶所有的新開發的應

用系統未來皆採用 Redis Cache。

http://blogs.technet.com/b/azuretw/archive/2014

/08/09/azure-cache.aspx

Page 37: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

AZURE TAIWAN USER GROUP

Page 38: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

什麼是 REDIS CACHE開放原始碼專案,非常流行的 No-SQL 資料庫

• 既有非常多種語言程式庫的支援

不止是傳統式鍵值對 (key-value) 的快取

• 支援豐富、高效能的資料類型

hashes、lists、sets、sorted sets

• 支援高效率的操作方式

append、increase、decrease、…

• 支援 pub/sub pattern

Page 39: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

AZURE REDIS CACHE 的優點

由微軟整合,提供具有高可用性的穩定服務

• 2014-09 推出正式版

免自行架設,不需處理繁複的容錯設定

Page 40: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

AZURE REDIS 快取服務的種類基本 Basic

• 單一快取節點

• 共用 或 專用

標準 Standard

• 具備兩個快取節點

• 提供複寫服務 (master/slave replication)

• 提供可用性高達 99.9% 的 SLA

Page 41: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

如何建立 AZURE REDIS 快取• 一律於新 Portal 建立

https://portal.azure.com/

Page 42: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

重要的 MAXMEMORY 原則設定

• 一旦快取服務面臨「記憶體用盡」時的處理原則

原則 說明

NoEviction 直接回傳錯誤

VolatileTTL 在過期項⽬目中尋找,清除存活時間最接近項⽬目

AllKeysRandom 隨機回收項⽬目

VolatileRandom 隨機回收過期項⽬目

AllKeysLRU 在所有項⽬目中尋找,清除最近最少使⽤用的項⽬目

VolatileLRU 在過期項⽬目中尋找,清除最近最少使⽤用的項⽬目

Page 43: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

MAXMEMORY TERMS

LRU

• Least Recently Used

• 近期 少使用為優先排除的

演算法

TTL

• Time To Live

• 存活時間優先演算法

Page 44: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

在 ASP.NET 網站程式

應用 AZURE REDIS CACHE

Page 45: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

網站如何應用 REDIS CACHE

• ASP.NET Session State (out-of-proc)

• ASP.NET OutputCache

自訂 Data Cache 機制

• 分散式快取替代本機快取 ObjectCache, WebCache, ...

Page 46: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

ASP.NET SESSION• Session 是 Web 應用程式經常需要使用到的儲存體

• 優點:ASP.NET Web 應用程式存取非常方便

• 缺點:應用程式產生內部「狀態」

• In-Proc:停留在某一部主機上,造成 Web Farm 架構瓶頸

• Out-of-Proc:付出通訊成本,但換得應用程式延展性

Page 47: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

REDISSESSIONSTATEPROVIDER• NuGet

• web.config

Page 48: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

ASP.NET OUTPUTCACHE• OutputCache 是頁面快取技術

• 避免反覆跑異動性低的頁面

Page 49: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

REDISOUTPUTCACHEPROVIDER• NuGet

• web.config

Page 50: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

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

Page 51: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

自訂 DATA CACHE• 適用於複雜、規模更大的網站

• 透過 API 自行管理資料快取

Page 52: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

STACKEXCHANGE.REDIS 是基礎

• StackExchange.Redis

OR

StackExchange.Redis.StrongName

• ConnectionMultiplexer

• 建立與 redis server 之間的連線

Page 53: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

CONNECTIONMULTIPLEXER

只需建立一次,同一個 instance 服務本機所有操作

• Thread-Safe 執行緒安全的設計

• TCP/IP 連線建立的問題

勿每次操作時都再次建立 ConnectionMultiplexer

• 耗盡 TCP port

Page 54: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

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

Page 55: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

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 資料修復程式

Page 56: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

REDIS DESKTOP MANAGER

• GUI 圖形界面應用程式

• 開放原始碼, 目前是 0.7.6 版

• 可以方便的方式檢閱快取資料

Page 57: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

REDIS COMMANDS

• http://redis.io/commands

Page 58: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

講個秘訣一個 Redis instance 中預設開啟 16 個 db,可將不同

性質的資料放置於個別的 db

• Data Cache (db=0)

• ASP.NET Session (db=1)

• ASP.NET OutputCache (db=2)

Page 59: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

REDISSESSIONSTATEPROVIDER• NuGet

• web.config

Page 60: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

REDISOUTPUTCACHEPROVIDER• NuGet

• web.config

Page 61: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

使用 COMMANDS 清理快取redis-­‐cli.exe  –h  xxxx.redis.cache.windows.net –a  "…"

flushall

select  [n]

flushdb

Page 62: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

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();

});

}

Page 63: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

http://skilltree.my

http://demoshop.tw http://www.hexdigits.com https://fb.me/studyazure

http://cacafly.com

主辦單位

合作伙伴

協辦單位

Page 64: 雲端環境的快取策略-Global Azure Bootcamp 2015 臺北場

http://mvc.tw

• 本投影片所包含的商標與文字皆屬原著作者所有。• 本投影片使用的圖片皆從網路搜尋。• 本著作係採用姓名標示-非商業性-相同方式分享 3.0 台灣 (中華民國) 授權條款授權。

謝謝各位