❶ redis master宕機和腦裂
兩個配置可以減少非同步復制和腦裂導致的數據丟失:
min-slaves-to-write 1
min-slaves-max-lag 10
解釋:要求至少有1個slave,數據復制和同步的延遲不能超過10秒,如果說一旦所有的slave,數據復制和同步的延遲都超過了10秒鍾,那麼這個時候,master就不會再接收任何請求了
(賣豎1)減少非同步復制的數據丟失
有了min-slaves-max-lag這個配置,就可以確保說,一旦slave復制數據和ack延時太長,就認為可能master宕機後損失的數據太多了,那麼就拒絕寫請求,這樣可以把master宕機時由於部分數據未同步到slave導致的數據丟失降低的可控范圍內
(2)減少腦裂的數據丟失
如果一個master出現了腦裂,跟其他slave丟了連接,那麼上面兩個配置可以確保說,如果不能繼續給指定數量的slave發送弊塌數據,而且slave超過10秒沒有給自己ack消息,那麼就直接拒絕客戶端的寫請求,這樣腦裂後的舊master就不會接受client的新數據,也就避免了數據丟失
上面的配置就確保了,如果跟任何一個slave丟了連接,在10秒後發現沒有中卜大slave給自己ack,那麼就拒絕新的寫請求。
因此在腦裂場景下,最多就丟失10秒的數據
client可以採取的措施,第一做服務降級。第二 將數據灌入消息隊列,過段時間再寫
❷ redis宕機自動重啟
Redis伺服器可以配置宕機後自動重啟的功能,這樣可以避免因為宕機造成的影響。可以在 Redis 配置姿橋文件中添加相應遲冊汪的配碼仔置內容,來實現 redis 宕機自動重啟的功能。
❸ redis 宕機數據怎麼辦
用redis保存的*.rdb文件恢復即喊孝滾可。
另外redis還有AOF功慎槐能,啟動時可以自動恢復到前一條查詢。鄭余
❹ redis內存滿了,會宕機嗎
接下來一起探討下,Redis的內存淘汰策略。
redis的配置文件不一定使用的是安裝目錄下面的redis.conf文件,啟動redis服務的時候是可以傳一個轎賀參數指定redis的配置文件的
既然可以設置Redis最大佔用內存大小,那麼配置的內存就有用完的時候。那在內存用完的時候,還繼續往Redis裡面添加數據不就沒內存可用了嗎?
實際上Redis定義了幾種策略用來處理這種情況:
noeviction(默認策略) :對於寫請求不再提供服務,直接返回錯誤(DEL請求和部分特殊請求除外)
allkeys-lru :從所有key中使用LRU演算法進行淘汰
volatile-lru :從設置了過期時間的key中使用LRU演算法進行淘汰
allkeys-random :從所有key中隨機淘汰數據
volatile-random :從設置了過期時間的key中隨機淘汰
volatile-ttl :在設置了過期時間的key中,根據key的過期時間進行淘汰,越早過期的越優先被淘汰
上面說到了Redis可使用最做帆滑大內存使用完了,是可以使用LRU演算法進行內存淘汰純臘的,那麼什麼是LRU演算法呢?
❺ redis怎麼會崩潰
由於redis存儲在內存中且提供一般編程語言常用的數據結構存儲類型,所以經常被用於做伺服器崩潰宕機的數據恢復處理。
伺服器可以在某些指定過程中將需要保存的數據以json對象等方式存儲到redis中,也就是我們常說的快照,當伺服器運行時讀取redis來判斷是否有待需要恢復數據繼續處理的業務。
當一次業務處理結束後再刪除redis的數據即可。
redis提供兩種將內存數據導出到硬碟實現數據備份的方法:
RDB方式(默認)
RDB方式的持久化是通過快照(snapshotting)完成的,當符合一定條件時Redis會自動將內存中的所有數據進行快照並存儲在硬碟上。進行快照的條件可以由用戶在配置文件中自定義,由兩個參數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照。RDB是redis默認採用的持久化方式,在配置文件中已經預置了3個條件:
save 900 1 # 900秒內有至少1個鍵被更改則進行快照
save 300 10 # 300秒內有至少10個鍵被更改則進行快照
save 60 10000 # 60秒內有至少10000個鍵被更改則進行快照
可以存在多個條件,條件之間是「或」的關系,只要滿足其中一個條件,就會進行快照。 如果想要禁用自動快照,只需要將所有的save參數刪除即可。
Redis默認會將快照文件存儲在當前目錄(可CONFIG GET dir來查看)的mp.rdb文件中,可以通過配置dir和dbfilename兩個參數分別指定快照文件的存儲路徑和文件名。
Redis實現快照的過程
Redis使用fork函數復制一份當前進程(父進程)的副本(子進程);
父進程繼續接收並處理客戶端發來的命令,而子進程開始將內存中的數據寫入硬碟中的臨時文件;
當子進程寫入完所有數據後會用該臨時文件替換舊的RDB文件,至此一次快照操作完成。
在執行fork的時候操作系統(類Unix操作系統)會使用寫時復制(-on-write)策略,即fork函數發生的一刻父子進程共享同一內存數據,當父進程要更改其中某片數據時(如執行一個寫命令 ),操作系統會將該片數據復制一份以保證子進程的數據不受影響,所以新的RDB文件存儲的是執行fork一刻的內存數據。
Redis在進行快照的過程中不會修改RDB文件,只有快照結束後才會將舊的文件替換成新的,也就是說任何時候RDB文件都是完整的。這使得我們可以通過定時備份RDB文件來實 現Redis資料庫備份。RDB文件是經過壓縮(可以配置rdbcompression參數以禁用壓縮節省CPU佔用)的二進制格式,所以佔用的空間會小於內存中的數據大小,更加利於傳輸。
除了自動快照,還可以手動發送SAVE或BGSAVE命令讓Redis執行快照,兩個命令的區別在於,前者是由主進程進行快照操作,會阻塞住其他請求,後者會通過fork子進程進行快照操作。 Redis啟動後會讀取RDB快照文件,將數據從硬碟載入到內存。根據數據量大小與結構和伺服器性能不同,這個時間也不同。通常將一個記錄一千萬個字元串類型鍵、大小為1GB的快照文件載入到內 存中需要花費20~30秒鍾。 通過RDB方式實現持久化,一旦Redis異常退出,就會丟失最後一次快照以後更改的所有數據。這就需要開發者根據具體的應用場合,通過組合設置自動快照條件的方式來將可能發生的數據損失控制在能夠接受的范圍。如果數據很重要以至於無法承受任何損失,則可以考慮使用AOF方式進行持久化。
AOF方式
默認情況下Redis沒有開啟AOF(append only file)方式的持久化,可以在redis.conf中通過appendonly參數開啟:
appendonly yes
在啟動時Redis會逐個執行AOF文件中的命令來將硬碟中的數據載入到內存中,載入的速度相較RDB會慢一些
開啟AOF持久化後每執行一條會更改Redis中的數據的命令,Redis就會將該命令寫入硬碟中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通過dir參數設置的,默認的文件名是appendonly.aof,可以通過appendfilename參數修改:
appendfilename appendonly.aof
配置redis自動重寫AOF文件的條件
auto-aof-rewrite-percentage 100 # 當目前的AOF文件大小超過上一次重寫時的AOF文件大小的百分之多少時會再次進行重寫,如果之前沒有重寫過,則以啟動時的AOF文件大小為依據
auto-aof-rewrite-min-size 64mb # 允許重寫的最小AOF文件大小
配置寫入AOF文件後,要求系統刷新硬碟緩存的機制
# appendfsync always # 每次執行寫入都會執行同步,最安全也最慢
appendfsync everysec # 每秒執行一次同步操作
# appendfsync no # 不主動進行同步操作,而是完全交由操作系統來做(即每30秒一次),最快也最不安全
Redis允許同時開啟AOF和RDB,既保證了數據安全又使得進行備份等操作十分容易。此時重新啟動Redis後Redis會使用AOF文件來恢復數據,因為AOF方式的持久化可能丟失的數據更少
我們簡單做一個定時計數器的小程序
[javascript]view plain
redis=require('redis'),//導入js模塊
RDS_PORT=1379,//埠號
RDS_HOST='47.93.112.119',//伺服器IP
RDS_OPTS={},//設置項
redisdb=redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS);//創建連接
redisdb.select(20);//指定分區庫
redisdb.on('ready',function(res){
console.log('ready');
});
redisdb.on('connect',function(){
console.log('connect');
});
exports.redisdb=redisdb;
functionredis_opt(opt,key,value,callback){
if(opt=='get'){
redisdb.get(key,function(err,data){
if(err==null){
callback(data);
}
else{
callback(err);
}
});
}
elseif(opt=='set')
{
redisdb.set(key,value,function(err,result){
if(err==null){
callback(result);
}
else{
callback(err);
}
});
}
elseif(opt=='del')
{
redisdb.del(key,function(err,result){
if(err==null){
callback(result);
}
else{
callback(err);
}
});
}
else
{
callback("erroropt!");
}
}
functionupdate(key)
{
redis_opt("get",key,null,function(data){
console.log("theredisdatais"+data);
if(data){
count=parseInt(data);
redis_opt("set",key,++count,function(data){
console.log("set"+count+""+data);
});
}
else{
redis_opt("set",key,10000,function(data){
console.log("set"+10000+""+data);
});
}
});
}
functionclear(key)
{
redis_opt("del",key,null,function(ret){
console.log("del"+key+""+ret);
});
}
functionmain()
{
varkey="count_test";
setInterval(function(){clear(key)},5000);
setInterval(function(){update(key)},1000);
}
//testmain();
main();
以上代碼為簡單的計時器函數,即伺服器啟動後定時讀取redis的數據,如果存在則累加修改,不存在則初始化,同時為了方便說明,又設置了一個定時刪除數據的定時器。
❻ 如何解決redis高並發客戶端頻繁time out
redis為什麼會有高並發問題
redis的出身決定
Redis是一種單線程機制的nosql資料庫,基於key-value,數橘汪據可持久化落盤。由於單線程所以redis本身並沒有鎖的概念,多個客戶端連接並不存在競爭關系,但是利用jedis等客戶端對redis進行並發訪問時會出現問題。發生連接超笑指時、數據轉換錯誤、阻塞、客戶端關閉連接等問題,這些問題均是由於客戶端連接混圓升仔亂造成。
同時,單線程的天性決定,高並發對同一個鍵的操作會排隊處理,如果並發量很大,可能造成後來的請求超時。
在遠程訪問redis的時候,因為網路等原因造成高並發訪問延遲返回的問題。
解決辦法
在客戶端將連接進行池化,同時對客戶端讀寫Redis操作採用內部鎖synchronized。
伺服器角度,利用setnx變向實現鎖機制。
❼ 每天一個知識點:宕機情況下,Redis 如何實現快速恢復
上一篇文章,我們講到了宕機情況下,Redis 如何進行數據備份,那麼,數據備份之後如何快速恢復呢?我的建議是使用內存快照(Redis Database)。
AOF 方法進行故障恢復的時候,需要逐一把操作日誌都執行一遍。如果操作日誌非常多,Redis 就會恢核沒復得很緩慢,影響到正常使用。RDB 既可以保證可靠性,還能在宕機時實現快速恢復。
Redis 的數據都在內存中,為了提供所有數據的可靠性保證,它執行的是全量快照,也就是說,把內存中的所有數據都記錄到磁碟中,這就類似於給 100 個人拍合影,把每一個人都拍進照片里。這樣做的好處是,一次性記錄了所有數據,一個都不少。
Redis 提供了兩個命令來生成 RDB 文件,分別是 save 和 bgsave。
bgsave 可以避免阻塞,但避免阻塞和正常處理寫操作並不是一回事。此時,主線程的確沒有阻塞,可以正常接收請求,但是,為了保證快照完整性,它只能處理讀操作,因為不能修改正在執行快照的數據。為了快照而暫停寫操作,肯定是不能接受的。所以這個時候,Redis 就會藉助操作系統提供的寫時復制技術(Copy-On-Write, COW),在執行快照的同時,正常處理寫操作。簡單來說,bgsave 子進程是由主線程 fork 生成的,可以共享主線鏈豎程的所有內存數據。bgsave 子進程運行後,開始讀取主線程的內存數據,並把它們寫入 RDB 文件。此時,如果主線程對這些數據也都是讀操作(例如圖中的鍵值對 A),那麼,主線程和 bgsave 子進程相互不影響。但是,如果主線程要修改一塊數據(例如圖中的鍵值對 C),那麼,這塊數據就會被復制一份,生成該數據的副本(鍵值對 C』)。然後,主線程在這個數據副本上進行修改。同時,bgsave 子進程可以繼續把原來的數據(鍵值對 C)寫入 RDB 文件。
Redis 4.0 中提出了一個棚氏大混合使用 AOF 日誌和內存快照的方法。簡單來說,內存快照以一定的頻率執行,在兩次快照之間,使用 AOF 日誌記錄這期間的所有命令操作。這樣一來,快照不用很頻繁地執行,這就避免了頻繁 fork 對主線程的影響。而且,AOF 日誌也只用記錄兩次快照間的操作,也就是說,不需要記錄所有操作了,因此,就不會出現文件過大的情況了,也可以避免重寫開銷。
關於 AOF 和 RDB 的選擇問題,有三點建議: