
附錄:Redis企業實戰的一些坑
一、前言
小夥伴們對Redis應該不陌生,Redis是系統必備的分布式緩存中間件,主要用來解決高并發下分擔DB資源的負載,進而提升系統吞吐量。
Redis支援多種資料類型,String(字元串)、list(清單)、hash(哈希)、set(集合)、zset(有序集合),不同的類型可以應用到不同的業務需求中。
Redis的叢集部署也增強了Redis的高可用性,以及對資料的易擴容。
上面都是Redis知識掌握的重點,這些知識點也是我們工作的時候,經常用到的,網上介紹的也挺多,老顧就不介紹了。
今天老顧分享Redis企業應用,從業務實戰的緯度,看看我們平時使用Redis出現了什麼問題?如何去解決?
二、Redis叢集劃分
現在我們企業中,做的項目産品肯定不止一個;或者一個大的平台中,會有很多業務線。不同的項目和業務線肯定是不同的團隊進行開發的。那大家都會用到Redis,那怎麼去劃分?
- 獨立Redis叢集
這種方案就是不同的業務用不同的Redis叢集,這種方案針對一些小項目或業務線不複雜,以及用到Redis緩存範圍不大的話,是對伺服器資源的浪費,而且增加了運維的工作量。
當然也有好處,就是Redis資源的獨立性,不幹擾;一般會用在大項目中。
- 公共Redis叢集
這種方案就是一些業務共用一個Redis叢集,增強了對Redis資源的使用率。
三、問題
在一般企業中,不同的業務線一般我們采用的是公共Redis叢集,因為業務線都不大,獨立叢集沒有必要。這樣雖然對Redis資源充分利用了,但會出現一些問題。
四、如何區分業務
多業務間用Redis,會出現很多緩存Key,根本沒法知道哪些key是屬于哪個業務的,如:
KEY: user:1000、user:book、book、user:like:book、book:user;甚至會出現key沖突。
Redis的key在開發的使用是要合理進行設計規劃的,但兩個不同的團隊,技術和管理都不一樣,即使有規範文檔,但不同的業務團隊間,規範的執行就不得而知。
五、如何優雅擴容
我們在開發web服務時,會用類似jedis用戶端連接配接Redis伺服器,會在配置檔案中加入Redis叢集位址。不過當系統遇到Redis負載太高,或者redis的資料需要擴容,就需要增加Redis伺服器。這時就需要重新把配置檔案中的Redis叢集更改,再重新開機應用。
上面的方式是否太low了,都需要重新啟動應用,那麼多的應用都需要重新開機,是不是很麻煩,而且如果在無法區分業務的情況下,還不知道重新開機哪些業務應用。
六、如何發現異常
因為不同的業務,不同的團隊,不同的開發人員在真實業務場景中,我們管理者是無法避免bug存在的,也無法預測線上會發生什麼樣的問題?如:發現Redis叢集有不穩定情況,cpu負載非常高,那我們怎麼知道是哪個業務導緻的呢?
這個是非常重要的,因為這個是公共的Redis叢集,一旦這個叢集挂了,會影響整個業務。
七、如何截斷異常
當我們在生産環境中,發現異常是由哪個業務産生時,或者是哪個應用伺服器産生的,那如何很快速截斷的讓有問題的業務和應用伺服器,先不讓他們通路我們公共Redis叢集,等排查出原因在恢複他們的通路權限。
八、解決方案
小夥伴看到這裡,感覺怎麼樣?是不是工作中,沒有想過這些問題,工作中就直接按照網上的介紹先拿來用了。
現在是不是心裡在想,怎麼去解決上面的問題?
老顧這裡介紹一下解決思路,具體整個代碼等老顧的開源項目rb-cache上線後,會分享給大家。
九、區分業務
這個問題解決相對比較簡單,就是對我們現有的用戶端工具,進行二次封裝,
上圖就是定義一個二次封裝接口
其實原理就是強制在方法中,要開發人員賦予業務區分,每個業務都是在開發前,管理人員定下來的,這個管理就比較簡單了。
如果項目管理中,對業務的劃分比較合理的話,可以在外面再封裝一個簡單的方法,把business業務放在配置檔案中,這樣就不需要每次都要傳business這個參數了。
十、優雅擴容
解決這個問題,其實原理比較簡單,就是程式如果能夠知道Redis叢集位址産生了變化,重新設定一下jedis用戶端的連接配接配置。現在的問題就是如何知道Redis叢集位址發生了改變?
我們可以采用把Redis的叢集位址配置在zookeeper中,應用在啟動的時候,擷取zk上的叢集位址的值,進行初始化。如果想要改變叢集位址,要在zk上面進行設定。
zk重要的特性就是監聽特性,節點發生變化,就會立刻把變化發送給應用,進而應用擷取到值,重新設定jedis用戶端連接配接
十一、發現異常
發現異常這個問題,其實就是一個監控的問題,我們需要把各個用戶端使用Redis的情況進行監控。怎麼監控?
需要一個監控工具,這個監控工具網上有幾個,推薦使用小米的open-falcon,自行搭建改監控系統,搭建比較複雜,但功能比較強大,很多公司都在使用。
當然小夥伴們可以用别的監控工具,隻要資料上報協定,和監控報表輸出功能即可,當然也要有報警的功能,及時給運維人員報告
再使用Aop攔截Redis操作類,攔截Redis操作,把相關資料進行封裝。每隔1分鐘把這些資料上報到open-falcon平台中。具體監控什麼資料,由業務決定,一般要把設定的key,業務,操作時長,哪個用戶端IP發起的,都需要監控。
在可以設定相關的報警規則,如:某個key一直被調用,在一段時間内操作次數太高。這樣就可以友善排查哪些key導緻cpu負載太高,就可以去看一下設定這個key的代碼,有沒有什麼問題?是不是死循環等問題?
十二、截斷異常
在上面的發現異常的基礎上面,如果發現某些業務應用,不正常,就可以立即發起截斷該用戶端的請求,這樣可以保證其他業務不受影響。這裡我們使用用戶端方式去實作截斷。原理也很簡單,在Redis二次封裝的類中,我們需要判斷本機是否在黑名單中,如果存在,則無法操作方法,或報異常。
如何知道黑名單的變化,跟優雅擴容那個Redis叢集位址的改變,方案一樣。
十三、總結
在企業應用中,小夥伴們要經常去思考,業務進行中,如何友善管理,及時發現問題,是非常重要的。這也是很多管理者經常忽略的,都隻是先把功能完成了,而不顧管理和監控。希望這篇文章能夠幫助大家,從另一個緯度發現問題。謝謝!!!