Redis

redis是什麼


​ redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sortedset --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
​ Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關係數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
​ Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。由於完全實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。redis的官網地址,非常好記,是redis.io。
​ 目前,Vmware在資助着redis項目的開發和維護。

redis的特性


1、完全居於內存,數據實時的讀寫內存,定時閃回到文件中。採用單線程,避免了不必要的上下文切換和競爭條件
2、支持高併發量,官方宣傳支持10萬級別的併發讀寫
3、支持持久存儲,機器重啓後的,重新加載模式,不會掉數據
4、海量數據存儲,分佈式系統支持,數據一致性保證,方便的集羣節點添加/刪除
5、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
6、災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後可以通過aof恢復;
7、虛擬內存--Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤;
8、Redis支持數據的備份,即master-slave模式的數據備份;

redis的架構


Redis

各功能模塊說明如下:


File Event: 處理文件事件,接受它們發來的命令請求(讀事件),並將命令的執行結果返回給客戶端(寫事件))
Time Event: 時間事件(更新統計信息,清理過期數據,附屬節點同步,定期持久化等)
AOF: 命令日誌的數據持久化
RDB: 實際的數據持久化
Lua Environment : Lua 腳本的運行環境. 爲了讓 Lua 環境符合 Redis 腳本功能的需求,Redis 對 Lua 環境進行了一系列的修改, 包括添加函數庫、更換隨機函數、保護全局變量, 等等
Command table(命令表):在執行命令時,根據字符來查找相應命令的實現函數。
Share Objects(對象共享):
主要存儲常見的值:
a.各種命令常見的返回值,例如返回值OK、ERROR、WRONGTYPE等字符;
b. 小於 redis.h/REDIS_SHARED_INTEGERS (默認1000)的所有整數。通過預分配的一些常見的值對象,並在多個數據結構之間共享對象,程序避免了重複分配的麻煩。也就是說,這些常見的值在內存中只有一份。
Databases:
Redis數據庫是真正存儲數據的地方。當然,數據庫本身也是存儲在內存中的。

###redis啓動流程


Redis

redis安裝方式

redis安裝常用兩種方式:yum安裝和源碼包安裝

yum 安裝: 通常是在線安裝,好處是安裝方式簡單,不易出錯;常用的安裝yum源爲epel

源碼包安裝: 是先將 redis 的源碼下載下來,在自己的系統裏編譯生成可執行文件,然後執行,好處是因爲是在自己的系統上編譯的,更符合自己系統的性能,也就是說在自己的系統上執行 redis 服務性能效率更好。

區別:路徑和啓動方式不同,支持的模塊也不同。

redis程序路徑


程序環境:

配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
客戶端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
數據目錄:/var/lib/redis
監聽:6379/tcp

配置文件:

網絡配置項
基本配置項
持久化相關配置
複製相關的配置
安全相關配置
Limit相關的配置
Cluster相關配置
SlowLog相關的配置
Advanced配置

網絡配置項:

bind IP
port PORT
protected-mode 是否開啓保護模式,默認開啓。要是配置裏沒有指定bind和碼。開啓該參數後,redis只會本地進行訪問,拒絕外部訪問。
tcp-backlog 定義了每一個端口最大的監聽隊列的長度
unixsocket
timeout:連接的空閒超時時長;

通用配置項:

daemonize, 是否以守護進程啓動
supervised, 可以通過upstart和systemd管理Redis守護進程,這個參數是和具體的操作系統相關的
loglevel,
pidfile,
logfile,
databases:設定數據庫數量,默認爲16個,每個數據庫的名字均爲整數,從0開始編號,默認操作的數據庫爲0;
切換數據庫的方法:
SELECT <dbid>

快照配置:

save900 1 #900秒有一個key變化,就做一個保存
save300 10 #300秒有10個key變化,就做一個保存,這裏需要和開發溝通
save60 10000 #60秒有10000個key變化就做一個保存
stop-writes-on-bgsave-error yes #在出現錯誤的時候,是不是要停止保存
rdbcompression yes #使用壓縮rdb文件,rdb文件壓縮使用LZF壓縮算法,yes:壓縮,但是需要一些cpu的消耗。no:不壓縮,需要更多的磁盤空間
rdbchecksum yes #是否校驗rdb文件。從rdb格式的第五個版本開始,在rdb文件的末尾會帶上CRC64的校驗和。這跟有利於文件的容錯性,但是在保存rdb文件的時候,會有大概10%的性能損耗,所以如果你追求高性能,可以關閉該配置。
dbfilenamedump.rdb #rdb文件的名稱
dir./ 數據目錄,數據庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄

Limits相關的配置:

maxclients 設置能連上redis的最大客戶端連接數量
maxmemory <bytes> redis配置的最大內存容量。當內存滿了,需要配合maxmemory-policy策略進
行處理。
maxmemory-policy noeviction
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
內存容量超過maxmemory後的處理策略。
# volatile-lru:利用LRU算法移除設置過過期時間的key。
# volatile-random:隨機移除設置過過期時間的key。
# volatile-ttl:移除即將過期的key,根據最近過期時間來刪除(輔以TTL)
# allkeys-lru:利用LRU算法移除任何key。
# allkeys-random:隨機移除任何key。
# noeviction:不移除任何key,只是返回一個寫錯誤。
# 上面的這些驅逐策略,如果redis沒有合適的key驅逐,對於寫命令,還是會返回錯誤。redis將不再接收寫
請求,只接收get請求。寫命令包括:set setnx
maxmemory-samples 5 #淘汰算法運行時的採樣樣本數;

持久化配置:

#APPEND ONLY MODE #
# 默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了。但是redis如果中途宕機,會導致可能有幾分鐘的數據丟失,根據save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性。Redis會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啓動時Redis都會先把這個文件的數據讀入內存裏,先忽略RDB文件。
appendonly yes #啓動aof模式
# aof文件名(default: "appendonly.aof")
appendfilename "appendonly.aof" #據讀入內存裏,先忽略RDB文件
*appendfsync
Redis supports three different modes:
no:redis不執行主動同步操作,而是OS進行;
everysec:每秒一次;
always:每語句一次;

如果Redis只是將客戶端修改數據庫的指令重現存儲在AOF文件中,那麼AOF文件的大小會不斷的增加,因爲AOF文件只是簡單的重現存儲了客戶端的指令,而並沒有進行合併。對於該問題最簡單的處理方式,即當 AOF文件滿足一定條件時就對AOF進行rewrite, rewrite是根據當前內存數據庫中的數據進行遍歷寫到一個臨時的AOF文件,待寫完後替換掉原來的AOF文件即可。redis重寫會將多個key、value對集合來用一條命令表達。在rewrite期間的寫操作會保存在內存的rewrite buffer中,rewrite成功後這些操作也會複製到臨時文件中,在最後臨時文件會代替AOF文件。

no-appendfsync-on-rewrite no

# 在aof重寫或者寫入rdb文件的時候,會執行大量IO,此時對於everysec和always的aof模式來說,執行fsync會造成阻塞過長時間,noappendfsync-on-rewrite字段設置爲默認設置爲no。如果對延遲要求很高的應用,這個字段可以設置爲yes,否則還是設置爲no,這樣對持久化特性來說這是更安全的選擇。設置爲yes表示rewrite期間對新寫操作不fsync,暫時存在內存中,等rewrite完成後再寫入,默認爲no,建議yes。Linux的默認fsync策略是30秒。可能丟失30秒數據。

auto-aof-rewrite-percentage 100 aof自動重寫配置。當目前aof文件大小超過上一次重寫的aof文件大小的百分之多少進行重寫,即當aof文件增長到一定大小的時候Redis能夠調用bgrewrite aof對日誌文件進行重寫。當前AOF文件大小是上次日誌重寫得到AOF文件大小的二倍(設置爲100)時,自動啓動新的日誌重寫過程。
auto-aof-rewrite-min-size 64mb #設置允許重寫的最小aof文件大小,避免了達到約定百分比但尺寸仍然很小的情況還要重寫

上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少於64MB;
aof-load-truncated yes #指redis在恢復時,會忽略最後一條可能存在問題的指令。aof文件可能在尾部是不完整的,出現這種現象,可以選擇讓redis退出,或者導入儘可能多的數據。如果選擇的是yes,當截斷的aof文件被導入的時候,會自動發佈一個log給客戶端然後load。如果是no,用戶必須手動redis-check-aof修復AOF文件纔可以。

注意:持久機制本身不能取代備份;應該制訂備份策略,對redis庫定期備份;Redis服務器啓動時用持久化的數據文件恢復數據,會優先使用AOF;

redis持久存儲讀取


Redis

redis配置文件


SlowLog相關的配置:

slowlog-log-slower-than 10000
#當命令的執行超過了指定時間,單位是微秒;
slowlog-max-len 128
#慢查詢日誌長度。當一個新的命令被寫進日誌的時候,最老的那個記錄會被刪掉。
ADVANCED配置:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
設置ziplist的鍵數量最大值,每個值的最大空間;

redis命令介紹

└── bin
├── redis-benchmark #redis性能測試工具,可以測試在本系統本配
置下的讀寫性能
├── redis-check-aof #對更新日誌appendonly.aof檢查,是
否可用
├── redis-check-dump #用於檢查本地數據庫的rdb文件
├── redis-cli #redis命令行操作工具,也可以用telnet根據
其純文本協議來操作
├── redis-sentinel Redis-sentinel 是Redis實例的監控管理、通知和
實例失效備援服務,是Redis集羣的管理工具
└── redis-server #redis服務器的daemon啓動程序

redis-cli命令介紹

默認選擇 db庫是 0
redis-cli -p 6379
查看當前所在“db庫”所有的緩存key
redis 127.0.0.1:6379> keys *
選擇 db庫
redis 127.0.0.1:6379> select 8
清除所有的緩存key
redis 127.0.0.1:6379> FLUSHALL
清除當前“db庫”所有的緩存key
redis 127.0.0.1:6379[8]> FLUSHDB
設置緩存值
redis 127.0.0.1:6379> set keyname keyvalue
獲取緩存值
redis 127.0.0.1:6379> get keyname
刪除緩存值:返回刪除數量(0代表沒刪除)
redis 127.0.0.1:6379> del keyname
服務端相關命令
time:返回當前服務器時間
client list: 返回所有連接到服務器的客戶端信息和統計數據 參見http://redisdoc.com/server/client_list.html
client kill ip:port:關閉地址爲 ip:port 的客戶端
save:將數據同步保存到磁盤
bgsave:將數據異步保存到磁盤
lastsave:返回上次成功將數據保存到磁盤的Unix時戳
shundown:將數據同步保存到磁盤,然後關閉服務
info:提供服務器的信息和統計
config resetstat:重置info命令中的某些統計數據
config get:獲取配置文件信息
config set:動態地調整 Redis 服務器的配置(configuration)而無須重啓,可以修改的配置參數可以使用命令 CONFIG GET
* 來列出
config rewrite:Redis 服務器時所指定的 redis.conf 文件進行改寫
monitor:實時轉儲收到的請求
slaveof:改變複製策略設置
debug: sleep segfault
slowlog get 獲取慢查詢日誌
slowlog len 獲取慢查詢日誌條數
slowlog reset 清空慢查詢

redis常用數據類型


Redis

Redis內部使用一個redisObject對象來表示所有的key和value,redisObject最主要的信息如上圖所示:
type代表一個value對象具體是何種數據類型,encoding是不同數據類型在redis內部的存儲方式比如:type=string代表value存儲的是一個普通字符串,那麼對應的encoding可以是raw或者是int,如果是int則代表實際redis內部是按數值型類存儲和表示這個字符串的,當然前提是這個字符串本身可以用數值表示,比如:"123" "456"這樣的字符串。
Redis的鍵值可以使用物種數據類型:字符串,散列表,列表,集合,有序集合。

對KEY操作的命令

exists(key):確認一個key是否存在
del(key):刪除一個key
type(key):返回值的類型
keys(pattern):返回滿足給定pattern的所有key
randomkey:隨機返回key空間的一個
keyrename(oldname, newname):重命名key
dbsize:返回當前數據庫中key的數目
expire:設定一個key的活動時間(s)
ttl:獲得一個key的活動時間
move(key, dbindex):移動當前數據庫中的key到dbindex數據庫
flushdb:刪除當前選擇數據庫中的所有key
flushall:刪除所有數據庫中的所有key

應用場景1:String是最常用的一種數據類型,普通的key/ value 存儲都可以歸爲此類.即可以完全實現目前 Memcached 的功能,並且效率更高。還可以享受Redis的定時持久化,操作日誌及 Replication等功能。除了提供與 Memcached 一樣的get、set、incr、decr 等操作外,Redis還提供了下面一些操作:

對String操作的命令

set(key, value):給數據庫中名稱爲key的string賦予值value
get(key):返回數據庫中名稱爲key的string的value
getset(key, value):給名稱爲key的string賦予上一次的value
mget(key1, key2,…, key N):返回庫中多個string的value
setnx(key, value):添加string,名稱爲key,值爲value
setex(key, time, value):向庫中添加string,設定過期時間time
mset(key N, value N):批量設置多個string的值
msetnx(key N, value N):如果所有名稱爲key i的string都不存在
incr(key):名稱爲key的string增1操作
incrby(key, integer):名稱爲key的string增加integer
decr(key):名稱爲key的string減1操作
decrby(key, integer):名稱爲key的string減少integer
append(key, value):名稱爲key的string的值附加value
substr(key, start, end):返回名稱爲key的string的value的子串

應用場景:在Memcached中,我們經常將一些結構化的信息打包成HashMap,在客戶端序列化後存儲爲一個字符串的值,比如用戶的暱稱、年齡、性別、積分等,這時候在需要修改其中某一項時,通常需要將所有值取出反序列化後,修改某一項的值,再序列化存儲回去。這樣不僅增大了開銷,也不適用於一些可能併發操作的場合(比如兩個併發的操作都需要修改積分)。而Redis的Hash結構可以使你像在數據庫中Update一個屬性一樣只修改某一項屬性值。

對Hash操作的命令

hset(key, field, value):向名稱爲key的hash中添加元素field
hget(key, field):返回名稱爲key的hash中field對應的value
hmget(key, (fields)):返回名稱爲key的hash中field i對應的value
hmset(key, (fields)):向名稱爲key的hash中添加元素field
hincrby(key, field, integer):將名稱爲key的hash中field的value增加integer
hexists(key, field):名稱爲key的hash中是否存在鍵爲field的域
hdel(key, field):刪除名稱爲key的hash中鍵爲field的域
hlen(key):返回名稱爲key的hash中元素個數
hkeys(key):返回名稱爲key的hash中所有鍵
hvals(key):返回名稱爲key的hash中所有鍵對應的value
hgetall(key):返回名稱爲key的hash中所有的鍵(field)及其對應的value

Redis

Redis

Redis

Redis

Redis

Redis list的應用場景非常多,也是Redis最重要的數據結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現。我們在看完一條微博之後,常常會評論一番,或者看看其他人的吐槽。每條評論的記錄都是按照時間順序排序的

對List操作的命令

rpush(key, value):在名稱爲key的list尾添加一個值爲value的元素
lpush(key, value):在名稱爲key的list頭添加一個值爲value的 元素
llen(key):返回名稱爲key的list的長度
lrange(key, start, end):返回名稱爲key的list中start至end之間的元素
ltrim(key, start, end):截取名稱爲key的list
lindex(key, index):返回名稱爲key的list中index位置的元素
lset(key, index, value):給名稱爲key的list中index位置的元素賦值
lrem(key, count, value):刪除count個key的list中值爲value的元素
lpop(key):返回並刪除名稱爲key的list中的首元素
rpop(key):返回並刪除名稱爲key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回並刪除名稱爲srckey的list的尾元素,並將該元素添加到名稱爲dstkey的list的頭部

Set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 Redis 提供的 Set 數據結構,可以存儲一些集合性的數據。比如在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。因爲 Redis 非常人性化的爲集合提供了求交集、並集、差集等操作,那麼就可以非常方便的實現如共同關注、共同喜好、二度好友等功能

對Set操作的命令

sadd(key, member):向名稱爲key的set中添加元素member
srem(key, member) :刪除名稱爲key的set中的元素member
spop(key) :隨機返回並刪除名稱爲key的set中一個元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名稱爲key的set的基數
sismember(key, member) :member是否是名稱爲key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集並將交集保存到dstkey的集合
sunion(key1, (keys)) :求並集
sunionstore(dstkey, (keys)) :求並集並將並集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集並將差集保存到dstkey的集合
smembers(key) :返回名稱爲key的set的所有元素
srandmember(key) :隨機返回名稱爲key的set的一個元素

Sorted Set

常用命令:zadd,zrange,zrem,zcard,zcount等

使用場景:

Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優先級(score)的參數來爲成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重複的集合列表,那麼可以選擇sorted set數據結構,比如twitter 的public timeline可以以發表時間作爲score來存儲,這樣獲取時就是自動按時間排好序的。
另外還可以用Sorted Sets來做帶權重的隊列,比如普通消息的score爲1,重要消息的score爲2,然後工作線程可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。
ZADD page_rank 9 baidu.com 8 bing.com 10 google.com

redis主從複製


Redis的複製方式有兩種,一種是主(master)-從(slave)模式,一種是從(slave)-從(slave)模式,因此Redis的複製拓撲圖會豐富一些,可以像星型拓撲,也可以像個有向無環。一個Master可以有多個slave主機,支持鏈式複製;
Master以非阻塞方式同步數據至slave主機;

Redis

複製優點

通過配置多個Redis實例,數據備份在不同的實例上,主庫專注寫請求,從庫負責讀請求,這樣的好處主要體現在下面幾個方面
1、高可用性
在一個Redis集羣中,如果master宕機,slave可以介入並取代master的位置,因此對於整個Redis服務來說不至於提供不了服務,這樣使得整個Redis服務足夠安全。
2、高性能
在一個Redis集羣中,master負責寫請求,slave負責讀請求,這麼做一方面通過將讀請求分散到其他機器從而大大減少了master服務器的壓力,另一方面slave專注於提供讀服務從而提高了響應和讀取速度。
3、水平擴展性
通過增加slave機器可以橫向(水平)擴展Redis服務的整個查詢服務的能力。

複製需要解決的問題

複製提供了高可用性的解決方案,但同時引入了分佈式計算的複雜度問題,認爲有兩個核心問題:
1、數據一致性問題:如何保證master服務器寫入的數據能夠及時同步到slave機器上。
2、讀寫分離;如何在客戶端提供讀寫分離的實現方案,通過客戶端實現將讀寫請求分別路由到master和slave實例上。
上面兩個問題,尤其是第一個問題是Redis服務實現一直在演變,致力於解決的一個問題:複製實時性和數據一致性矛盾
Redis提供了提高數據一致性的解決方案,一致性程度的增加雖然使得我能夠更信任數據,但是更好的一致性方案通常伴隨着性能的損失,從而減少了吞吐量和服務能力。然而我們希望系統的性能達到最優,則必須要犧牲一致性的程度,因此Redis的複製實時性和數據一致性是存在矛盾的。

redis主從複製


1、slave向master發送sync命令。
2、master開啓子進程來講dataset寫入rdb文件,同時將子進程完成之前接收到的寫命令緩存起來。
3、子進程寫完,父進程得知,開始將RDB文件發送給slave。master發送完RDB文件,將緩存的命令也發給slave。master增量的把寫命令發給slave。

值得注意的是,當slave跟master的連接斷開時,slave可以自動的重新連接master,在redis2.8版本之前,每當slave進程掛掉重新連接master的時候都會開始新的一輪全量複製。如果master同時接收到多個slave的同步請求,則master只需要備份一次RDB文件。

實戰示例


一、準備好4臺機器

192.168.42.150 redis-node1 #主
192.168.42.151 redis-node2 #從
192.168.42.152 redis-node3 #從
192.168.42.153 redis-node4 #從

二、安裝redis,配置好基本配置

yum install redis
cp /etc/redis.conf{,.back}
vim redis.conf
daemonize yes
bind 0.0.0.0 #改爲各個節點的IP

三.依照上面設定的從主機,在從主機配置文件中開啓從配置(需要配置3臺機器):

### REPLICATION ###
slaveof 192.168.1.29 6379 #主節點地址,<host> <port>
#masterauth <master-password> #如果設置了訪問認證就需要設定此項。
slave-server-stale-data yes #當slave與master連接斷開或者slave正處於同步狀態時,如果slave收到請求允許響應,no表示返回錯誤。
slave-read-only yes #slave節點是否爲只讀。
slave-priority 100 #設定此節點的優先級,是否優先被同步。

四、redis主從複製測試

set master-slave ok

五、高級配置

一個RDB文件從master端傳到slave端,分爲兩種情況:
1、支持disk:master端將RDB file寫到disk,稍後再傳送到slave端;
2、無磁盤diskless:master端直接將RDB file傳到slave socket,不需要與disk進行交互。無磁盤diskless方式適合磁盤讀寫速度慢但網絡帶寬非常高的環境。
repl-diskless-sync no #默認不使用diskless同步方式
repl-diskless-sync-delay 5 #無磁盤diskless方式在進行數據傳遞之前會有一個時間的延遲,以便slave端能夠進行到待傳送的目標隊列中,這個時間默認是5秒
repl-ping-slave-period 10 #slave端向server端發送pings的時間區間設置,默認爲10秒
repl-timeout 60 #設置超時時間
*slave-priority 100
複製集羣中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉;
min-slaves-to-write 3 #主節點僅允許其能夠通信的從節點數量大於等於此處的值時接受寫操作;
min-slaves-max-lag 10 #從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;

Sentinel是Redis的高可用性(HA)解決方案,由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進行下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器,然後由新的主服務器代替已下線的主服務器繼續處理命令請求。Redis提供的sentinel(哨兵)機制,通過sentinel模式啓動redis後,自動監控master/slave的運行狀態,基本原理是:心跳機制+投票裁決

監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。

自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時,Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其他從服務器改爲複製新的主服務器; 當客戶端試圖連接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可以使用新主服務器代替失效服務器。

Redis

一、配置sentinel

只需在sentinel節點的配置文件中修改以下配置即可:

port 26379
#sentinel announce-ip 1.2.3.4 #默認監聽在0.0.0.0 所以此處可以註釋。
dir “/tmp”
sentinel monitor mymaster 192.168.1.29 6379 1 #sentinel moitor <master-name> <ip> <redis-port> <法定人數
quorum>
#設定master節點的*名稱*和位置,法定人數表示多少臺sentinel節點認同纔可以上線。
<quorum>表示sentinel集羣的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認爲其真的故障
s_down: subjectively down
o_down: objectively down
sentinel down-after-milliseconds mymaster 5000 #如果聯繫不到節點5000毫秒,我們就認爲此節點下線。
sentinel failover-timeout mymaster 60000 #設定轉移主節點的目標節點的超時時長。
sentinel auth-pass <master-name> <password> #如果redis節點啓用auth,此處也要設置password。
sentinel parallel-syncs <master-name> <numslaves> #指在failover過程中,能夠被sentinel並行配置的從節點的數量;

一些關於sentinel的命令:

redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
sentinel masters <master-name> #查看此複製集羣的主節點信息。
sentinel slaves <master-name> #查看此複製集羣的從節點信息。
sentinel failover <node-name> #切換指定的節點爲節點爲主節點。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章