redis-port 使用的兩個例子

瑞士小刀

在上一篇《7月,redis迷情》提到平時(shí)運(yùn)維中榨崩,重度使用 redis-port颈墅,下面和大家分享下使用場景和心得。redis-port 最初是 codis 項(xiàng)目的附屬工具茫舶,同步 redis 數(shù)據(jù)到 codis 中械巡,現(xiàn)在已經(jīng)拆出來單獨(dú)維護(hù)。感謝作者@斯賓洛克?(spinlock??的意思)饶氏。

一切從需求出發(fā)

需求即場景讥耗,運(yùn)維有很多相似之處,下面列舉的例子不止 redis嚷往,涉及存儲數(shù)據(jù)都會遇到葛账,mysql, pg, mongodb,帶狀態(tài)的存儲大同小異皮仁。

1. redis 集群的擴(kuò)容與收縮籍琳,最經(jīng)典的需求

2. 數(shù)據(jù)異構(gòu)同步菲宴,從 redis 到 mysql等等

3. redis 原有集群的拆分,按業(yè)務(wù)線打散成多個集群

4. redis 當(dāng)前內(nèi)存使用趋急,key占比分析

5. 無用數(shù)據(jù)的檢測和清除

6. 對于 rdb 文件的備份

看了需求喝峦,相信大家都會相視一笑,把 redis 替換成任何數(shù)據(jù)庫呜达,仍然成立谣蠢。新浪對redis這塊重度使用,他們有過分享查近,大家可以谷歌搜一下眉踱。

先來看看redis-port原理

簡單來說,就是把自已偽裝成 slave, 欺騙master來達(dá)到數(shù)據(jù)流同步的目地霜威。

發(fā)送sync命令->接收rdb->解析rdb->過濾->回放rdb->回放master推送的同步數(shù)據(jù)

上面是原理流程谈喳,非常容易理解,解析完rdb后的每一步都可以高度定制戈泼。DBA 看著是不是很熟悉婿禽? 非常像淘寶的canal,基于 binlog 做數(shù)據(jù)的增量消費(fèi)大猛。相比 mysql replication的原理 redis 簡單太多扭倾,增量的數(shù)據(jù)就是普通的命令,需要解析的只有rdb文件挽绩。網(wǎng)上有一篇文章《Redis RDB Dump File Format》講的很贊膛壹,大家可以看看。

概括起來 rdb 格式由如下塊構(gòu)成:

1. 文件開頭是 rdb 版本號唉堪,比如REDIS0005

2. FE 后面跟隨 redis DB 號恢筝,正常 slave 回放時(shí)要使用 select db

3. FD|FC 后面跟隨秒或毫秒過期時(shí)間,緊隨其后 value-type, string-encoded-key, encoded-value巨坊。value-type表示value的類型 set, map, sorted set等等

4. FE 后面跟隨 redis DB 號,同步其它DB數(shù)據(jù)

5. 重復(fù)第3步

6. FF 表示RDB結(jié)束

7. 8 byte checksum crc64較驗(yàn)碼

結(jié)合 redis和redis-port 源代碼會對 rdb 理解更深刻此改。整個流程對應(yīng)代碼 cmd/sync.go 中的cmd.SyncRDBFile 和 cmd.SyncCommand 函數(shù)趾撵。

解決問題

假設(shè)大家有一定go基礎(chǔ),安裝 golang 和下載 redis-port 步驟省略共啃。

以擴(kuò)容為例占调,假如原有集群架構(gòu)是twemproxy模式,那么新建一套空集群移剪,后端實(shí)例成倍究珊。 redis-port默認(rèn)同步到 codis, 使用slotsrestore, 需要改成 restore 命令。

cmd/utils.go ?restoreRdbEntry ?函數(shù)

restoreRdbEntry函數(shù)替換 slotsrestore

重新編譯纵苛,生成 redis-port 可執(zhí)行命令剿涮。兩套twemproxy, 后端對應(yīng)的hash策略改變言津,數(shù)據(jù)分布相應(yīng)也會改變,redis-port 同步時(shí)源指定為舊集群后端的master實(shí)例取试,目標(biāo)要指定為新集群的proxy地址悬槽。使用命令如下:

redis-port ?sync --parallel=100 --from=master_host:master_port ?--target=proxy:proxy_port?

這條命令是前臺執(zhí)行,長時(shí)間運(yùn)行nohup即可瞬浓。parallel 指同步 rdb 事件時(shí)并發(fā)的goroutine數(shù)量初婆。

再舉一個打散的例子,將 key 前輟是user_info的遷移到新集群猿棉。根據(jù) redis 同步原理磅叛,只要在sync rdb和sync command時(shí),將 key 前輟是user_info的過濾出來即可萨赁,代碼修改如下:

cmd/utils.go? restoreRdbEntry? 函數(shù)除了修改 slotsrestore弊琴,還要增加 key過濾

restoreRdbEntry增加key過濾

上圖代碼增加對 key 的過濾,完成了 sync rdb代碼的修改位迂。還要修改sync command访雪。

cmd/sync.go? SyncCommand? 函數(shù)增加 key過濾

SyncCommand增加key過濾

最后使用和擴(kuò)容同樣的命令。遷移出 user_info 后掂林,老集群無效的key需要過濾并刪除臣缀。修改 cmd/utils.go restoreRdbEntry函數(shù),將restore改成del命令泻帮,再將同步自身即可精置。

這兩個例子比較典型,建義使用的同學(xué)仔細(xì)讀讀源代碼锣杂,順便學(xué)好go啊 ~_~

以下引用為作者@斯賓洛克 同學(xué)補(bǔ)充:

1. 支持 psync脂倦,例如 --psync?

2. 從 master 獲取 rdb+backlog 速度過慢,可導(dǎo)致 master 主動關(guān)閉連接元莫。解決方法你提到了一種赖阻,此外,還可以結(jié)合 --sockfile=buffer.tmp --filesize=64GB 參數(shù)踱蠢,這樣能使用一個最大 64GB 的文件作為緩沖(循環(huán)寫火欧,自動釋放),能加速 rdb+backlog 的獲取茎截,口味更佳苇侵。

3. 向 slave restore 的速度,可以通過增加 CPU 以及增加并發(fā)連接數(shù)實(shí)現(xiàn)企锌,分別是 --ncpu=4 --paralle=32

4. 其實(shí)榆浓,使用 psync 的話,port 和 master 之間就有 position 的概念了撕攒,可以減少同步失敗的發(fā)生情況陡鹃,redis-port 會自動重試直到不能烘浦。

注意事項(xiàng)

1. 同步時(shí)有兩個 redis 參數(shù)需要注意

?repl-backlog-size?

Set the replication backlog size. The backlog is a buffer that accumulates??slave data when slaves are disconnected for some time, so that when a slave?wants to reconnect again, often a full resync is not needed, but a partial?resync is enough, just passing the portion of data the slave missed while?disconnected.

The bigger the replication backlog, the longer the time the slave can be?disconnected and later be able to perform a partial resynchronization.

同步buffer的大小,默認(rèn)1mb杉适,根據(jù)當(dāng)前數(shù)據(jù)量大小適當(dāng)調(diào)整谎倔,比如10mb.

?client-output-buffer-limit

The client output buffer limits can be used to force disconnection of clients that are not reading data from the server fast enough for some reason (a common reason is that a Pub/Sub client can't consume messages as fast as the publisher can produce them). The limit can be set differently for the three different classes of clients: normal -> normal clients including MONITOR clients slave? -> slave clients pubsub -> clients subscribed to at least one pubsub channel or pattern The syntax of every client-output-buffer-limit directive is the following: client-output-buffer-limitA client is immediately disconnected once the hard limit is reached, or if?the soft limit is reached and remains reached for the specified number of?seconds (continuously).

So for instance if the hard limit is 32 megabytes and the soft limit is?16 megabytes / 10 seconds, the client will get disconnected immediately?if the size of the output buffers reach 32 megabytes, but will also get?disconnected if the client reaches 16 megabytes and continuously overcomes?the limit for 10 seconds.

client slave 級別的buffer也要調(diào)整,比如 client-output-buffer-limit slave 256mb 128mb 60?

2. restore 操作只要目標(biāo)集群存在指定Key, 就會fatal猿推,如果沒問題可以在代碼中去掉err檢測片习。

3. 使用偽裝slave的機(jī)制,redis-port一定要輪流同步蹬叭,同時(shí)bgsave可不好玩藕咏。

4. 代碼修改成通用的工具,每次改代碼邏輯容易出問題秽五,from和target一定要確認(rèn)好孽查。

5. 同步時(shí)由于源數(shù)據(jù)量太大,可能工具會中斷坦喘,調(diào)整redis-port并發(fā)數(shù)和redis上面提到的兩個buffer就好盲再。

存在的不足

最初 redis-port 只是定位臨時(shí)遷移工具,流處理時(shí)出現(xiàn)異常直接 panic, 同步時(shí)間不建義太久瓣铣。也和 redis replication 實(shí)現(xiàn)機(jī)制有關(guān)答朋,沒有類似 mysql binlog 和 position 的概念。

那么問題來了棠笑,聰明的你梦碗,想想該如何解決?

蠻好玩的工具 大完玩的開心 enjoy ...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓖救,一起剝皮案震驚了整個濱河市洪规,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌循捺,老刑警劉巖斩例,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異从橘,居然都是意外死亡樱拴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門洋满,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人珍坊,你說我怎么就攤上這事牺勾。” “怎么了阵漏?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵驻民,是天一觀的道長翻具。 經(jīng)常有香客問我,道長回还,這世上最難降的妖魔是什么裆泳? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮柠硕,結(jié)果婚禮上工禾,老公的妹妹穿的比我還像新娘。我一直安慰自己蝗柔,他們只是感情好闻葵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著癣丧,像睡著了一般槽畔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胁编,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天厢钧,我揣著相機(jī)與錄音,去河邊找鬼嬉橙。 笑死早直,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的憎夷。 我是一名探鬼主播莽鸿,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拾给!你這毒婦竟也來了祥得?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蒋得,失蹤者是張志新(化名)和其女友劉穎级及,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體额衙,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饮焦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窍侧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片县踢。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伟件,靈堂內(nèi)的尸體忽然破棺而出硼啤,到底是詐尸還是另有隱情,我是刑警寧澤斧账,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布谴返,位于F島的核電站煞肾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗓袱。R本人自食惡果不足惜籍救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渠抹。 院中可真熱鬧蝙昙,春花似錦、人聲如沸逼肯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篮幢。三九已至大刊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間三椿,已是汗流浹背缺菌。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搜锰,地道東北人伴郁。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蛋叼,于是被迫代替她去往敵國和親焊傅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Redis 配置文件示例 注意:想要讀取配置文件狈涮,Redis的第一個參數(shù)必須是文件的路徑 ./redis-serv...
    起個名忒難閱讀 1,190評論 0 1
  • 5/15/2017 7:06:35 PM 縱觀各大組件狐胎,配置文件占據(jù)極其重要的地位「桠桑可配置化也是當(dāng)下開發(fā)的一流行趨...
    愛做夢的胖子閱讀 4,417評論 0 8
  • # redis 配置文件示例 # 當(dāng)你需要為某個配置項(xiàng)指定內(nèi)存大小的時(shí)候握巢,必須要帶上單位, # 通常的格式就是 1...
    iyimao閱讀 788評論 0 2
  • ## Generated by install_server.sh ## # Redis configuratio...
    依然飯?zhí)?/span>閱讀 2,024評論 0 5
  • 1.1 資料 松却,最好的入門小冊子暴浦,可以先于一切文檔之前看,免費(fèi)晓锻。 作者Antirez的博客歌焦,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,034評論 1 51