• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      排查Redis存儲(chǔ)失敗

      2020-12-31 05:47:01河南劉建臣
      網(wǎng)絡(luò)安全和信息化 2020年6期
      關(guān)鍵詞:磁盤(pán)命令進(jìn)程

      ■ 河南 劉建臣

      單位的一臺(tái)Web服務(wù)器后臺(tái)使用的是Redis服務(wù)器,其工作一直比較正常。而最近出現(xiàn)無(wú)法寫(xiě)入數(shù)據(jù)的故障,給業(yè)務(wù)帶來(lái)了很大的影響。

      該機(jī)安裝的是CentOS6.X系統(tǒng),使用的是四核的CPU,內(nèi)存為16GB,在該機(jī)上執(zhí)行“top”命令,發(fā)現(xiàn)內(nèi)存的使用率為70%,CPU的負(fù)荷并不大。執(zhí)行“df”“l(fā)sof”“iotop”等命令,發(fā)現(xiàn)磁盤(pán)讀寫(xiě)情況沒(méi)有問(wèn)題。進(jìn)入Redis日志文件路徑(這里為“/var/log/redis”),然后執(zhí)行“vi redis.log”命令,發(fā)現(xiàn)其中存在“Can't save in background:fork:Cannot allocate memory”錯(cuò)誤提示。

      故障排查

      根據(jù)以上錯(cuò)誤信息,說(shuō)明當(dāng)Redis存儲(chǔ)數(shù)據(jù)時(shí),因?yàn)閮?nèi)存無(wú)法分配導(dǎo)致故障的發(fā)生。但是執(zhí)行“top”命令發(fā)現(xiàn)內(nèi)存并沒(méi)有耗盡,似乎應(yīng)該可以為Redis分配足夠的內(nèi)存。

      執(zhí)行“vi/etc/redis/redis.conf”命令,在Redis配置文件中發(fā)現(xiàn)“save 900 1” “save 300 10” “save 60 10000” “appendonly no”“maxmemory 10GB”等信息。其中三個(gè)“save”項(xiàng)目指的是自動(dòng)觸發(fā)Redis數(shù)據(jù)持久化到磁盤(pán)的策略,即當(dāng)指定的時(shí)間內(nèi)數(shù)據(jù)發(fā)生設(shè)定次數(shù)變動(dòng)時(shí),就會(huì)觸發(fā)“bgsave”命令將數(shù)據(jù)存儲(chǔ)到磁盤(pán)。

      例如,對(duì)于“save 900 1”來(lái)說(shuō),當(dāng)900秒內(nèi)數(shù)據(jù)變化為1次時(shí),就將變化的數(shù)據(jù)存儲(chǔ)到磁盤(pán)中。根據(jù)Redis日志文件提供的信息,可以看到當(dāng)觸發(fā)了“save 60 1000”策略時(shí),才出現(xiàn)了無(wú)法分配內(nèi)存的故障。這意味著在60秒時(shí)間內(nèi),當(dāng)數(shù)據(jù)變化的次數(shù)達(dá)到10000次時(shí),才出現(xiàn)無(wú)法分配內(nèi)存的問(wèn)題。

      但是對(duì)于其他兩個(gè)Save策略來(lái)說(shuō),在存儲(chǔ)數(shù)據(jù)時(shí)是沒(méi)有問(wèn)題的。在“appendonly”項(xiàng)中的參數(shù)為“no”,說(shuō)明并沒(méi)有開(kāi)啟Resia的AOF持久化機(jī)制。如果開(kāi)啟該機(jī)制,那么當(dāng)每次執(zhí)行寫(xiě)操作時(shí),都會(huì)自動(dòng)記錄對(duì)應(yīng)的Log日志,這將提高數(shù)據(jù)安全性。

      我們知道,Redis是內(nèi)存型數(shù)據(jù)庫(kù),數(shù)據(jù)都是存儲(chǔ)在內(nèi)存中,為了避免Redis進(jìn)程關(guān)閉導(dǎo)致數(shù)據(jù)的永久丟失,需要定期將Redis中的數(shù)據(jù)以命令等形式從內(nèi)存保存到硬盤(pán)。當(dāng)以后重啟Redis時(shí),就可以利用持久化機(jī)制實(shí)現(xiàn)數(shù)據(jù)恢復(fù)。

      當(dāng)然,為保護(hù)數(shù)據(jù)安全,還要盡可能的將持久化文件復(fù)制到遠(yuǎn)程存儲(chǔ)空間中保存。Redis持久化分為RDB和AOF兩種方式,前者是將當(dāng)前進(jìn)程中的數(shù)據(jù)生成快照保存到硬盤(pán),也稱(chēng)快照持久化,保存的文件后綴是“.rdb”。當(dāng)Redis重新啟動(dòng)時(shí),可以讀取快照文件恢復(fù)數(shù)據(jù)。

      后者是將Redis執(zhí)行的每次寫(xiě)命令記錄到單獨(dú)的日志文件中,當(dāng)Redis重啟時(shí)再次執(zhí)行AOF文件中的命令來(lái)恢復(fù)數(shù)據(jù)。由于AOF持久化的實(shí)時(shí)性更好,遇到Redis異常退出時(shí)丟失的數(shù)據(jù)更少,因此AOF是目前主流的持久化方式。在默認(rèn)狀態(tài)下,該機(jī)制是處于不開(kāi)啟的狀態(tài),即Redis會(huì)采取異步機(jī)制將數(shù)據(jù)寫(xiě)入到磁盤(pán)中。在“maxmemory”參數(shù)中執(zhí)行Redis可以使用的最大的內(nèi)存量,當(dāng)Redis在啟動(dòng)時(shí),會(huì)加能夠數(shù)據(jù)加載到內(nèi)存中,當(dāng)達(dá)到最大的內(nèi)存使用量時(shí),Redis會(huì)嘗試清除已經(jīng)或者即將到期的Key鍵值。

      當(dāng)處理完畢后,如果依然達(dá)到最大的內(nèi)存使用量,就無(wú)法執(zhí)行寫(xiě)入操作,但依然可以執(zhí)行數(shù)據(jù)的讀取操作。這里的Redis的最大內(nèi)庫(kù)存使用量為10GB,但是實(shí)際內(nèi)存量為16GB,看起來(lái)還有很多可用的內(nèi)存,并不應(yīng)該出現(xiàn)無(wú)法分配內(nèi)存的提示。

      繼續(xù)查閱Redis日志文件,發(fā)現(xiàn)了“WARNING overcommit_memory is set to 0!” “Background save may fail under low memory condition”等提示信息,大意是說(shuō)明在低內(nèi)存的環(huán)境下,后臺(tái)存儲(chǔ)存儲(chǔ)數(shù)據(jù)存在風(fēng)險(xiǎn)。面對(duì)這種情況,一般的應(yīng)對(duì)策略是打開(kāi)“/etc/sysctl.conf”文件,在其中對(duì)名為“vm.overcommit_memory”的內(nèi)存存儲(chǔ)參數(shù)進(jìn)行修改。

      之后執(zhí)行“sysctl vm.overcommit_memory=1”命令命令使該修改生效?!皏m.overcommit_memory”參數(shù)實(shí)際對(duì)應(yīng)的是“/proc/sys/vm/overcommit_memory”文件,該文件的主要作用是指定系統(tǒng)內(nèi)核針對(duì)內(nèi)存的分配策略。該參數(shù)默認(rèn)值為0,表示當(dāng)內(nèi)核對(duì)于內(nèi)存分配情況進(jìn)行檢測(cè)時(shí),如果發(fā)現(xiàn)應(yīng)有程序沒(méi)有足夠的可用內(nèi)存的話,那么內(nèi)存申請(qǐng)操作失敗,并將錯(cuò)誤信息發(fā)送給目標(biāo)程序。反之,則允許申請(qǐng)內(nèi)存,保證應(yīng)用程序正常工作。

      如果將該參數(shù)的值設(shè)置為1,表示不管當(dāng)前的內(nèi)存使用情況處于什么狀態(tài),都允許分配所有可用的物理內(nèi)存內(nèi)存給應(yīng)用程序。如果參數(shù)設(shè)置為2,表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存量。對(duì)于Redis來(lái)說(shuō),建議將參數(shù)的值設(shè)置為1,便于其利用所有的物理內(nèi)存。在本例中該參數(shù)的值實(shí)際上設(shè)置為0,這意味著雖然系統(tǒng)存在一定的空閑內(nèi)存,但是其小于Redis所申請(qǐng)的內(nèi)存量,自然會(huì)出現(xiàn)無(wú)法分配內(nèi)存的故障。

      故障解決

      Redis的持久化機(jī)制數(shù)據(jù)回寫(xiě)方式包括同步回寫(xiě)和異步回寫(xiě)。對(duì)于前者來(lái)說(shuō),Redis對(duì)應(yīng)執(zhí)行的是SAVE命令,即由Redis主進(jìn)程直接將數(shù)據(jù)寫(xiě)入磁盤(pán)。當(dāng)寫(xiě)入的數(shù)據(jù)量較大時(shí),該命令將阻塞主進(jìn)程,導(dǎo)致客戶端無(wú)法連接Redis,只有當(dāng)SAVE操作完成后,主進(jìn)程才開(kāi)始工作,客戶端才可以正常連接Redis。

      對(duì)于后者來(lái)說(shuō),實(shí)際上和Redis的BGSAVE命令對(duì)應(yīng)。即Redis主進(jìn)程通過(guò)fork一個(gè)子進(jìn)程,復(fù)制主進(jìn)程的內(nèi)存并通過(guò)子進(jìn)程將數(shù)據(jù)寫(xiě)入到磁盤(pán)中。

      在執(zhí)行BGSAVE命令過(guò)程中,并不影響Redis主進(jìn)程,客戶端可以正常連接Redis,等子進(jìn)程fork執(zhí)行存儲(chǔ)完成后,通知主進(jìn)程并關(guān)閉子進(jìn)程。

      根據(jù)在Redis配置文件,可以看到當(dāng)滿足了自動(dòng)觸發(fā)Redis數(shù)據(jù)持久化到磁盤(pán)的策略時(shí),Redis就會(huì)后臺(tái)調(diào)用BGSAVE命令,BGSAVE命令需要fork一個(gè)子進(jìn)程,這就相當(dāng)于復(fù)制了一個(gè)Redis主進(jìn)程的內(nèi)存鏡像。該服務(wù)器的物理內(nèi)存是16GB,因?yàn)镽edis主進(jìn)程占用了最大10GB內(nèi)存,對(duì)應(yīng)的由BGSAVE命令行fork的子進(jìn)程也需占用了最大10GB內(nèi)存。

      這樣,Redis就需要最大的內(nèi)存量就變成了20GB內(nèi)存,該機(jī)的物理內(nèi)存顯然無(wú)法滿足該要求,所以才出現(xiàn)無(wú)法分配內(nèi)存的故障,這必然導(dǎo)致Redis無(wú)法向磁盤(pán)寫(xiě)入數(shù)據(jù)的問(wèn)題。

      根據(jù)以上分析,解決問(wèn)題最直接的方法是對(duì)Redis的配置文件進(jìn)行修改,將“maxmemory 10GB”配置項(xiàng)進(jìn)行修改,降低其最大內(nèi)存使用量,例如修改為“maxmemory 5GB”等。之后執(zhí)行“/etc/init.d/redisserver restart”之類(lèi)的命令來(lái)重啟Redis,讓配置生效。也可以增加該機(jī)的而無(wú)力內(nèi)存量,例如將物理內(nèi)存增加到32GB,來(lái)滿足實(shí)際的需要。

      猜你喜歡
      磁盤(pán)命令進(jìn)程
      只聽(tīng)主人的命令
      債券市場(chǎng)對(duì)外開(kāi)放的進(jìn)程與展望
      解決Windows磁盤(pán)簽名沖突
      修改磁盤(pán)屬性
      移防命令下達(dá)后
      磁盤(pán)組群組及iSCSI Target設(shè)置
      創(chuàng)建VSAN群集
      這是人民的命令
      社會(huì)進(jìn)程中的新聞學(xué)探尋
      我國(guó)高等教育改革進(jìn)程與反思
      民县| 右玉县| 灌阳县| 合作市| 故城县| 西盟| 靖宇县| 云浮市| 浙江省| 沈阳市| 安塞县| 武功县| 奉化市| 清远市| 九江市| 沙田区| 双辽市| 辉县市| 铜山县| 金溪县| 甘德县| 金湖县| 婺源县| 高邑县| 东光县| 永清县| 冕宁县| 西昌市| 襄樊市| 温州市| 增城市| 平度市| 江永县| 凌云县| 手游| 凭祥市| 衢州市| 马山县| 营口市| 微博| 宽甸|