20171116 Redis

  • NoSQL
  • Redis基礎(chǔ)
  • Redis配置文件基礎(chǔ)
  • Redis的持久化
  • Redis的復(fù)制
  • Redis的集群

一、NoSQL

(一)基本概念

  • NoSQL:Not Only SQL,非關(guān)系型、分布式、開源、水平可擴(kuò)展的數(shù)據(jù)庫
  • 特性:數(shù)據(jù)量大、數(shù)據(jù)變化非??欤〝?shù)據(jù)增長快、流量分布變化大、數(shù)據(jù)間耦合結(jié)構(gòu)變化快)、數(shù)據(jù)源很多

(二)設(shè)計(jì)原則

(1)CAP理論:
  • 一個(gè)分布式系統(tǒng)不可能同時(shí)滿足C、A、P三個(gè)特性,最多可同時(shí)滿足其中兩者;對于分布式系統(tǒng)滿足分區(qū)容錯(cuò)性幾乎是必須的
  • C:Consistency,多個(gè)數(shù)據(jù)節(jié)點(diǎn)上的數(shù)據(jù)一致
  • A:Availablity,用戶發(fā)出請求后的有限時(shí)間范圍內(nèi)返回結(jié)果
  • P:Partition tolerence,網(wǎng)絡(luò)發(fā)生分區(qū)后(network partition),服務(wù)是否依然可用
(2)BASE:BA,S,E,基于CAP演化而來
  • BA:Basically Available,基本可用
  • S:Soft state,軟狀態(tài)/柔性事務(wù),即狀態(tài)可以在一個(gè)時(shí)間窗口內(nèi)是不同步的
  • E:Eventually consistency,最終一致性

(三)分類和主流產(chǎn)品

  • Key Value / Tuple Store:鍵值存儲,DynamoDB, redis
  • Wide Column Store / Column Families:列式數(shù)據(jù)庫,hbase
  • Document Store:文檔數(shù)據(jù)庫,mongodb, Elastic
  • Graph Databases:圖式數(shù)據(jù)庫,Neo4j
  • Time Series / Streaming Databases:時(shí)間序列存儲

二、Redis基礎(chǔ)

(一)簡介:

  • 開源、內(nèi)存存儲、數(shù)據(jù)結(jié)構(gòu)存儲
  • 可用作:數(shù)據(jù)庫、緩存、消息隊(duì)列
  • 數(shù)據(jù)結(jié)構(gòu):字符串、列表(數(shù)組)、hashes(關(guān)聯(lián)數(shù)組)、集合、有序集合、bitmaps、hyperloglogs、空間索引

(二)程序環(huán)境:

  • 配置文件:/etc/redis.conf
  • 主程序:/usr/bin/redis-server
  • 端口:6379/tcp
  • 客戶端:/usr/bin/redis-cli
  • Unit File:/usr/lib/systemd/system/redis.service
  • 數(shù)據(jù)目錄:/var/lib/redis

(三)客戶端的基本操作

(1)K/V 數(shù)據(jù)結(jié)構(gòu)
  • key:直接ASCII字符串;
  • value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
(2)radis-cli工具的使用
  • 交互式界面:直接輸入radis-cli進(jìn)入

  • 幫助:輸入HELP,按Tab鍵切換value類型

  • 數(shù)據(jù)庫:只有0-15共16個(gè)數(shù)據(jù)庫,使用SELECT #命令切換,默認(rèn)為0數(shù)據(jù)庫

  • @string
    SET:新增一條鍵值對
    GET:查看鍵對應(yīng)的值
    EXISTS
    INCR:整數(shù)值自增1
    DECR:整數(shù)值自減1
    SETNX:只在沒有此鍵時(shí)添加鍵值對
    SETEX:添加一條鍵值對并設(shè)定過期時(shí)間
    INCRBYFLOAT:按給定數(shù)值增加整數(shù)值
    MGET:查看多個(gè)鍵對應(yīng)的值
    MSET:新增多條鍵值對

SET:新增,GET:查詢,APPEND:添加,STRLEN:長度

SETNX:不存在時(shí)新增,INCR:自增1,INCRBY count 2:自增2,DEL:刪除

  • @list:數(shù)組
    LPUSH:從左側(cè)新增鍵值對
    RPUSH:從右側(cè)新增鍵值對
    LPOP:從左側(cè)移除鍵值對
    RPOP:從右側(cè)移除鍵值對
    LPUSHX:僅當(dāng)list存在時(shí),從左側(cè)新增鍵值對
    RPUSHX:僅當(dāng)list存在時(shí),從右側(cè)新增鍵值對
    LRANGE:查看某個(gè)范圍
    LINDEX:通過索引查看
    LSET:通過list的索引修改元素的值

LPUSH:從左側(cè)添加,LINDEX weekdays 0:查看索引為0的元素值

LRANGE weekdays 0 4:查看索引0至4的元素值
LINSERT weekdays AFTER Tue Wed:在元素后Tue插入Wed

LPOP:左側(cè)移除,RPOP:右側(cè)移除,LLEN:list的長度

  • @set:集合
    SADD:集合中添加成員
    SPOP:從集合中隨機(jī)刪除成員
    SREM :從集合中刪除成員
    SRANDMEMBER:隨機(jī)查看集合中的成員
    SINTER:做交集
    SUNION:做并集

SADD:添加成員,SMEMBERS:查看成員

SINTER:查看交集結(jié)果,SUNION:查看并集結(jié)果

SREM:刪除指定成員,SPOP:隨機(jī)刪除成員

  • @sorted_set:有序集合
    ZADD:從集合中添加成員,若存在則為更新成員的值
    ZCARD:查看有序集合成員數(shù)
    ZCOUNT:按照所賦予的值,輸出指定排序范圍的成員數(shù)
    ZRANK:按照所賦予的值,輸出指定排序范圍的成員

ZADD:添加有序集合的成員,ZSCORE:查看成員所賦予的值

ZRANK:查看指定成員的排序,ZRANGE:查看指定排序范圍的成員,ZRANGEBYSCORE:查看指定排序范圍的成員

  • @hash:關(guān)聯(lián)數(shù)組
    HSET:新增包含一個(gè)鍵值對的關(guān)聯(lián)數(shù)組
    HMSET:新增包含多個(gè)鍵值對的關(guān)聯(lián)數(shù)組
    HGET:查看關(guān)聯(lián)數(shù)組的一個(gè)鍵值對
    HMGET:查看關(guān)聯(lián)數(shù)組的多個(gè)鍵值對
    HKEYS:查看關(guān)聯(lián)數(shù)組的所有鍵
    HVALS:查看關(guān)聯(lián)數(shù)組的所有值
    HDEL:刪除關(guān)聯(lián)數(shù)組的鍵值對
    HGETALL:查看關(guān)聯(lián)數(shù)組的所有鍵和對應(yīng)的值

HMSET:在一個(gè)hash中創(chuàng)建多個(gè)鍵值對,HKEYS:查看鍵,HVALS:查看鍵對應(yīng)的值

HGETALL:查看hash的所有鍵值對,HDEL:刪除鍵值對

  • @pubsub
    PUBLISH:向頻道扇出一條信息
    SUBSCRIBE:訂閱指定頻道
    UNSUBSCRIBE:退訂指定頻道
    PSUBSCRIBE:按pattern規(guī)則訂閱頻道
    PUNSUBSCRIBE:按pattern規(guī)則退訂頻道

PUBLISH:扇出信息

SUBSCRIBE:訂閱并接受信息

  • @geo:空間索引

  • @server
    Server相關(guān)的命令:
    CLIENT GETNAME:查詢當(dāng)前連接名稱
    CLIENT KILL:殺死客戶端的連接
    CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
    CLIENT LIST:列出客戶端連接
    CLIENT PAUSE:暫停執(zhí)行客戶端指令一段時(shí)間
    CLIENT PAUSE timeout
    CLIENT REPLY:告訴服務(wù)器是否回應(yīng)指令
    CLIENT SETNAME:設(shè)置當(dāng)前連接名稱
    SHUTDOWN [NOSAVE|SAVE]:關(guān)閉服務(wù)器
    CONFIG GET:查看配置參數(shù)
    CONFIG RESETSTAT:重置配置參數(shù)
    CONFIG REWRITE:將配置寫入配置文件,實(shí)現(xiàn)運(yùn)行時(shí)永久修改
    CONFIG SET:設(shè)置配置參
    數(shù)
    INFO:INFO [section],服務(wù)器狀態(tài)信息查看,可分為多個(gè)secion查看
    FLUSHDB:清空當(dāng)前數(shù)據(jù)庫
    FLUSHALL:清空所有數(shù)據(jù)庫

CONFIG SET:實(shí)時(shí)修改配置

CONFIG REWRITE:配置文件中自動(dòng)生成相應(yīng)配置信息

INFO:服務(wù)器狀態(tài)信息

三、Redis配置文件基礎(chǔ)

  • 配置文件分為如下章節(jié):
    INCLUDES:包含其他配置文件的路徑
    NETWORK:網(wǎng)絡(luò)配置項(xiàng)
    GENERAL:基本配置項(xiàng)
    SNAPSHOTTING:快照持久化相關(guān)配置
    REPLICATION:復(fù)制相關(guān)配置
    SECURITY:安全相關(guān)配置
    LIMITS:限制相關(guān)的配置
    SLOW LOG:慢日志相關(guān)的配置
    ADVANCED CONFIG:高級配置

  • 通用配置項(xiàng):
    daemonize on
    supervised no
    loglevel notice:日志級別
    pidfile /var/run/redis/redis.pid:pid文件路徑
    logfile /var/log/redis/redis.log:日志文件路徑
    databases:設(shè)定數(shù)據(jù)庫數(shù)量,默認(rèn)為16個(gè),每個(gè)數(shù)據(jù)庫的名字均為整數(shù),從0開始編號,默認(rèn)操作的數(shù)據(jù)庫為0

  • 網(wǎng)絡(luò)配置項(xiàng):
    bind IP:綁定IP
    port PORT:監(jiān)聽端口
    protected-mode yes:安全模式
    tcp-backlog 511:后援隊(duì)列長度
    unixsocket:socket文件路徑
    timeout:連接的空閑超時(shí)時(shí)長

  • 安全配置:
    requirepass <PASSWORD>
    rename-command <COMMAND> <NEW_CMND_NAME>:修改命令名稱
    在AOF或Replication環(huán)境中,不推薦使用

設(shè)置密碼后,在redis-cli中使用AUTH password命令驗(yàn)證密碼

  • Limits相關(guān)的配置:
    maxclients 10000:并發(fā)客戶端連接數(shù)
    maxmemory <bytes>:最大內(nèi)存使用容量,超出時(shí)按照maxmemory-policy設(shè)置的策略刪除鍵值
    maxmemory-policy noeviction:淘汰策略

    volatile-lru:從接近過期時(shí)間的鍵值中采用LRU算法淘汰
    allkeys-lru:從所有鍵值中采用LRU算法淘汰
    volatile-random:從接近過期時(shí)間的鍵值中隨機(jī)淘汰
    allkeys-random:從全部鍵值中隨機(jī)淘汰
    volatile-ttl:從最接近過期時(shí)間的鍵值開始淘汰 
    noeviction:不刪除鍵值,寫操作直接報(bào)錯(cuò)
    

    maxmemory-samples 5: 淘汰算法運(yùn)行時(shí)的采樣樣本數(shù)

  • SlowLog相關(guān)的配置:
    slowlog-log-slower-than 10000:超過多少時(shí)間被記錄進(jìn)慢查詢?nèi)罩荆瑔挝皇俏⒚?br> slowlog-max-len 128:慢查詢?nèi)罩咀畲髼l目

  • Advanced配置:
    hash-max-ziplist-entries 512:設(shè)置ziplist的鍵數(shù)量最大值
    hash-max-ziplist-value 64:每個(gè)值的最大空間
    client-output-buffer-limit normal 0 0 0:普通客戶端輸出緩沖限制
    client-output-buffer-limit slave 256mb 64mb 60:從服務(wù)器客戶端輸出緩沖限制
    client-output-buffer-limit pubsub 32mb 8mb 60:隊(duì)列客戶端輸出緩沖限制
    三個(gè)值的說明:<hard-limit> <soft-limit> <soft-limit seconds>,一般情況不能超過<soft-limit>,任何情況絕對不能超過<hard-limit>,超過<soft-limit>的部分在<soft-limit seconds>的寬限期后將被刪除

四、Redis的持久化

(一)持久化的兩種方式

  • RDB:snapshotting,二進(jìn)制格式
    按事先定制的策略,周期性地將數(shù)據(jù)從內(nèi)存同步至磁盤
    數(shù)據(jù)文件默認(rèn)為dump.rdb
    客戶端顯式使用SAVE或BGSAVE命令來手動(dòng)啟動(dòng)快照保存機(jī)制
    SAVE:同步,即在主線程中保存快照,此時(shí)會阻塞所有客戶端請求
    BGSAVE:異步,后臺執(zhí)行

  • AOF:Append Only File, fsync
    記錄每次寫操作至指定的文件尾部實(shí)現(xiàn)的持久化
    當(dāng)redis重啟時(shí),可通過重新執(zhí)行文件中的命令在內(nèi)存中重建出數(shù)據(jù)庫
    BGREWRITEAOF:AOF文件重寫,后臺執(zhí)行
    不會讀取正在使用AOF文件,而是通過將內(nèi)存中的數(shù)據(jù)以命令的方式保存至臨時(shí)文件中,完成之后替換原來的AOF文件

  • RDB模式效率更高,AOF模式時(shí)間精度更高

(二)RDB相關(guān)的配置:

  • save <seconds> <changes>

    save 900 1
    save 300 10
    save 60 10000
    

    表示:三個(gè)策略滿足其中任意一個(gè)均會觸發(fā)SNAPSHOTTING操作,即:
    900s內(nèi)至少有一個(gè)key有變化
    300s內(nèi)至少有10個(gè)key有變化
    60s內(nèi)至少有1W個(gè)key發(fā)生變化

  • stop-writes-on-bgsave-error yes
    dump操作出現(xiàn)錯(cuò)誤時(shí),是否禁止新的寫入操作請求,默認(rèn)yes

  • rdbcompression yes:復(fù)制時(shí)是否支持壓縮,默認(rèn)yes

  • rdbchecksum yes:復(fù)制時(shí)是否檢驗(yàn)完整性,默認(rèn)yes

  • dbfilename dump.rdb:指定rdb文件名

  • dir /var/lib/redis:rdb文件的存儲路徑

(三)AOF相關(guān)的配置

  • appendonly no:是否打開AOF模式,默認(rèn)no

  • appendfilename "appendonly.aof":指定rof文件名

  • appendfsync:AOF同步模式,支持三種模式
    no:不執(zhí)行主動(dòng)同步操作,而是OS進(jìn)行
    everysec:每秒一次
    always:每語句一次

  • no-appendfsync-on-rewrite no
    是否在后臺執(zhí)行aof重寫期間不調(diào)用fsync,默認(rèn)為no,表示調(diào)用

  • auto-aof-rewrite-percentage 100

  • auto-aof-rewrite-min-size 64mb
    上述兩個(gè)條件同時(shí)滿足時(shí),方會觸發(fā)重寫AOF,即
    與上次aof文件大小相比,其增長量超過100%,且大小不少于64MB

  • aof-load-truncated yes

(四)其他

  • 注意:持久機(jī)制本身不能取代備份;應(yīng)該制訂備份策略,對redis庫定期備份;

  • RDB與AOF同時(shí)啟用:
    BGSAVE和BGREWRITEAOF不會同時(shí)進(jìn)行
    Redis服務(wù)器啟動(dòng)時(shí)用持久化的數(shù)據(jù)文件恢復(fù)數(shù)據(jù),會優(yōu)先使用AOF

五、Redis的復(fù)制

(一)特點(diǎn):

  • 一個(gè)Master可以有多個(gè)Slave主機(jī),支持鏈?zhǔn)綇?fù)制
  • Master以非阻塞方式同步數(shù)據(jù)至Slave主機(jī)

(二)方法一:配置slave節(jié)點(diǎn)

  • redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>:指明主節(jié)點(diǎn)的IP和端口
  • redis-cli> CONFIG SET masterauth <PASSWORD>:主節(jié)點(diǎn)密碼認(rèn)證

(三)方法二:配置參數(shù)

(1)必須配置的參數(shù)
  • slaveof
  • masterauth
(2)其他視情況配置的參數(shù)
  • slave-serve-stale-data yes:從節(jié)點(diǎn)是否使用過時(shí)的數(shù)據(jù)提供服務(wù),默認(rèn)yes

  • slave-read-only yes:從節(jié)點(diǎn)是否只讀,默認(rèn)yes

  • repl-diskless-sync no:是否使用無盤方式復(fù)制,由以下三種模式
    no, Disk-backed, Diskless

    • 新的從節(jié)點(diǎn)或某較長時(shí)間未能與主節(jié)點(diǎn)進(jìn)行同步的從節(jié)點(diǎn)重新與主節(jié)點(diǎn)通信,需要做"full synchronization",此時(shí)其同步方式有兩種style:
    • Disk-backend:主節(jié)點(diǎn)新創(chuàng)建快照文件于磁盤中,而后將其發(fā)送給從節(jié)點(diǎn)
    • Diskless:主節(jié)點(diǎn)新創(chuàng)建快照后直接通過網(wǎng)絡(luò)套接字文件發(fā)送給從節(jié)點(diǎn)
  • repl-diskless-sync-delay 5
    當(dāng)使用Diskless模式時(shí),為了實(shí)現(xiàn)并行復(fù)制,通常需要在復(fù)制啟動(dòng)前延遲一個(gè)時(shí)間段,默認(rèn)5s

  • repl-ping-slave-period 10:從節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送ping的間隔,默認(rèn)10s

  • repl-timeout 60:復(fù)制超時(shí)時(shí)間,默認(rèn)60s

  • repl-disable-tcp-nodelay no:是否禁用tcp延遲發(fā)送,默認(rèn)不禁用

  • repl-backlog-size 1mb:消息隊(duì)列長度

  • slave-priority 100
    復(fù)制集群中,主節(jié)點(diǎn)故障時(shí),sentinel應(yīng)用場景中的主節(jié)點(diǎn)選舉時(shí)使用的優(yōu)先級
    數(shù)字越小優(yōu)先級越高,但0表示不參與選舉

  • min-slaves-to-write 3
    主節(jié)點(diǎn)僅允許其能夠通信的從節(jié)點(diǎn)數(shù)量大于等于此處的值時(shí)接受寫操作

  • min-slaves-max-lag 10
    從節(jié)點(diǎn)延遲時(shí)長超出此處指定的時(shí)長時(shí),主節(jié)點(diǎn)會拒絕寫入操作

(四)實(shí)驗(yàn)1:實(shí)現(xiàn)Redis的復(fù)制

  • 實(shí)驗(yàn)環(huán)境:
    主節(jié)點(diǎn)IP:192.168.136.230
    從節(jié)點(diǎn)1的IP:192.168.136.130
    從節(jié)點(diǎn)2的IP:192.168.136.131
(1)編輯主從節(jié)點(diǎn)的配置文件,修改監(jiān)聽IP,配置密碼認(rèn)證
vim /etc/redis.conf
bind 0.0.0.0
requirepass centos
(2)編輯從節(jié)點(diǎn)1的配置文件
slaveof 192.168.136.230 6379     // 指向主節(jié)點(diǎn)的IP和端口
masterauth centos                // 主節(jié)點(diǎn)的認(rèn)證密碼
(3)通過redis-cli命令配置從節(jié)點(diǎn)2的設(shè)置
redis-cli -h 192.168.136.131
192.168.136.131:6379> AUTH centos
192.168.136.131:6379> SLAVEOF 192.168.136.230 6379     // 指向主節(jié)點(diǎn)的IP和端口
192.168.136.131:6379> CONFIG SET masterauth centos     // 主節(jié)點(diǎn)的認(rèn)證密碼
192.168.136.131:6379> CONFIG GET masterauth
192.168.136.131:6379> CONFIG GET slave-read-only
192.168.136.131:6379> CONFIG REWRITE                   // 寫入配置文件
(4)啟動(dòng)主次節(jié)點(diǎn)的服務(wù),測試配置

主節(jié)點(diǎn)上查看連接的從節(jié)點(diǎn):127.0.0.1:6379> CLIENT LIST

主節(jié)點(diǎn)查看Replication章節(jié)的信息,可以看到從節(jié)點(diǎn)的相關(guān)信息

從節(jié)點(diǎn)1查看Replication章節(jié)的信息,可以看到主節(jié)點(diǎn)IP和當(dāng)前連接狀態(tài)

從節(jié)點(diǎn)2查看Replication章節(jié)的信息,可以看到主節(jié)點(diǎn)IP和當(dāng)前連接狀態(tài)

主節(jié)點(diǎn)查看所有鍵

從節(jié)點(diǎn)1查看所有鍵,成功同步

從節(jié)點(diǎn)2查看所有鍵,成功同步

(五)sentinel

(1)sentinel簡介
  • 主要完成三個(gè)功能:監(jiān)控、通知、自動(dòng)故障轉(zhuǎn)移
  • 選舉:流言協(xié)議(向網(wǎng)絡(luò)內(nèi)多臺主機(jī)確認(rèn)主節(jié)點(diǎn)是否宕機(jī))、投票協(xié)議(少數(shù)服從多數(shù))
(2)配置項(xiàng)
  • 配置文件:/etc/redis.conf

  • port 26379:默認(rèn)監(jiān)聽端口,26379

  • sentinel monitor <master-name> <ip> <redis-port> <quorum>
    主節(jié)點(diǎn)IP和端口
    <quorum>:表示sentinel集群的quorum機(jī)制,即至少有quorum個(gè)sentinel節(jié)點(diǎn)同時(shí)判定主節(jié)點(diǎn)故障時(shí),才認(rèn)為其是真的故障
    s_down: subjectively down,主觀宕機(jī),單個(gè)sentinel服務(wù)器獨(dú)自判定主節(jié)點(diǎn)是否宕機(jī)
    o_down: objectively down,客觀宕機(jī),多個(gè)sentinel服務(wù)器投票決定主節(jié)點(diǎn)是否宕機(jī)

  • sentinel auth-pass <master-name> <password> :主節(jié)點(diǎn)認(rèn)證

  • sentinel down-after-milliseconds <master-name> <milliseconds>
    監(jiān)控到指定的集群的主節(jié)點(diǎn)異常狀態(tài)持續(xù)多久方才將標(biāo)記為“故障”

  • sentinel parallel-syncs <master-name> <numslaves>
    指在failover過程中,能夠被sentinel并行配置的從節(jié)點(diǎn)的數(shù)量;

  • sentinel failover-timeout <master-name> <milliseconds>
    sentinel必須在此指定的時(shí)長內(nèi)完成故障轉(zhuǎn)移操作,否則,將視為故障轉(zhuǎn)移操作失敗

  • sentinel notification-script <master-name> <script-path>
    通知腳本,此腳本被自動(dòng)傳遞多個(gè)參數(shù)

(3)命令行選項(xiàng)

redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
SENTINEL masters:查看主節(jié)點(diǎn)
SENTINEL slaves <MASTER_NAME>:查看指定主節(jié)點(diǎn)的從節(jié)點(diǎn)
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>

(六)實(shí)驗(yàn)2:實(shí)現(xiàn)sentinel監(jiān)控主機(jī)狀態(tài),當(dāng)主節(jié)點(diǎn)發(fā)生故障時(shí)自動(dòng)轉(zhuǎn)移

  • 實(shí)驗(yàn)環(huán)境:
    繼承實(shí)驗(yàn)1的主從節(jié)點(diǎn)環(huán)境,為減少實(shí)驗(yàn)系統(tǒng)開銷,主節(jié)點(diǎn)、從節(jié)點(diǎn)1、從節(jié)點(diǎn)2共三臺主機(jī)全部兼任sentinel服務(wù)器
    根據(jù)quorum機(jī)制,只有大于過半數(shù)的節(jié)點(diǎn)認(rèn)定主節(jié)點(diǎn)宕機(jī)才會視作主機(jī)宕機(jī),故quorum值為2
(1)編輯三臺主機(jī)的sentinel配置文件
vim /etc/redis-sentinel.conf
bind 0.0.0.0
sentinel monitor mymaster 192.168.136.230 6379 2
sentinel auth-pass mymaster centos
sentinel down-after-milliseconds mymaster 30000
(2)啟動(dòng)redis-sentinel服務(wù),并測試
systemctl start redis-sentinel
登錄sentinel服務(wù)器
redis-cli -h 192.168.136.230 -p 26379
SENTINEL masters             // 查詢主節(jié)點(diǎn)信息
SENTINEL slaves mymaster     // 查詢從節(jié)點(diǎn)信息

SENTINEL masters,查詢主節(jié)點(diǎn)信息,當(dāng)前為192.168.136.230,符合預(yù)期

SENTINEL slaves mymaster,查詢從節(jié)點(diǎn)信息,當(dāng)前為192.168.136.130和192.168.136.131,符合預(yù)期

(3)關(guān)閉主節(jié)點(diǎn)的redis服務(wù),造成宕機(jī)狀況,測試故障轉(zhuǎn)移功能
systemctl stop redis         // 192.168.136.230主機(jī)上操作
redis-cli -h 192.168.136.131 -p 26379
SENTINEL masters             // 查詢主節(jié)點(diǎn)信息
SENTINEL slaves mymaster     // 查詢從節(jié)點(diǎn)信息

192.168.136.130已經(jīng)變?yōu)橹鞴?jié)點(diǎn)

192.168.136.230已經(jīng)降為從節(jié)點(diǎn),由于宕機(jī)目前不可用

192.168.136.131仍舊保持從節(jié)點(diǎn)的身份

(4)修復(fù)主機(jī)192.168.136.230,并重新上線
vim /etc/redis.conf
slaveof 192.168.136.130 6379     // 設(shè)置為新的主節(jié)點(diǎn)IP
masterauth centos
systemctl start redis

成功上線

六、Redis的集群

(一)redis的集群技術(shù):

Twitter:twemproxy,Twitter已經(jīng)不再使用
豌豆莢:codis
原生:redis cluster

(二)redis cluster集群相關(guān)的配置:

  • cluster-enabled
    是否開啟集群配置
  • cluster-config-file
    集群節(jié)點(diǎn)集群信息配置文件,每個(gè)節(jié)點(diǎn)都有一個(gè),由redis生成和更新,配置時(shí)避免名稱沖突
  • cluster-node-timeout
    集群節(jié)點(diǎn)互連超時(shí)的閾值,單位毫秒
  • cluster-slave-validity-factor
    進(jìn)行故障轉(zhuǎn)移時(shí),salve會申請成為master。有時(shí)slave會和master失聯(lián)很久導(dǎo)致數(shù)據(jù)較舊,這樣的slave不應(yīng)該成為master。這個(gè)配置用來判斷slave是否和master失聯(lián)時(shí)間過長。

(三)實(shí)驗(yàn)3:實(shí)現(xiàn)redis集群

  • 提示:注意關(guān)閉之前實(shí)驗(yàn)的sentinel服務(wù),將主從節(jié)點(diǎn)的相關(guān)配置恢復(fù),然后重啟redis服務(wù)
(1)設(shè)置配置文件,啟用集群功能
vim /etc/redia.conf     // 每個(gè)節(jié)點(diǎn)都要如此設(shè)置
cluster-enabled yes
cluster-config-file nodes-6379.conf
systemctl restart redis
(2)啟動(dòng)redis后為每個(gè)節(jié)點(diǎn)分配slots
systemctl restart redis
redis-cli -h 192.168.136.230 -a centos CLUSTER ADDSLOTS {0..5461}
redis-cli -h 192.168.136.130 -a centos CLUSTER ADDSLOTS {5462..10923}
redis-cli -h 192.168.136.131 -a centos CLUSTER ADDSLOTS {10924..16383}

注意:每個(gè)slot要獨(dú)立創(chuàng)建;可用范圍是0-16383,共16384個(gè)

使用CLUSTER INFO查看集群信息,可以看到已經(jīng)分配相應(yīng)數(shù)量的slot,但是集群狀態(tài)還是fail

(3)設(shè)定集群成員關(guān)系
redis-cli -h 192.168.136.230 -a centos
CLUSTER MEET 192.168.136.130 6379
CLUSTER MEET 192.168.136.131 6379
CLUSTER INFO

再次使用CLUSTER INFO查看集群信息,集群狀態(tài)已經(jīng)ok狀態(tài)

(4)測試集群功能
redis-cli -h 192.168.136.230 -a centos
192.168.136.230:6379> SET testkey1 hi
OK
192.168.136.230:6379> SET testkey2 hello
(error) MOVED 14758 192.168.136.131:6379
// 返回結(jié)果要求到192.168.136.131的節(jié)點(diǎn)執(zhí)行操作
redis-cli -h 192.168.136.131 -a centos
192.168.136.131:6379> SET testkey2 hello
OK
192.168.136.131:6379> SET testkey3 sayhello
(error) MOVED 10631 192.168.136.130:6379

192.168.136.230成功存儲testkey1鍵值對,但是節(jié)點(diǎn)要求去192.168.136.131存儲testkey2鍵值對

192.168.136.131成功存儲testkey2鍵值對,但是節(jié)點(diǎn)要求去192.168.136.130存儲testkey3鍵值對

注意:當(dāng)對redis cluster中的某個(gè)節(jié)點(diǎn)寫數(shù)據(jù)時(shí),可能會要求存儲至其他節(jié)點(diǎn)。即可以向任意一個(gè)節(jié)點(diǎn)發(fā)起請求,節(jié)點(diǎn)可能會接收請求,也可能返回去其他節(jié)點(diǎn)完成操作的結(jié)果。故實(shí)際使用中,redis cluster需要與智能客戶端協(xié)同發(fā)揮功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.1 資料 ,最好的入門小冊子,可以先于一切文檔之前看,免費(fèi)。 作者Antirez的博客,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,323評論 1 51
  • 大小固定//自定義一個(gè)Cell @interfaceMMCell:UITableViewCell @end @im...
    陳世美_閱讀 607評論 0 2
  • 寫在前面的話: 學(xué)英語挺難的,但是如果找到別有意義的方法去記住詞匯,那么就不會太難。本文受到了一檔英文脫口秀節(jié)目的...
    姚石之言閱讀 42,747評論 5 26
  • 今天是團(tuán)日活動(dòng),我們護(hù)理省內(nèi)班的春游。 昨晚想定七點(diǎn)起床的,但小黃說七點(diǎn)半起 我?guī)еS刺的心情同意了。我覺得七點(diǎn)半...
    木刻茉莉閱讀 312評論 0 0
  • 從20多年前剛剛開始工作起,為了看海就天南地北地跑了很多地方。好幾次冒著被上司責(zé)怪的后果。終于有一天,對自...
    入流亡所閱讀 490評論 0 2

友情鏈接更多精彩內(nèi)容