1. 程式人生 > 實用技巧 >Redis 實戰筆記

Redis 實戰筆記

Redis

yum源安裝

yum install -y epel-release redis
systemctl enable redis
systemctl start redis
systemctl status redis

redis 簡介

Redis是一個開源的使用 C語言編寫的 Key-value記憶體資料庫讀寫效能強,支援多種資料型別把資料儲存在記憶體中的快取記憶體作者 Salvatore Sanfilippo# 中文文件http://www.redis.cn/documentation.html

redis 特點

速度快
支援多種資料結構( string、list、hash、set、stored set)

持久化
主從複製(叢集)
支援過期時間
支援事務
訊息訂閱
官方不支援 WINDOWS,但是有第三方版本

Redis與 Memcache的對比



對比測試


Redis應用場景

資料快取 提高訪問效能,使用的方式與 memcache相同。會話快取( Session Cache) 儲存Web會話資訊排行榜/計數器 Nginx+lua+Redis 計數器進行IP自動封禁訊息佇列 構建實時訊息系統,聊天,群聊。

多例項

複製redis.conf redis-server redis-cli 到不同的資料夾修改配置檔案中的埠
# 去除註釋
sed -ri '/^$|#/d' redis.conf
# 後臺啟動
[root@mysql-56 redis-6.0.9]# grep daemon redis.conf
daemonize yes
[root@mysql-56 redis-6.0.9]# ./src/redis-server redis.conf
[root@mysql-56 redis-6.0.9]# ./src/redis-cli -p 6380
127.0.0.1:6380>

redis 原始碼安裝

#安裝
wget http://download.redis.io/releases/redis-3.2.6.tar.gz
tar xzf redis-3.2.6.tar.gz
cd redis-3.2.6
make

#執行
src/redis-server
#客戶端
src/redis-cli

#檢視路徑
rpm -ql redis 

# 啟動客戶端埠
redis-cli -p 6380


配置檔案

主目錄下 redis.conf
port 6380    # 埠
daemonize yes                          # 後臺執行
pidfile /var/run/redis_6380.pid        #程序檔案
logfile "/data/redis6380/redis.log"    #日誌檔案
appendonly yes        #日誌開關
dbfilename dump.rdb    # 持久化資料檔案


[root@mysql-56 redis-6.0.9]# ls /data/redis6380/
redis.conf  redis.log  redis-server


redis 保護模式

一鍵部署
[root@mysql-56 redis-6.0.9]# cat /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target


[Service]
ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755


[Install]
WantedBy=multi-user.target

Bind 保護模式

  • Redis 3.2 新特性
-解決訪問安全
  • Bind
-指定IP進行監聽 bind 10.0.0.11
  • 禁止 protected-mode
protected-mode yes/no
  • 增加 requirepass {password}
requirepass 123456
  • 在redis-cli中使用
auth {password}進行認證
[root@mysql-56 redis-6.0.9]# grep prote redis.conf
protected-mode yes
requirepass 123456

127.0.0.1:6380> SHUTDOWN
not connected> exit
127.0.0.1:6380> get foo
(error) NOAUTH Authentication required.
127.0.0.1:6380> auth 123456
OK
127.0.0.1:6380> get a
"1"

redis 資料

獲取當前配置CONFIG GET *變更執行配置CONFIG SET loglevel "notice"

持久化

  • RDB持久化可以在指定的時間間隔內生成資料集的時間點快照(point-in-time snapshot)
  • AOF持久化記錄伺服器執行的所有寫操作命令,並在伺服器啟動時,通過重新執行這些命令來還原資料集。AOF檔案中的命令全部以Redis協議的格式來儲存,新命令會被追加到檔案的末尾。Redis還可以在後臺對AOF檔案進行重寫(rewrite),使得AOF檔案的體積不會超出儲存資料集狀態所需的實際大小。
  • Redis還可以同時使用AOF持久化和RDB持久化。在這種情況下,當 Redis重啟時,它會優先使用AOF檔案來還原資料集,因為AOF檔案儲存的資料集通常比RDB檔案所儲存的資料集更完整。
  • 你甚至可以關閉持久化功能,讓資料只在伺服器執行時存在。

持久化策略

日誌檔案 appendonly yes/nosave 900 1save 300 10save 60 10000分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改,即將資料寫入硬碟。

壓縮

decompression yes-指定儲存至本地資料庫時是否壓縮資料,預設為yes,Redis 採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫檔案變的巨大

同步

appendfsync everysec - no:表示等作業系統進行資料快取同步到磁碟,linux 約30秒(快) - always:表示每次更新操作後呼叫fsync()將資料寫到磁碟(慢,安全) - everysec:表示每秒同步一次(折中,預設值)

核心實戰


資料型別



常規操作

KEYS * 檢視KEY支援萬用字元DEL 刪除給定的一個或多個keyEXISTS 檢查是否存在EXPIRE 設定生存時間TTL 以秒為單位返回過期時間DUMP RESTORE 序例化與反序列化PEXIRE PTTL PERSIST 以毫秒為單位RENAME 變更KEY名SORT 鍵值排序,有非數字時報錯TYPE 返回鍵所儲存值的型別

字串


SET name lewenGet name一個鍵最大能儲存512MB
Append    #將value追加到key原來的值的末尾
INCRBY    #增加
DECRBY    #減少
    DECRBY count 20    減去指定量
Mget mset    #同時獲取設定一個或多個鍵值對
STRLEN    #返回字串長度
INCR DECR    #將值增或減1

練習

127.0.0.1:6380> set name lewen
OK
127.0.0.1:6380> get name
"lewen"
127.0.0.1:6380> type name
string


127.0.0.1:6380> APPEND name 123
(integer) 8
127.0.0.1:6380> get name
"lewen123"


127.0.0.1:6380> mset name fadewalk age 24
OK
127.0.0.1:6380> get name
"fadewalk"
127.0.0.1:6380> get age
"24"


127.0.0.1:6380> mget name age
1) "fadewalk"
2) "24"


127.0.0.1:6380> STRLEN name
(integer) 8
127.0.0.1:6380> STRLEN age
(integer) 2

127.0.0.1:6380> INCR age
(integer) 25
127.0.0.1:6380> INCR age
(integer) 26

127.0.0.1:6380> DECR age
(integer) 25
127.0.0.1:6380> DECR age
(integer) 24

重複set 會覆蓋掉前面的值

127.0.0.1:6380> EXISTS name
(integer) 1
127.0.0.1:6380> INCRBY age
(error) ERR wrong number of arguments for 'incrby' command
127.0.0.1:6380> INCRBY age 100
(integer) 124

hash

Redis hash 是一個鍵值對集合。Redis hash 是一個 string型別的field 和 value 的對映表hash 特別適合用於儲存物件。每個hash可以儲存2^32-1鍵值對
HSET HGET #設定返回單個值HMSET HMGET #設定返回多個值Hmset user name quo sex male age 22
HGETALL #返回KEY的所有鍵值HEXSITS #判斷是否存在HLEN #判斷長度HKEYS #獲取所有字典HVALS #獲取所有值HDEL #刪除key中的一個或多個指定域
127.0.0.1:6380> hset user:1 name lewen
(integer) 1
127.0.0.1:6380> TYPE user:1
hash
127.0.0.1:6380> hset user:1 set male
(integer) 1

127.0.0.1:6380> hgetall user:1
1) "name"
2) "lewen"
3) "age"
4) "24"
5) "set"
6) "male"
127.0.0.1:6380> hget user:1 name
"lewen"
127.0.0.1:6380> hget user:1 age
"24"
127.0.0.1:6380> hmget user:1 name age
1) "lewen"
2) "24"

刪除
127.0.0.1:6380> hdel user:1 name
(integer) 1
127.0.0.1:6380> hdel user:1 set
(integer) 1
127.0.0.1:6380> del user:1
(integer) 1
127.0.0.1:6380> keys *
1) "age"
2) "name"


127.0.0.1:6380> hmset user name lewen age 24 sex male
OK
127.0.0.1:6380> HINCRBY user age 10
(integer) 34
127.0.0.1:6380> HINCRBY user age -5
(integer) 29

list

Redis 列表是簡單的字串列表。按照插入順序排序每個LIST可以儲存2^32-1鍵值對
LPUSH #將一個或多個值插入到列表頭部RPUSH #將一個或多個值插入到列表尾部LPOP/RPOP #移除表頭/尾的元素LLEN #返回列表長度LRANGE #返回指定的元素LREM greet 2 morning #刪除前兩個 morningLREM greet -1 morning #刪除後一個 morningLREM greet 0 hello #刪除所有 hello
Lindex #返回列表key中下標為 index的元素LSET key index value #將列表key下標為 index的元素的值設定為valueLINSERT #插入資料位於某元素之前或之後。LINSERT key BEFORE|AFTER pivotvalue
127.0.0.1:6380> lpush found gf yfd jy fc zs
(integer) 5
127.0.0.1:6380> type found
list


127.0.0.1:6380> lrange found 0 10
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"


127.0.0.1:6380> lrange found 0 3
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
127.0.0.1:6380> lrange found 0 5
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"


127.0.0.1:6380> lpush found wj
(integer) 6
127.0.0.1:6380> lrange found 0 5
1) "wj"
2) "zs"
3) "fc"
4) "jy"
5) "yfd"
6) "gf"


127.0.0.1:6380> rpush found ha
(integer) 7
127.0.0.1:6380> lrange found 0 6
1) "wj"
2) "zs"
3) "fc"
4) "jy"
5) "yfd"
6) "gf"
7) "ha"


消費
127.0.0.1:6380> rpop found
"ha"
127.0.0.1:6380> lrange found 0 6
1) "wj"
2) "zs"
3) "fc"
4) "jy"
5) "yfd"
6) "gf"
127.0.0.1:6380> lpop found
"wj"
127.0.0.1:6380> lrange found 0 6
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"

127.0.0.1:6380> rpush found bao1 bao2 bao3 bao4
(integer) 9
127.0.0.1:6380> lrange found 0 10
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"
6) "bao1"
7) "bao2"
8) "bao3"
9) "bao4"
127.0.0.1:6380> lpop found
"zs"
127.0.0.1:6380> lpop found
"fc"
127.0.0.1:6380> lpop found
"jy"
127.0.0.1:6380> lpop found
"yfd"
127.0.0.1:6380> lpop found
"gf"
127.0.0.1:6380> lpop found
"bao1"

127.0.0.1:6380> lrange found 0 10
1) "bao2"
2) "bao3"
3) "bao4"
127.0.0.1:6380> LLEN found
(integer) 3




127.0.0.1:6380> rpush found bao1 bao2 bao3 bao4
(integer) 7
127.0.0.1:6380> lrange found 0 10
1) "bao2"
2) "bao3"
3) "bao4"
4) "bao1"
5) "bao2"
6) "bao3"
7) "bao4"
127.0.0.1:6380> lrem found 1 bao2
(integer) 1
127.0.0.1:6380> lrange found 0 10
1) "bao3"
2) "bao4"
3) "bao1"
4) "bao2"
5) "bao3"
6) "bao4"

127.0.0.1:6380> lset found 0 baozi001
OK
127.0.0.1:6380> lrange found 0 10
1) "baozi001"
2) "bao4"
3) "bao1"
4) "bao2"
5) "bao3"
6) "bao4"


127.0.0.1:6380> lindex found 0"baozi001"
127.0.0.1:6380> linsert found after baozi001 baozi002(integer) 7127.0.0.1:6380> lrange found 0 101) "baozi001"2) "baozi002"3) "bao4"4) "bao1"5) "bao2"6) "bao3"7) "bao4"

redis 佇列訂閱

生產消費模型


訊息模式

  • 釋出訊息通常有兩種模式:佇列模式( queuIng)和釋出-訂閱模式(publish- subscribe)。佇列模式中, consumers可以同時從服務端讀取訊息,每個訊息只被其中一個 consume讀到。
  • 釋出-訂閱模式中訊息被廣播到所有的 consumer中, topic中的訊息將被分發到組中的一個成員中。同一組中的 consumer可以在不同的程式中,也可以在不同的機器上。

Redis 釋出訂閱

  • Redis釋出訂閱(pub/sub)是一種訊息通訊模式:傳送者(pub)傳送訊息,訂閱者(sub)接收訊息。
  • Redis客戶端可以訂閱任意數量的頻道。


訂閱釋出例項

SUBSCRIBE mq1 #客戶端PUBLISH mq1 "Redis is a great caching technique"PSUBSCRIBE 訂閱一個或多個符合給定模式的頻道psubscribe news *tech*PUBLISH channel message將資訊 message傳送到指定的頻道 channel。返回值代表消費者數量pubsub channels #顯示訂閱頻道 PUBSUB NUMSUB news.it #列印各頻道訂閱者數量PUNSUBSCRIBE #退訂多個頻道SUBSCRIBE #訂閱給定的一個或多個頻道的資訊。UNSUBSCRIBE #退訂頻道
127.0.0.1:6380> PUBLISH mq1 "redis is a great caching technique"(integer) 2127.0.0.1:6380>





Redis 事務

Redis 事務可以一次執行多個命令事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。原子性:事務中的命令要麼全部被執行,要麼全部都不執行。
執行過程
  • 開始事務
  • 命令入隊
  • 執行事務


事務命令

DISCARD 取消事務,放棄執行事務塊內的所有命合。EXEC 執行所有事務塊內的命令MULTI 標記一個事務塊的開始UNWATCH 取消 WATCH命合對所有key的監視WATCH key [key....] -監視一個(或多個)key,如果在事務執行之前這個(或這些)key被其他命合所改動,那麼事務捋被打斷























資料備份

[root@cs7 ~]# redis-cli
127.0.0.1:6379> CONFIG GET dir  # 獲取當前目錄
1) "dir"
2) "/var/lib/redis"
[root@cs7 ~]# ls /var/lib/redis/
dump.rdb

  • Save備份(無持久化策略時),生成時在redis 當前目錄中。
  • 恢復時只需將 dump.rdb 放入redis當前目錄
save 之後要關閉才會儲存到檔案

備份恢復例項

[root@mysql-56 redis6380]# egrep "port|daemon|dir|logfile|dbfilename" redis.conf
port 6380
daemonize yes
logfile "./redis.log"
dbfilename dump-6380.rdb
dir /data/redis6380
[root@mysql-56 redis6380]# tree
.
├── appendonly.aof
├── dump-6380.rdb
├── redis.conf
├── redis.log
└── redis-server


[root@mysql-56 redis6380]# ./redis-server redis.conf
[root@mysql-56 redis6380]# redis-cli -p 6380
127.0.0.1:6380> KEYS *
(empty list or set)
127.0.0.1:6380> mset name lewen age 24
OK
127.0.0.1:6380> SHUTDOWN
not connected> exit
[root@mysql-56 redis6380]# ls
appendonly.aof  dump-6380.rdb  redis.conf  redis.log  redis-server
[root@mysql-56 redis6380]# mv dump-6380.rdb /tmp/
[root@mysql-56 redis6380]# mv appendonly.aof /tmp/

[root@mysql-56 redis6380]# ./redis-server redis.conf
[root@mysql-56 redis6380]# redis-cli -p 6380
127.0.0.1:6380> KEYS *
(empty list or set)
127.0.0.1:6380> SHUTDOWN
not connected>
[root@mysql-56 redis6380]# mv /tmp/dump-6380.rdb .
[root@mysql-56 redis6380]# ls
appendonly.aof  dump-6380.rdb  redis.conf  redis.log  redis-server
[root@mysql-56 redis6380]# ./redis-server redis.conf
[root@mysql-56 redis6380]# redis-cli -p 6380
127.0.0.1:6380> KEYS *
1) "age"
2) "name"

主從複製

主從配置

slaveof 192.168.1.1:6379slave-read-only # 只讀模式masterauth <password> #主伺服器設定密碼後需要填寫密碼min-slaves-to-write <number of slaves> #從伺服器不少於,才允許寫入min-slaves-max-lag <number of seconds> #從伺服器延遲不大於CONFIG set slave-read-only yesConfig set masterauth rootinfo replicationSLAVEOF NO ONE #升級至 MASTER

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=140,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=140,lag=1
master_replid:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140


127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6382> SLAVEOF 127.0.0.1 6380
OK

127.0.0.1:6382> MGET name age
1) "lewen"
2) "24"
127.0.0.1:6381> SLAVEOF no one


基於 keepalived的自動故障切換





Redis sentinel

redis 哨兵實現主從複製master和slave 自動切換

Redis sentinel

·Redis-Sentinel 是 Redis官方推薦的高可用性(HA)解決方案,當用Redis做 Master-slave的高可用方案時,假如 master宕機了,Redis本身(包括它的很多客戶端)都沒有實現自動進行主備切換,而Redis-sentinel 本身也是一個獨立執行的程序,它能監控多個 master-slave叢集,發現 master宕機後能進行自動切換。

功能

監控( Monitoring):Sentinel 會不斷地檢查你的主伺服器和從服務器是否運作正常。提醒( Notification):當被監控的某個Redis伺服器出現問題時,Sentinel可以通過API向管理員或者其他應用程式傳送通知。自動故障遷移( Automatic failover):當一個主伺服器不能正常工時, Sentinel會開始一次自動故障遷移操作,它會將失效主服務器的其中一個從伺服器升級為新的主伺服器,並讓失效主伺服器的其他從伺服器改為複製新的主伺服器;當客戶端試圖連線失效的主伺服器時,叢集也會向客戶端返回新主伺服器的地址,使得叢集可以使用新主伺服器代替失效伺服器。

Sentinel 命令

PING: 返回PONGSENTINEL masters:列出所有被監視的主伺服器SENTINEL slaves <master name>SENTINEL get-master-addr-by-name<master name>:返回給定名字的主伺服器的IP地址和埠號。SENTINEL reset <pattern>:重置所有名字和給定模式 pattern相匹配的主伺服器。SENTINEL failover <master name>:當主伺服器失效時,在不詢問其他 Sentinel意見的情況下,強制開始一次自動故障遷移。
檢視配置檔案

配置


cp src/redis-sentinel sentinel.conf 
vim sentinel.conf
port 26380
dir "."
sentinel monitor mcmaster 127.0.0.1 6381 1  # 主的個數,這裡就寫一個
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster O
#啟動
./redis-sentinel /sentinel.conf
實操配置複製到哨兵檔案到 /data/s1
[root@mysql-56 s1]# cat sentinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "./sentinel.log"
dir "/data/s1/"
sentinel myid 1c83d3230453094e2878f2f89dcd609ec601e380
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 6381 1
sentinel down-after-milliseconds mymaster 10000
sentinel config-epoch mymaster 1

配置檔案

指定監控 mastersentinel monitor mymaster 127.0.0.1 6379 2 {2表示多少個 sentinel同意}安全資訊sentinel auth-pass mymaster luyx30超過15000毫秒後認為主機宕機sentinel down-after-milliseconds mymaster 15000·當主從切換多久後認為主從切換失敗sentinel failover-timeout mymaster 100000這兩個配置後面的數量主從機需要一樣, epoch為 master的版本sentinel leader-epoch mymaster 1sentinel config-epoch mymaster 1

演示

6380 掛了會自動的 6381 成為master當6380 恢復了以後,又可以加入成為slave如下:
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=9326,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=9326,lag=0
master_replid:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:9459
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:9459
127.0.0.1:6380> SHUTDOWN
not connected>


[root@mysql-56 s1]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=11106,lag=0
master_replid:15dc060e31823a40c0e971733dc0add4c3e960f0
master_replid2:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92
master_repl_offset:11106
second_repl_offset:10006
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:11106


Redis cluster



Redis叢集

Reds叢集是一個可以在多個Redis節點之間進行資料共享的設施(installation)。Redis叢集不支援那些需要同時處理多個鍵的Redis命合,因為執行這些命令需要在多個Redis節點之間移動資料,並且在高負載的情況下,這些命令將降低Redis叢集的效能,並導致不可預測的行為Redis叢集通過分割槽(partition)來提供一定程度的可用性(availability):即使叢集中有一部分節點失效或者無法進行通訊,叢集也可以繼續處理命合請求。將資料自動切分(split)到多個節點的能力。當叢集中的一部分節點失效或者無法進行通訊時,仍然可以繼續處理命令請求的能力。

前面是 主從複製的小叢集

Redis 叢集資料共享

  • Redis叢集使用資料分片(sharding)而非一致性雜湊(consistency hashing)來實現:一個Redis叢集包含16384個雜湊槽( hash slot),資料庫中的每個鍵都屬於這16384個雜湊槽的其中一個,叢集使用公式CRC16(key)% 16384來計算鍵key屬於哪個槽,其中CRC16(key)語句用於計算鍵key的CRC16校驗和。
  • 節點A負責處理0號至5500號雜湊槽。
  • 節點B負責處理5501號至11000號雜湊槽。
  • 節點C負責處理11001號至16384號雜湊槽

叢集的複製

  • 為了使得叢集在一部分節點下線或者無法與叢集的大多數(majority)節點進行通訊的情況下,仍然可以正常運作,Redis叢集對節點使用了主從複製功能:叢集中的每個節點都有1個至N個複製品(replicate),其中一個複製品為主節點(master),而其餘的N-1個複製品為從節點(slave)。
  • 在之前列舉的節點A、B、C的例子中,如果節點B下線了,那麼叢集將無法正常執行,因為叢集找不到節點來處理501號至11000號的雜湊槽。
  • 假如在建立叢集的時候(或者至少在節點B下線之前),我們為主節點B添加了從節點B1,那麼當主節點B下線的時候,叢集就會捋B1設定為新的主節點,並讓它代替下線的主節點B,繼續處理5501號至11000號的雜湊槽,這樣叢集就不會因為主節點B的下線而無法正常運作了。
  • 不過如果節點B和B1都下線的話,Redis叢集還是會停止運作。






執行機制

所有的 redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。節點的fail是通過叢集中超過半數的 master節點檢測失效時才生效客戶端與redis節點直連,不需要中間 proxy層.客戶端不需要連線叢集所有節點連線叢集中任何一個可用節點即可
把所有的物理節點對映到[0~16383] slot上,cluster 負責維護 node slot key

注意

需要安裝ruby支援yum install ruby rubygems -ygem install redis<如果gem卡住不動,使用國內映象>gemsources--addhttps://gems.ruby-china.org/--removehttps://rubygems.org/gem sources -[root@mysql-56 s1]# yum install ruby rubygems -y[root@mysql-56 s1]# gem install redis




[root@mysql-56 s1]# gem sources -a https://mirrors.ustc.edu.cn/rubygems/https://mirrors.ustc.edu.cn/rubygems/ added to sources[root@mysql-56 s1]# gem sources --remove https://rubygems.org/https://rubygems.org/ removed from sources[root@mysql-56 s1]# gem sources -l*** CURRENT SOURCES ***https://mirrors.ustc.edu.cn/rubygems/


配置檔案中包含
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

建立多個例項

#!/bin/bash
rm -rf /data/700*
for no in {0..5}
do
    mkdir /data/700$no
    cd /data/700$no
    cp -r /data/redis6380/* ./    
    sed -i "s/port 6379/port 700$no/g" redis.conf
    sed -i "s/daemonize no/daemonize yes/g" redis.conf
    sed -i "s#/var/log/redis/redis.log#redis.log#g" redis.conf
    # sed -i "s/dump.rdb/dump_700$no.rdb/g" redis.conf
    # sed -i "s/appendonly.aof/appendonly_700$no.aof/g" redis.conf
    echo "cluster-enabled yes" >> redis.conf
    echo "cluster-config-file nodes.conf" >> redis.conf
    echo "cluster-node-timeout 5000" >> redis.conf
    sed -i "s/appendonly no/appendonly yes/g" redis.conf
    sed -i "s/redis_6379.pid/redis_700$no.pid/g" redis.conf
    sed -i "/dir/d" redis.conf
    echo 'dir "./"' >>redis.conf
    
done


啟動例項

#!/bin/bash
for i in `ss -lntp|grep 700|egrep 'pid=[0-9]{4}'|awk -F '=|,' '{print $3}'`;do kill -9 $i;done
for no in {0..5}
do

    cd /data/700$no
    ./redis-server ./redis.conf

done

建立叢集

/data/redis-trib.rb create --replicas 1 \127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \127.0.0.1:7004 127.0.0.1:7005給定 redis-trib.rb程式的命合是 create,這表示我們希望建立一個新的叢集。選項 --replicas 1 表示我們希望為叢集中的每個主節點建立一個從節點之後跟著的其他引數則是例項的地址列表,我們希望程式使用這些地址所指示的例項來建立新叢集。
# 新的建立叢集方式/data/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
叢集客戶端[root@txy redis-6.0.9]# redis-cli -c -p 7000重新分片./redis-trib.rb reshard 127.0.0.1:7000
[root@txy redis-6.0.9]# redis-cli -c -p 7000
127.0.0.1:7000> set name lewf
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> set name lewfd
OK
127.0.0.1:7001> set name lewfd
OK
127.0.0.1:7001> get name
"lewfd"

叢集管理

叢集狀態redis-cli -p 7000 cluster nodes |grep master故障轉移redis-cli -p 7002 debug segfault檢視狀態redis-cli -p 7000 cluster nodes|grep master

增加新的節點

./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000變成某例項的從redis 127.0.0.1:7006 > cluster replicate3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e刪除一個節點redis-trib del-node ip:port '<node-id>'刪除 master節點之前首先要使用 reshard 移除 master的全部 slot,然後再刪除當前節點

狀態說明

  • 叢集最近一次向節點發送PING命合之後,過去了多長時間還沒接到回覆。
  • 節點最近一次返回PONG回覆的時間。
  • 節點的配置紀元(configuration epoch):詳細資訊請參考Redis叢集規範。
  • 本節點的網路連線情況:例如 connected。
  • 節點目前包含的槽:例如 1270.0.1:7001 目前包含號碼為5960至10921的雜湊槽。


面試常問


叢集哨兵持久化問題

redis qps

單例項qps每天11萬次
不要超過5萬最大3萬