redis基本知識(shí)學(xué)習(xí)總結(jié)

基本數(shù)據(jù)類型

  • string
  • hash
  • list
  • set
  • zset

數(shù)據(jù)遷移方法

  • move(基本廢除)
  • dump+restore(非原子性)
  • migrate (原子性)

鍵的遍歷

  • keys(全量)
  • scan(漸進(jìn)式贪婉,解決keys可能帶來(lái)的阻塞問(wèn)題)

redis高性能的三個(gè)因素

  • 純內(nèi)存存儲(chǔ),IO多路復(fù)用吼蚁,單線程

慢查詢

  • slowlog-log-slower-than 和slowlog-max-len

  • 慢查詢不包含命令網(wǎng)絡(luò)和排隊(duì)時(shí)間

  • 日志列表是一個(gè)先進(jìn)先出的隊(duì)列,日志比較多的情況下记焊,可能會(huì)丟失部分慢查詢命令袱讹,一般需要做日志持久化存儲(chǔ)面睛。

pipeline

  • 可以有效減少RTT次數(shù),但是每次Pipeline的命令數(shù)量不能無(wú)節(jié)制

redis-lua腳本

  • 可以創(chuàng)建出原子冲甘,高效绩卤,自定義命令組合
  • redis執(zhí)行l(wèi)ua腳本兩種方法: eval和evalsha

節(jié)省內(nèi)存

  • bitmaps (位數(shù)組)可以用來(lái)做獨(dú)立用戶統(tǒng)計(jì)途样,有效節(jié)省內(nèi)存;如果存在大的偏移量濒憋,由于申請(qǐng)大內(nèi)存會(huì)導(dǎo)致阻塞

  • hyperLogLog (伯努利實(shí)驗(yàn)娘纷,統(tǒng)計(jì)總數(shù),存在誤差)

發(fā)布訂閱

  • publish,subscribe(用于聊天室跋炕,系統(tǒng)解耦赖晶,公告消息)
  • 相比專業(yè)消息隊(duì)列系統(tǒng)功能較弱,不過(guò)足夠簡(jiǎn)單辐烂。

GEO

  • 底層實(shí)現(xiàn)用zset

redis客戶端總結(jié)

客戶端api

  • 客戶端類型(11種遏插,常用下面三種)

    • normal 普通客戶端(flag=N)
    • slave 用于復(fù)制(flag=S)
    • pubsub 發(fā)布訂閱(flag=O)
  • client list 列出與redis服務(wù)器相連接的所有客戶端信息

  • info clients 列出輸入和輸入緩沖區(qū)的對(duì)象數(shù)

    qbuf,qbuf-free 客戶端緩沖區(qū),作用將客戶端發(fā)送的命令臨時(shí)保存纠修,同時(shí)redis從輸入的緩沖區(qū)拉取命令并執(zhí)行

    qbuf緩沖的總?cè)萘扛斐埃琿buf-free緩沖剩余容量

    輸入緩沖區(qū)過(guò)大的原因

    • 是因?yàn)閞edis的處理速度跟不上輸入緩沖區(qū)的速度
    • redis發(fā)生了阻塞,短期里不能處理命令扣草,造成客戶端輸入的命令積壓在緩沖區(qū)
    • 合理防范了牛,通過(guò)定期執(zhí)行client list命令,收集qbuf和qbuf-free找到異常連接記錄進(jìn)行分析辰妙,通過(guò)info clients找到輸入緩沖區(qū)的預(yù)警參數(shù)進(jìn)行預(yù)警提示
    • 在開(kāi)發(fā)中要減少bigkey,減少redis阻塞鹰祸,合理的監(jiān)控報(bào)警

    輸出緩沖區(qū)(固定緩沖區(qū)->字節(jié)數(shù)組,動(dòng)態(tài)緩沖區(qū)->列表)

    • obl固定緩沖區(qū)的長(zhǎng)度

    • oll動(dòng)態(tài)緩沖區(qū)的長(zhǎng)度

    • omem代表使用的字節(jié)數(shù)

    預(yù)防輸出緩沖區(qū)出現(xiàn)異常

    • 進(jìn)行監(jiān)控密浑,設(shè)置閾值蛙婴,超過(guò)閾值及時(shí)處理
    • 限制普通客戶端輸出到緩沖區(qū),把錯(cuò)誤扼殺在搖籃
    • 適當(dāng)增大slave的輸出緩沖區(qū)尔破,如果master節(jié)點(diǎn)寫入較大街图,slave客戶端的輸出緩沖區(qū)可能會(huì)比較大,一旦slave客戶端連接因?yàn)檩敵鼍彌_區(qū)溢出被kill懒构,會(huì)造成復(fù)制重連餐济。
    • 限制容易造成輸出緩沖區(qū)增大的命令
    • 及時(shí)監(jiān)控內(nèi)存,一旦發(fā)生抖動(dòng)頻繁胆剧,可能就是輸出緩沖區(qū)過(guò)大絮姆。
  • 客戶端限制

    • maxclients 限制最大客戶端連接數(shù)(通過(guò)config set maxclients對(duì)客戶端連接數(shù)動(dòng)態(tài)設(shè)置)
    • timeout 限制連接的最大空閑時(shí)間,一旦客戶端連接的idle(空閑時(shí)間)超過(guò)了timeout, 連接將會(huì)被關(guān)閉
  • 客戶端常見(jiàn)異常

    • 無(wú)法從連接池獲取連接(1>高并發(fā)下連接池供不應(yīng)求, 2>連接池沒(méi)有正確釋放赞赖,3>客戶端存在慢查詢滚朵,4>服務(wù)端執(zhí)行命令阻塞)
    • 讀寫超時(shí)
    • 客戶端連接超時(shí)
    • 客戶端緩存區(qū)異常
    • lua腳本正在執(zhí)行
    • redis加載持久化文件
    • 使用內(nèi)存超過(guò)maxmemory設(shè)置
    • 客戶端連接數(shù)過(guò)大
  • 數(shù)據(jù)持久化

    • RDB

      • 命令bgsave

      • 執(zhí)行流程

      • 優(yōu)點(diǎn)

        RDB是一個(gè)緊湊的二進(jìn)制壓縮文件,代表Redis在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)快照前域,非常適合備份,全量復(fù)制韵吨。比如每隔6小時(shí)執(zhí)行bgsave

      • 缺點(diǎn)

        RDB無(wú)法實(shí)時(shí)持久化(秒級(jí)別)匿垄,因?yàn)閎gsave運(yùn)行時(shí)會(huì)執(zhí)行fork創(chuàng)建子進(jìn)程,屬于重量級(jí)操作,頻繁執(zhí)行成本過(guò)高

        RDB使用特定二進(jìn)制保存椿疗,redis版本演進(jìn)過(guò)程中漏峰,存在老版本無(wú)法兼容新版本

    • AOF

      實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)持久化,以獨(dú)立日志的方式記錄每次寫命令届榄,在重啟時(shí)重新執(zhí)行AOF文件達(dá)到數(shù)據(jù)恢復(fù)的作用

      • 執(zhí)行流程

        1)所有的寫入命令會(huì)追加到AOF_buf(緩沖區(qū))

        2)AOF緩沖區(qū)根據(jù)一定策略項(xiàng)硬盤做同步操作

        3)隨著AOF文件越來(lái)越大浅乔,需要定期對(duì)AOF重寫,達(dá)到壓縮的目的

        4)當(dāng)redis服務(wù)重啟時(shí)铝条,可以加載AOF文件進(jìn)行數(shù)據(jù)恢復(fù)

      • 持久化方式

        1)執(zhí)行AOF重寫請(qǐng)求

        2)父進(jìn)程執(zhí)行fork創(chuàng)建子進(jìn)程靖苇,開(kāi)銷等同于bgsave

        3)主進(jìn)程完成fork后,繼續(xù)執(zhí)行其他命令班缰。所有修改命令依然寫入AOF緩沖區(qū)并根據(jù)appendfsync策略同步硬盤贤壁,保證AOF機(jī)制正確;由于fork操作運(yùn)用復(fù)寫技術(shù)埠忘,子進(jìn)程只能共享fork操作時(shí)的內(nèi)存數(shù)據(jù)脾拆。由于父進(jìn)程依然響應(yīng)命令,redis使用“AOF重寫緩沖區(qū)”保存這部分新數(shù)據(jù)莹妒,防止AOF文件生成期間丟失這部分?jǐn)?shù)據(jù)名船。

        4)子進(jìn)程根據(jù)內(nèi)存快照,按照命令合并規(guī)則寫入到新的AOF文件旨怠。

      • 啟動(dòng)加載

        1)AOF持久化開(kāi)啟包帚,優(yōu)先加載AOF文件

        2)AOF文件不存在加在RDB文件

        3)加載AOF/RDB文件成功后,Redis啟動(dòng)成功

        4)AOF/RDB文件存在錯(cuò)誤時(shí)运吓,Redis啟動(dòng)失敗渴邦,打印錯(cuò)誤日志

      • 改善fork操作耗時(shí)

        1)優(yōu)先使用物理機(jī)或者高效支持fork操作的虛擬技術(shù),避免使用Xen.

        2)控制redis實(shí)例最大使用內(nèi)存拘哨,fork耗時(shí)跟內(nèi)存量成正比谋梭,線上建議10GB內(nèi)

        3)合理配置linux內(nèi)存分配策略

        4)降低fork操作頻率,適度放寬AOF觸發(fā)時(shí)機(jī)倦青,避免全量復(fù)制

  • 復(fù)制

    參與復(fù)制的redis節(jié)點(diǎn)分為主節(jié)點(diǎn)和從節(jié)點(diǎn)瓮床,默認(rèn)redis實(shí)例都是主節(jié)點(diǎn),每個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)产镐。復(fù)制的流程是單向的隘庄,只能從主節(jié)點(diǎn)復(fù)制到從節(jié)點(diǎn)。

    • 啟動(dòng)1>癣亚,配置文件添加slaveof {masterHost} {masterPort} 隨redis啟動(dòng)生效丑掺;2> 客戶端redis-server --slaveof {masterHost} {masterPort} 生效;3> 直接使用slaveof {masterHost} {masterPort} 生效

    • slave 是異步命令述雾,執(zhí)行后節(jié)點(diǎn)只保留主節(jié)點(diǎn)信息后返回街州,后續(xù)復(fù)制流程在節(jié)點(diǎn)內(nèi)部異步執(zhí)行兼丰。可使用info replication 命令查看復(fù)制信息

    • 斷開(kāi)連接 slave of one

    • 切主操作 slave {newMasterIP} {newMasterPort}

      • 斷開(kāi)當(dāng)前主節(jié)點(diǎn)連接復(fù)制關(guān)系
      • 建立與新主節(jié)點(diǎn)復(fù)制關(guān)系
      • 清除從節(jié)點(diǎn)當(dāng)前所有數(shù)據(jù)
      • 對(duì)新節(jié)點(diǎn)進(jìn)行復(fù)制操作
    • 復(fù)制拓?fù)?/p>

      • 一主一從(注意主節(jié)點(diǎn)重啟時(shí)的數(shù)據(jù)持久化)
      • 一主多從唆缴,網(wǎng)狀(實(shí)現(xiàn)讀寫分離鳍征,可以用其中一臺(tái)從節(jié)點(diǎn)集中實(shí)現(xiàn)慢查詢,主節(jié)點(diǎn)負(fù)責(zé)寫入面徽,從節(jié)點(diǎn)負(fù)責(zé)讀妊薮浴)
      • 樹(shù)狀拓?fù)洌ǚ乐怪鞴?jié)點(diǎn)到從節(jié)點(diǎn)數(shù)據(jù)傳輸造成主節(jié)點(diǎn)壓力過(guò)大)
    • 復(fù)制過(guò)程(原理)

      從節(jié)點(diǎn)執(zhí)行salveof 命令后,就開(kāi)始執(zhí)行復(fù)制

      • 保存主節(jié)點(diǎn)信息
      • 從節(jié)點(diǎn)salveof通過(guò)內(nèi)部定時(shí)任務(wù)維護(hù)復(fù)制邏輯趟紊,從節(jié)點(diǎn)發(fā)起scoket套接字到主節(jié)點(diǎn)建立網(wǎng)絡(luò)連接
      • 發(fā)送ping命令驗(yàn)證網(wǎng)絡(luò)套接字是否可用
      • 權(quán)限校驗(yàn)氮双,如果主節(jié)點(diǎn)設(shè)置了requriepass認(rèn)證,從節(jié)點(diǎn)在配置文件中設(shè)置masterauth進(jìn)行校驗(yàn)
      • 同步數(shù)據(jù)集织阳,首次建立連接需要全量同步數(shù)據(jù)集比較耗時(shí)眶蕉,在首次同步后,可進(jìn)行數(shù)據(jù)部分復(fù)制唧躲。
      • 命令持續(xù)復(fù)制造挽。
    • 全量復(fù)制

    • 部分復(fù)制

    • 主從心跳檢查

      • 主節(jié)點(diǎn)默認(rèn)每隔十秒向從節(jié)點(diǎn)發(fā)送ping

      • 從節(jié)點(diǎn)主線程每隔一秒通過(guò) replconf ack offset 給主節(jié)點(diǎn)上報(bào)自身偏移量

        replconf 作用, 檢查網(wǎng)絡(luò)狀態(tài)弄痹, 檢查偏移量從緩沖區(qū)復(fù)制增量數(shù)據(jù)

    • 異步復(fù)制

      異步復(fù)制指在寫命令完成后并不等主節(jié)點(diǎn)同步復(fù)制到從節(jié)點(diǎn)完成饭入,直接返回客戶端寫入結(jié)果

  • 阻塞

    • 阻塞的常見(jiàn)原因

      • API或數(shù)據(jù)結(jié)構(gòu)使用不合理

        減少慢查詢,減少大對(duì)象

      • CPU飽和問(wèn)題

      • 持久化相關(guān)阻塞

    • 阻塞外在原因

      • CPU競(jìng)爭(zhēng)
      • 內(nèi)存交換
      • 網(wǎng)絡(luò)問(wèn)題
  • 內(nèi)存管理

    • 內(nèi)存信息查看(info memory)
    • 對(duì)象內(nèi)存
    • 緩沖內(nèi)存
    • 內(nèi)存碎片
  • 內(nèi)存調(diào)整

    • 內(nèi)存上線

    • 動(dòng)態(tài)調(diào)整內(nèi)存上線

    • 內(nèi)存回收

      • 刪除過(guò)期鍵對(duì)象
      • 惰性刪除
      • 定時(shí)任務(wù)刪除
    • 內(nèi)存溢出控制策略(config set maxmemory-policy{policy}動(dòng)態(tài)配置)

      • noeviction: 默認(rèn)策略肛真,不刪除任何數(shù)據(jù)谐丢,拒絕所有寫入
      • volatile-lru: 根據(jù)LRU算法設(shè)置過(guò)期鍵,直到騰出足夠空間蚓让。如果沒(méi)有課刪除的鍵對(duì)象乾忱,回退到noeviction策略
      • allkeys-lru: 根據(jù)LRU算法刪除鍵,不管數(shù)據(jù)有沒(méi)有設(shè)置超時(shí)屬性历极,直到騰出足夠空間為止
      • allkeys-random: 隨機(jī)刪除所有鍵窄瘟,直到騰出足夠空間
      • volatile-random:隨機(jī)刪除過(guò)期鍵,直到騰出足夠空間
      • volatile-ttl:根據(jù)鍵值對(duì)象ttl屬性趟卸,刪除最近將要過(guò)期的數(shù)據(jù)蹄葱,如果沒(méi)有,回到noeviction策略
    • 內(nèi)存優(yōu)化

      • redisObject對(duì)象

        redis存儲(chǔ)的所有值在內(nèi)部定義為redisObject結(jié)構(gòu)體锄列,內(nèi)部結(jié)構(gòu)包括:

        type:對(duì)象類型图云;encoding:內(nèi)部編碼類型:lru:REDIS_LRU_BITS LRU計(jì)時(shí)時(shí)鐘

        init refcount: 引用計(jì)算器

        void *ptr 數(shù)據(jù)指針(與存儲(chǔ)的數(shù)據(jù)內(nèi)有有關(guān),如果是整數(shù)邻邮,直接存儲(chǔ)數(shù)據(jù)竣况;否則表示指向數(shù)據(jù)的指針,redis3.0之后字符串長(zhǎng)度<=39字節(jié)饶囚,內(nèi)部編碼embstr類型)

      • 縮減鍵值長(zhǎng)度減少key和value的長(zhǎng)度

        使用工具壓縮json和xml內(nèi)容后存入redis 例如使用 Snappy

      • 共享對(duì)象池

        redis在啟動(dòng)的時(shí)候內(nèi)部維護(hù)了[0-9999]的整數(shù)對(duì)象池

      • 編碼優(yōu)化

        ziplist編碼主要是為了節(jié)約內(nèi)存帕翻,因此所有數(shù)據(jù)都是采用線性連續(xù)的內(nèi)存結(jié)構(gòu)鸠补。ziplist編碼是應(yīng)用廣泛的一種萝风,可以作為hash,list,zset類型的底層數(shù)據(jù)結(jié)構(gòu)嘀掸。

      • ziplist (壓縮列表編碼)

      • intset編碼

      • 控制鍵的數(shù)量

        當(dāng)redis存儲(chǔ)大量數(shù)據(jù)時(shí),通常會(huì)存儲(chǔ)大量的鍵名规惰,過(guò)多的鍵會(huì)消耗較多的內(nèi)存睬塌,使用相同的數(shù)據(jù)結(jié)構(gòu)可以減少外層鍵名,減少內(nèi)存占用

      • hash結(jié)構(gòu)降低鍵數(shù)量分析

        根據(jù)鍵的規(guī)模在客戶端通過(guò)分組映射到一組hash對(duì)象中歇万,如存在100萬(wàn)個(gè)鍵揩晴,可以映射到1000個(gè)hash中,每個(gè)hash保存1000個(gè)元素

        hash的field可用于記錄原始key字符串贪磺,方便哈希查找

        hash的value保存原始值對(duì)象硫兰,確保不要超過(guò)hash-max-ziplist-value限制

      • ziplist編碼的hash和string比較

        同樣數(shù)據(jù)ziplist編碼比string節(jié)約內(nèi)存;

        隨著value空間的減少寒锚,節(jié)約內(nèi)存越來(lái)越明顯

        hash-ziplist比string寫入耗時(shí)劫映,但隨著value空間的減少,耗時(shí)逐漸減少

      • hash類型內(nèi)存節(jié)省原理

        1. hash使用ziplist編碼節(jié)約內(nèi)存刹前,如果使用hashtable反而會(huì)增加內(nèi)存

        2)ziplist長(zhǎng)度需要控制在1000以內(nèi)泳赋,否則由于存取時(shí)間復(fù)雜度在O(N)到O(N2)之間,長(zhǎng)列表會(huì)導(dǎo)致CPU消耗嚴(yán)重喇喉,得不償失祖今。

        3)ziplist適合存儲(chǔ)小對(duì)象,對(duì)于大對(duì)象不但內(nèi)存優(yōu)化效果不明顯還會(huì)增加命令耗時(shí)拣技。

        4)需要預(yù)估鍵的規(guī)模千诬,從而確定每個(gè)hash結(jié)構(gòu)需要存儲(chǔ)的數(shù)量。

        5)根據(jù)hash長(zhǎng)度和元素大小膏斤,調(diào)整hash-max-ziplist-entries和hash-max-ziplist-value參數(shù)徐绑,確保hash類型使用ziplist編碼

      • hash鍵和field鍵的設(shè)計(jì)

        1)當(dāng)鍵離散度較高時(shí),可以按字符串位截取掸绞,把后三位作為哈希的field,之前那部分作為哈希的鍵泵三。如:key=194888 哈希key=group : hash:194 , 哈希field=888

        2)當(dāng)鍵離散度較低時(shí),可以使用哈希算法打散鍵衔掸,如使用crc32(key)&10000函數(shù)把鍵映射到“0-9999”整數(shù)范圍烫幕,哈希field存儲(chǔ)的原始值。

        3)盡量減少hash鍵和field的長(zhǎng)度敞映。

      • hash結(jié)構(gòu)控制鍵存在的問(wèn)題

        雖然hash存儲(chǔ)可以降低內(nèi)存较曼,但是同樣會(huì)帶來(lái)問(wèn)題:

        1)客戶端需要預(yù)估鍵的規(guī)模設(shè)計(jì)分組規(guī)則,加重客戶端開(kāi)發(fā)成本

        2)hash重構(gòu)后所有鍵無(wú)法使用超時(shí)和LRU淘汰機(jī)制振愿,需要手動(dòng)維護(hù)

      • ziplist+hash優(yōu)化keys后捷犹,如果想使用超時(shí)刪除功能弛饭,開(kāi)發(fā)人員可以存儲(chǔ)每個(gè)對(duì)象的寫入時(shí)間,然后通過(guò)定時(shí)任務(wù)使用hscan命令掃描數(shù)據(jù)萍歉,找出hash內(nèi)超時(shí)的數(shù)據(jù)刪除

  • 哨兵

    • 實(shí)現(xiàn)原理

      • 三個(gè)定時(shí)任務(wù)完成對(duì)各節(jié)點(diǎn)的發(fā)現(xiàn)和監(jiān)控

        1)每隔10秒侣颂,每個(gè)sentinel節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)和從節(jié)點(diǎn)發(fā)送info命令獲取最新的拓?fù)浣Y(jié)構(gòu),通過(guò)向主節(jié)點(diǎn)執(zhí)行info命令枪孩,獲取從節(jié)點(diǎn)的信息憔晒,這也是為什么sentinel節(jié)點(diǎn)不需要顯示配置監(jiān)控從節(jié)點(diǎn);感知新節(jié)點(diǎn)的加入蔑舞;節(jié)點(diǎn)不可達(dá)或者故障轉(zhuǎn)移后拒担,通過(guò)info更新拓?fù)湫畔ⅰ?/p>

        2)每隔2秒,每個(gè)sentinel節(jié)點(diǎn)會(huì)向redis數(shù)據(jù)節(jié)點(diǎn)的_ sentinel _ :hello頻道上發(fā)送Sentinel節(jié)點(diǎn)對(duì)于主節(jié)點(diǎn)的判斷以及當(dāng)前sentinel節(jié)點(diǎn)的信息攻询,同時(shí)每個(gè)sentinel節(jié)點(diǎn)也會(huì)訂閱該頻道从撼,來(lái)了解其他Sentinel節(jié)點(diǎn)以及它們對(duì)節(jié)點(diǎn)判斷。

        3)每隔一秒钧栖,每個(gè)Sentinel節(jié)點(diǎn)會(huì)向主節(jié)點(diǎn)低零,從節(jié)點(diǎn),其余Sentinel節(jié)點(diǎn)發(fā)送一條ping命令做一次心跳檢查桐经。來(lái)確認(rèn)這些節(jié)點(diǎn)是否可達(dá)毁兆。

        因此通過(guò)三個(gè)定時(shí)任務(wù)實(shí)現(xiàn)個(gè)sentinel節(jié)點(diǎn),主節(jié)點(diǎn)阴挣,從節(jié)點(diǎn)之間的連接和監(jiān)控

      • 主觀下線

        每個(gè)Sentinel節(jié)點(diǎn)會(huì)每隔1秒對(duì)主節(jié)點(diǎn)气堕,從節(jié)點(diǎn),其他sentinel發(fā)送ping命令做心跳檢測(cè)畔咧,當(dāng)這些節(jié)點(diǎn)超過(guò)down-after-millseconds沒(méi)有進(jìn)行有效回復(fù)茎芭,sentinel節(jié)點(diǎn)就會(huì)對(duì)該節(jié)點(diǎn)做失敗判定,這個(gè)行為為主觀下線誓沸。

      • 客觀下線

        當(dāng)sentinel主觀下線的節(jié)點(diǎn)是主節(jié)點(diǎn)時(shí)梅桩,該Sentinel節(jié)點(diǎn)會(huì)通過(guò)sentinel is-master-down-by-addr 命令向其他節(jié)點(diǎn)詢問(wèn)對(duì)主節(jié)點(diǎn)的判斷,當(dāng)超過(guò)< quorum >個(gè)數(shù)拜隧,Sentinel節(jié)點(diǎn)會(huì)認(rèn)為主節(jié)點(diǎn)確實(shí)有問(wèn)題宿百,這時(shí)該Sentinel節(jié)點(diǎn)會(huì)做出客觀下線決定。

      • 領(lǐng)導(dǎo)者選舉

        raft算法實(shí)現(xiàn)leader選舉

        1)每個(gè)在線的sentinel節(jié)點(diǎn)都有資格成為領(lǐng)導(dǎo)者洪添,當(dāng)它確認(rèn)主節(jié)點(diǎn)主觀下線時(shí)候垦页,會(huì)向其他Sentinel節(jié)點(diǎn)發(fā)送 sentinel is-master-down-by-addr命令,要求自己成為領(lǐng)導(dǎo)者

    • 集群

      • 數(shù)據(jù)分區(qū)

        1. 節(jié)點(diǎn)取余分區(qū)

        2)一致性哈希分區(qū)()

        3)虛擬槽分區(qū)

      • 集群功能限制

        1. key 批量操作支持有限干奢。如mset痊焊,mget,目前只支持slot值的key執(zhí)行批量操作,對(duì)于slot值的key用于執(zhí)行mget,mset等操作存在于多個(gè)節(jié)點(diǎn)上不支持

        2)key事務(wù)操作支持有限薄啥,同樣只支持同一節(jié)點(diǎn)上的事務(wù)操作

        3)key作為數(shù)據(jù)分區(qū)的最小粒度辕羽,因此不能將一個(gè)大的鍵值對(duì)象hash,list映射到不同節(jié)點(diǎn)。

        1. 不支持多數(shù)據(jù)庫(kù)空間垄惧。單機(jī)下redis支持16個(gè)庫(kù)刁愿,集群只支持db0數(shù)據(jù)庫(kù)空間。

        5)復(fù)制結(jié)構(gòu)只支持一層赘艳,從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn)酌毡,不支持嵌套樹(shù)狀復(fù)制結(jié)構(gòu)克握。

      • 搭建集群

        1. 準(zhǔn)備節(jié)點(diǎn)

        2)節(jié)點(diǎn)握手(Gossip流言算法)

        3)分配槽(16384個(gè)槽全部分配完成蕾管,集群才可以上線)

      • 節(jié)點(diǎn)通信

        1)集群中的每個(gè)節(jié)點(diǎn)都會(huì)單獨(dú)開(kāi)辟一個(gè)TCP通道,用于節(jié)點(diǎn)之間彼此通信菩暗,通信端口號(hào)在基礎(chǔ)上加10000.

        2)每個(gè)節(jié)點(diǎn)在固定周期內(nèi)通過(guò)特定規(guī)則選擇幾個(gè)節(jié)點(diǎn)發(fā)送ping消息掰曾。

        3)接收到ping消息的節(jié)點(diǎn)用pong消息作為響應(yīng)。

      • 消息種類

        (消息格式:消息頭和消息體)

        消息頭包含發(fā)送節(jié)點(diǎn)自身狀態(tài)數(shù)據(jù)接收節(jié)點(diǎn)消息頭就可以獲取到發(fā)送的相關(guān)數(shù)據(jù)停团。(節(jié)點(diǎn)id旷坦,槽映射,節(jié)點(diǎn)標(biāo)識(shí))

        消息體:定義發(fā)送消息的數(shù)據(jù)佑稠,使用cluster MsgDataGossip數(shù)組作為消息體數(shù)據(jù)秒梅。

        meet 用于通知新節(jié)點(diǎn)加入

        ping 用于檢測(cè)和交換信息,包含了自身節(jié)點(diǎn)和部分其他節(jié)點(diǎn)狀態(tài)數(shù)據(jù)

        pong 用于接收到meet和ping后返回自身狀態(tài)舌胶,也可以在集群里廣播自身狀態(tài)

        fail當(dāng)判斷某個(gè)節(jié)點(diǎn)下線后捆蜀,在集群里進(jìn)行廣播該節(jié)點(diǎn)狀態(tài)

      • 集群伸縮

        擴(kuò)容集群

        1)準(zhǔn)備新節(jié)點(diǎn)

        2)加入集群

        3)遷移槽和數(shù)據(jù)

        加入的新節(jié)點(diǎn)剛開(kāi)始都是主節(jié)點(diǎn)狀態(tài),但是由于沒(méi)有負(fù)責(zé)的槽幔嫂,所以不能接受任何讀寫操作辆它。

        遷移槽和數(shù)據(jù)

        槽遷移需要保證每個(gè)負(fù)責(zé)相似數(shù)量的槽,從而保證各節(jié)點(diǎn)的數(shù)量均勻

        數(shù)據(jù)遷移過(guò)程是逐個(gè)槽進(jìn)行的履恩,每個(gè)槽數(shù)據(jù)遷移流程

        1)對(duì)目標(biāo)節(jié)點(diǎn)發(fā)送cluster setslot {slot} importing {sourceNodeId}命令锰茉,讓目標(biāo)節(jié)點(diǎn)準(zhǔn)備導(dǎo)入槽的數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市切心,隨后出現(xiàn)的幾起案子飒筑,更是在濱河造成了極大的恐慌,老刑警劉巖绽昏,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件协屡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡而涉,警方通過(guò)查閱死者的電腦和手機(jī)著瓶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)啼县,“玉大人材原,你說(shuō)我怎么就攤上這事沸久。” “怎么了余蟹?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵卷胯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我威酒,道長(zhǎng)窑睁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任葵孤,我火速辦了婚禮担钮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尤仍。我一直安慰自己箫津,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布宰啦。 她就那樣靜靜地躺著苏遥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赡模。 梳的紋絲不亂的頭發(fā)上田炭,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音漓柑,去河邊找鬼教硫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛欺缘,可吹牛的內(nèi)容都是我干的栋豫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谚殊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丧鸯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嫩絮,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丛肢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后剿干,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜂怎,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年置尔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杠步。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幽歼,靈堂內(nèi)的尸體忽然破棺而出朵锣,到底是詐尸還是另有隱情,我是刑警寧澤甸私,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布诚些,位于F島的核電站,受9級(jí)特大地震影響皇型,放射性物質(zhì)發(fā)生泄漏诬烹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一弃鸦、第九天 我趴在偏房一處隱蔽的房頂上張望绞吁。 院中可真熱鬧,春花似錦寡键、人聲如沸掀泳。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至脑沿,卻和暖如春藕畔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庄拇。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工注服, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人措近。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓溶弟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瞭郑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜御,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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