給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上去寫數據。