這篇文章將為大家詳細講解有關redis內(nèi)存數(shù)據(jù)庫分片的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

我們提供的服務有:網(wǎng)站設計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、淮濱ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的淮濱網(wǎng)站制作公司
· 允許用多臺機器的內(nèi)存存放更大的數(shù)據(jù)集。如果沒有分片,那么你只能存放單臺機器內(nèi)存的最大值的數(shù)據(jù)集。
· 允許用多核和多臺機器提高計算能力和網(wǎng)絡帶寬。
1、按照范圍分片
2、哈希分片,例如一致性哈希
常見的分片的實現(xiàn):
①客戶端分片
②在代理中做分片,比如:twemproxy
③查詢路由:就是發(fā)送查詢到一個隨機實例,這個實例會保證轉(zhuǎn)發(fā)你的查詢到正確的節(jié)點,redis集群在客戶端的幫助下,實現(xiàn)了查詢路由的一種混合形式,請求不是直接從redis實例轉(zhuǎn)發(fā)到另一個實例,而是客戶端收到重定向到正確的節(jié)點
④在服務端進行分片,Redis采用哈希槽(hash slot)的方式在服務器端進行分片:
Redis集群有16384個哈希槽,使用健CrC16對16384取模來計算一個鍵所屬的哈希槽
Redis 的一些特性與分片在一起時玩轉(zhuǎn)的不是很好:
1、涉及多個鍵的操作通常不支持。例如,你不能對映射在兩個不同 Redis 實例上的鍵執(zhí)行交集(事實上有辦法做到,但不是直接這么干)。
2、涉及多個鍵的事務不能使用。
3、分片的粒度(granularity)是鍵,所以不能使用一個很大的鍵來分片數(shù)據(jù)集,例如一個很大的有序集合。
4、當使用了分片,數(shù)據(jù)處理變得更復雜,例如,你需要處理多個 RDB/AOF 文件,備份數(shù)據(jù)時你需要聚合多個實例和主機的持久化文件。
5、添加和刪除容量也很復雜。例如,Redis 集群具有運行時動態(tài)添加和刪除節(jié)點的能力來支持透明地再均衡數(shù)據(jù),但是其他方式,像客戶端分片和代理都不支持這個特性。但是,有一種稱為預分片(Presharding)的技術在這一點上能幫上忙。
Redis分片的缺點
1、不支持涉及多建的操作,如mget,如果所操作的健都在同一個節(jié)點,就正常執(zhí)行,否則會提示報錯
2、分片的粒度是健,因此每個鍵對應的值不要太大
3、數(shù)據(jù)備份會比較麻煩,備份數(shù)據(jù)時你需要聚合多個實例和主機的持久化文件
4、擴容的處理比較麻煩
5、故障的恢復的處理會比較麻煩,可能需要重新梳理Master和Slave的關系,并調(diào)整每個復制集里面的數(shù)據(jù)
Redis的預分片技術可以按照以下步驟進行實例遷移操作:
(1)在新機子上啟動新的redis實例;
(2)將新redis實例作為slave將原redis實例作為master,將數(shù)據(jù)從原redis實例遷移到新redis實例上;
(3)停止客戶端(分片操作在客戶端上時)或代理服務器(分片操作在代理上)
(4)更新客戶端或者代理服務器中的配置信息,去掉被遷移的原redis實例的ip和端口等信息,加上新啟動redis實例的IP地址和端口;
(5)向新啟動的redis發(fā)送SLAVEOF NOONE命令,終止新redis實例對原redis實例的從屬關系;
(6)重啟客戶端程序或者代理程序,此時它們將會使用新的redis實例;
(7)關掉被遷移走數(shù)據(jù)的原redis實例;
我們已經(jīng)知道分片存在的一個問題,除非我們使用 Redis 作為緩存,增加和刪除節(jié)點是一件很棘手的事情,使用固定的鍵和實例映射要簡單得多。
然而,數(shù)據(jù)存儲的需求可能一直在變化。今天我可以接受 10 個 Redis 節(jié)點(實例),但是明天我可能就需要 50 個節(jié)點。
因為 Redis 只有相當少的內(nèi)存占用(footprint)而且輕量級(一個空閑的實例只是用 1MB 內(nèi)存),一個簡單的解決辦法是一開始就開啟很多的實例。即使你一開始只有一臺服務器,你也可以在第一天就決定生活在分布式的世界里,使用分片來運行多個 Redis 實例在一臺服務器上。
你一開始就可以選擇很多數(shù)量的實例。例如,32 或者 64 個實例能滿足大多數(shù)的用戶,并且為未來的增長提供足夠的空間。
這樣,當你的數(shù)據(jù)存儲需要增長,你需要更多的 Redis 服務器,你要做的就是簡單地將實例從一臺服務器移動到另外一臺。當你新添加了第一臺服務器,你就需要把一半的 Redis 實例從第一臺服務器搬到第二臺,如此等等。
使用 Redis 復制,你就可以在很小或者根本不需要停機時間內(nèi)完成移動數(shù)據(jù):
· 在你的新服務器上啟動一個空實例。
· 移動數(shù)據(jù),配置新實例為源實例的從服務。
· 停止你的客戶端。
· 更新被移動實例的服務器 IP 地址配置。
· 向新服務器上的從節(jié)點發(fā)送 SLAVEOF NO ONE 命令。
· 以新的更新配置啟動你的客戶端。
· 最后關閉掉舊服務器上不再使用的實例。
由于數(shù)據(jù)量過大,單個復制集難以承擔,因此需要對多個復制集進行集群,形成水平擴展,每個復制集只負責存儲數(shù)據(jù)集的一部分,這就是Redis的集群
1、在以前版本中,Redis的集群是依靠客戶端分片來完成,但是這樣會有很多缺點,比如維護成本高,需要客戶端編碼解決;增加、移除節(jié)點都比較繁瑣等
2、Redis3.0新增的一大特性就是支持集群,在不降低性能的情況下,還提供了網(wǎng)絡分區(qū)的可訪問性和支持對主數(shù)據(jù)庫故障的恢復。
3、使用集群后,都只能使用默認的0號數(shù)據(jù)庫
4、每個redis集群節(jié)點需要兩個TCP連接打開,正常的TCP端口用來服務客戶端,例如6379,家10000的端口用作數(shù)據(jù)端口,必須保證防火墻打開這兩個端口
5、Redis集群不保證強一致性,這意味著在特定的條件下,Redis集群可能會丟掉一些被系統(tǒng)收到的寫入請求命令(Master傳播命令返回OK后掛掉,slave還沒有收到廣播)
集群的架構
1、所有的Redis節(jié)點彼此互聯(lián),內(nèi)部使用二進制協(xié)議優(yōu)化傳輸速度和寬帶
2、節(jié)點的fail是通過集群中超過半數(shù)的節(jié)點檢測失效時才生效
3、客戶端與redis節(jié)點直連,不需要中間的proxy層。客戶端不需要連接集群所有節(jié)點,連接集群中任何一個可用節(jié)點即可
4、集群把所有的物理節(jié)點映射到【0-16383】插槽上,集群負責維護:節(jié)點—插槽—值 的關系
集群操作的基本命令
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 目的節(jié)點目的節(jié)點鍵名 數(shù)據(jù)庫號碼 超時時間 [copy] [replace]
關于Redis內(nèi)存數(shù)據(jù)庫分片的示例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網(wǎng)頁題目:Redis內(nèi)存數(shù)據(jù)庫分片的示例分析
文章地址:http://www.chinadenli.net/article48/gpccep.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、靜態(tài)網(wǎng)站、自適應網(wǎng)站、小程序開發(fā)、軟件開發(fā)、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)