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項目的開發和維護。javascript
一、徹底居於內存,數據實時的讀寫內存,定時閃回到文件中。採用單線程,避免了沒必要要的上下文切換和競爭條件
二、支持高併發量,官方宣傳支持10萬級別的併發讀寫
三、支持持久存儲,機器重啓後的,從新加載模式,不會掉數據
四、海量數據存儲,分佈式系統支持,數據一致性保證,方便的集羣節點添加/刪除
五、Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
六、災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後能夠經過aof恢復;
七、虛擬內存--Redis當物理內存用完時,能夠將一些好久沒用到的value 交換到磁盤;
八、Redis支持數據的備份,即master-slave模式的數據備份;css
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數據庫是真正存儲數據的地方。固然,數據庫自己也是存儲在內存中的。html
###redis啓動流程java
redis安裝經常使用兩種方式:yum安裝和源碼包安裝node
yum 安裝: 一般是在線安裝,好處是安裝方式簡單,不易出錯;經常使用的安裝yum源爲epelmysql
源碼包安裝: 是先將 redis 的源碼下載下來,在本身的系統裏編譯生成可執行文件,而後執行,好處是由於是在本身的系統上編譯的,更符合本身系統的性能,也就是說在本身的系統上執行 redis 服務性能效率更好。nginx
區別:路徑和啓動方式不一樣,支持的模塊也不一樣。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
配置文件:sql
網絡配置項 基本配置項 持久化相關配置 複製相關的配置 安全相關配置 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;
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內部使用一個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 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的複製方式有兩種,一種是主(master)-從(slave)模式,一種是從(slave)-從(slave)模式,所以Redis的複製拓撲圖會豐富一些,能夠像星型拓撲,也能夠像個有向無環。一個Master能夠有多個slave主機,支持鏈式複製;
Master以非阻塞方式同步數據至slave主機;
複製優勢
經過配置多個Redis實例,數據備份在不一樣的實例上,主庫專一寫請求,從庫負責讀請求,這樣的好處主要體如今下面幾個方面 一、高可用性 在一個Redis集羣中,若是master宕機,slave能夠介入並取代master的位置,所以對於整個Redis服務來講不至於提供不了服務,這樣使得整個Redis服務足夠安全。 二、高性能 在一個Redis集羣中,master負責寫請求,slave負責讀請求,這麼作一方面經過將讀請求分散到其餘機器從而大大減小了master服務器的壓力,另外一方面slave專一於提供讀服務從而提升了響應和讀取速度。 三、水平擴展性 經過增長slave機器能夠橫向(水平)擴展Redis服務的整個查詢服務的能力。
複製須要解決的問題
複製提供了高可用性的解決方案,但同時引入了分佈式計算的複雜度問題,認爲有兩個核心問題:
一、數據一致性問題:如何保證master服務器寫入的數據可以及時同步到slave機器上。
二、讀寫分離;如何在客戶端提供讀寫分離的實現方案,經過客戶端實現將讀寫請求分別路由到master和slave實例上。
上面兩個問題,尤爲是第一個問題是Redis服務實現一直在演變,致力於解決的一個問題:複製實時性和數據一致性矛盾 Redis提供了提升數據一致性的解決方案,一致性程度的增長雖然使得我可以更信任數據,可是更好的一致性方案一般伴隨着性能的損失,從而減小了吞吐量和服務能力。然而咱們但願系統的性能達到最優,則必需要犧牲一致性的程度,所以Redis的複製實時性和數據一致性是存在矛盾的。
一、slave向master發送sync命令。
二、master開啓子進程來說dataset寫入rdb文件,同時將子進程完成以前接收到的寫命令緩存起來。
三、子進程寫完,父進程得知,開始將RDB文件發送給slave。master發送完RDB文件,將緩存的命令也發給slave。master增量的把寫命令發給slave。
值得注意的是,當slave跟master的鏈接斷開時,slave能夠自動的從新鏈接master,在redis2.8版本以前,每當slave進程掛掉從新鏈接master的時候都會開始新的一輪全量複製。若是master同時接收到多個slave的同步請求,則master只須要備份一次RDB文件。
1、準備好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 #從
2、安裝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 #設定此節點的優先級,是否優先被同步。
4、redis主從複製測試
set master-slave ok
5、高級配置
一個RDB文件從master端傳到slave端,分爲兩種狀況:
一、支持disk:master端將RDB file寫到disk,稍後再傳送到slave端; 二、無磁盤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 會開始一次自動故障遷移操做, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可使用新主服務器代替失效服務器。
1、配置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> #切換指定的節點爲節點爲主節點。
redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> GET runoobkey "redis"
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK 127.0.0.1:6379> HGETALL runoobkey 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000"
redis 127.0.0.1:6379> LPUSH runoobkey redis (integer) 1 redis 127.0.0.1:6379> LPUSH runoobkey mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH runoobkey mysql (integer) 3 redis 127.0.0.1:6379> LRANGE runoobkey 0 10 1) "mysql" 2) "mongodb" 3) "redis"
redis 127.0.0.1:6379> SADD runoobkey redis (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mongodb (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS runoobkey 1) "mysql" 2) "mongodb" 3) "redis"
redis 127.0.0.1:6379> ZADD runoobkey 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD runoobkey 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"