三十分鐘帶你掌握Redis應如何管理

2022-03-03 19:00:17
本篇文章給大家帶來了關於的相關知識,其中主要介紹了Redis管理工具的相關問題,應該怎樣去管理Redis資料庫,下面就來看一下,希望對大家有幫助。

推薦學習:

本文將帶你熟悉Redis管理方面的知識,包含安全和通訊協定等等內容。
與此同時,還會介與之緊密相關的第三方管理工具。

一、安全

談到安全,我們會聯想到些什麼?
比如,可信任的環境會給我們帶來安全感,陌生的環境則會讓你感到未知的恐懼和孤獨。
再比如,國產化替代信創專案(安可替代),這裡我簡稱為國創專案,就是要達到信任、安全可靠以及自主可控的的目的。

上面談了這麼多(瞎扯了很多,我黔驢盡窮了),只是為了提升我們的安全意識。

Redis以簡潔為美,創始人曾這麼描述過。但同樣在安全層面也沒做過多的工作。

這裡補充一點,上次沒有講到如何優雅的關閉Redis服務。雖然可以殺掉程序來控制,但推薦使用如下方式關閉:

$ /opt/redis-6.0.8/src/redis-cli shutdown

1、可信環境

Redis的安全設計是基於「Redis執行在可信任的環境」這個前提下做出來的。在生產環境(正式釋出環境)執行時,不允許外部直接連線到Redis伺服器上,此時應該通過應用程式進行中轉,執行在可信任的環境中是保證Redis安全至關重要的方法。

1.1、bind引數

在Redis的預設組態檔redis.conf中,只會接受原生的網路請求。但通過在組態檔中修改bind引數更改這一設定,預設的bind設定為:

bind:127.0.0.1

bind引數同樣可以繫結多個IP地址,IP地址以間隔空格分隔,如下範例:

# Examples:# bind 192.168.1.100 10.0.0.1# bind 127.0.0.1 ::1

1.2、protected-mode引數

在Redis3.2的版本中,引入了一個特殊模式:保護模式,來更好地確保Redis執行在可信環境之中。值得注意的是,保護模式在預設情況下是開啟的。

引數設定:

#開啟保護模式protected-mode yes#禁止保護模式protected-mode no

作用

  • 開啟保護模式:接收到來自不在bind繫結的網路使用者端傳送命令時,如果使用者端沒有設定密碼,Redis會返回錯誤拒絕(DENIED)執行該命令。
  • 禁止保護模式:可以在設定中使用protected-mode no禁止。
  • 安全:對於生產環境需要確保開啟了護盾(防火牆),達到確保可信使用者端連線伺服器的目的。

在測試的時候,比如我在Windows下連線我的linux上的Redis服務。為了方便測試,此時臨時關閉防護牆firewalld,或者採用firewall-cmd命令加入6379預設埠以及Redis服務,關於防火牆的知識可以參考我之前的文章《firewalld與iptables防火牆工具》:

#臨時關閉防火牆systemctl stop firewalld.service

注意:Redis3.2之前的版本預設會繫結所有網路介面,任何網路上的計算機(包含公網)都可連線至Redis伺服器上。使用舊版的需要注意,最好修改這個引數,或者升級到新版。

2、資料庫密碼

Redis中提供了資料庫密碼功能。最開始我傻傻的以為直接就能連上,豈不是沒有密碼,真不安全。直到後來在工作的實踐中,才發現原來這貨可以是設定密碼的,只是我以前並不知道而已。值得注意的是:並且在6.0版本中支援多使用者許可權控制功能

2.1、Redis密碼設定

在我的上一篇文章也有提到過。Redis資料庫密碼是通過引數requirepass來控制的,預設的6.0.8版本是禁用掉了,需要手動開啟。

#預設禁用掉了#requirepass foobared#啟用密碼requirepass 123456

使用者端每次連線到Redis時都需要傳送密碼,否則Redis會拒絕執行使用者端發來的命令。例如我使用Windows使用者端連線:
開啟了保護模式,開始提示DENIED。利用bind繫結了信任的ip或者禁止保護模式,最後還會提示密碼為驗證。

範例:設定鍵sky,set 「sky」 「hello redis」

#設定skyset "sky" "hello redis"

重新啟動redis服務(需要讀取到redis.conf檔案),會提示驗證密碼,如下圖所示。

#獲取skyget sky(error) NOAUTH Authentication required. 
#提示需要密碼認證
#認證auth 123456
#再次獲取skyget sky"hello redis"

雖然資料庫設定密碼很方便,但是在複雜的場景中經常需要使用更加細粒度的存取許可權控制。比如:

  • 生產環境中的應用程式下不應該具有執行CONFIG、FLUSHALL涉及到管理或者資料安全的命令許可權
  • 多個程式因不同用途共用一個Redis服務時,建議限制某個程式存取其它程式產生的鍵。

tips:為此,Redis6.0推出了存取控制列表(ACL)功能,可以支援多使用者,並且設定每個使用者可以使用的命令和存取的鍵名規則等。可以通過組態檔設定,如下:

  • 將ACL設定直接寫在Redis組態檔中
  • 將ACL設定寫在單獨的檔案中,然後在Redis組態檔通過aclfile指令引入,例如:
aclifile /opt/person/conf.acl

2.1、Redis主從複製注意事項

在設定Redis複製的時候,如果主庫設定了密碼,需要在從庫的組態檔中通過masterauth <master-password>引數設定主庫的密碼,使從庫連線主庫時自動使用auth命令驗證,設定如下。

masterauth <master-password>

3、命名命令

Redis支援在組態檔中將命令重新命名,例如將FLUSHALL命令重新命名為一個比較複雜的名字,達到保證只有自己的應用可以使用該命令。當然,這個功能可以看做在6.0版本之前沒有ACL,作為對命令安全性的一個補充。如下設定:

rename-command FLUSHALL redisabcdsky1r2d3is

如果希望直接一點,直接禁用,通過重新命名為空字元

rename-command FLUSHALL ""

再次強調:安全起見,無論設定密碼還是重新命名命令,都應遵循保證組態檔的安全性,否則就無意義了。

二、通訊協定

之前有了解到Redis的主從複製以及持久化AOF檔案的格式,通過了解Redis通訊協定能更好的理解Redis。

當然Redis支援兩種通訊協定。如下:

  • 一種是二進位制安全的統一請求協定(unified request protocol)
  • 第二種是比較直觀的便於在telnet程式中輸入的簡單協定

1、簡單協定

簡單協定適合在telnet程式中和Redis通訊。如下是通過telnet測試與Redis通訊:

linux下Redhat系列安裝telnet通過yum命令

yum -y install telnet

Windows在啟用或關閉Windows功能中啟用telnet

[root@dywangk redis-6.0.8]# telnet 127.0.0.1 6379Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.auth 123456 #同樣需要驗證密碼,之前設定了密碼+OKset foo bar 
+OK
get foo$3bar#輸入quit退出telnet

1.1、錯誤回覆

錯誤回覆(error reply)以 - 開頭並在後面跟著錯誤資訊:

-ERR unknown command ``, with args beginning with:

1.2、狀態回覆

狀態回覆(status reply)以+開頭

+OK

1.3、整數回覆

整數回覆(integer reply)以:開頭

:3

1.4、字串回覆

字串(bulk reply)回覆以$開頭

$3

2、統一請求協定

統一請求協定是從Redis1.2開始加入的,其命令格式與多行字串回覆格式類似。也以telnet為例演示:

[root@dywangk redis-6.0.8]# telnet 127.0.0.1 6379Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.auth 123456 #同樣需要驗證密碼,之前設定了密碼+OK
*3$3set$3foo$3bar  
+OK#輸入quit退出telnet

同樣,在傳送命令的時候指定了後面字串的長度,所以每個命令的每個引數都可以包含二進位制的字元。

Redis的AOF檔案和主從複製時資料庫傳送的內容使用了統一請求協定。如果簡單的使用telnet與Redis進行通訊,使用簡單協定即可。

三、管理工具

1、redis-cli

看到redis-cli大家肯定不陌生,是的我們學習測試快速融入都是使用的redis-cli命令進行的,Redis自帶的使用者端。Redis可以執行大部分的Redis命令,包括檢視資料庫資訊的info命令、更改資料庫設定的config命令和強制進行RDB快照的save命令。簡單介紹幾個管理Redis常用的命令。

1.1、耗時命令紀錄檔

當一條命令執行時間超過限制時,Redis會將該命令的執行時間等資訊加入耗時命令紀錄檔(slow log)以供開發者檢視。通過組態檔的slowlog-log-slower-than 10000引數設定限制,注意單位是微秒,可以看到預設為10000。通過slowlog-max-len 128限制記錄的條數。

獲取當前耗時命令紀錄檔

slowlog get

每條紀錄檔由以下4個部分組成

  • 唯一紀錄檔ID
  • 執行的Unix時間
  • 耗時時間,單位為微秒
  • 命令及其引數

測試時,將slowlog-log-slower-than 0 引數設定為0

slowlog-log-slower-than 0

1.2、命令監控

Redis提供了monitor來監控Redis執行的所有命令,redis-cli也支援。例如:

monitor

注意:一般用於偵錯和糾錯使用。

2、Medis

獲取地址:https://getmedis.com/

當Redis中的鍵比較多時,此時使用redis-cli管理略顯不足。Medis是一款macOS下的視覺化Redis管理工具。通過介面即可實現管理Redis。

3、phpRedisAdmin

看到phpRedisAdmin,大家也許會聯想到以網頁形式管理MySQL的phpMyAdmin管理工具。

下載地址:https://github.com/erikdubbelboer/phpRedisAdmin

關於工具的使用,可以參考github說明,這裡不做過多介紹。

建議:github那存取速度大家都懂的,建議匯入到gitee作為映象倉庫使用,每隔一段時間同步。

4、Rdbtools

一款採用Python語言開發的Redis的快照檔案解析器,它可以根據快照檔案匯出json資料檔案、分析Redis中每個鍵的佔用空間情況。

下載地址:https://github.com/sripathikrishnan/redis-rdb-tools

關於工具的使用,可以參考github說明,這裡不做過多介紹。

5、命令參考

最後介紹一個Redis命令大全參考網站,源自於Redis官網,連結如下:

https://redis.io/commands

推薦學習:

以上就是三十分鐘帶你掌握Redis應如何管理的詳細內容,更多請關注TW511.COM其它相關文章!