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