1. 程式人生 > >redis主從那些事

redis主從那些事

redis 作為一個數據結構伺服器,支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,對於主從和叢集兩種方式傻傻分不清楚,這篇文章意在回顧一下 redis 主從。

 一、安裝

官網地址: https://redis.io 

1、此處下載的是 5.0.2 最新穩定版

wget http://download.redis.io/releases/redis-5.0.2.tar.gz

2、之後進行編譯安裝

tar zxf redis-5.0.2.tar.gz -C /usr/local/      # 解壓檔案到 /usr/local/ 目錄
cd redis-5.0.2/        # 進入 redis 編譯目錄
make        # 編譯

3、為了方便放置啟動檔案與配置,我們在 /usr/local 下新建一個 redis 目錄,並建立 bin 目錄和 conf 目錄。

[root@reset local]# mkdir redis
[root@reset local]# mkdir redis/bin
[root@reset local]# mkdir redis/conf

4、把前面編譯後的redis的可執行檔案(在redis-5.0.2/src/下),複製到/usr/local/redis/bin裡面去

[root@reset local]# cp redis-5.0.2/src/redis* redis/bin/

5、redis 提供給我們了一個預設的配置檔案 redis.conf ,把它複製到/usr/local/redis

目錄下,並改名為6379.conf

[root@reset local]# cp redis-5.0.2/redis.conf redis/conf/6379.conf

6、刪除一些不必要的檔案(我們只需要 redis 的可執行檔案)

[root@reset bin]# rm *.c *.o *.h
rm: remove regular file ‘redis-benchmark.c’? y
rm: remove regular file ‘redis-check-aof.c’? y
rm: remove regular file ‘redis-check-rdb.c’? y
rm: remove regular file ‘redis-cli.c’? y
rm: remove regular file ‘redis-benchmark.o’? y
rm: remove regular file ‘redis-check-aof.o’? y
rm: remove regular file ‘redis-check-rdb.o’? y
rm: remove regular file ‘redis-cli.o’? y
rm: remove regular file ‘redisassert.h’? y
rm: remove regular file ‘redismodule.h’? y
[root@reset bin]# ll
total 40528
-rwxr-xr-x 1 root root 4365288 Dec  8 15:26 redis-benchmark
-rwxr-xr-x 1 root root 8085504 Dec  8 15:26 redis-check-aof
-rwxr-xr-x 1 root root 8085504 Dec  8 15:26 redis-check-rdb
-rwxr-xr-x 1 root root 4786544 Dec  8 15:26 redis-cli
-rwxr-xr-x 1 root root 8085504 Dec  8 15:26 redis-sentinel
-rwxr-xr-x 1 root root 8085504 Dec  8 15:26 redis-server
-rwxr-xr-x 1 root root    3600 Dec  8 15:26 redis-trib.rb

 

二、配置主從

1、接下來我們就修改配置檔案

vim /usr/local/redis/conf/6379.conf

修改如下幾個配置:

daemonize no 
修改為:
daemonize yes  (後臺程式方式執行)

pidfile /var/run/redis_6379.pid
修改為:
pidfile /usr/local/redis/redis_6379.pid
(把pidfile生成到有許可權的目錄下)

2、啟動

[root@reset conf]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/6379.conf 
16983:C 08 Dec 2018 15:37:54.905 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16983:C 08 Dec 2018 15:37:54.905 # Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=16983, just started
16983:C 08 Dec 2018 15:37:54.905 # Configuration loaded
[root@reset conf]# 
[root@reset conf]# netstat -antlp|grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      16984/redis-server 

3、配置從節點

[root@reset conf]# cp 6379.conf 6380.conf 

修改6380.conf 
修改對應的埠和pid配置 
然後加入slaveof 127.0.0.1 6379

port 6379
修改為:
port 6380

pidfile /usr/local/redis/redis_6379.pid
修改為:
pidfile /usr/local/redis/redis_6380.pid

增加一行:
slaveof 127.0.0.1 6379

4、啟動從節點

[root@reset conf]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/6380.conf 
17031:C 08 Dec 2018 15:45:45.864 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17031:C 08 Dec 2018 15:45:45.864 # Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=17031, just started
17031:C 08 Dec 2018 15:45:45.864 # Configuration loaded

5、確認主從連線

[root@reset conf]# netstat -antlp|grep 6380
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      17032/redis-server  
[root@reset conf]# 
[root@reset conf]# netstat -antlp|grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      16984/redis-server  
tcp        0      0 127.0.0.1:35540         127.0.0.1:6379          ESTABLISHED 17032/redis-server # 從 
tcp        0      0 127.0.0.1:6379          127.0.0.1:35540         ESTABLISHED 16984/redis-server  

6、啟動 redis 客戶端

[root@reset redis]# ./bin/redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> 
127.0.0.1:6379> info

輸入 info 命令後,我們將看到主從資訊

# Replication
role:master  # 主
connected_slaves:1  # 有一個從主機
slave0:ip=127.0.0.1,port=6380,state=online,offset=238,lag=1  # 從節點的IP地址加埠

7、在主節點新增值

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"

8、在從節點上檢視值

[root@reset redis]# ./bin/redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> get name
"zhangsan"

現在 2 個例項已經完成了資料的同步。

9、在從上進行新增操作

127.0.0.1:6380> set name lisi
(error) READONLY You can't write against a read only replica.

這裡會提示在從節點上是允許只讀的。

 

三、安全

我們可以通過 redis 的配置檔案設定密碼引數,這樣客戶端連線到 redis 服務就需要密碼驗證,這樣可以讓 redis 服務更安全。

127.0.0.1:6379> CONFIG GET requirepass             # 檢視密碼
1) "requirepass"
2) ""
127.0.0.1:6379> CONFIG set requirepass redis123    # 設定密碼
OK
127.0.0.1:6379> CONFIG GET requirepass             # 這時我們會發現已經需要認證了
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth redis123                      # 進行密碼認證
OK
127.0.0.1:6379> CONFIG GET requirepass             # 檢視到密碼
1) "requirepass"
2) "redis123"

這時我們會發現主從同步失敗了。

role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down

所以我們需要在配置檔案中增加 masterauth 認證密碼

masterauth  "redis123"   # 主從認證密碼,否則主從不能同步

現在就能看到 master 連線狀態已經成功了

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up

接著就能看到之前新增的 age 資訊了

127.0.0.1:6380> get age
"22"

 

四、效能測試

Redis 效能測試是通過同時執行多個命令實現的。

redis 效能測試的基本命令如下:

redis-benchmark [option] [option value]

下面同時執行 10000 個請求來檢測效能:

[root@reset redis]# bin/redis-benchmark -n 10000 -q
PING_INLINE: 65359.48 requests per second
PING_BULK: 68493.15 requests per second
SET: 66225.17 requests per second
GET: 66666.66 requests per second
INCR: 67567.57 requests per second
LPUSH: 65789.48 requests per second
RPUSH: 66225.17 requests per second
LPOP: 67114.09 requests per second
RPOP: 67567.57 requests per second
SADD: 66225.17 requests per second
HSET: 65789.48 requests per second
SPOP: 65789.48 requests per second
LPUSH (needed to benchmark LRANGE): 66225.17 requests per second
LRANGE_100 (first 100 elements): 66666.66 requests per second
LRANGE_300 (first 300 elements): 67567.57 requests per second
LRANGE_500 (first 450 elements): 66225.17 requests per second
LRANGE_600 (first 600 elements): 67114.09 requests per second
MSET (10 keys): 58139.53 requests per second

使用了多個引數來測試 redis 效能:

[root@reset redis]# bin/redis-benchmark -h 127.0.0.1 -p 6379 -n 10000 -t set,lpush  -q
SET: 62893.08 requests per second
LPUSH: 64102.56 requests per second

[root@reset redis]# bin/redis-benchmark -h 127.0.0.1 -p 6380 -n 10000 -t set,lpush  -q
SET: 59171.60 requests per second
LPUSH: 61349.69 requests per second

以上例項中主機為 127.0.0.1,埠號為 6379,執行的命令為 set,lpush,請求數為 10000,通過 -q 引數讓結果只顯示每秒執行的請求數。

我們可以從結果中看出主從的效能。

 

 

 

 

參考資料

1. Redis叢集 - 配置最簡單的Redis主從

2. Redis 安全

3. Linux Redis安裝配置及使用詳解

4. Redis 主從配置密碼以及哨兵