當前位置:首頁 » 硬碟大全 » 緩存服務集群
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

緩存服務集群

發布時間: 2022-05-13 05:36:31

『壹』 java web開發緩存方案,ehcache和redis哪個更好

其實沒有好與不好的絕對
給你知乎上的介紹:
ehcache直接在jvm虛擬機中緩存,速度快,效率高;但是緩存共享麻煩,集群分布式應用不方便。
redis是通過socket訪問到緩存服務,效率比ecache低,比資料庫要快很多,處理集群和分布式緩存方便,有成熟的方案。

如果是單個應用或者對緩存訪問要求很高的應用,用ehcache。
如果是大型系統,存在緩存共享、分布式部署、緩存內容很大的,建議用redis。

補充下:ehcache也有緩存共享方案,不過是通過RMI或者Jgroup多播方式進行廣播緩存通知更新,緩存共享復雜,維護不方便;簡單的共享可以,但是涉及到緩存恢復,大數據緩存,則不合適。

『貳』 redis3.0集群性能瓶頸主要有哪些

Redis最初的使命是用高效的內存取代復雜繁重的資料庫,如果從緩存伺服器獲取一個Key要經過二次定位,訪問時間是原來單機
緩存伺服器的兩倍,那樣我們還不如直接用資料庫呢。
鑒於Redis3.0所謂的ASK 轉向/MOVED 轉向機制,網上推出了JAVA版的Redis3.0客戶端庫jedis、C++版的Redis3.0客戶端
庫ACL,他們都支持根據Redis伺服器居返回"MOVED"信息進行二次定位數據訪問,而且還有在主備切換的情況下訪問備機的功能,
正常情況下Redis3.0集群要部署3台主機和3台備機,這樣客戶端就要同時維持這6台伺服器的長連接,像我們公司的系統有上百個
進程,一個線程就要維持6台緩存伺服器的長連接,一個進程擁有多個線程,總的算起來差不多上千個緩存伺服器的長連接,這無異於飲鴆止渴。

『叄』 Redis怎麼做集群

為什麼集群?

通常,為了提高網站響應速度,總是把熱點數據保存在內存中而不是直接從後端資料庫中讀取。Redis是一個很好的Cache工具。大型網站應用,熱點數據量往往巨大,幾十G上百G是很正常的事兒,在這種情況下,如何正確架構Redis呢?

首先,無論我們是使用自己的物理主機,還是使用雲服務主機,內存資源往往是有限制的,scale up不是一個好辦法,我們需要scale out橫向可伸縮擴展,這需要由多台主機協同提供服務,即分布式多個Redis實例協同運行。

其次,目前硬體資源成本降低,多核CPU,幾十G內存的主機很普遍,對於主進程是單線程工作的Redis,只運行一個實例就顯得有些浪費。同時,管理一個巨大內存不如管理相對較小的內存高效。因此,實際使用中,通常一台機器上同時跑多個Redis實例。

方案

1.Redis官方集群方案 Redis Cluster

Redis Cluster是一種伺服器Sharding技術,3.0版本開始正式提供。

Redis Cluster中,Sharding採用slot(槽)的概念,一共分成16384個槽,這有點兒類pre sharding思路。對於每個進入Redis的鍵值對,根據key進行散列,分配到這16384個slot中的某一個中。使用的hash演算法也比較簡單,就是CRC16後16384取模。

Redis集群中的每個node(節點)負責分攤這16384個slot中的一部分,也就是說,每個slot都對應一個node負責處理。當動態添加或減少node節點時,需要將16384個槽做個再分配,槽中的鍵值也要遷移。當然,這一過程,在目前實現中,還處於半自動狀態,需要人工介入。

Redis集群,要保證16384個槽對應的node都正常工作,如果某個node發生故障,那它負責的slots也就失效,整個集群將不能工作。

為了增加集群的可訪問性,官方推薦的方案是將node配置成主從結構,即一個master主節點,掛n個slave從節點。這時,如果主節點失效,Redis Cluster會根據選舉演算法從slave節點中選擇一個上升為主節點,整個集群繼續對外提供服務。這非常類似前篇文章提到的Redis Sharding場景下伺服器節點通過Sentinel監控架構成主從結構,只是Redis Cluster本身提供了故障轉移容錯的能力。

Redis Cluster的新節點識別能力、故障判斷及故障轉移能力是通過集群中的每個node都在和其它nodes進行通信,這被稱為集群匯流排(cluster bus)。它們使用特殊的埠號,即對外服務埠號加10000。例如如果某個node的埠號是6379,那麼它與其它nodes通信的埠號是16379。nodes之間的通信採用特殊的二進制協議。

對客戶端來說,整個cluster被看做是一個整體,客戶端可以連接任意一個node進行操作,就像操作單一Redis實例一樣,當客戶端操作的key沒有分配到該node上時,Redis會返回轉向指令,指向正確的node,這有點兒像瀏覽器頁面的302 redirect跳轉。

Redis Cluster是Redis 3.0以後才正式推出,時間較晚,目前能證明在大規模生產環境下成功的案例還不是很多,需要時間檢驗。

2.Redis Sharding集群

Redis 3正式推出了官方集群技術,解決了多Redis實例協同服務問題。Redis Cluster可以說是服務端Sharding分片技術的體現,即將鍵值按照一定演算法合理分配到各個實例分片上,同時各個實例節點協調溝通,共同對外承擔一致服務。

多Redis實例服務,比單Redis實例要復雜的多,這涉及到定位、協同、容錯、擴容等技術難題。這里,我們介紹一種輕量級的客戶端Redis Sharding技術。

Redis Sharding可以說是Redis Cluster出來之前,業界普遍使用的多Redis實例集群方法。其主要思想是採用哈希演算法將Redis數據的key進行散列,通過hash函數,特定的key會映射到特定的Redis節點上。這樣,客戶端就知道該向哪個Redis節點操作數據。

慶幸的是,java redis客戶端驅動jedis,已支持Redis Sharding功能,即ShardedJedis以及結合緩存池的ShardedJedisPool。

Jedis的Redis Sharding實現具有如下特點:

1. 採用一致性哈希演算法(consistent hashing),將key和節點name同時hashing,然後進行映射匹配,採用的演算法是MURMUR_HASH。採用一致性哈希而不是採用簡單類似哈希求模映射的主要原因是當增加或減少節點時,不會產生由於重新匹配造成的rehashing。一致性哈希隻影響相鄰節點key分配,影響量小。

2.為了避免一致性哈希隻影響相鄰節點造成節點分配壓力,ShardedJedis會對每個Redis節點根據名字(沒有,Jedis會賦予預設名字)會虛擬化出160個虛擬節點進行散列。根據權重weight,也可虛擬化出160倍數的虛擬節點。用虛擬節點做映射匹配,可以在增加或減少Redis節點時,key在各Redis節點移動再分配更均勻,而不是只有相鄰節點受影響。

3.ShardedJedis支持keyTagPattern模式,即抽取key的一部分keyTag做sharding,這樣通過合理命名key,可以將一組相關聯的key放入同一個Redis節點,這在避免跨節點訪問相關數據時很重要。

『肆』 JAVA高並發問題,大數據,頻繁I/O操作。

建議採用緩存處理,按照你說的這種數據量,基於redis的緩存完全可以滿足,存取速度可以10W+的,另外,擬採用的hashMap 是ConcurrentHashMap還是其他,頁面展示是增量查詢還是直接所有的再查詢一次,socket數據接收你是用的netty還是mina,這都需要經過仔細的斟酌考慮設計的。有這么大的並發的需求,完全可以考慮做分布式集群的,估計這只是領導想要的目標吧

『伍』 JAVA幾種緩存技術介紹說明

1、TreeCache / JBossCache

JBossCache是一個復制的事務處理緩存,它允許你緩存企業級應用數據來更好的改善性能。緩存數據被自動復制,讓你輕松進行JBoss伺服器之間 的集群工作。JBossCache能夠通過JBoss應用服務或其他J2EE容器來運行一個MBean服務,當然,它也能獨立運行。

2、WhirlyCache

Whirlycache是一個快速的、可配置的、存在於內存中的對象的緩存。它能夠通過緩存對象來加快網站或應用程序的速度,否則就必須通過查詢資料庫或其他代價較高的處理程序來建立。

3、SwarmCache

SwarmCache是一個簡單且有效的分布式緩存,它使用IP multicast與同一個區域網的其他主機進行通訊,是特別為集群和數據驅動web應用程序而設計的。SwarmCache能夠讓典型的讀操作大大超過寫操作的這類應用提供更好的性能支持。

4、JCache

JCache是個開源程序,正在努力成為JSR-107開源規范,JSR-107規范已經很多年沒改變了。這個版本仍然是構建在最初的功能定義上。

5、ShiftOne

ShiftOne Java Object Cache是一個執行一系列嚴格的對象緩存策略的Java lib,就像一個輕量級的配置緩存工作狀態的框架。

『陸』 JAVA目前比較常用的緩存有哪些 集中式緩存與分布式緩存有何區別 它們應用場景是

java目前常用的緩存:
Generic
JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, etc)
EhCache 2.x
Hazelcast
Infinispan
Couchbase
Redis
Caffeine
Guava (deprecated)
Simple
建議使用spring boot集成方式,可插拔,簡單。
集中式緩存適用場景:
1、伺服器集群部署。
2、數據高一致性(任何數據變化都能及時的被查詢到)

分布式緩存適用場景:
系統需要緩存的數據量大
對數據的可用性較高的情況

需要橫向擴展,從而達到緩存的容量無限的要求

『柒』 開發的JAVA WEB程序部署在伺服器集群的哪一個伺服器上

閣下在沒有分布式集群部署經驗的前提下能畫出這樣的架構圖讓人佩服

本來我是不敢回答這些問題的,因為本身我也沒有集群部署經驗,但是一來沒有人幫忙回來二來我也看過一點這些相關的書籍,所以可以把我知道的給你說下,估計能幫助你30%。

整個架構部署用到了集群部署(1:2)、動靜分離、緩存服務、拆分資料庫等高並發處理技術,屬於大型系統的模型。

據我所知,集群1:2是1負載分發器、2web伺服器,(以Apache+tomcat集群為例),那麼Director server應該安裝Apache,而Real Server應該安裝tomcat,至於java web項目在tomcat下面即可。

而你的架構圖中還有動靜分離機制,理論上靜態文件伺服器也應該有java web項目才對,不然靜態文件伺服器如何取靜態文件呢。tomcat對靜態文件處理不是很好,所以很多人推薦用Nginx作為載體。

緩存和集群資料庫我不了解,不發表任何謬論。

session會話就是指的httpsession:一個客戶端一個session會話,在客戶端與伺服器保持通信期間都會需要這個會話,所以集群伺服器一定要保存這個session。問題是客戶端的URL請求被director server均衡分發了,可能第一次訪問的是第一個real server,第二次訪問的是第四個real server,如果session只在第一個real server保存,而第四個real server就會認為客戶掉線拒絕請求,所以你要考慮四個real server用一種機制保存共享所有客戶的session。一些經典的共享session方式有:session復制、session粘連、session統一獨立存儲等。

建議看下一些集群架構方面的書籍,比如《大型網站系統與java中間件實踐》。

『捌』 將緩存數據分配到集群的不同節點,分片規則使用什麼演算法

以每24小時作為一份時間(而非自然日),根據用戶的配置有兩種工作模式:帶狀模式中,用戶僅定義開始日期時,從開始日期(含)開始,每份時間1個分片地無限增加下去;環狀模式中,用戶定義了開始日期和結束日期時,以結束日期(含)和開始日期(含)之間的時間份數作為分片總數(分片數量固定),以類似取模的方式路由到這些分片里。

1. DBLE 啟動時,讀取用戶在 rule.xml 配置的 sBeginDate 來確定起始時間
2. 讀取用戶在 rule.xml 配置的 sPartionDay 來確定每個 MySQL 分片承載多少天內的數據
3. 讀取用戶在 rule.xml 配置的 dateFormat 來確定分片索引的日期格式
4. 在 DBLE 的運行過程中,用戶訪問使用這個演算法的表時,WHERE 子句中的分片索引值(字元串),會被提取出來嘗試轉換成 Java 內部的時間類型
5. 然後求分片索引值與起始時間的差,除以 MySQL 分片承載的天數,確定所屬分片

1. DBLE 啟動時,讀取用戶在 rule.xml 配置的起始時間 sBeginDate、終止時間 sEndDate 和每個 MySQL 分片承載多少天數據 sPartionDay
2. 根據用戶設置,建立起以 sBeginDate 開始,每 sPartionDay 天一個分片,直到 sEndDate 為止的一個環,把分片串聯串聯起來
3. 讀取用戶在 rule.xml 配置的 defaultNode
4. 在 DBLE 的運行過程中,用戶訪問使用這個演算法的表時,WHERE 子句中的分片索引值(字元串),會被提取出來嘗試轉換成 Java 內部的日期類型
5. 然後求分片索引值與起始日期的差:如果分片索引值不早於 sBeginDate(哪怕晚於 sEndDate),就以 MySQL 分片承載的天數為模數,對分片索引值求模得到所屬分片;如果分片索引值早於 sBeginDate,就會被放到 defaultNode 分片上

與MyCat的類似分片演算法對比

中間件
DBLE
MyCat

分片演算法種類 date 分區演算法 按日期(天)分片
兩種中間件的取模範圍分片演算法使用上無差別

開發注意點
【分片索引】1. 必須是字元串,而且 java.text.SimpleDateFormat 能基於用戶指定的 dateFormat 來轉換成 java.util.Date
【分片索引】2. 提供帶狀模式和環狀模式兩種模式
【分片索引】3. 帶狀模式以 sBeginDate(含)起,以 86400000 毫秒(24 小時整)為一份,每 sPartionDay 份為一個分片,理論上分片數量可以無限增長,但是出現 sBeginDate 之前的數據而且沒有設定 defaultNode 的話,會路由失敗(如果有 defaultNode,則路由至 defaultNode)
【分片索引】4. 環狀模式以 86400000 毫秒(24 小時整)為一份,每 sPartionDay 份為一個分片,以 sBeginDate(含)到 sEndDate(含)的時間長度除以單個分片長度得到恆定的分片數量,但是出現 sBeginDate 之前的數據而且沒有設定 defaultNode 的話,會路由失敗(如果有 defaultNode,則路由至 defaultNode)
【分片索引】5. 無論哪種模式,分片索引欄位的格式化字元串 dateFormat 由用戶指定
【分片索引】6. 無論哪種模式,劃分不是以日歷時間為准,無法對應自然月和自然年,且會受閏秒問題影響

運維注意點
【擴容】1. 帶狀模式中,隨著 sBeginDate 之後的數據出現,分片數量的增加無需再平衡
【擴容】2. 帶狀模式沒有自動增添分片的能力,需要運維手工提前增加分片;如果路由策略計算出的分片並不存在時,會導致失敗
【擴容】3. 環狀模式中,如果新舊 [sBeginDate,sEndDate] 之間有重疊,需要進行部分數據遷移;如果新舊 [sBeginDate,sEndDate] 之間沒有重疊,需要數據再平衡

配置注意點
【配置項】1. 在 rule.xml 中,可配置項為 <propertyname="sBeginDate"> 、 <propertyname="sPartionDay"> 、 <propertyname="dateFormat"> 、 <propertyname="sEndDate"> 和 <propertyname="defaultNode">
【配置項】2.在 rule.xml 中配置 <propertyname="dateFormat">,符合 java.text.SimpleDateFormat 規范的字元串,用於告知 DBLE 如何解析sBeginDate和sEndDate

【配置項】3.在 rule.xml 中配置 <propertyname="sBeginDate">,必須是符合 dateFormat 的日期字元串

【配置項】4.在 rule.xml 中配置 <propertyname="sEndDate">,必須是符合 dateFormat 的日期字元串;配置了該項使用的是環狀模式,若沒有配置該項則使用的是帶狀模式

【配置項】5.在 rule.xml 中配置 <propertyname="sPartionDay">,非負整數,該分片策略以 86400000 毫秒(24 小時整)作為一份,而 sPartionDay 告訴 DBLE 把每多少份放在同一個分片

【配置項】6.在 rule.xml 中配置 <propertyname="defaultNode"> 標簽,非必須配置項,不配置該項的話,用戶的分片索引值沒落在 mapFile 定義

『玖』 如何理解redis+tomcat+nginx集群緩存

Nginx是一款輕量級兼備高性能的Http和反向代理伺服器。
所謂反向代理就是指在用戶發起訪問請求,由代理伺服器接收,然後將請求轉發給正式伺服器,並且將正式伺服器處理完的數據返回給客戶端,此時代理伺服器就表現為一個伺服器。

『拾』 Redis集群方案應該怎麼做

高可用的話 其他題主已經說了 可以用sentinel去做 比如通過sentinel做節點切換 並且通知一些協調服務(例如zookeeper) 告訴所有使用者切換節點之類的 很容易
至於 sharding 分兩類 一類是proxy 有一些成熟實現 比如codis、twemproxy 另一類就是在客戶端做

建議 把codis/FAQ_zh.md at master · wandoulabs/codis · GitHub 看完 然後管作者要一份演講的PPT 就能知道為啥不用其他的代理以及smart client了 codis唯一的瑕疵是 需要更改redis的源代碼(為了加入slot信息) 以及代理實現本身會有的問題 所以 如果集群規模不大的話 沒必要用proxy 做客戶端sharding即可