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 引數讓結果只顯示每秒執行的請求數。
我們可以從結果中看出主從的效能。
參考資料
2. Redis 安全