目錄
場景
原理
首頁 資料庫 Redis 深入了解Redis中的Codis

深入了解Redis中的Codis

Jan 06, 2022 am 09:54 AM
redis

這篇文章帶大家了解Redis中的Codis,介紹一下Codis原理,希望對大家有幫助!

深入了解Redis中的Codis

場景

在大數據高並發場景下,使用單一redis實例,即使redis的效能再高,也會變的非常吃力,

首先,資料量越大,redis佔用記憶體就越大,進一步導致rdb檔案過大,這種情況會使的主從全量同步時間過長,同時實例重啟時,載入過大的rdb也會讓啟動時間變長。 【相關推薦:Redis影片教學

其次在CPU的使用上,單一實例的Redis只能使用一個CPU核心,一個核心應多過多的數據,也會顯得力不從心,

因此需要一個叢集方案,將巨大的資料量由一台實例分散到多台實例上,從Redis流行到官方支援自己的Cluster方案之間,第三方也在自己開發支持叢集的元件,Codis就是其中之一,

Codis使用Go語言開發,在Redis與客戶端中間充當代理的角色,使用Redis協議,所以客戶端直接連接Codis,向其發送指令即可,Codis負責轉送指令給Redis,最後接收回傳結果再回傳給客戶端,

深入了解Redis中的Codis

Codis代理程式的Redis實例構成一個Redis集群,當叢集空間也不足以使用時,可以動態擴容,繼續增加Redis實例,同時,客戶端使用的sdk不需要做任何改動,只需由原來的連接redis改成連接codis即可,

Codis自身也可以採取一個集群,來確保自身的高可用,由於其本身就是無狀態的,只負責轉發內容,增加多個Codis沒有副作用還可以保證QPS的提高,當其中一個Codis掛掉時,還可以使用別的。

深入了解Redis中的Codis

原理

Codis將特定的Key轉送到特定的Redis實例,叢集中每個實例都保存一部分Key,降低其他實例的壓力,同時所有實例的資料加起來,就是一份完整的資訊。

Codis預設劃分了1024個插槽(slot),叢集中的每個Redis實例對應一部分槽位,Codis會在記憶體中維護槽位與Redis實例的對應關係,

槽位的數量預設是1024,可以更改,如果叢集節點比較多,可以將數字調大。

深入了解Redis中的Codis

當接收到客戶端發送過來的key時,Codis對該key進行crc32 運算得出一個hash 值,

再將hash 後的整數值對1024(槽位數) 進行取模得到一個餘數,該餘數就是Key將被保存到的槽位,有了槽位就可以找到這個key該發到哪個redis實例上了。

偽代碼:

hash = crc32(command.key) # 计算hash值
slot = hash % 1024 # 取模得到槽位
redisInstance = slots[slot].redis # 得到redis实例
redis.do(command) # 执行命令复制代码
登入後複製

群集插槽同步

Redis與槽位的對映關係存在Codis的記憶體當中,因此Codis叢集需要考慮確保每個節點中的槽位映射關係同步,所以Codis採用Zookeeper、Etcd 分散式配置儲存中間件來持久化槽位映射關係,確保Codis叢集之間的資料同步,

如下圖,Codis將插槽關係存在Zookeeper中,並提供了一個Dashboard 觀察與修改槽位關係,當發生改變時,Codis Proxy 監聽到變化並重新同步槽位關係。

深入了解Redis中的Codis

拓容

#當現有叢集也不滿足業務需求時,就需要新增實例加入的叢集中,此時槽位映射關係需要重新分配,需要分配一部分的插槽給新節點。

Codis新增了一個SLOTSSCAN 指令,可以遍歷指定slot下的所有key,透過該指令掃描出待遷移槽位的所有key,然後挨個遍歷每個key遷移到新節點中,

遷移過程中,Codis繼續對外提供服務,此時來了一個請求打在了正在遷移的槽位上,由於該槽位現在對應新老兩個節點,此時Codis 無法判斷該key 有沒有從舊節點中遷移到新節點上,

因此這種情況Codis 會立即強制對當前的key 進行單一遷移,遷移完成後,將請求轉發給新的Redis實例上。

偽代碼:

slot_index = crc32(command.key) % 1024
if slot_index in migrating_slots:
    doMigratingKey(command.key)
    redis = slots[slot_index].new_redis
else:
    redis = slots[slot_index].redis复制代码
登入後複製

SLOTSSCAN 與Redis本身的Scan指令一樣,無法避免掃描出來的資料重複,但這不會影響到遷移的正確性,因為單一key遷移之後,就立刻從舊實例中刪除了,無法再被掃描出來。

自動均衡槽位

#

每次新增實例,如果都需要人工維護slot的映射關係太麻煩,Codis提供自動均衡,該功能會在系統比較空閒的時候觀察每個Redis實例對應的slot數量,如果不平衡,就進行自動均衡,遷移資料的操作。

缺點

Codis為Redis帶來擴容好處,但也造成了一些副作用。

不支援交易

一個交易可能對多個key做了操作,但交易只能在單一實例中完成,但是由於key分散在不同的實例中,因此Codis無法支援事務操作。

不支援rename

rename將一個key命名成另一個key,但是這兩個key可能hash出來的插槽並不是同一個,而是在不同實例的插槽上,因此rename也不被支援。

官方提供的不支援的指令清單:https://github.com/CodisLabs/codis/blob/master/doc/unsupported_cmds.md

##擴容卡頓

Codis在擴容過程中,對資料的遷移是將整個key直接遷移過去的,例如一個hash結構,Codis會直接hgetall 拉取所有的內容,使用hmset 放到新節點中,

如果該hash的內容過大,將會引起卡頓,官方建議單一集合結構的總大小不超過1MB,在業務上可以透過分桶儲存等,將大型資料拆成多個小的,做一個折中。

網路開銷

由於Codis 在客戶端與Redis實例之間充當網路Proxy,多了一層,網路開銷自然多一些,比直接連接Redis的性能要稍低一些。

中間件運維開銷

Codis叢集配置需要使用Zk或Etcd,這表示引入Codis叢集又要引入其他中間件,增加運維機器資源成本。

優點

Codis將分散式一致性的問題交給了第三方(ZK或Etcd)負責,省去了這方面的維護工作,降低實現代碼的複雜性,

Redis官方的Cluster為了實現去中心化,引入了Raft與Gossip協議,以及大量需要調優的配置參數,複雜度驟增。

批次取得

對於批次操作,例如使用mget 取得多個key的值,這些key可能分散在多個實例中, Codis將key依照所在的實例分組,然後對每個實例挨個呼叫mget,最後匯總傳回給客戶端。

深入了解Redis中的Codis

其他功能

#Codis 提供Dashboard 介面化,以及Codis-fe 對叢集進行管理,還可以進行增加分組、節點、執行自動均衡等操作,查看slot 狀態以及slot 對應的redis 實例,這些功能使的運維更加方便輕鬆。

深入了解Redis中的Codis

深入了解Redis中的Codis

深入了解Redis中的Codis

深入了解Redis中的Codis

##走向歷史

Codis是為了彌補Redis官方沒有提供集群這一概念時出現的,現在Redis官方提供Cluster功能,官方的支持自然比第三方的更有優勢,### ###同時第三方軟體也需要即時關注官方發布的新特性各種,而Cluster肯定是即時相容新特性,因此更推薦使用官方的Cluster,Codis作為曾經的一個知識點了解,某些想法與Cluster是有重合的。 ######更多程式相關知識,請造訪:###程式設計入門###! ! ###

以上是深入了解Redis中的Codis的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis指令怎麼用 redis指令怎麼用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

redis怎麼使用鎖 redis怎麼使用鎖 Apr 10, 2025 pm 08:39 PM

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

See all articles