最近進行了Redis集羣的學習和配置,可以參考了以下博客:
- 主線
redis5.0後放棄了Ruby的集羣方式,大大簡化了集羣的構建複雜度
Redis容災部署哨兵(sentinel)機制配置詳解及原理介紹(配置)
Redis哨兵模式(sentinel)學習總結及部署記錄(主從複製、讀寫分離、主從切換)(深入原理)
- 分支
redis requires ruby version 2.2.2的解決方案
1.1 哈希槽分配異常
- 出現情況
有以下出錯提示:
Please fix your cluster problems before resharding
- 出現場景
在哈希槽沒有被正常分配時出現,這個時候重新分配哈希槽的時候會出現上述的出錯提示
- 解決方法
這個時候使用指令
/bin/redis-trib fix 127.0.0.1:7000
此時該指令會幫你重新分配哈希槽,分配後集羣便會恢復正常。
1.2 結點標誌異常
- 出現情況
在redis-cli
客戶端中使用cluster nodes
出現:
78641a9cf0098e1c5c07821266dcd1feae21bcd3 :0 fail,noaddr - 1530942381678 1530942361875 0 disconnected
- 出現場景
因爲使用kill直接殺掉進程導致結點標誌沒有被清除,而殘留下來的結點標誌可能會佔用哈希槽造成不必要的錯誤。
- 解決方法
可以在redis-cli
客戶端中使用指令cluster reset
重新設置結點標誌。使用cluster meet
添加主節點,使用./redis-trip add-node --slave
添加子節點。
此時還存在哈希槽分配不均的問題,使用./redis-trib reshard
重新分配哈希槽,最後使用done結束選擇數據源。
1.3 等待加入
- 出現情況
在給集羣增加節點或者新建集羣是會出現以下提示並且處於無限等待中:
Waiting for the cluster to join....................................
- 解決方法
在本篇文章中有以下方法[How to solve redis cluster “Waiting for the cluster to join” issue?]:
1、 由於結點間數據的傳輸需要一個端口,而這個端口是與客戶端端口分開的,一般是客戶端端口上加上1000。比如客戶端端口爲6379,那麼服務端端口則爲16379。使用iptable -F
關閉防火牆或者開啓相對應的端口即可
2、檢查redis.conf
中的bind
設置,將127.0.0.1移除或者將其移到LAN IP後。
在本篇文章中有以下方法[Redis 3.2.1集羣搭建](https://www.cnblogs.com/yuanermen/p/5717885.html)
1、在redis-cli -c -p 700*
中分別進入redis各節點的客戶端命令窗口, 依次輸入cluster meet 192.168.1.238 7000
,與進入等待狀態的7000結點建立連接。
另外還有:
1、在redis.conf文件中把bind 127.0.0.1本地環回口改爲物理接口.
不過以上方法測試後都失敗了,最後我使用了1.2節的方法解決了該問題。
1.4 配置錯誤
- 出現情況
使用指令./redis-trip check ip:port
時出現以下提示
Redis [ERR] Nodes don’t agree about configuration!
- 出現場景
在哈西槽分配異常時可能出現,比如已經fail掉的節點佔有哈西槽
- 解決方法
這個時候使用指令
/bin/redis-trib fix 127.0.0.1:7000
此時該指令會幫你重新分配哈希槽,分配後集羣便會恢復正常。
1.5 指定地址不合法
- 出現情況
配置完所有主節點後,報
" ERR Invalid node address specified"
- 解決方法
由於redis-trib.rb 對域名或主機名支持不好,故在創建集羣的時候要使用ip:port的方式
redis-trib.rb create ip1:port1 ip2:port2 ip3:port3
1.6 slot插槽被佔用了
- 出現情況
創建集羣時報
err slot 0 is already busy (redis::commanderror)
- 解決方法
這是由於之間創建集羣沒有成功,需要將nodes.conf
和dir
裏面的文件全部刪除(注意不要刪除了redis.conf
)
或者用redis-cli
登錄到每個節點執行flushall
和cluster reset
就可以了。
1.6 已經擁有插槽
- 出現情況
ERR I'm already the owner of hash slot 0 (Redis::CommandError)
- 解決方法
搭建集羣前時,以前redis的舊數據和配置信息沒有清理乾淨。這個時候使用下列指令進行修復
/bin/redis-trib fix 127.0.0.1:7000
1.7 語法錯誤
- 出現情況
在用redis-tirb
工具進行reshard 的時候,報如下錯誤:
[ERR] Calling MIGRATE ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)
- 出現場景
ruby gem安裝的redis庫,版本不能使用最新的4.x版本的,否則redis-trib reshard 127.0.0.1:7117
重新分片會報語法錯誤
- 解決方法
1、卸載安裝的redis庫,gem uninstall redis
2、安裝3.x版本,gem install redis -v 3.3.5 測試3.2.1到3.3.5都可以,4.x以上的分片報錯。
1.8 結點非空
- 出現情況
創建集羣的時候出現以下錯誤提示:
[ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
- 解決方法
這是由於7000結點上還有上次集羣的信息。在redus-cli
客戶端狀態下仍然可以看到7000結點建立的連接。
a5ec74f676af17dc88433a84975a94f06f4219fe 127.0.0.1:7000 myself,master - 0 0 10 connected 10923-16383
0eabc86d1131fb7e6c33560d71fc9e717f9ae13d 127.0.0.1:7005 slave 3ee71b59d8f4b58e463bceb4af09e9a3bc648abb 0 1558247953061 12 connected
需要將所有的nodes結點信息的文件刪除,若刪除後仍有該錯誤提示。則需要對需要建立集羣的結點使用cluster reset
指令清除所有結點信息
1.9 redis主從複製失敗等
- 出現情況
包括主從複製失敗、主從故障轉移失敗、哨兵機制無法檢測到監測主節點的slave結點、slave結點中的master_link_status爲down。
- 解決方法
存在以下情況:
1、 防火牆攔截了端口的訪問
2、conf文件中沒有用bind綁定主服務器地址
可以查看該文章尋找解決方案:redis主從複製失敗(master_link_status:down)
1.10 其他
可以參考其他博客: