redis生產環境優化

 

最近幾天生產系統上線,對redis的一些參數做了一些調優,同時處理了一些問題,記錄一下,這只是初級版本,如果有大佬有其他更好的優化方案,歡迎指教。

一、前置環境

操作系統

redis最好部署在linux,windows 沒有官方版本,微軟版本只支持到3年前的3.2.100,由於我們目前只有windows server,所以使用一個非官方維護的windows4.0.2版本

硬盤

硬盤首選SSD,當然如果沒有持久化要求可以用普通機械硬盤

網絡

redis和應用一定要再同一個內網環境,這個對TPS影響特別大,如果redis和應用部署在同一個服務器,那麼儘量找一個內存使用不超過2/5的服務器。

高可用

建議通過哨兵實現高可用,至少3哨兵+一主一備

內存分配限制

Redis在主從複製時,需要fork子進程來進行操作,如果你的應用堆積了很大數據在內存中,那麼就需要針對這個子進程申請相應的內存空間,此時會受到操作系統的限制。通過更改系統配置文件/etc/sysctl.conf的vm.overcommit_memory=1以永久生效。該參數有0、1、2三個值。1表示允許分配所有的物理內存,而不管當前的內存狀態如何。

客戶端獲取連接限制

頻繁地連服務器,但每次連接都在短時間內結束,導致很多的TIME_WAIT,以至於用光端口號,所以新連接沒辦法綁定端口。修改如下2個內核參數:

sysctl -w net.ipv4.tcp_timestamps=1,開啓對於TCP時間戳的支持,若該項設置爲0,則下面一項設置不起作用;

sysctl -w net.ipv4.tcp_tw_recycle=1,表示開啓TCP連接中TIME-WAIT sockets的快速回收。

redis rdb目錄配置

主從的dir需要配置爲不一樣的地址,否則可能報錯

主從複製配置

slave需要配置該參數,slaveof <masterip> <masterport>,注意,masterip需要與master節點bind參數第一個IP一致。

二、redis參數

日誌配置

日誌級別和輸出(loglevel、logfile),生產可調至warning級別,並寫入文件中,有助於排查問題。

客戶端輸出緩衝區(client-output-buffer-limit

該參數有三種場景,主要是第二種slave場景在寫入比較頻繁時容易出問題。

當使用主從複製時,性能壓測下,數據量會急劇增長,導致從節點需要複製的數據很大,消耗時長增加。slave沒掛但被阻塞住了,比如正在loading Master發過來的RDB, Master的指令不能立刻發送給slave,就會放在output buffer中(見oll是命令數量,omem是大小),在配置文件中有如下配置:client-output-buffer-limit slave 256mb 64mb 60, 這是說負責發數據給slave的client,如果buffer超過256m或者連續60秒超過64m,就會被立刻強行關閉。所以此時應該相應調大數值,否則就會出現很悲劇的循環:Master傳輸一個很大的RDB給Slave,Slave努力地裝載,但還沒裝載完,Master對client的緩存滿了,再來一次。

平時可以在master執行 redis-cli client list 找那個cmd=sync,flag=S的client,注意OMem的變化。

建議配置 client-output-buffer-limit slave 0 0 0

異常信息:Uncaught RedisException: Redis is LOADING the dataset 

端口綁定配置

如果redis使用了哨兵+主從,則在bind參數的第一個ip需要配置內網ip,如master 配置爲bind 192.168.30.2,則redis slave的slaveof也需要配置爲192.168.30.2

異常信息:Sending command to master in replication handshake: -Writing to master: Unknown error;

stop-writes-on-bgsave-error配置

redis被配置爲保存數據庫快照,如果快照不能持久化,則寫入會報錯。將stop-writes-on-bgsave-error設置爲no解決。當然根本問題還是持久化出了問題,需要檢查爲什麼不能持久化。

異常信息:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error

端口

建議使用10000以上端口

port 29764

後臺運行

linux系統配置redis後臺運行

daemonize yes

三、漏洞

redis存在未授權訪問漏洞,在使用之前一定要進行加固,否則系統分分鐘被黑。

漏洞介紹及攻擊方法

加固方案

1、redis.conf文件添加如下配置,禁用遠程修改DB文件,如config set 命令也無法使用

rename-command FLUSHALL "" 

rename-command CONFIG "" 

rename-command EVAL ""

2、爲redis單獨創建用戶和目錄,以下命令適用於linux

 

groupadd -r redis && useradd -r -g redis redis

3、爲redis添加密碼驗證

 

requirepass mypassword

4、禁止外網訪問redis

 

bind 127.0.0.1 

5、linux下保證authorized_keys文件的安全,只對擁有者只讀,對其他用戶沒有權限

 

chmod 400 ~/.ssh/authorized_keys

6、爲保證authorized_keys的權限不會被改掉,您還需要設置該文件的immutable位權限

 

chattr +i ~/.ssh/authorized_keys

7、然而,用戶還可以重命名~/.ssh,然後新建新的~/.ssh目錄和authorized_keys文件。要避免這種情況,需要設置~./ssh的immutable位權限

 

chattr +i ~/.ssh

如果需要添加新的公鑰,需要移除authorized_keys的 immutable 位權限。然後,添加好新的公鑰之後,按照上述步驟重新加上immutable位權限

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章