對于配置文件來說,往往是很多大佬們?nèi)胧诌\維優(yōu)化的第一步,因此我們想要真正的進階,就一定要看看配置文件中有哪些可以配置的地方,有哪些可以優(yōu)化的配置點。當(dāng)然,咱也不是特別專業(yè),有很多配置也不知道是啥意思,更不知道應(yīng)該配成什么才是最好的。既然這樣,那就一起來學(xué)學(xué)唄。
整個配置文件有兩篇文章,基于 Redis6.2 版本的原生配置文件。其它沒有在配置文件中出現(xiàn)的配置項可能都并不是非常常用的選項,Redis7 以及更新版本的配置項也并沒有詳細的列出,如果大家有興趣,可以到官方文檔中去查找完整的以及最新的所有配置項信息。
打開配置文件,最開始的部分就是告訴我們可以進行一些單位的轉(zhuǎn)換。直接使用 1k 可以表示 1000bytes ,而使用 1kb 則可以表示 1024bytes ,注意這一塊的微小差別哦。
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
接著,就是教我們可以 INCLUDES 其它配置文件,這個也是很多類似的系統(tǒng)工具都提供的功能,最典型的就是 Nginx 配置 vhost 的時候大家也往往會不同的站點單獨使用一個配置文件。但其實它們最后都是在主配置文件中 INCLUDES 進來的。緊跟著后面是可以使用 loadmodule 加載一些外部模塊和插件,比如官方文檔上就有的布隆過濾器之類的插件。
好了,繼續(xù)向下看,我們將看到 NETWORK 這一個大的配置模塊。
bind 127.0.0.1 ::1
protected-mode no
port 6379
這三個應(yīng)該是同學(xué)們接觸到的比較多的配置項,bind 是綁定 IP ,默認就是綁定本地的回環(huán)地址,protected-mode 是保護模式的開關(guān),打開后服務(wù)端將只接收 bind 綁定的客戶端連接,并且需要配置密碼(注意如果是多實例哨兵部署,這個要設(shè)置成no,否則哨兵之間可能無法通信)。最后的 port 就是服務(wù)端啟動時所監(jiān)聽的端口號。
剩下的幾個配置大家看看就好,平常改動這幾個配置的應(yīng)該不多。
# tcp 未連接隊列數(shù)量配置,要注意主進程是否有慢查詢,如果出現(xiàn)慢查詢
# 這里就會積壓,超過這個數(shù)量之后就會產(chǎn)生隊列溢出,拋棄連接
# 不要大于系統(tǒng)的 /proc/sys/net/core/somaxconn 配置,可以設(shè)置成 2048 ,和系統(tǒng)的 somaxconn 一起改
tcp-backlog 511
# 使用 unix socket 形式連接
# 之前我們試過,默認是注釋的狀態(tài)
# unixsocket /run/redis.sock
# unixsocketperm 700
# 客戶端空閑多久后關(guān)閉連接
timeout 0
# 客戶端保持活躍狀態(tài)的時間,推薦就是 300s
tcp-keepalive 300
這一塊的配置是用于配置安全套接字連接的,對應(yīng)的 HTTP 上就是 HTTPS 的那個意思。不過一般我們也很少會配置這里,因為大部分情況下其實我們的 Redis 會優(yōu)先配置在內(nèi)網(wǎng)使用,如果有外網(wǎng)使用需求的話,增加這一套配置是對于安全的又一層保障。
# 默認情況下,TLS/SSL 是關(guān)閉的
# 如果要打開的話,先把 port 設(shè)置成 0
# 然后打開下面這個注釋
# tls-port 6379
# 配置X.509證書和私鑰以用于驗證
# tls-cert-file redis.crt
# tls-key-file redis.key
# 如果密鑰文件使用密碼短語加密就在下面這里直接配置上
# tls-key-file-pass secret
# 有的時候,可能會配置不同的證書,比如客戶端證書和服務(wù)端證書
# 在這里,可以直接配置客戶端證書
# tls-client-cert-file client.crt
# tls-client-key-file client.key
# 客戶端證書如果是密碼的,也可以直接把密碼寫在這里
# tls-client-key-file-pass secret
# 配置 Diffie-Hellman (DH) 文件,使用 DH 密鑰
# tls-dh-params-file redis.dh
# 配置使用 CA 證書進行驗證
# tls-ca-cert-file ca.crt
# tls-ca-cert-dir /etc/ssl/certs
# 默認情況下,需要客戶端使用有效的客戶端證書
# 如果配置為 no 則不需要也不接受客戶端證書
# 如果配置為 optinal 則接受客戶端請收并驗證其有效,但并不是必須的
# tls-auth-clients no
# tls-auth-clients optional
# 默認情況下,主從復(fù)制和 Cluster 間不會使用 TLS ,這里可以設(shè)置成 yes 開啟主從復(fù)制也使用 TLS
# tls-replication yes
# tls-cluster yes
# 使用什么 TLS 協(xié)議
# 下面打開注釋就是只啟用 1.2 和 1.3 的 TLS ,不使用 1.1x 版本
# tls-protocols "TLSv1.2 TLSv1.3"
# 配置允許的密碼,只對小于等于 TLSv1.2 以下的版本有效
# tls-ciphers DEFAULT:!MEDIUM
# 配置 TLSv1.3 所使用的密碼套件信息
# tls-ciphersuites TLS_CHACHA20_POLY1305_SHA256
# 使用 yes 的話,選擇密碼時,使用服務(wù)器的首選項
# 設(shè)置 no 的話,服務(wù)端跟隨客戶端的選擇
# tls-prefer-server-ciphers yes
# 禁用或開啟 TLS 緩存
# tls-session-caching no
# TLS 緩存會話的默認數(shù)量,不設(shè)置或者保持注釋狀態(tài)的話,默認是 20480
# tls-session-cache-size 5000
# TLS 緩存會話的超時時間
# tls-session-cache-timeout 60
好吧,實話實說,從來沒配置過這一塊的內(nèi)容,所以說只能是照著注釋大概翻譯一下。
通用配置這一塊,比較常用的是下面幾個配置。
daemonize yes #后臺運行
pidfile "/var/run/redis_6379.pid" # 進程id文件存放路徑
databases 16 # 庫數(shù)量
這三個配置之前的文章中也都用過,也不用多解釋了,剩下的東西我們再通過注釋看一下。
# 可以通過upstart和systemd管理Redis守護進程
# 不是我們常見的那個 supervisectl 工具
# upstart 和 systemd 是大部分 Linux 自帶的那個
# supervised auto
# 服務(wù)端日志輸出級別
# 有 debug、verbose、notice、warning
# debug 輸出的內(nèi)容最多全面,適合測試環(huán)境
# notic 和 warning 適合生產(chǎn)環(huán)境
loglevel notice
# 配置日志的輸出路徑
# 如果 daemonize 是 no ,輸出到控制臺
# 如果 daemonize 是 yes ,輸出到指定的路徑文件中,如果沒配,輸出到 /dev/null
logfile ""
# 系統(tǒng)日志記錄相關(guān)的配置
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
# 系統(tǒng)崩潰日志相關(guān)的配置
# crash-log-enabled no
# crash-memcheck-enabled no
# 啟動時顯示 Redis 的 Logo 不
always-show-logo no
# Linux 下查看進程名時,是否設(shè)置 Redis 的進程名
# 就是我們用 ps 命令查看時的那個名字
set-proc-title yes
# 進程名的模板
proc-title-template "{title} {listen-addr} {server-mode}"
這一塊呀,其實就是 RDB 相關(guān)的配置,本身對于 RDB 持久話來說,它就是一種快照機制。因此,這一大塊的配置名稱也是使用的 SNAPSHOTTING 。
# 不用多解釋了吧,RDB 持久化的規(guī)則
# 不記得的小伙伴看之前的 Redis進階:持久化策略 這篇文章或者視頻哦
save 3600 1
save 300 100
save 60 10000
# 假如 bgsave 的時候發(fā)生問題,默認情況下會禁止寫入
# 這個吧,可以幫助發(fā)現(xiàn)問題,也就是持久化失敗了會很明顯的出現(xiàn)無法寫入數(shù)據(jù)的情況
# 但如果你已經(jīng)有了對于持久化的監(jiān)控,把它關(guān)掉也可以
stop-writes-on-bgsave-error yes
# 是否在持久化時對數(shù)據(jù)進行 LZF 壓縮
rdbcompression yes
# 是否對 RDB 內(nèi)容進行 CRC64 簽名檢查
rdbchecksum yes
# 啟用或禁用對于 ziplist 和 listpack 的完整整理
# 可以設(shè)置 no yes clients
# 默認值是 clients ,表示僅對客戶端連接進行整理,但它會影響集群
# 集群操作時,可以臨時設(shè)置為 no
# sanitize-dump-payload no
# RDB 文件的名稱
dbfilename "dump.rdb"
# 刪除同步文件,僅在有 AOF 文件時有效
# 主從復(fù)制時,在沒有配置 RDB 持久化策略的機器上是否刪除復(fù)制時使用的 RDB 文件
rdb-del-sync-files no
# 工作目錄
# 之前講過,rdb、aof、cluster nodes 文件都會放到這個目錄下
dir "/usr/local/var/db/redis"
主從配置是一塊非常大的配置部分,有很多的配置參數(shù)。不過當(dāng)時我們學(xué)習(xí)的時候大部分都是在命令行操作的,而且其實主要接觸到的也就那么兩個命令以及對應(yīng)的配置參數(shù)。其它的配置參數(shù)咱們今天就一起都來好好看看。
# 不多解釋了吧
# 之前文章中我們使用的是在命令中直接配置
# 也說過在配置文件中也可以直接配置,就是在這里了
# replicaof <masterip> <masterport>
# 主從配置時認證相關(guān)的內(nèi)容
# 之前也講過了
# masterauth <master-password>
# masteruser <username>
# 當(dāng)從庫失去與主機的連接之后要怎么辦?
# 設(shè)置為 yes ,就還是正常響應(yīng)命令及結(jié)果,但可以包含過期數(shù)據(jù)
# 設(shè)置為 no ,除了 INFO、REPLICAOF 等等的一些命令之外,其它的命令報錯
# 具體哪些命令可以使用直接去看原版注釋
replica-serve-stale-data yes
# 配置從庫是否是只讀的,換成 no 的話就也可以寫入數(shù)據(jù)了
replica-read-only yes
# 復(fù)制的同步策略,使用磁盤還是socket
# 磁盤就是發(fā)送 RDB 文件
# socket 就是直接主庫請求從庫的socket端口同步命令
# 現(xiàn)在肯定是無盤復(fù)制好些啦,不過默認是 no ,因為無盤復(fù)制還是實驗階段
repl-diskless-sync no
# 當(dāng)使用無盤復(fù)制的時候,可以配置等待時間
# 一般主庫會等待一會再向從庫發(fā)送數(shù)據(jù)
repl-diskless-sync-delay 5
# 無盤加載
# 一般情況下,socket 會比文件傳輸快,但也有可能傳送時有新的數(shù)據(jù)
# 這里的配置如果是 disabled ,就是不使用無盤復(fù)制,先將文件保存到磁盤再加載
repl-diskless-load disabled
# 副本以預(yù)定義的間隔向服務(wù)器發(fā)送PING
# 默認值為10秒
# repl-ping-replica-period 10
# 復(fù)制的超時時間
# repl-timeout 60
# 同步之后是否禁用主庫上的 TCP_NODELAY
# 使用 yes 會使用較少的包向從庫發(fā)送數(shù)據(jù),但會增加延遲和帶寬
repl-disable-tcp-nodelay no
# 復(fù)制緩沖日志大小
# repl-backlog-size 1mb
# 緩沖日志刪除時間
# repl-backlog-ttl 3600
# 復(fù)制副本的優(yōu)先級 優(yōu)先級高的副本在哨兵選舉時的得分會更高
replica-priority 100
# 在 哨兵 信息中可以移除當(dāng)前副本的信息
# replica-announced yes
# 從機最小寫入數(shù)量
# 幾個從機處于在線狀態(tài)
# 從機的延遲小于10秒
# min-replicas-to-write 3
# min-replicas-max-lag 10
# 主庫的 role 命令可以查看到的從庫的信息
# replica-announce-ip 5.5.5.5
# replica-announce-port 1234
無盤復(fù)制大概的意思是指主服務(wù)器直接通過套接字將快照內(nèi)容發(fā)送到從節(jié)點,生成快照是一個遍歷的過程,主節(jié)點會一邊遍歷內(nèi)存,一邊將序列化的內(nèi)容發(fā)送到從節(jié)點,從節(jié)點還是跟之前一樣,先將接收到的內(nèi)容存儲到磁盤文件中,再進行一次性加載。
主要是對于客戶端的緩存來說的。一般情況下,Redis 支持客戶端緩存一些鍵的內(nèi)容,這樣可以幫助客戶端更快地響應(yīng)數(shù)據(jù)并且減少服務(wù)端的壓力。默認狀態(tài)下是不開啟的,當(dāng)開啟之后,如果數(shù)據(jù)發(fā)生了變化,服務(wù)端會向客戶端發(fā)通知并更新緩存,而客戶端緩存的鍵數(shù)量如果超出了下面設(shè)置的值,就會隨機刪除一個之前緩存的客戶端緩存 Key 。
# 客戶端緩存時跟蹤的鍵數(shù)量
# tracking-table-max-keys 1000000
更詳細的資料大家可以自己再去搜索一下哈。
安全相關(guān)的配置不用我說大家應(yīng)該也想到了,一個是全局密碼,一個是之前我們學(xué)過的 ACL ,這兩塊的配置之前也是在命令行中直接操作的,同樣地,它們也可以通過配置文件來實現(xiàn)。另外,ACL 配置文件還可以單獨設(shè)置一個配置文件,我們也講過。
# ACL 用戶的配置
# user alice on -DEBUG +@all ~* >somepassword
# ACL 日志長度
acllog-max-len 128
# 使用單獨的 acl 文件保存 acl 用戶信息
#aclfile /usr/local/etc/redis_users.acl
# 全局密碼配置
# requirepass aabbcc
# 為 PUB/SUB 模式提供用戶的默認權(quán)限
# acl-pubsub-default resetchannels
# 給命令重命名(已標(biāo)記為廢棄)
# 可以更改危險命令的名稱
# 現(xiàn)在推薦的是使用 ACL 控制用戶可以執(zhí)行的命令權(quán)限
# rename-command CONFIG ""
就一個,客戶端的最大連接數(shù)。另外在系統(tǒng)層面還要注意 Linux 系統(tǒng)的 ulimit 配置。
maxclients 10000
今天的內(nèi)容是配置文件學(xué)習(xí)的第一部分,主要是基本配置、快照(RDB)、主從復(fù)制、安全相關(guān)配置的內(nèi)容。有很多內(nèi)容是我們之前用過的,但更多的內(nèi)容其實是我們平常很少會接觸到的,在這里不管用不用得到,大概的看一眼留個印象才是更重要的。如果確實想要精通整個 Redis 以及需要對 Redis 優(yōu)化有深度需求的同學(xué),那還是要更加詳細地了解每個配置參數(shù)的作用以及它們更詳細的含義。
下篇文章我們將繼續(xù)學(xué)習(xí)配置文件中后半部分的內(nèi)容。