Redis的分片、預分片技術總結

  Redis的分片(Sharding或者Partitioning)技術是指將數據分散到多個Redis實例中的方法,分片以後,每一個redis擁有一部分原數據集的子集。在數據量很是大時,這種技術可以將數據量分散到若干主機的redis實例上,進而減輕單臺redis實例的壓力。分片技術可以以更易擴展的方式使用多臺計算機的存儲能力(這裏主要指內存的存儲能力)和計算能力:redis

        (1)從存儲能力的角度,分片技術經過使用多臺計算機的內存來承擔更大量的數據,若是沒有分片技術,那麼redis的存儲能力將受限於單臺主機的內存大小。算法

        (2) 從計算能力的角度,分片技術經過將計算任務分散到多核或者多臺主機中,可以充分利用多核、多臺主機的計算能力。服務器

下面將以舉例的方式說明分片技術及其存在的優點:分佈式

示例1:未採用分片技術,有1000萬條用戶信息數據,以鍵值對:UsrID:UsrInfo的形式存儲在一個redis實例中,此時全部的用戶信息都會存儲在一個redis實例中,對這1000萬條數據的全部插、查、刪、該操做壓力都會集中在這個redis所在的主機上;此時所要考慮的問題不只有存儲和操做對該主機的壓力,還有該主機失效時將致使全部操做都沒法進行的問題。以下圖1所示:代理

圖1 單redis實例進程

示例2:採用分片技術;有1000萬條用戶信息數據,以鍵值對:UsrID:UsrInfo的形式存儲於redis中,此時有4臺主機,每臺主機運行一個Redis實例:主機A (Redis1)、主機B(Redis2)、主機C(Redis3)、主機D(Redis4),分片時算法爲:事務

redis_index = 用戶的ID % 4 + 1;ip

例如ID爲10000654則可獲得到redis_index的值:10000654 % 4 + 1 = 1,即用戶10000654的信息將被放到Redis1上,全部對用戶1000654的操做也將被分片到Redis1上;假如用戶ID以順序方式出現,這1000萬條用戶信息將被平均分配到這四臺主機的各Redis實例上,以下圖2所示:內存

圖2 採用分片算法路由

採用分片以後,數據將被分散到4個redis實例中,對數據的操做也被分散到每一個redis實例中,此時單臺主機的壓力將大大減輕。

分片的部署,即實例2中分片算法被放在哪裏?是在分片時須要首先考慮的問題,分片部署方式通常分爲如下三種:

         (1)在客戶端作分片;這種方式在客戶端肯定要鏈接的redis實例,而後直接訪問相應的redis實例;

         (2)在代理中作分片;這種方式中,客戶端並不直接訪問redis實例,它也不知道本身要訪問的具體是哪一個redis實例,而是由代理轉發請求和結果;其工做過程爲:客戶端先將請求發送給代理,代理經過分片算法肯定要訪問的是哪一個redis實例,而後將請求發送給相應的redis實例,redis實例將結果返回給代理,代理最後將結果返回給客戶端。

         (3)在redis服務器端作分片;這種方式被稱爲「查詢路由」,在這種方式中客戶端隨機選擇一個redis實例發送請求,若是所請求的內容再也不當前redis實例中它會負責將請求轉交給正確的redis實例,也有的實現中,redis實例不會轉發請求,而是將正確redis的信息發給客戶端,由客戶端再去向正確的redis實例發送請求。

上面主要描述了分片的優勢,固然分片的存在也有缺陷,例如:

        (1) 一般沒法支持涉及多鍵的操做;在redis中有不少一次操做多個key的操做,例如求集合交集的SINTER操做,該操做將涉及到多個鍵,而這多個鍵有可能被分片到不一樣的redis實例中,此時就沒法執行這種操做。

        (2)Redis的事務操做中涉及多個鍵時也不能用;

        (3)分片將致使數據處理更加複雜;例如在分片過程當中,隨着redis實例的增長,數據備份等操做都將會變得更加複雜。

         (4)Redis目前不支持動態分片操做,擴容和縮容操做都會比較複雜,尤爲分片操做部署在客戶端時,須要從新配置和啓動客戶端。在使用過程當中縮容用的很少,擴容能夠採用後面介紹的預分片策略來緩解此問題。

預分片技術

         在正常運營環境中,通常所存儲的數據會逐漸增長,可能今天只要10個redis實例就能應付,可是到了一年之後就須要50個redis實例才能支撐,所以,redis的擴容是常常用到的功能,在redis的分佈式部署中,有預分片技術是很是好用的方法之一;

         預分片技術是指在開始時就啓動足夠多的redis實例(例如32或64個,估計一下夠之後擴展用就好了),等到後續須要擴容的時候,只須要將其中一部分的redis實例轉移到新增長的機子上便可,在redis實例遷移過程當中使用redis的複製功能能夠最大限度的下降redis的停工時間甚至能夠作到沒有停工時間。因爲redis實例是輕量級的進程,並且佔用內存較少,這裏指單純的空的redis實例,一個空的redis實例大約佔用1M的內存;所以,這種方式即不會佔用太多系統開銷,又便於實現;

         Redis的預分片技術能夠按照如下步驟進行實例遷移操做:

        (1)在新機子上啓動新的redis實例;

        (2)將新redis實例做爲slave將原redis實例做爲master,將數據從原redis實例遷移到新redis實例上;

        (3)中止客戶端(分片操做在客戶端上時)或代理服務器(分片操做在代理上)

        (4)更新客戶端或者代理服務器中的配置信息,去掉被遷移的原redis實例的ip和端口等信息,加上新啓動redis實例的IP地址和端口;

        (5)向新啓動的redis發送SLAVEOF NOONE命令,終止新redis實例對原redis實例的從屬關係;

        (6)重啓客戶端程序或者代理程序,此時它們將會使用新的redis實例;

        (7)關掉被遷移走數據的原redis實例;

相關文章
相關標籤/搜索