您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Redis內存數據庫分片的示例分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
· 允許用多臺機器的內存存放更大的數據集。如果沒有分片,那么你只能存放單臺機器內存的最大值的數據集。
· 允許用多核和多臺機器提高計算能力和網絡帶寬。
1、按照范圍分片
2、哈希分片,例如一致性哈希
常見的分片的實現:
①客戶端分片
②在代理中做分片,比如:twemproxy
③查詢路由:就是發送查詢到一個隨機實例,這個實例會保證轉發你的查詢到正確的節點,redis集群在客戶端的幫助下,實現了查詢路由的一種混合形式,請求不是直接從redis實例轉發到另一個實例,而是客戶端收到重定向到正確的節點
④在服務端進行分片,Redis采用哈希槽(hash slot)的方式在服務器端進行分片:
Redis集群有16384個哈希槽,使用健CrC16對16384取模來計算一個鍵所屬的哈希槽
Redis 的一些特性與分片在一起時玩轉的不是很好:
1、涉及多個鍵的操作通常不支持。例如,你不能對映射在兩個不同 Redis 實例上的鍵執行交集(事實上有辦法做到,但不是直接這么干)。
2、涉及多個鍵的事務不能使用。
3、分片的粒度(granularity)是鍵,所以不能使用一個很大的鍵來分片數據集,例如一個很大的有序集合。
4、當使用了分片,數據處理變得更復雜,例如,你需要處理多個 RDB/AOF 文件,備份數據時你需要聚合多個實例和主機的持久化文件。
5、添加和刪除容量也很復雜。例如,Redis 集群具有運行時動態添加和刪除節點的能力來支持透明地再均衡數據,但是其他方式,像客戶端分片和代理都不支持這個特性。但是,有一種稱為預分片(Presharding)的技術在這一點上能幫上忙。
Redis分片的缺點
1、不支持涉及多建的操作,如mget,如果所操作的健都在同一個節點,就正常執行,否則會提示報錯
2、分片的粒度是健,因此每個鍵對應的值不要太大
3、數據備份會比較麻煩,備份數據時你需要聚合多個實例和主機的持久化文件
4、擴容的處理比較麻煩
5、故障的恢復的處理會比較麻煩,可能需要重新梳理Master和Slave的關系,并調整每個復制集里面的數據
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實例;
我們已經知道分片存在的一個問題,除非我們使用 Redis 作為緩存,增加和刪除節點是一件很棘手的事情,使用固定的鍵和實例映射要簡單得多。
然而,數據存儲的需求可能一直在變化。今天我可以接受 10 個 Redis 節點(實例),但是明天我可能就需要 50 個節點。
因為 Redis 只有相當少的內存占用(footprint)而且輕量級(一個空閑的實例只是用 1MB 內存),一個簡單的解決辦法是一開始就開啟很多的實例。即使你一開始只有一臺服務器,你也可以在第一天就決定生活在分布式的世界里,使用分片來運行多個 Redis 實例在一臺服務器上。
你一開始就可以選擇很多數量的實例。例如,32 或者 64 個實例能滿足大多數的用戶,并且為未來的增長提供足夠的空間。
這樣,當你的數據存儲需要增長,你需要更多的 Redis 服務器,你要做的就是簡單地將實例從一臺服務器移動到另外一臺。當你新添加了第一臺服務器,你就需要把一半的 Redis 實例從第一臺服務器搬到第二臺,如此等等。
使用 Redis 復制,你就可以在很小或者根本不需要停機時間內完成移動數據:
· 在你的新服務器上啟動一個空實例。
· 移動數據,配置新實例為源實例的從服務。
· 停止你的客戶端。
· 更新被移動實例的服務器 IP 地址配置。
· 向新服務器上的從節點發送 SLAVEOF NO ONE 命令。
· 以新的更新配置啟動你的客戶端。
· 最后關閉掉舊服務器上不再使用的實例。
由于數據量過大,單個復制集難以承擔,因此需要對多個復制集進行集群,形成水平擴展,每個復制集只負責存儲數據集的一部分,這就是Redis的集群
1、在以前版本中,Redis的集群是依靠客戶端分片來完成,但是這樣會有很多缺點,比如維護成本高,需要客戶端編碼解決;增加、移除節點都比較繁瑣等
2、Redis3.0新增的一大特性就是支持集群,在不降低性能的情況下,還提供了網絡分區的可訪問性和支持對主數據庫故障的恢復。
3、使用集群后,都只能使用默認的0號數據庫
4、每個redis集群節點需要兩個TCP連接打開,正常的TCP端口用來服務客戶端,例如6379,家10000的端口用作數據端口,必須保證防火墻打開這兩個端口
5、Redis集群不保證強一致性,這意味著在特定的條件下,Redis集群可能會丟掉一些被系統收到的寫入請求命令(Master傳播命令返回OK后掛掉,slave還沒有收到廣播)
集群的架構
1、所有的Redis節點彼此互聯,內部使用二進制協議優化傳輸速度和寬帶
2、節點的fail是通過集群中超過半數的節點檢測失效時才生效
3、客戶端與redis節點直連,不需要中間的proxy層。客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
4、集群把所有的物理節點映射到【0-16383】插槽上,集群負責維護:節點—插槽—值 的關系
集群操作的基本命令
CLUSTER INFO
CLUSTER NODES
CLUSTER MEET
CLUSTER FORGET
CLUSTER REPLICATE
CLUSTER SAVECONFIG
CLUSTER ADDSLOTS
CLUSTER DELSLOTS
CLUSTER FLUSHSLOTS
CLUSTER SETSLOT NODE
CLUSTER SETSLOT MIGRATING
CLUSTER SETSLOT IMPORTING
CLUSTER SETSLOT STABLE
CLUSTER KEYSLOT
CLUSTER COUNTKEYSINSLOT
CLUSTER GETKEYSINSLOT
MIGRATE 目的節點目的節點鍵名 數據庫號碼 超時時間 [copy] [replace]
關于Redis內存數據庫分片的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。