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