給redis cluster集群加上認證功能

  • 2019 年 10 月 5 日
  • 筆記

接上一篇部落格:http://lee90.blog.51cto.com/10414478/1863242

給redis cluster集群加上認證功能

【下面以最常用的3台主機6個實例這種架構來搭建redis集群】

首先搭建並啟動最基本的環境:

#node1上

redis-server /usr/local/redis_cluster/7000/redis.conf

redis-server /usr/local/redis_cluster/7001/redis.conf

#node2上

redis-server /usr/local/redis_cluster/7003/redis.conf

redis-server /usr/local/redis_cluster/7004/redis.conf

#node3上

redis-server /usr/local/redis_cluster/7006/redis.conf

redis-server /usr/local/redis_cluster/7007/redis.conf

然後在任意節點上執行創建cluster:

redis-trib.rb create –replicas 1 192.168.2.11:7000 192.168.2.11:7001 192.168.2.12:7003 192.168.2.12:7004 192.168.2.13:7006 192.168.2.13:7007

然後,我們登錄到node1執行下面的操作

# redis-cli -h 192.168.2.11 -p 7000 -c

> config set masterauth abc

> config set requirepass abc

> config rewrite

這幾步操作完成後,就完成了添加密碼的操作。密碼是abc。

注意事項:

1.如果是使用redis-trib.rb工具構建集群,集群構建完成前不要配置密碼,集群構建完畢再通過config set + config rewrite命令逐個機器設置密碼

2.如果對集群設置密碼,那麼requirepass和masterauth都需要設置,否則發生主從切換時,就會遇到授權問題,可以模擬並觀察日誌

3.各個節點的密碼都必須一致,否則Redirected就會失敗

各個節點都完成上面的3條config操作後,在redis-cli命令行里再執行shutdown安全的關閉redis。

關閉後,我們再次啟動各個節點的redis服務,然後試下redis-cli -h 192.168.2.11 -p 7000 -c  就會發現執行命令提示沒有認證的字樣了,

只有執行# redis-cli  -h 192.168.2.11 -p 7000 -c -a 'abc'  這樣帶認證的才能成功登陸到redis上。

此外,我們看下各節點的redis.conf,可以發現最後多了3行內容,如下:

我後來再次實驗中好像發現slave節點的這2條認證的配置丟失了,導致redis-trib.rb check時候發現無法連接到部分主機。如果出現這種情況的話,手動編輯redis.conf將上面的認證參數加進去,重啟redis即可。

做到這裡還不夠,現在我們執行redis-trib.rb check 192.168.2.11:7001 檢查集群狀態的話,會報錯如下圖:

這是因為我們給redis配置密碼導致的redis-trib.rb無法登陸,還要做如下修改:

vi /usr/local/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.1/lib/redis/client.rb

帶密碼認證的redis停止的腳本:

#node1上

redis-cli  -h 192.168.2.11 -p 7000 -c -a abc shutdown

redis-cli  -h 192.168.2.11 -p 7001 -c -a abc shutdown

#node2上

redis-cli  -h 192.168.2.12 -p 7003 -c -a abc shutdown

redis-cli  -h 192.168.2.12 -p 7004 -c -a abc shutdown

#node3上

redis-cli  -h 192.168.2.13 -p 7006 -c -a abc shutdown

redis-cli  -h 192.168.2.13 -p 7007 -c -a abc shutdown

下面是一個網上找的測試腳本  #!/bin/bash  # 地址寫集群里的任意的地址,注意加-c選項  REDISCLT="redis-cli -h 192.168.2.10 -p 6379 -c -n 0 set"  ID=1     while [ $ID -le 50000000 ]  do   INSTANCE_NAME="i-2-$ID-VM"   UUID=`cat /proc/sys/kernel/random/uuid`   CREATED=`date "+%Y-%m-%d %H:%M:%S"`   $REDISCLT vm_instance:$ID:instance_name "$INSTANCE_NAME"   $REDISCLT vm_instance:$ID:uuid "$UUID"   $REDISCLT vm_instance:$ID:created "$CREATED"   $REDISCLT vm_instance:$INSTANCE_NAME:id "$ID"   ID=`expr $ID + 1`  done

測試了下,如果你寫的是slave節點數據,它會自動跑到對應的master上去寫數據。