Redis 運維的常規操做

Redis 運維的常規操做

Redis 是一個高性能的 key-value 數據庫。node

SET 操做每秒鐘 110000 次;GET 操做每秒鐘 81000 次。linux

安裝

Window 下安裝

下載地址:github.com/MSOpenTech/…c++

Redis 支持 32 位和 64 位。這個須要根據你係統平臺的實際狀況選擇,這裏咱們下載 Redis-x64-xxx.zip壓縮包到 C 盤,解壓後,將文件夾從新命名爲 redisgit

打開一個 cmd 窗口 使用 cd 命令切換目錄到 C:\redis 運行 redis-server.exe redis.windows.confgithub

若是想方便的話,能夠把 redis 的路徑加到系統的環境變量裏,這樣就免得再輸路徑了,後面的那個 redis.windows.conf 能夠省略,若是省略,會啓用默認的。redis

這時候另啓一個 cmd 窗口,原來的不要關閉,否則就沒法訪問服務端了。算法

切換到 redis 目錄下運行 redis-cli.exe -h 127.0.0.1 -p 6379數據庫

Linux 下安裝

下載地址: redis.io/download,下載…windows

下載、解壓、編譯 Redis緩存

$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
複製代碼

爲了編譯 Redis 源碼,你須要 gcc-c++和 tcl。若是你的系統是 CentOS,能夠直接執行命令:yum install -y gcc-c++ tcl 來安裝。

進入到解壓後的 src 目錄,經過以下命令啓動 Redis:

$ src/redis-server
複製代碼

您可使用內置的客戶端與 Redis 進行交互:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
複製代碼

Ubuntu 下安裝

在 Ubuntu 系統安裝 Redi 可使用如下命令:

$sudo apt-get update
$sudo apt-get install redis-server
複製代碼

開機啓動

  • 開機啓動配置:echo "/usr/local/bin/redis-server /etc/redis.conf" >> /etc/rc.local

開放防火牆端口

  • 添加規則:iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
  • 保存規則:service iptables save
  • 重啓 iptables:service iptables restart

Redis 使用和配置

啓動

啓動 redis 服務

cd /opt/redis/redis-5.0.4/src
./redis-server
複製代碼

啓動 redis 客戶端

cd /opt/redis/redis-5.0.4/src
./redis-cli
複製代碼

查看 redis 是否啓動

$ redis-cli
複製代碼

以上命令將打開如下終端:

redis 127.0.0.1:6379>
複製代碼

127.0.0.1 是本機 IP ,6379 是 redis 服務端口。如今咱們輸入 PING 命令。

redis 127.0.0.1:6379> ping
PONG
複製代碼

以上說明咱們已經成功啓動了 redis。

常見配置

Redis 默認的配置文件是根目錄下的 redis.conf 文件。

若是須要指定特定文件做爲配置文件,須要使用命令: ./redis-server -c xxx.conf

每次修改配置後,須要重啓才能生效。

Redis 官方默認配置:

自 Redis2.6 起就能夠直接經過命令行傳遞 Redis 配置參數。這種方法能夠用於測試。自 Redis2.6 起就能夠直接經過命令行傳遞 Redis 配置參數。這種方法能夠用於測試。

設爲守護進程

Redis 默認以非守護進程方式啓動,而一般咱們會將 Redis 設爲守護進程啓動方式,配置:daemonize yes

遠程訪問

Redis 默認綁定 127.0.0.1,這樣就只能本機才能訪問,若要 Redis 容許遠程訪問,須要配置:bind 0.0.0.0

設置密碼

Redis 默認訪問不須要密碼,若是須要設置密碼,須要以下配置:

  • protected-mode yes
  • requirepass <密碼>

配置參數表

配置項 說明
daemonize no Redis 默認不是以守護進程的方式運行,能夠經過該配置項修改,使用 yes 啓用守護進程(Windows 不支持守護線程的配置爲 no )
pidfile /var/run/redis.pid 當 Redis 以守護進程方式運行時,Redis 默認會把 pid 寫入 /var/run/redis.pid 文件,能夠經過 pidfile 指定
port 6379 指定 Redis 監聽端口,默認端口爲 6379,做者在本身的一篇博文中解釋了爲何選用 6379 做爲默認端口,由於 6379 在手機按鍵上 MERZ 對應的號碼,而 MERZ 取自意大利歌女 Alessia Merz 的名字
bind 127.0.0.1 綁定的主機地址
timeout 300 當客戶端閒置多長時間後關閉鏈接,若是指定爲 0,表示關閉該功能
loglevel notice 指定日誌記錄級別,Redis 總共支持四個級別:debug、verbose、notice、warning,默認爲 notice
logfile stdout 日誌記錄方式,默認爲標準輸出,若是配置 Redis 爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給 /dev/null
databases 16 設置數據庫的數量,默認數據庫爲 0,可使用 SELECT 命令在鏈接上指定數據庫 id
save <seconds> <changes> Redis 默認配置文件中提供了三個條件:save 900 1save 300 10save 60 10000 分別表示 900 秒(15 分鐘)內有 1 個更改,300 秒(5 分鐘)內有 10 個更改以及 60 秒內有 10000 個更改。 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合
rdbcompression yes 指定存儲至本地數據庫時是否壓縮數據,默認爲 yes,Redis 採用 LZF 壓縮,若是爲了節省 CPU 時間,能夠關閉該選項,但會致使數據庫文件變的巨大
dbfilename dump.rdb 指定本地數據庫文件名,默認值爲 dump.rdb
dir ./ 指定本地數據庫存放目錄
slaveof <masterip> <masterport> 設置當本機爲 slav 服務時,設置 master 服務的 IP 地址及端口,在 Redis 啓動時,它會自動從 master 進行數據同步
masterauth <master-password> 當 master 服務設置了密碼保護時,slav 服務鏈接 master 的密碼
requirepass foobared 設置 Redis 鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接 Redis 時須要經過 AUTH 命令提供密碼,默認關閉
maxclients 128 設置同一時間最大客戶端鏈接數,默認無限制,Redis 能夠同時打開的客戶端鏈接數爲 Redis 進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis 會關閉新的鏈接並向客戶端返回 max number of clients reached 錯誤信息
maxmemory <bytes> 指定 Redis 最大內存限制,Redis 在啓動時會把數據加載到內存中,達到最大內存後,Redis 會先嚐試清除已到期或即將到期的 Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis 新的 vm 機制,會把 Key 存放內存,Value 會存放在 swap 區
appendonly no 指定是否在每次更新操做後進行日誌記錄,Redis 在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis 自己同步數據文件是按上面 save 條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲 no
appendfilename appendonly.aof 指定更新日誌文件名,默認爲 appendonly.aof
appendfsync everysec 指定更新日誌條件,共有 3 個可選值:no:表示等操做系統進行數據緩存同步到磁盤(快)always:表示每次更新操做後手動調用 fsync() 將數據寫到磁盤(慢,安全)everysec:表示每秒同步一次(折中,默認值)
vm-enabled no 指定是否啓用虛擬內存機制,默認值爲 no,簡單的介紹一下,VM 機制將數據分頁存放,由 Redis 將訪問量較少的頁即冷數據 swap 到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析 Redis 的 VM 機制)
vm-swap-file /tmp/redis.swap 虛擬內存文件路徑,默認值爲 /tmp/redis.swap,不可多個 Redis 實例共享
vm-max-memory 0 將全部大於 vm-max-memory 的數據存入虛擬內存,不管 vm-max-memory 設置多小,全部索引數據都是內存存儲的(Redis 的索引數據 就是 keys),也就是說,當 vm-max-memory 設置爲 0 的時候,實際上是全部 value 都存在於磁盤。默認值爲 0
vm-page-size 32 Redis swap 文件分紅了不少的 page,一個對象能夠保存在多個 page 上面,但一個 page 上不能被多個對象共享,vm-page-size 是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page 大小最好設置爲 32 或者 64bytes;若是存儲很大大對象,則可使用更大的 page,若是不肯定,就使用默認值
vm-pages 134217728 設置 swap 文件中的 page 數量,因爲頁表(一種表示頁面空閒或使用的 bitmap)是在放在內存中的,,在磁盤上每 8 個 pages 將消耗 1byte 的內存。
vm-max-threads 4 設置訪問 swap 文件的線程數,最好不要超過機器的核數,若是設置爲 0,那麼全部對 swap 文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲 4
glueoutputbuf yes 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓
hash-max-zipmap-entries 64 hash-max-zipmap-value 512 指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法
activerehashing yes 指定是否激活重置哈希,默認爲開啓(後面在介紹 Redis 的哈希算法時具體介紹)
include /path/to/local.conf 指定包含其它的配置文件,能夠在同一主機上多個 Redis 實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件

Redis 集羣使用和配置

Redis 3.0 後支持集羣模式。

集羣規劃

Redis 集羣通常由 多個節點 組成,節點數量至少爲 6 個,才能保證組成 完整高可用 的集羣。

理想狀況固然是全部節點各自在不一樣的機器上,首先於資源,本人在部署 Redis 集羣時,只獲得 3 臺服務器。因此,我計劃每臺服務器部署 2 個 Redis 節點。

部署

Redis 集羣節點的安裝與單節點服務相同,差別僅在於部署方式。

假設三臺服務器地址以下:

  • 服務 A:127.0.0.1
  • 服務 B:127.0.0.2
  • 服務 C:127.0.0.3

分配以下:

127.0.0.1 127.0.0.2 127.0.0.3
127.0.0.1:6381 127.0.0.2:6383 127.0.0.3:6385
127.0.0.1:6382 127.0.0.2:6384 127.0.0.3:6386

(1)建立節點目錄

我我的偏好將軟件放在 /opt 目錄下,在個人機器中,Redis 都安裝在 /opt/redis/redis-5.0.4 目錄下。因此,下面的命令和配置都假設 Redis 安裝目錄爲 /opt/redis/redis-5.0.4

確保機器上已經安裝了 Redis 後,執行如下命令,建立 Redis 集羣節點實例目錄:

  • 127.0.0.1
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6381
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6382
複製代碼
  • 127.0.0.2
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6383
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6384
複製代碼
  • 127.0.0.3
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6385
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6386
複製代碼

(2)集羣節點實例配置

每一個實例目錄下,新建 redis.conf 配置文件。

實例配置模板以 6381 節點爲例(其餘節點,徹底替換配置中的端口號 6381 便可),以下:

# 端口號
port 6381
# 綁定的主機端口(0.0.0.0 表示容許遠程訪問)
bind 0.0.0.0
# 以守護進程方式啓動
daemonize yes

# 開啓集羣模式
cluster-enabled yes
# 集羣的配置,配置文件首次啓動自動生成
cluster-config-file /opt/redis/redis-5.0.4/cluster/6381/6381.conf
# 請求超時時間,設置 10 秒
cluster-node-timeout 10000

# 開啓 AOF 持久化
appendonly yes
# 數據存放目錄
dir /opt/redis/redis-5.0.4/cluster/6381
# 進程文件
pidfile /var/run/redis-cluster/redis-6381.pid
# 日誌文件
logfile /opt/redis/redis-5.0.4/cluster/6381/6381.log
複製代碼

(3)啓動 Redis 節點

Redis 的 utils/create-cluster 目錄下自帶了一個名爲 create-cluster 的腳本工具,能夠利用它來新建、啓動、中止、重啓 Redis 節點。

腳本中有幾個關鍵參數:

  • PORT=30000 - 初始端口號
  • TIMEOUT=2000 - 超時時間
  • NODES=6 - 節點數
  • REPLICAS=1 - 備份數

腳本中的每一個命令項會根據初始端口號,以及設置的節點數,遍歷的去執行操做。

因爲前面的規劃中,節點端口是從 6381 ~ 6386,因此須要將 PORT 變量設爲 6380。

腳本中啓動每一個 Redis 節點是經過指定命令行參數來配置屬性。因此,咱們須要改一下:

if [ "$1" == "start" ]
then
    while [ $((PORT < ENDPORT)) != "0" ]; do
        PORT=$((PORT+1))
        echo "Starting $PORT"
        /opt/redis/redis-5.0.4/src/redis-server /opt/redis/redis-5.0.4/cluster/${PORT}/redis.conf
    done
    exit 0
fi
複製代碼

好了,在每臺服務器上,都執行 ./create-cluster start 來啓動節點。

而後,經過 ps 命令來確認 Redis 進程是否已經工做:

$ ps -ef | grep redis
root     12036     1 12 16:26 ?        00:08:28 /opt/redis/redis-5.0.4/src/redis-server 0.0.0.0:6381 [cluster]
root     12038     1  0 16:26 ?        00:00:03 /opt/redis/redis-5.0.4/src/redis-server 0.0.0.0:6382 [cluster]
複製代碼

(4)啓動集羣

經過 redis-cli --cluster create 命令能夠自動配置集羣,以下:

$ /opt/redis/redis-5.0.4/src/redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.2:6383 127.0.0.2:6384 127.0.0.3:6385 127.0.0.3:6386 --cluster-replicas 1
複製代碼

若是啓動成功,能夠看到以下信息:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.2:6384 to 127.0.0.1:6381
Adding replica 127.0.0.3:6386 to 127.0.0.2:6383
Adding replica 127.0.0.1:6382 to 127.0.0.3:6385
M: 75527b790e46530ea271a5b78f9e0fd9030f68e0 127.0.0.1:6381
   slots:[0-5460] (5461 slots) master
S: 031dd0fd5ad90fa26fcf45d49ad906d063611a6d 127.0.0.1:6382
   replicates 53012ebdd25005840da9ecbe07d937296a264206
M: 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884 127.0.0.2:6383
   slots:[5461-10922] (5462 slots) master
S: 016ae9624202891cc6f2b480ff0634de478197fb 127.0.0.2:6384
   replicates 75527b790e46530ea271a5b78f9e0fd9030f68e0
M: 53012ebdd25005840da9ecbe07d937296a264206 127.0.0.3:6385
   slots:[10923-16383] (5461 slots) master
S: b6d70f2ed78922b1dcb7967ebe1d05ad9157fca8 127.0.0.3:6386
   replicates 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 127.0.0.1:6381)
M: 75527b790e46530ea271a5b78f9e0fd9030f68e0 127.0.0.1:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884 127.0.0.2:6383
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 016ae9624202891cc6f2b480ff0634de478197fb 127.0.0.2:6384
   slots: (0 slots) slave
   replicates 75527b790e46530ea271a5b78f9e0fd9030f68e0
M: 53012ebdd25005840da9ecbe07d937296a264206 127.0.0.3:6385
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 031dd0fd5ad90fa26fcf45d49ad906d063611a6d 127.0.0.1:6382
   slots: (0 slots) slave
   replicates 53012ebdd25005840da9ecbe07d937296a264206
S: b6d70f2ed78922b1dcb7967ebe1d05ad9157fca8 127.0.0.3:6386
   slots: (0 slots) slave
   replicates 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
複製代碼

(5)平常維護操做

  • 關閉集羣 - ./create-cluster stop
  • 檢查集羣是否健康(指定任意節點便可):./redis-cli --cluster check <ip:port>
  • 嘗試修復集羣節點:./redis-cli --cluster fix <ip:port>

Redis 命令

命令詳細用法,請參考 Redis 命令官方文檔

搬遷兩張 cheat sheet 圖,原址:www.cheatography.com/tasjaevan/c…

壓力測試

參考官方文檔:How fast is Redis?

Redis 自帶了一個性能測試工具:redis-benchmark

(1)基本測試

$ redis-benchmark -q -n 100000
複製代碼
  • -q 表示靜默(quiet)執行
  • -n 100000 請求 10 萬次

(2)測試指定讀寫指令

$ redis-benchmark -t set,lpush -n 100000 -q
SET: 74239.05 requests per second
LPUSH: 79239.30 requests per second
複製代碼

(3)測試 pipeline 模式下指定讀寫指令

redis-benchmark -n 1000000 -t set,get -P 16 -q
SET: 403063.28 requests per second
GET: 508388.41 requests per second
複製代碼

客戶端

推薦使用 RedisDesktopManager

腳本

若是想傻瓜式安裝一個 Redis 單節點服務,可使用個人 安裝腳本

參考資料

相關文章
相關標籤/搜索