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

分布式緩存集群性能搜索

發布時間: 2023-03-26 01:19:08

『壹』 EhCache 分布式緩存/緩存集群

一 緩存系統簡介 EhCache 是一個純 Java 的進程內緩存框架 具有快速 精乾等特點 是 Hibernate 中默認的 CacheProvider EhCache 應用架構圖 下圖是 EhCache 在應用程序中的位置

EhCache 的主要特性有 快速 精幹 簡單 多種緩存策略 緩存數據有兩級 內存和磁碟 因此無需擔心容量問題 緩存數據會在虛擬機重啟的過程中寫入磁碟 可以通過 RMI 可插入 API 等方式進行分布式緩存 具有緩存和緩存管理器的偵聽介面 支持多緩存管理器實例 以及一個實例的多個緩存區域 提供 Hibernate 的緩存實現 由於 EhCache 是進程中的緩存系統 一旦將應用部署在集群環境中 每一個節點維護各自的緩存數據 當某個節點對緩存數據進行更新 這些更新的數據無法在其它節點 *** 享 這不僅會降低節點運行的效率 而且會導致數據不同步的情況發生 例如某個網站採用 A B 兩個節點作為集群部署 當 A 節點的緩存更新後 而 B 節點緩存尚未更新就可能出現用戶在瀏覽頁面的時候 一會是更新後的數據 一會是尚未更新的數據 盡管我們也可以通過 Session Sticky 技術來將用戶鎖定在某個節點上 但對於一些交互性比較強或者是非 Web 方式的系統來說 Session Sticky 顯然不太適合 所以就需要用到 EhCache 的集群解決方案 從 版本開始 Ehcache可以使用分布式的緩存了 EhCache 從 版本開始 支持五種集群方案 分別是 ? Terracotta ? RMI ? JMS ? JGroups ? EhCache Server 其中的三種最為常用集群方式 分別是 RMI JGroups 以及 EhCache Server 本文主要介紹RMI的方式 分布式這個特性是以plugin的方式實現的 Ehcache自帶了一些默認的分布式緩存插件實現 這些插件可以滿足大部分應用的需要 如果需要使用其他的插件那就需要自己開發了 開發者可以通過查看distribution包里的源代碼及JavaDoc來實現它 盡管不是必須的 在使用分布式緩存時理解一些ehcahce的設計思想也是有幫助的 這可以參看分布式緩存設計的頁面 以下的部分將展示如何讓分布式插件同ehcache一起工作 下面列出的是一些分布式緩存中比較重要的方面 ? 你如何知道集群環境中的其他緩存? ? 分布式傳送的消息是什麼形式? ? 什麼情況需要進行復制?增加(Puts) 更新(Updates)或是失效(Expiries)? ? 採用什麼方式進行復制?同步還是非同步方式? 為了安裝分布式緩存 你需要配置一個PeerProvider 一個CacheManagerPeerListener 它們對於一個CacheManager來說是全局的 每個進行分布式操作的cache都要添加一個cacheEventListener來傳送消息

二 集群緩存概念及其配置 正確的元素類型 只有可序列化的元素可以進行復制 一些操作 比如移除 只需要元素的鍵值而不用整個元素 在這樣的操作中即使元素不是可序列化的但鍵值是可序列化的也可以被復制 成員發現(Peer Discovery) Ehcache進行集群的時候有一個cache組的概念 每個cache都是其他cache的一個peer 沒有主cache的存在 剛才我們問了一個問題 你如何知道集群環境中的其他緩存?這個問題可以命名為成員發現(Peer Discovery) Ehcache提供了兩種機制用來進行成員發現 就像一輛汽車 手動檔和自動檔 要使用一個內置的成員發現機制要在ehcache的配置文件中指定元素的class屬性為 net sf ehcache distribution 自動的成員發現 自動的發現方式用TCP廣播機制來確定和維持一個廣播組 它只需要一個簡單的配置可以自動的在組中添加和移除成員 在集群中也不需要什麼優化伺服器的知識 這是默認推薦的 成員每秒向群組發送一個 心跳 如果一個成員 秒種都沒有發出信號它將被群組移除 如果一個新的成員發送了一個 心跳 它將被添加進群組 任何一個用這個配置安裝了復制功能的cache都將被其他的成員發現並標識為可用狀態 要設置自動的成員發現 需要指定ehcache配置文件中元素的properties屬性 就像下面這樣 peerDiscovery=automatic multicastGroupAddress=multicast address | multicast host name multicastGroupPort=port timeToLive= (timeToLive屬性詳見常見問題部分的描述) 示例 假設你在集群中有兩台伺服器 你希望同步sampleCache 和sampleCache 每台獨立的伺服器都要有這樣的配置 配置server 和server <class= net sf ehcache distribution properties= peerDiscovery=automatic multicastGroupAddress= />multicastGroupPort= timeToLive= 手動進行成員發現 進行手動成員配置要知道每個監聽器的IP地址和埠 成員不能在運行時動態地添加和移除 在技術上很難使用廣播的情況下就可以手動成員發現 例如在集群的伺服器之間有一個不能傳送廣播報文的路由器 你也可以用手動成員發現進行單向的數據復制 只讓server 知道server 而server 不知道server 配置手動成員發現 需要指定ehcache配置文件中的properties屬性 像下面這樣 peerDiscovery=manual rmiUrls=//server:port/cacheName //server:port/cacheName … rmiUrls配置的是伺服器cache peers的列表 注意不要重復配置 示例 假設你在集群中有兩台伺服器 你要同步sampleCache 和sampleCache 下面是每個伺服器需要的配置 配置server <class= net sf ehcache distribution properties= peerDiscovery=manual />rmiUrls=//server : /sampleCache |//server : /sampleCache 配置server <class= net sf ehcache distribution properties= peerDiscovery=manual />rmiUrls=//server : /sampleCache |//server : /sampleCache 配置CacheManagerPeerListener 每個CacheManagerPeerListener監聽從成員們發向當前CacheManager的消息 配置CacheManagerPeerListener需要指定一個 它以插件的機制實現 用來創建CacheManagerPeerListener 的屬性有 class – 一個完整的工廠類名 properties – 只對這個工廠有意義的屬性 使用逗號分隔 Ehcache有一個內置的基於RMI的分布系統 它的監聽器是RMICacheManagerPeerListener 這個監聽器可以用 RMI來配置 <class= net sf ehcache distribution RMI properties= hostName=localhost port= />socketTimeoutMillis= 有效的屬性是 hostname (可選) – 運行監聽器的伺服器名稱 標明了做為集群群組的成員的地址 同時也是你想要控制的從集群中接收消息的介面

在CacheManager初始化的時候會檢查hostname是否可用 如果hostName不可用 CacheManager將拒絕啟動並拋出一個連接被拒絕的異常 如果指定 hostname將使用InetAddress getLocalHost() getHostAddress()來得到 警告 不要將localhost配置為本地地址 因為它在網路中不可見將會導致不能從遠程伺服器接收信息從而不能復制 在同一台機器上有多個CacheManager的時候 你應該只用localhost來配置 port – 監聽器監聽的埠 socketTimeoutMillis (可選) – Socket超時的時間 默認是 ms 當你socket同步緩存請求地址比較遠 不是本地區域網 你可能需要把這個時間配置大些 不然很可能延時導致同步緩存失敗 配置CacheReplicators 每個要進行同步的cache都需要設置一個用來向CacheManagerr的成員復制消息的緩存事件監聽器 這個工作要通過為每個cache的配置增加一個cacheEventListenerFactory元素來完成 <! Sample cache named sampleCache ><cache name= sampleCache maxElementsInMemory= eternal= false timeToIdleSeconds= timeToLiveSeconds= overflowToDisk= false ><cacheEventListenerFactory class= net sf ehcache distribution RMICacheReplicatorFactory properties= replicateAsynchronously=true replicatePuts=true replicateUpdates=true replicateUpdatesViaCopy=false replicateRemovals=true /></cache>class – 使用net sf ehcache distribution RMICacheReplicatorFactory 這個工廠支持以下屬性 replicatePuts=true | false – 當一個新元素增加到緩存中的時候是否要復制到其他的peers 默認是true replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制 默認是true replicateRemovals= true | false – 當元素移除的時候是否進行復制 默認是true replicateAsynchronously=true | false – 復制方式是非同步的(指定為true時)還是同步的(指定為false時) 默認是true replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其他的cache中時是否進行復制指定為true時為復制 默認是true replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其他的cache中時是否進行復制(指定為true時為復制) 默認是true 你可以使用ehcache的默認行為從而減少配置的工作量 默認的行為是以非同步的方式復制每件事 你可以像下面的例子一樣減少RMICacheReplicatorFactory的屬性配置 <! Sample cache named sampleCache All missing RMICacheReplicatorFactory properties default to true ><cache name= sampleCache maxElementsInMemory= eternal= true overflowToDisk= false memoryStoreEvictionPolicy= LFU ><cacheEventListenerFactory class= net sf ehcache distribution RMICacheReplicatorFactory /></cache> 常見的問題 Windows上的Tomcat 有一個Tomcat或者是JDK的bug 在tomcat啟動時如果tomcat的安裝路徑中有空格的話 在啟動時RMI監聽器會失敗 參見 bin/wa?A =ind &L=rmi users&P= 和 doc/faq howto bugs/l 由於在Windows上安裝Tomcat默認是裝在 Program Files 文件夾里的 所以這個問題經常發生 廣播阻斷 自動的peer discovery與廣播息息相關 廣播可能被路由阻攔 像Xen和VMWare這種虛擬化的技術也可以阻攔廣播 如果這些都打開了 你可能還在要將你的網卡的相關配置打開 一個簡單的辦法可以告訴廣播是否有效 那就是使用ehcache remote debugger來看 心跳 是否可用 廣播傳播的不夠遠或是傳得太遠 你可以通過設置badly misnamed time to live來控制廣播傳播的距離 用廣播IP協議時 timeToLive的值指的是數據包可以傳遞的域或是范圍 約定如下 是限制在同一個伺服器 是限制在同一個子網 是限制在同一個網站 是限制在同一個region 是限制在同一個大洲 是不限制 譯者按 上面這些資料翻譯的不夠准確 請讀者自行尋找原文理解吧 在Java實現中默認值是 也就是在同一個子網中傳播 改變timeToLive屬性可以限制或是擴展傳播的范圍

三 RMI方式緩存集群/配置分布式緩存 RMI 是 Java 的一種遠程方法調用技術 是一種點對點的基於 Java 對象的通訊方式 EhCache 從 版本開始就支持 RMI 方式的緩存集群 在集群環境中 EhCache 所有緩存對象的鍵和值都必須是可序列化的 也就是必須實現 java io Serializable 介面 這點在其它集群方式下也是需要遵守的 下圖是 RMI 集群模式的結構圖

採用 RMI 集群模式時 集群中的每個節點都是對等關系 並不存在主節點或者從節點的概念 因此節點間必須有一個機制能夠互相認識對方 必須知道其它節點的信息 包括主機地址 埠號等 EhCache 提供兩種節點的發現方式 手工配置和自動發現 手工配置方式要求在每個節點中配置其它所有節點的連接信息 一旦集群中的節點發生變化時 需要對緩存進行重新配置 由於 RMI 是 Java 中內置支持的技術 因此使用 RMI 集群模式時 無需引入其它的 Jar 包 EhCache 本身就帶有支持 RMI 集群的功能 使用 RMI 集群模式需要在 ehcache xml 配置文件中定義 節點 分布式同步緩存要讓這邊的cache知道對方的cache 叫做Peer Discovery(成員發現) EHCache實現成員發現的方式有兩種 手動查找 A 在ehcache xml中配置PeerDiscovery成員發現對象 Server 配置 配置本地hostName port是 分別監聽 : 的mobileCache和 : 的mobileCache 注意這里的mobileCache是緩存的名稱 分別對應著server server 的cache的配置 <?xml version= encoding= gbk ?><ehcache xmlns:xsi= instance xsi:noNamespaceSchemaLocation= ehcache xsd > <diskStore path= java io tmpdir /> <! 集群多台伺服器中的緩存 這里是要同步一些伺服器的緩存 server hostName: port: cacheName:mobileCache server hostName: port: cacheName:mobileCache server hostName: port: cacheName:mobileCache 注意 每台要同步緩存的伺服器的RMI通信socket埠都不一樣 在配置的時候注意設置 > <! server 的配置 > < class= net sf ehcache distribution properties= hostName=localhost port= socketTimeoutMillis= peerDiscovery=manual rmiUrls=// : /mobileCache|// : /mobileCache /></ehcache>以上注意元素出現的位置在diskStore下

同樣在你的另外 台伺服器上增加配置 Server 配置本地host port為 分別同步 : 的mobileCache和 : 的mobileCache <! server 的配置 >< class= net sf ehcache distribution properties= hostName=localhost port= socketTimeoutMillis= peerDiscovery=manual rmiUrls=// : /mobileCache|// : /mobileCache />Server 配置本地host port為 分別同步 : 的mobileCache緩存和 : 的mobileCache緩存 <! server 的配置 >< class= net sf ehcache distribution properties= hostName=localhost port= socketTimeoutMillis= peerDiscovery=manual rmiUrls=// : /mobileCache|// : /mobileCache />這樣就在三台不同的伺服器上配置了手動查找cache的PeerProvider成員發現的配置了 值得注意的是你在配置rmiUrls的時候要特別注意url不能重復出現 並且埠 地址都是對的 如果指定 hostname將使用InetAddress getLocalHost() getHostAddress()來得到 警告 不要將localhost配置為本地地址 因為它在網路中不可見將會導致不能從遠程伺服器接收信息從而不能復制 在同一台機器上有多個CacheManager的時候 你應該只用localhost來配置 B 下面配置緩存和緩存同步監聽 需要在每台伺服器中的ehcache xml文件中增加cache配置和cacheEventListenerFactory cacheLoaderFactory的配置 <defaultCache maxElementsInMemory= eternal= false timeToIdleSeconds= timeToLiveSeconds= overflowToDisk= false /><! 配置自定義緩存 maxElementsInMemory:緩存中允許創建的最大對象數 eternal:緩存中對象是否為永久的 如果是 超時設置將被忽略 對象從不過期 timeToIdleSeconds:緩存數據空閑的最大時間 也就是說如果有一個緩存有多久沒有被訪問就會被銷毀 如果該值是 就意味著元素可以停頓無窮長的時間 timeToLiveSeconds:緩存數據存活的時間 緩存對象最大的的存活時間 超過這個時間就會被銷毀 這只能在元素不是永久駐留時有效 如果該值是 就意味著元素可以停頓無窮長的時間 overflowToDisk:內存不足時 是否啟用磁碟緩存 memoryStoreEvictionPolicy:緩存滿了之後的淘汰演算法 每一個小時更新一次緩存( 小時過期) ><cache name= mobileCache maxElementsInMemory= eternal= false overflowToDisk= true timeToIdleSeconds= timeToLiveSeconds= memoryStoreEvictionPolicy= LFU > <! RMI緩存分布同步查找 class使用net sf ehcache distribution RMICacheReplicatorFactory 這個工廠支持以下屬性 replicatePuts=true | false – 當一個新元素增加到緩存中的時候是否要復制到其他的peers 默認是true replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制 默認是true replicateRemovals= true | false – 當元素移除的時候是否進行復制 默認是true replicateAsynchronously=true | false – 復制方式是非同步的 指定為true時 還是同步的 指定為false時 默認是true replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其他的cache中時是否進行復制 指定為true時為復制 默認是true replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其他的cache中時是否進行復制 指定為true時為復制 默認是true = > <! 監聽RMI同步緩存對象配置 注冊相應的的緩存監聽類 用於處理緩存事件 如put remove update 和expire > <cacheEventListenerFactory class= net sf ehcache distribution RMICacheReplicatorFactory properties= replicateAsynchronously=true /> replicatePuts=true replicateUpdates=true replicateUpdatesViaCopy=false replicateRemovals=true <! 用於在初始化緩存 以及自動設置 > <bootstrapCacheLoaderFactory class= net sf ehcache bootstrap BootstrapCacheLoaderFactory /></cache> C 這樣就完成了 台伺服器的配置 下面給出server 的完整的ehcache xml的配置 <?xml version= encoding= gbk ?><ehcache xmlns:xsi= instance xsi:noNamespaceSchemaLocation= ehcache xsd > <diskStore path= java io tmpdir /> <!

集群多台伺服器中的緩存 這里是要同步一些伺服器的緩存 server hostName: port: cacheName:mobileCache server hostName: port: cacheName:mobileCache server hostName: port: cacheName:mobileCache 注意每台要同步緩存的伺服器的RMI通信socket埠都不一樣 在配置的時候注意設置 > <! server 的配置 > < class= net sf ehcache distribution properties= hostName=localhost port= socketTimeoutMillis= peerDiscovery=manual rmiUrls=// : /mobileCache|// : /mobileCache /> <defaultCache maxElementsInMemory= eternal= false timeToIdleSeconds= timeToLiveSeconds= overflowToDisk= false /> <! 配置自定義緩存 maxElementsInMemory:緩存中允許創建的最大對象數 eternal:緩存中對象是否為永久的 如果是 超時設置將被忽略 對象從不過期 timeToIdleSeconds:緩存數據空閑的最大時間 也就是說如果有一個緩存有多久沒有被訪問就會被銷毀 如果該值是 就意味著元素可以停頓無窮長的時間 timeToLiveSeconds:緩存數據存活的時間 緩存對象最大的的存活時間 超過這個時間就會被銷毀 這只能在元素不是永久駐留時有效 如果該值是 就意味著元素可以停頓無窮長的時間 overflowToDisk:內存不足時 是否啟用磁碟緩存 memoryStoreEvictionPolicy:緩存滿了之後的淘汰演算法 每一個小時更新一次緩存( 小時過期) > <cache name= mobileCache maxElementsInMemory= eternal= false overflowToDisk= true timeToIdleSeconds= timeToLiveSeconds= memoryStoreEvictionPolicy= LFU > <! RMI緩存分布同步查找 class使用net sf ehcache distribution RMICacheReplicatorFactory 這個工廠支持以下屬性 replicatePuts=true | false – 當一個新元素增加到緩存中的時候是否要復制到其他的peers 默認是true replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制 默認是true replicateRemovals= true | false – 當元素移除的時候是否進行復制 默認是true replicateAsynchronously=true | false – 復制方式是非同步的 指定為true時 還是同步的 指定為false時 默認是true replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其他的cache中時是否進行復制 指定為true時為復制 默認是true replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其他的cache中時是否進行復制 指定為true時為復制 默認是true = > <! 監聽RMI同步緩存對象配置 注冊相應的的緩存監聽類 用於處理緩存事件 如put remove update 和expire > <cacheEventListenerFactory class= net sf ehcache distribution RMICacheReplicatorFactory properties= replicateAsynchronously=true /> replicatePuts=true replicateUpdates=true replicateUpdatesViaCopy=false replicateRemovals=true <! 用於在初始化緩存 以及自動設置 > <bootstrapCacheLoaderFactory class= net sf ehcache bootstrap BootstrapCacheLoaderFactory /> </cache></ehcache> 自動發現 自動發現配置和手動查找的方式有一點不同 其他的地方都基本是一樣的 同樣在ehcache xml中增加配置 配置如下 <! 搜索某個網段上的緩存timeToLive 是限制在同一個伺服器 是限制在同一個子網 是限制在同一個網站 是限制在同一個region 是限制在同一個大洲 是不限制 >< class= net sf ehcache distribution properties= peerDiscovery=automatic multicastGroupAddress= multicastGroupPort= timeToLive= /> lishixin/Article/program/Java/hx/201311/25706

『貳』 什麼為分布式緩存

分布式緩存主要用於在高並發環境下,減輕資料庫的壓力,提高系統的響應速度和並發吞吐。當大量的讀、寫請求湧向資料庫時,磁碟的處理速度與內存顯然不在一個量級,因此,在資料庫之前加一層緩存,能夠顯著提高系統的響應速度,並降低資料庫的壓力。作為傳統的大豎關系型資料庫,Mysql提供完整的ACID操作,支持豐富的數據類型、強大的關聯查詢、where語句等,能夠非常客易地建立查詢索引,執行復雜的內連接、外連接、求和、排序、分組等操作,並且支持存儲過程、函數等功能,產品成熟度高,功能強大。但是,對於需要應對高並發訪問並且存儲海量數據的場景來說,出於對性能的考慮,不得不放棄很多傳統關系型資料庫原本強大的功能,犧牲了系統的易用性,並且使得系統的設計和管理變得更為復雜。這也使得在過去幾年中,流行著另一種新的存儲解決方案——NoSQL,它與傳統的關系型資料庫最大的差別在於,它不使用SQL作為查詢語言來查找數據,而採用key-value形式進行查找,提供了滾仿鬧更高的查詢效率及吞吐,並且能夠更加方便地進行擴展,存儲海量數據,在數千個節點上進行分區,自動進行數據的復制和備份。在分布式系統中,消息作為應用間通信的一種方式,得到了十分廣泛的應用。消息可以被保存在隊列中,直到被接收者取出,由於消息發送者不需要同步等待消息接收者的響應,消息的非同步接收降低了系統集成的耦合度,提升了分布式系統協作大罩的效率,使得系統能夠更快地響應用戶,提供更高的吞吐。
當系統處於峰值壓力時,分布式消息隊列還能夠作為緩沖,削峰填谷,緩解集群的壓力,避免整個系統被壓垮。垂直化的搜索引擎在分布式系統中是一個非常重要的角色,它既能夠滿足用戶對於全文檢索、模糊匹配的需求,解決資料庫like查詢效率低下的問題,又能夠解決分布式環境下,由於採用分庫分表,或者使用NoSQL資料庫,導致無法進行多表關聯或者進行復雜查詢的問題。

『叄』 分布式存儲最佳緩存比

作者:深入細節的 SmartX 一線技術團隊

近日,VMware 發布了 vSAN 8,對存儲架構進行了重大更新。其中最主要的變化,即引入了新的 Express Storage Architecture(ESA)架構:用「存儲池」替代了原存儲架構(OSA)中的「磁碟組」,並不再需要專用 SSD 承擔緩存加速功能,一定程度上避免了 8.0 之前版本中的專用緩存檔利用率低、易發生緩存擊穿等問題。
而值得一提的是,在 vSAN 大版本更新之前,SmartX 即通過統一緩存空間和智能冷熱數據管理優化了分布式存儲緩存機制,有效規避了上述問題。本文將通過重點解讀 vSAN(以 vSAN 7 為例)和 SmartX 分布式塊存儲組件 ZBS* 緩存機制的原理,並測試對比兩種緩存機制下虛擬機性能表現,讓讀者更好地了解兩種技術實現機制的區別對業務可能帶來的實際影響。

* ZBS 內置於 SmartX 超融合軟體 SMTX OS,可與 SmartX 原生虛擬化 ELF 搭配提供服務。

本文重點
vSAN 7 採用劃分讀寫緩存空間的機制,將緩存磁碟按照容量佔比劃分為寫緩沖區(30%)和讀緩存區(70%)。這種方式可能出現緩存利用率低、在訪問數據量過大時導致緩存擊穿,進而引起性能下降等問題。
ZBS 採用統一緩存空間的機制,並通過 2 級 LRU 演算法對冷熱數據進行管理,在充分利用緩存容量的同時避免了因訪問量激增導致虛擬機性能下降的情況。
本文基於相同的硬體配置和 I/O 讀寫場景,分別測試 VMware 超融合(vSphere 虛擬化 + vSAN 分布式存儲)寫入 300 GB 數據、SMTX OS(ELF + ZBS)寫入 500 GB 數據時虛擬機的性能表現。結果顯示,vSAN 7 難以充分利用緩存介質,發生緩存擊穿,導致存儲性能下降;而 SMTX OS 即便在寫入更多數據的情況下也未發生緩存擊穿,虛擬機性能保持穩定。
場景問題
混閃配置是超融合或分布式存儲現階段的主流落地模式。混閃配置是指機器中的磁碟使用 SSD + HDD 混合組成,其中 SSD 磁碟作為數據緩存層,而 HDD 磁碟作為數據容量層。以該模式構建的分布式存儲池通過軟體演算法進行冷熱數據自動判斷,在提供高性能的同時,還可獲得較大的存儲容量,進而提升資源利用率,獲得相對全快閃記憶體儲更高的性價比。

在將 SSD 磁碟用作數據緩存層時,部分超融合產品會將緩存容量(Cache)劃分為讀和寫各自獨立的兩部分。例如,vSAN 7 及更早版本會將每個磁碟組(Disk Group)中的緩存磁碟,按照容量佔比劃分為寫緩沖區(30%)和讀緩存區(70%),當讀取數據未命中緩存或者寫緩存已滿,將會直接從容量層進行讀寫。

『肆』 分布式文件存儲系統通過什麼方式提高可用性和安全性

分布式存儲的六大優點


1. 高性能

一個具有高性能的分布式存戶通常能夠高效地管理讀緩存和寫緩存,並且支持自動的分級存儲。分布式存儲通過將熱點區域內數據映射到高速存儲中,來提高系統響應速度;一旦這些區域不再是熱點,那麼存儲系統會將它們移出高速存儲。而寫緩存技術則可使配合高速存儲來明顯改變整體存儲的性能,按照一定的策略,先將數據寫入高速存儲,再在適當的時間進行同步落盤。

2. 支持分級存儲

由於通過網路進行松耦合鏈接,分布式存儲允許高速存儲和低速存儲分開部署,或者任意比例混布。在不可預測的業務環境或者敏捷應用情況下,分層存儲的優勢可以發揮到最佳。解決了目前緩存分層存儲最大的問題是當性能池讀不命中後,從冷池提取數據的粒度太大,導致延遲高,從而給造成整體的性能的抖動的問題。

3. 多副本的一致性

與傳統的存儲架構使用RAID模式來保證數據的可靠性不同,分布式存儲採用了多副本備份機制。在存儲數據之前,分布式存儲對數據進行了分片,分片後的數據按照一定的規則保存在集群節點上。為了保證多個數據副本之間的一致性,分布式存儲通常採用的是一個副本寫入,多個副本讀取的強一致性技術,使用鏡像、條帶、分布式校驗等方式滿足租戶對於可靠性不同的需求。在讀取數據失敗的時候,系統可以通過從其他副本讀取數據,重新寫入該副本進行恢復,從而保證副本的總數固定;當數據長時間處於不一致狀態時,系統會自動數據重建恢復,同時租戶可設定數據恢復的帶寬規則,最小化對業務的影響。

4. 容災與備份

在分布式存儲的容災中,一個重要的手段就是多時間點快照技術,使得用戶生產系統能夠實現一定時間間隔下的各版本數據的保存。特別值得一提的是,多時間點快照技術支持同時提取多個時間點樣本同時恢復,這對於很多邏輯錯誤的災難定位十分有用,如果用戶有多台伺服器或虛擬機可以用作系統恢復,通過比照和分析,可以快速找到哪個時間點才是需要回復的時間點,降低了故障定位的難度,縮短了定位時間。這個功能還非常有利於進行故障重現,從而進行分析和研究,避免災難在未來再次發生。多副本技術,數據條帶化放置,多時間點快照和周期增量復制等技術為分布式存儲的高可靠性提供了保障。

5. 彈性擴展

得益於合理的分布式架構,分布式存儲可預估並且彈性擴展計算、存儲容量和性能。分布式存儲的水平擴展有以下幾個特性:

1) 節點擴展後,舊數據會自動遷移到新節點,實現負載均衡,避免單點過熱的情況出現;

2) 水平擴展只需要將新節點和原有集群連接到同一網路,整個過程不會對業務造成影響;

3) 當節點被添加到集群,集群系統的整體容量和性能也隨之線性擴展,此後新節點的資源就會被管理平台接管,被用於分配或者回收。

6. 存儲系統標准化

隨著分布式存儲的發展,存儲行業的標准化進程也不斷推進,分布式存儲優先採用行業標准介面(SMI-S或OpenStack Cinder)進行存儲接入。在平台層面,通過將異構存儲資源進行抽象化,將傳統的存儲設備級的操作封裝成面向存儲資源的操作,從而簡化異構存儲基礎架構的操作,以實現存儲資源的集中管理,並能夠自動執行創建、變更、回收等整個存儲生命周期流程。基於異構存儲整合的功能,用戶可以實現跨不同品牌、介質地實現容災,如用中低端陣列為高端陣列容災,用不同磁碟陣列為快閃記憶體陣列容災等等,從側面降低了存儲采購和管理成本。

『伍』 大型互聯網架構概述,看完文章又漲知識了

1. 大型網站系統的特點

2. 大型網站架構演化歷程

2.1. 初始階段架構

問題:網站運營初期,訪問用戶少,一台伺服器綽綽有餘。

特徵:應用程序、資料庫、文件等所有的資源都在一台伺服器上。

描述:通常伺服器操作系統使用 linux,應用程序使用 PHP 開發,然後部署在 Apache 上,資料庫使用 Mysql,通俗稱為 LAMP。匯集各種免費開源軟體以及一台廉價伺服器就可以開始系統的發展之路了。

2.2. 應用服務和數據服務分離

問題:越來越多的用戶訪問導致性能越來越差,越來越多的數據導致存儲空間不足,一台伺服器已不足以支撐。

特徵:應用伺服器、資料庫伺服器、文件伺服器分別獨立部署。

描述:三台伺服器對性能要求各不相同:應用伺服器要處理大量業務邏輯,因此需要更快更強大的 CPU;資料庫伺服器需要快速磁碟檢索和數據緩存,因此需要更快的硬碟和更大的內存;文件伺服器需要存儲大量文件,因此需要更大容量的硬碟。

2.3. 使用緩存改善性能

問題:隨著用戶逐漸增多,資料庫壓力太大導致訪問延遲。

特徵:由於網站訪問和財富分配一樣遵循二八定律:80% 的業務訪問集中在 20% 的數據上。將資料庫中訪問較集中的少部分數據緩存在內存中,可以減少資料庫的訪問次數,降低資料庫的訪問壓力。

描述:緩存分為兩種:應用伺服器上的本地緩存和分布式緩存伺服器上的遠程緩存,本地緩存訪問速度更快,但緩存數據量有限,同時存在與應用程序爭用內存的情況。分布式緩存可以採用集群方式,理論上可以做到不受內存容量限制的緩存服務。

2.4. 使用應用伺服器集群

問題:使用緩存後,資料庫訪問壓力得到有效緩解。但是單一應用伺服器能夠處理的請求連接有限,在訪問高峰期,成為瓶頸。

特徵:多台伺服器通過負載均衡同時向外部提供服務,解決單一伺服器處理能力和存儲空間不足的問題。

描述:使用集群是系統解決高並發、海量數據問題的常用手段。通過向集群中追加資源,提升系統的並發處理能力,使得伺服器的負載壓力不再成為整個系統的瓶頸。

2.5. 資料庫讀寫分離

問題:網站使用緩存後,使絕大部分數據讀操作訪問都可以不通過資料庫就能完成,但是仍有一部分讀操作和全部的寫操作需要訪問資料庫,在網站的用戶達到一定規模後,資料庫因為負載壓力過高而成為網站的瓶頸。

特徵:目前大部分的主流資料庫都提供主從熱備功能,通過配置兩台資料庫主從關系,可以將一台資料庫伺服器的數據更新同步到一台伺服器上。網站利用資料庫的主從熱備功能,實現資料庫讀寫分離,從而改善資料庫負載壓力。

描述:應用伺服器在寫操作的時候,訪問主資料庫,主資料庫通過主從復制機制將數據更新同步到從資料庫。這樣當應用伺服器在讀操作的時候,訪問從資料庫獲得數據。為了便於應用程序訪問讀寫分離後的資料庫,通常在應用伺服器端使用專門的數據訪問模塊,使資料庫讀寫分離的對應用透明。

2.6. 反向代理和 CDN 加速

問題:中國網路環境復雜,不同地區的用戶訪問網站時,速度差別也極大。

特徵:採用 CDN 和反向代理加快系統的靜態資源訪問速度。

描述:CDN 和反向代理的基本原理都是緩存,區別在於 CDN 部署在網路提供商的機房,使用戶在請求網站服務時,可以從距離自己最近的網路提供商機房獲取數據;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的伺服器時反向代理伺服器,如果反向代理伺服器中緩存著用戶請求的資源,就將其直接返回給用戶。

2.7. 分布式文件系統和分布式資料庫

問題:隨著大型網站業務持續增長,資料庫經過讀寫分離,從一台伺服器拆分為兩台伺服器,依然不能滿足需求。

特徵:資料庫採用分布式資料庫,文件系統採用分布式文件系統。

描述:分布式資料庫是資料庫拆分的最後方法,只有在單表數據規模非常龐大的時候才使用。不到不得已時,更常用的資料庫拆分手段是業務分庫,將不同的業務資料庫部署在不同的物理伺服器上。

2.8. 使用 NoSQL 和搜索引擎

問題:隨著網站業務越來越復雜,對數據存儲和檢索的需求也越來越復雜。

特徵:系統引入 NoSQL 資料庫及搜索引擎。

描述:NoSQL 資料庫及搜索引擎對可伸縮的分布式特性具有更好的支持。應用伺服器通過統一數據訪問模塊訪問各種數據,減輕應用程序管理諸多數據源的麻煩。

2.9. 業務拆分

問題:大型網站的業務場景日益復雜,分為多個產品線。

特徵:採用分而治之的手段將整個網站業務分成不同的產品線。系統上按照業務進行拆分改造,應用伺服器按照業務區分進行分別部署。

描述:應用之間可以通過超鏈接建立關系,也可以通過消息隊列進行數據分發,當然更多的還是通過訪問同一個數據存儲系統來構成一個關聯的完整系統。

縱向拆分:將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的 Web 應用系統。縱向拆分相對較為簡單,通過梳理業務,將較少相關的業務剝離即可。

橫向拆分:將復用的業務拆分出來,獨立部署為分布式服務,新增業務只需要調用這些分布式服務橫向拆分需要識別可復用的業務,設計服務介面,規范服務依賴關系。

2.10. 分布式服務

問題:隨著業務越拆越小,存儲系統越來越龐大,應用系統整體復雜程度呈指數級上升,部署維護越來越困難。由於所有應用要和所有資料庫系統連接,最終導致資料庫連接資源不足,拒絕服務。

特徵:公共業務提取出來,獨立部署。由這些可復用的業務連接資料庫,通過分布式服務提供共用業務服務。

3. 大型網站架構模式

3.1. 分層

大型網站架構中常採用分層結構,將軟體系統分為應用層、服務層、數據層:

分層架構的約束:禁止跨層次的調用(應用層直接調用數據層)及逆向調用(數據層調用服務層,或者服務層調用應用層)。

分層結構內部還可以繼續分層,如應用可以再細分為視圖層和業務邏輯層;服務層也可以細分為數據介面層和邏輯處理層。

3.2. 分割

將不同的功能和服務分割開來,包裝成高內聚低耦合的模塊單元。這有助於軟體的開發和維護,便於不同模塊的分布式部署,提高網站的並發處理能力和功能擴展能力。

3.3. 分布式

大於大型網站,分層和分割的一個主要目的是為了切分後的模塊便於分布式部署,即將不同模塊部署在不同的伺服器上,通過遠程調用協同工作。

分布式意味可以用更多的機器工作,那麼 CPU、內存、存儲資源也就更豐富,能夠處理的並發訪問和數據量就越大,進而能夠為更多的用戶提供服務。

分布式也引入了一些問題:

常用的分布式方案:

3.4. 集群

集群即多台伺服器部署相同應用構成一個集群,通過負載均衡設備共同對外提供服務。

集群需要具備伸縮性和故障轉移機制:伸縮性是指可以根據用戶訪問量向集群添加或減少機器;故障轉移是指,當某台機器出現故障時,負載均衡設備或失效轉移機制將請求轉發到集群中的其他機器上,從而不影響用戶使用。

3.5. 緩存

緩存就是將數據存放在距離最近的位置以加快處理速度。緩存是改善軟體性能的第一手段。

網站應用中,緩存除了可以加快數據訪問速度以外,還可以減輕後端應用和數據存儲的負載壓力。

常見緩存手段:

使用緩存有兩個前提:

3.6. 非同步

軟體發展的一個重要目標和驅動力是降低軟體耦合性。事物之間直接關系越少,彼此影響就越小,也就更容易獨立發展。

大型網站架構中,系統解耦的手段除了分層、分割、分布式等,還有一個重要手段——非同步。

業務間的消息傳遞不是同步調用,而是將一個業務操作拆分成多階段,每個階段間通過共享數據的方式非同步執行進行協作。

非同步架構是典型的生產者消費模式,二者不存在直接調用。非同步消息隊列還有如下特性:

3.7. 冗餘

大型網站,出現伺服器宕機是必然事件。要保證部分伺服器宕機的情況下網站依然可以繼續服務,不丟失數據,就需要一定程度的伺服器冗餘運行,數據冗餘備份。這樣當某台伺服器宕機是,可以將其上的服務和數據訪問轉移到其他機器上。

訪問和負載很小的服務也必須部署 至少兩台伺服器構成一個集群,目的就是通過冗餘實現服務高可用。數據除了定期備份,存檔保存,實現 冷備份 外;為了保證在線業務高可用,還需要對資料庫進行主從分離,實時同步實現 熱備份。

為了抵禦地震、海嘯等不可抗因素導致的網站完全癱瘓,某些大型網站會對整個數據中心進行備份,全球范圍內部署 災備數據中心。網站程序和數據實時同步到多個災備數據中心。

3.8. 自動化

大型網站架構的自動化架構設計主要集中在發布運維方面:

3.9. 安全

4. 大型網站核心架構要素

架構 的一種通俗說法是:最高層次的規劃,難以改變的決定。

4.1. 性能

性能問題無處不在,所以網站性能優化手段也十分繁多:

4.2. 可用性

可用性指部分伺服器出現故障時,還能否對用戶提供服務

4.3. 伸縮性

衡量伸縮的標准就是是否可以用多台伺服器構建集群,是否容易向集群中增刪伺服器節點。增刪伺服器節點後是否可以提供和之前無差別的服務。集群中可容納的總伺服器數是否有限制。

4.4. 擴展性

衡量擴展性的標准就是增加新的業務產品時,是否可以實現對現有產品透明無影響,不需要任何改動或很少改動,既有功能就可以上線新產品。主要手段有:事件驅動架構和分布式服務。

4.5. 安全性

安全性保護網站不受惡意攻擊,保護網站重要數據不被竊取。

歡迎工作一到五年的Java工程師朋友們加入Java程序員開發: 721575865

群內提供免費的Java架構學習資料(裡面有高可用、高並發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間「來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

『陸』 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,就像一個輕量級的配置緩存工作狀態的框架。

『柒』 什麼是分布式緩存

分布式緩存能夠處理大量的動態數據,因此比較適合應用在Web 2.0時代中的社交網站等需要由用戶生成內容的場景。從本地緩存擴展到分布式緩存後,關注重點從CPU、內存、緩存之間的數據傳輸速度差異也擴展到了業務系統、資料庫、分布式緩存之間的數據傳輸速度差異。

常用的分布式緩存包括Redis和Memcached。

Memcached

Memcached是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。Memcached通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。

特點:哈希方式存儲;全內存操作;簡單文本協議進行數據通信;只操作字元型數據;集群由應用進行控制,採用一致性哈希演算法。

限制性:數據保存在內存當中的,一旦機器重啟,數據會全部丟失;只能操作字元型數據,數據類型貧乏;以root許可權運行,而且Memcached本身沒有任何許可權管理和認證功能,安全性不足;能存儲的數據長度有限,最大鍵長250個字元,儲存數據不能超過1M。

Redis

Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。

特點:

Redis支持的數據類型包括:字元串、string、hash、set、sortedset、list;Redis實現持久化的方式:定期將內存快照寫入磁碟;寫日誌;Redis支持主從同步。

限制性:單核運行,在存儲大數據的時候性能會有降低;不是全內存操作;主從復制是全量復制,對實際的系統運營造成了一定負擔。

『捌』 分布式搜索引擎elasticsearch的架構原理

分布式搜索引擎:把大量的索引數據拆散成多塊,每台機器放一部分,然 後利用多台機器對分散之後的數據進行搜索,所有操作全部是分布在多台機器上進行,形成了 完整的分布式的架構。

近實時,有兩層意思:

集群包含多個節點,每個節點屬於哪個集群都是通數旦橋過一個配置來決定的,
Node 是集群中的一個節點,節點也有一個名稱,默認是隨機分配的。默認節點會去加入一個名 稱為 elasticsearch 的集群。如果直接啟動一堆節點,那麼它們會自動組成一個elasticsearch 集群,當然一個節點也可以組成 elasticsearch 集群。

文檔是 es 中最小的數據單元,一個 document 可以是1條客戶數據、1條商品分類數據、1條 訂單數據,通常用json 數據結構來表示。每個 index 下的 type,都可以存儲多條 document。
1個 document 裡面有多個 field,每個 field 就是1個數據欄位。

es 集群多個節點,會自動選舉1個節點為 master 節點,這個 master 節點其實就是干一些管理 的工作的,比如維護索引元數據、負責切換 primary shard 和 replica shard 身份等。要是 master 節點宕機了,那麼會重新選舉1個節點為 master 節點。 如果是非 master節點宕薯猛機了,那麼會由 master 節點,讓那個宕機節點上的 primary shard 的身 份轉移到其他機器上的 replica shard。接著你要是修復了那個宕機機器,重啟了之後,master 節點會控制將缺失的 replica shard 分配過去,同步後續修改的數據之類的,讓集群恢復正常。 說得更簡單1點,就是說如果某個非 master 節點宕機了,那麼此節點上的 primary shard 不就 沒了。那好遲租,master 會讓 primary shard 對應的 replica shard(在其他機器上)切換為 primary shard。如果宕機的機器修復了,修復後的節點也不再是 primary shard,而是 replica shard。

索引可以拆分成多個 shard ,每個 shard 存儲部分數據。拆分多個 shard是有好處的,一是支持橫向擴展,比如你數據量是 3T,3 個 shard,每個 shard 就 1T 的數據, 若現在數據量增加到 4T,怎麼擴展,很簡單,重新建1個有 4 個 shard 的索引,將數據導進 去;二是提高性能,數據分布在多個 shard,即多台伺服器上,所有的操作,都會在多台機器 上並行分布式執行,提高了吞吐量和性能。 接著就是這個 shard 的數據實際是有多個備份,就是說每個 shard 都有1個 primary shard ,負責寫入數據,但是還有多個 replica shard 。 primary shard 寫入數據之後, 會將數據同步到其他幾個 replica shard上去。
通過這個 replica 的方案,每個 shard 的數據都有多個備份,如果某個機器宕機了,沒關系啊, 還有別的數據副本在別的機器上,這樣子就高可用了。

總結:分布式就是兩點,1.通過shard切片實現橫向擴展;2.通過replica副本機制,實現高可用

基本概念

寫數據過程:客戶端通過hash選擇一個node發送請求,這個node被稱做coordinating node(協調節點),協調節點對docmount進行路由,將請求轉發給到對應的primary shard,primary shard 處理請求,將數據同步到所有的replica shard,此時協調節點,發現primary shard 和所有的replica shard都處理完之後,就反饋給客戶端。

客戶端發送get請求到任意一個node節點,然後這個節點就稱為協調節點,協調節點對document進行路由,將請求轉發到對應的node,此時會使用隨機輪詢演算法,在primary shard 和replica shard中隨機選擇一個,讓讀取請求負載均衡,接收請求的node返回document給協調節點,協調節點,返回document給到客戶端

es最強大的是做全文檢索,就是比如你有三條數據
1.java真好玩兒啊
2.java好難學啊
3.j2ee特別牛

你根據java關鍵詞來搜索,將包含java的document給搜索出來。

更新/刪除數據過程,首先還是write、merge操作,然後flush過程中:
1、write過程和上面的一致;
2、refresh過程有點區別

所謂的倒排索引,就是把你的數據內容先分詞,每句話分成一個一個的關鍵詞,然後記錄好每一個關鍵詞對應出現在了哪些 id 標識的數據。
然後你可以從其他地根據這個 id 找到對應的數據就可以了,這個就是倒排索引的數據格式 以及搜索的方式,這種利倒排索引查找數據的式,也被稱之為全文檢索。

Inverted Index就是我們常見的倒排索引, 主要包括兩部分:
一個有序的數據字典 Dictionary(包括單詞 Term 和它出現的頻率)。
與單詞 Term 對應的 Postings(即存在這個單詞的文件)
當我們搜索的時候,首先將搜索的內容分解,然後在字典里找到對應 Term,從而查找到與搜索相關的文件內容。

本質上,Stored Fields 是一個簡單的鍵值對 key-value。默認情況下,Stored Fields是為false的,ElasticSearch 會存儲整個文件的 JSON source。

哪些情形下需要顯式的指定store屬性呢?大多數情況並不是必須的。從_source中獲取值是快速而且高效的。如果你的文檔長度很長,存儲 _source或者從_source中獲取field的代價很大,你可以顯式的將某些field的store屬性設置為yes。缺點如上邊所說:假設你存 儲了10個field,而如果想獲取這10個field的值,則需要多次的io,如果從Stored Field 中獲取則只需要一次,而且_source是被壓縮過 的。

這個時候你可以指定一些欄位store為true,這意味著這個field的數據將會被單獨存儲(實際上是存兩份,source和 Stored Field都存了一份)。這時候,如果你要求返回field1(store:yes),es會分辨出field1已經被存儲了,因此不會從_source中載入,而是從field1的存儲塊中載入。

Doc_values 本質上是一個序列化的 列式存儲,這個結構非常適用於聚合(aggregations)、排序(Sorting)、腳本(scripts access to field)等操作。而且,這種存儲方式也非常便於壓縮,特別是數字類型。這樣可以減少磁碟空間並且提高訪問速度,ElasticSearch 可以將索引下某一個 Document Value 全部讀取到內存中進行操作.

Doc_values是存在磁碟的

在es中text類型欄位默認只會建立倒排索引,其它幾種類型在建立倒排索引的時候還會建立正排索引,當然es是支持自定義的。在這里這個正排索引其實就是Doc Value。

即上文所描述的動態索引

往 es 寫的數據,實際上都寫到磁碟文件里去了,查詢的時候,操作系統會將磁碟文件里的數據自動緩存到 filesystem cache 中去。

es 的搜索引擎嚴重依賴於底層的 filesystem cache ,你如果給 filesystem cache 更多的 內存,盡量讓內存可以容納所有的 idx segment file 索引數據文件,那麼你搜索的時候就 基本都是走內存的,性能會非常高。 性能差距究竟可以有多大?我們之前很多的測試和壓測,如果走磁碟一般肯定上秒,搜索性能 絕對是秒級別的,1秒、5秒、10秒。但如果是走 filesystem cache ,是走純內存的,那麼一 般來說性能比走磁碟要高一個數量級,基本上就是毫秒級的,從幾毫秒到幾百毫秒不等。

那如何才能節約filesystem cache這部分的空間呢?
當寫數據到ES時就要考慮到最小化數據,當一行數據有30幾個欄位,並不需要把所有的數據都寫入到ES,只需要把關鍵的需要檢索的幾列寫入。這樣能夠緩存的數據就會越多。 所以需要控制每台機器寫入的數據最好小於等於或者略大於filesystem cache空間最好。 如果要搜索海量數據,可以考慮用ES+Hbase架構。用Hbase存儲海量數據,然後ES搜索出doc id後,再去Hbase中根據doc id查詢指定的行數據。

當每台機器寫入的數據大於cache os太多時,導致太多的數據無法放入緩存,那麼就可以把一部分熱點數據刷入緩存中。

對於那些你覺得比較熱的、經常會有人訪問的數據,最好做個專門的緩存預熱系統,就是 對熱數據每隔一段時間,就提前訪問一下,讓數據進入 filesystem cache 里去。這樣下 次別人訪問的時候,性能肯定會好很多。

把熱數據和冷數據分開,寫入不同的索引里,然後確保把熱索引數據刷到cache里。

在ES里最好不要用復雜的關聯表的操作。當需要這樣的場景時,可以在創建索引的時候,就把數據關聯好。比如在mysql中需要根據關聯ID查詢兩張表的關聯數據:select A.name ,B.age from A join B where A.id = B.id,在寫入ES時直接去把相關聯數據放到一個document就好。

es 的分頁是較坑的,為啥呢?舉個例子吧,假如你每頁是 10 條數據,你現在要查詢第 100 頁,實際上是會把每個 shard 上存儲的前 1000 條數據都查到1個協調節點上,如果你有個 5 個 shard,那麼就有 5000 條數據,接著協調節點對這 5000 條數據進行一些合並、處理,再獲取到 最終第 100 頁的 10 條數據。
分布式的,你要查第 100 頁的 10 條數據,不可能說從 5 個 shard,每個 shard 就查 2 條數據, 最後到協調節點合並成 10 條數據吧?你必須得從每個 shard 都查 1000 條數據過來,然後根據 你的需求進行排序、篩選等等操作,最後再次分頁,拿到裡面第 100 頁的數據。你翻頁的時 候,翻的越深,每個 shard 返回的數據就越多,而且協調節點處理的時間越長,非常坑爹。所 以用 es 做分頁的時候,你會發現越翻到後面,就越是慢。

我們之前也是遇到過這個問題,用 es 作分頁,前幾頁就幾十毫秒,翻到 10 頁或者幾十頁的時 候,基本上就要 5~10 秒才能查出來一頁數據了。

解決方案嗎?
1)不允許深度分頁:跟產品經理說,你系統不允許翻那麼深的頁,默認翻的越深,性能就越差;
2)在APP或者公眾號里,通過下拉來實現分頁,即下拉時獲取到最新頁,可以通過scroll api來實現;
scroll 會1次性給你生成所有數據的1個快照,然後每次滑動向後翻頁就是通過游標 scroll_id 移動獲取下一頁,性能會比上面說的那種分頁性能要高很多很 多,基本上都是毫秒級的。 但是,唯1的缺點就是,這個適合於那種類似微博下拉翻頁的,不能隨意跳到任何一頁的場 景。也就是說,你不能先進到第 10 頁,然後去第 120 頁,然後再回到第 58 頁,不能隨意亂跳 頁。所以現在很多APP產品,都是不允許你隨意翻頁的,也有一些網站,做的就是你只能往 下拉,一頁一頁的翻。
初始化時必須指定 scroll 參數,告訴 es 要保存此次搜索的上下文多長時間。你需要確保用戶不會持續不斷翻頁翻幾個小時,否則可能因為超時而失敗。
除了用 scroll api ,也可以用 search_after 來做, search_after 的思想是使用前一頁的結果來幫助檢索下一頁的數據,顯然,這種方式也不允許你隨意翻頁,你只能一頁一頁往後 翻。初始化時,需要使用一個唯1值的欄位作為 sort 欄位。

『玖』 1.16.5伺服器優化技術有哪些

伺服器優化技術主要有分布式緩存、非同步操作、使用集群以及代碼。
網站性能優化第一定律:優先考慮使用緩存優化性能。
緩存原理
(1)什麼是緩存?(將數據存儲在相對較高訪問速度的介質中,以供系統處理)
(2)緩存的優點:訪問速度快,如果需要計算可以減少計算時間
(3)緩存的本質是一張以鍵值對存儲的內存hash表
(4)主要用來存儲:讀寫比例高,很少變化的數據
(5)網站的訪問遵循28定律
合理使用緩存應該注意以下問題
(1)頻繁更新的數據(數據還沒有讀就已經失效,一般要求讀寫比在2:1以上才有意義)
(2)沒有熱點數據(無疑浪費資源)
(3)數據不一致與臟讀(緩存被載入的過程中可能會產生數據不一致,有效時間過程數據在內存中就會變成臟數據)
(4)緩存的可用性(如果太過依賴緩存,容易產生雪崩。使用緩存熱備並不能提高緩存的可用性,使用集群可以提高可用性)
(5)緩存預熱(LRU計算時間過長,有的數據需要提前載入)
(6)緩存穿透(解決部分數據無法命中,而加重資料庫壓力的問題,一般設置空值)分布式緩存架構
(1)JBoss Cache:數據相同
(2)Memcached:數據不同互不通信
(3)Memcached5大優點:協議簡單、通用性強(支持各種語言)、Libevent網路通信、內存管理高效、互不通信。