新聞中心
海量數(shù)據(jù)下如何正確訪問Redis服務才不會掛掉?
海量數(shù)據(jù)下正確的訪問redis要注意的事情有很多,基本上可以從服務治理,數(shù)據(jù),redis正確使用三個方面來講。

成都創(chuàng)新互聯(lián)公司主營平山網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都app軟件開發(fā),平山h5重慶小程序開發(fā)公司搭建,平山網(wǎng)站營銷推廣歡迎平山等地區(qū)企業(yè)咨詢
既然是海量數(shù)據(jù),那么服務肯定要拆分成多個服務,最常見的采用“大中臺,小前臺”的概念,中臺分各個服務中心,各個中心去維護自己中心負責的服務,向上游前臺提供數(shù)據(jù)和服務。比如一個做內(nèi)容付費的公司可以有內(nèi)容中心、商品中心、交易中心
用戶中心、促銷中心、基礎中心、開放平臺等,中心之間采用RPC通信或者數(shù)據(jù)共享。
在做好服務治理和數(shù)據(jù)劃分的基礎上,這個時候就是重點講如何正確使用redis的時候了,個人列舉了部分細則僅供大家參考:
熟練使用五種數(shù)據(jù)結構(String、Set|、Hash、List、ZSet)以及每種數(shù)據(jù)結構的適用場景和注意事項;
防止緩存雪崩,即避免大批量緩存同一時間段集中過期,導致大量請求都懟到數(shù)據(jù)庫上,導致數(shù)據(jù)庫連接數(shù)爆滿、宕機;
防止緩存穿透,避免redis中熱點key存入了null或者不存在,導致大量請求繞過redis請求數(shù)據(jù)庫去了;
避免大key的存在:比如一個redis集群是16G,共8個節(jié)點,每個節(jié)點平均分配2G的內(nèi)存,這時候如果有一個大的hash key占用內(nèi)存超過2G了,這個時候盡管集群還有剩余的空間,這個大key的寫入依舊會失敗,單個key是無法做到集群的,另外再想想如果一個hash存儲了大量的數(shù)據(jù),考慮一下性能問題?
禁止使用keys、flushall、flushdb等,運維同學通過redis的rename機制禁掉命令,或者使用scan的方式漸進式處理;
批量讀寫redis請采用pipeline管道的方式;
要保證Redis不會掛掉,也就是提高Redis的高可用性,可以從這么幾個方面考慮。
Redis單副本:也就是只部署一臺Redis,不需要節(jié)點之間的數(shù)據(jù)同步,架構簡單,部署方便;但是單臺機器畢竟是有風險的,按照題目中【海量數(shù)據(jù)】的場景,是不能達到高可用要求的。
Redis主從:主從實例可以部署在不同的物理服務器上,充分利用多臺服務器的資源,在主庫發(fā)生故障的時候,可以進行主備切換,從而保證系統(tǒng)的穩(wěn)定運行,甚至可以做到讀寫分離,主庫專門用作寫操作,一臺或多臺備庫進行讀操作;但是當主庫發(fā)生故障的時候(如果沒有HA方案的話),是需要手動進行主備切換的。
Redis Sentinel:部署架構分為兩部分【Sentinel集群】和【數(shù)據(jù)集群】;Sentinel集群是由多個Sentinel節(jié)點組成的分布式集群,通常是2N+1臺服務器,可以實現(xiàn)故障發(fā)現(xiàn)和轉(zhuǎn)移、客戶端通知等功能;數(shù)據(jù)集群用于存儲數(shù)據(jù);它能夠解決主從模式下的自動切換問題,并且數(shù)據(jù)集群是可以橫向擴展的;當然這個架構實現(xiàn)和部署起來,也更為復雜一些;并且這個架構不能做到讀寫分離。
Redis Cluster:Redis 3.0集群,是分布式集群解決方案之一,物理架構中配置2N個節(jié)點(主從一一對應),主節(jié)點提供讀寫操作,從節(jié)點作為備份;數(shù)據(jù)分布保存在多個節(jié)點上,是一種無中心的架構,如果有部分節(jié)點發(fā)生故障,能夠?qū)崿F(xiàn)故障自動轉(zhuǎn)移和切換,用投票機制完成備庫升級為主庫(下文的Redis分片章節(jié),還會介紹到Redis Cluster)。
寫入mysql數(shù)據(jù)庫的數(shù)據(jù)量很大,數(shù)據(jù)庫架構該怎么去設計?
比如你的視圖是create view v_name asselect ....from ... where...先試試 as下面的代碼 看看有數(shù)據(jù)沒 select ....from ... where.. 執(zhí)行看看....如果沒救說明本來就沒....還有一個意思你就說 視圖不包含實際數(shù)據(jù)。。確實是這樣的。。。視圖只是一堆語句。。除非你給 視圖加了聚集索引 這個時候他包含數(shù)據(jù)
對于這種大數(shù)據(jù)量系統(tǒng)業(yè)界已經(jīng)有不少成熟方案
最簡單的是讀寫分離,寫操作只在主庫寫,配置自動同步到從庫。部分讀操作改成操作從庫,減少主庫數(shù)據(jù)庫壓力。
還可以讓給應用加一個redis緩存,查詢時先讀緩存,讀不到再讀數(shù)據(jù)庫。
如果改成這樣,壓力還是太大,就要考慮分表。
分表思路很多,例如把熱點數(shù)據(jù)放一張表,非熱點數(shù)據(jù)放一張表?;蛘甙从脩鬷d尾號做hash,分表分布在不同表。
如果讀寫要求已經(jīng)超過單機支撐能力,那就要考慮集群,你可以搜索一下怎么用mycat搭建數(shù)據(jù)庫集群
數(shù)據(jù)庫的寫入量高,是一個很常見的技術瓶頸,場景如央視春晚發(fā)紅包,千萬級別的寫入qps。而解決方案有很多,筆者分享一些目前業(yè)界最成熟有效的措施:
一、分表
將數(shù)據(jù)分攤到多個表上,流量也將分攤到多個表上,可以提高數(shù)據(jù)庫讀寫的吞吐量。
如將一個表從1個,分解為256個。
二、緩存
我們可以將數(shù)據(jù)庫中的熱點數(shù)據(jù),寫入緩存中,將讀請求的流量優(yōu)先走緩存,這樣可以分攤數(shù)據(jù)庫的讀壓力。
如使用Redis來存儲熱點數(shù)據(jù),而使用Canal將MySQL中的熱點數(shù)據(jù)同步到Redis中。
三、異步
我們知道,MySQL數(shù)據(jù)庫日志系統(tǒng),有一個持久化日志redolog,原理是數(shù)據(jù)庫為了減少磁盤IO的次數(shù),將要寫入數(shù)據(jù)庫的數(shù)據(jù)先在內(nèi)存中暫存,后續(xù)再批量寫入磁盤中,這邊是異步的一種案例。
我們的系統(tǒng)設計,也可以參考這個模式,將要寫入數(shù)據(jù)庫中的操作通過發(fā)送mq暫存到Kafka中,再通過消費mq的方式,將數(shù)據(jù)寫入數(shù)據(jù)庫,從而避免流量過大,一下子將數(shù)據(jù)庫打死了。
四、分庫
經(jīng)過壓測得知,一個16核32G內(nèi)存500G硬盤的MySQL,它的寫入極限是5600/s,這是硬件上的極限,從軟件層面已無法提升。
如使用MyCat就是構建數(shù)據(jù)庫集群,以增加更多的數(shù)據(jù)庫實例,從硬件層面上解決問題。
五、其他
以上是互聯(lián)網(wǎng)大廠最常用的優(yōu)化方案,只要你肯花心思,總有優(yōu)化的空間。
到此,以上就是小編對于redis 熱點數(shù)據(jù)的問題就介紹到這了,希望這2點解答對大家有用。
本文題目:寫入mysql數(shù)據(jù)庫的數(shù)據(jù)量很大,數(shù)據(jù)庫架構該怎么去設計?
鏈接地址:http://m.fisionsoft.com.cn/article/djhjhpd.html


咨詢
建站咨詢
