Redis集群的關閉與重啟操作
Redis集群關閉與重啟
1、註意
[root@master bin]# ./redis-cli --cluster create 192.168.230.21:7001 192.168.230.21:7002 192.168.230.21:7003 192.168.230.21:8001 192.168.230.21:8002 192.168.230.21:8003 --cluster-replicas 1 -a 123456
上面的命令隻能在新創健集群的時候執行一次,目的是為瞭建立內部各個節點的對應關系,比如主從關系,這些關系僅且隻能在一個集群中初始化時對應一次;
如果再此執行,則會出現如下錯誤:
[root@master bin]# ./redis-cli –cluster create 192.168.230.21:7001 192.168.230.21:7002 192.168.230.21:7003 192.168.230.21:8001 192.168.230.21:8002 192.168.230.21:8003 –cluster-replicas 1 -a 123456
Warning: Using a password with ‘-a’ or ‘-u’ option on the command line interface may not be safe.
[ERR] Node 192.168.230.21:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
2、集群關閉
集群關閉直接將各個節點的進程kill掉即可;
[root@master bin]# ps -ef | grep redis root 11516 1 0 16:15 ? 00:00:10 ./redis-server 192.168.230.21:7002 [cluster] root 11521 1 0 16:15 ? 00:00:09 ./redis-server 192.168.230.21:7003 [cluster] root 11526 1 0 16:15 ? 00:00:10 ./redis-server 192.168.230.21:8001 [cluster] root 11531 1 0 16:15 ? 00:00:10 ./redis-server 192.168.230.21:8002 [cluster] root 11536 1 0 16:15 ? 00:00:10 ./redis-server 192.168.230.21:8003 [cluster] root 11869 1 0 16:33 ? 00:00:07 ./redis-server 192.168.230.21:7001 [cluster] root 12528 9737 0 17:39 pts/7 00:00:00 grep --color=auto redis
[root@master bin]# kill -9 11516 [root@master bin]# kill -9 11521 [root@master bin]# kill -9 11526 [root@master bin]# kill -9 11531 [root@master bin]# kill -9 11536 [root@master bin]# kill -9 11869
[root@master bin]# ps -ef | grep redis root 12552 9737 0 17:40 pts/7 00:00:00 grep --color=auto redis
3、集群開啟及連接
(1)集群開啟
[root@master bin]# ./redis-server /opt/softWare/redis-cluster/redis01/redis.conf 12553:C 31 Mar 2020 17:40:59.875 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 12553:C 31 Mar 2020 17:40:59.875 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=12553, just started 12553:C 31 Mar 2020 17:40:59.875 # Configuration loaded [root@master bin]# ./redis-server /opt/softWare/redis-cluster/redis02/redis.conf 12558:C 31 Mar 2020 17:41:03.697 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 12558:C 31 Mar 2020 17:41:03.697 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=12558, just started 12558:C 31 Mar 2020 17:41:03.697 # Configuration loaded [root@master bin]# ./redis-server /opt/softWare/redis-cluster/redis03/redis.conf 12563:C 31 Mar 2020 17:41:06.702 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 12563:C 31 Mar 2020 17:41:06.702 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=12563, just started 12563:C 31 Mar 2020 17:41:06.702 # Configuration loaded [root@master bin]# ./redis-server /opt/softWare/redis-cluster/redis04/redis.conf 12568:C 31 Mar 2020 17:41:09.742 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 12568:C 31 Mar 2020 17:41:09.742 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=12568, just started 12568:C 31 Mar 2020 17:41:09.742 # Configuration loaded [root@master bin]# ./redis-server /opt/softWare/redis-cluster/redis05/redis.conf 12574:C 31 Mar 2020 17:41:12.760 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 12574:C 31 Mar 2020 17:41:12.760 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=12574, just started 12574:C 31 Mar 2020 17:41:12.760 # Configuration loaded [root@master bin]# ./redis-server /opt/softWare/redis-cluster/redis06/redis.conf 12580:C 31 Mar 2020 17:41:16.406 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 12580:C 31 Mar 2020 17:41:16.406 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=12580, just started 12580:C 31 Mar 2020 17:41:16.406 # Configuration loaded
[root@master bin]# ps -ef | grep redis root 12554 1 0 17:40 ? 00:00:00 ./redis-server 192.168.230.21:7001 [cluster] root 12559 1 0 17:41 ? 00:00:00 ./redis-server 192.168.230.21:7002 [cluster] root 12564 1 0 17:41 ? 00:00:00 ./redis-server 192.168.230.21:7003 [cluster] root 12569 1 0 17:41 ? 00:00:00 ./redis-server 192.168.230.21:8001 [cluster] root 12575 1 0 17:41 ? 00:00:00 ./redis-server 192.168.230.21:8002 [cluster] root 12581 1 0 17:41 ? 00:00:00 ./redis-server 192.168.230.21:8003 [cluster] root 12587 9737 0 17:41 pts/7 00:00:00 grep --color=auto redis
(2)集群連接
[root@master bin]# ./redis-cli -p 7001 -a 123456 -h 192.168.230.21 -a 123456 -c Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 192.168.230.21:7001> DBSIZE (integer) 2 192.168.230.21:7001> keys * 1) "aa" 2) "ss" 192.168.230.21:7001> set str STR -> Redirected to slot [6928] located at 192.168.230.21:7002 OK 192.168.230.21:7002>
Redis的三種集群方式
redis有三種集群方式:主從復制,哨兵模式和集群。
1.主從復制
主從復制原理:
- 從服務器連接主服務器,發送SYNC命令;
- 主服務器接收到SYNC命名後,開始執行BGSAVE命令生成RDB文件並使用緩沖區記錄此後執行的所有寫命令;
- 主服務器BGSAVE執行完後,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令;
- 從服務器收到快照文件後丟棄所有舊數據,載入收到的快照;
- 主服務器快照發送完畢後開始向從服務器發送緩沖區中的寫命令;
- 從服務器完成對快照的載入,開始接收命令請求,並執行來自主服務器緩沖區的寫命令;(從服務器初始化完成)
- 主服務器每執行一個寫命令就會向從服務器發送相同的寫命令,從服務器接收並執行收到的寫命令(從服務器初始化完成後的操作)
主從復制優缺點:
優點:
- 支持主從復制,主機會自動將數據同步到從機,可以進行讀寫分離
- 為瞭分載Master的讀操作壓力,Slave服務器可以為客戶端提供隻讀操作的服務,寫服務仍然必須由Master來完成
- Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力。
- Master Server是以非阻塞的方式為Slaves提供服務。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求。
- Slave Server同樣是以非阻塞的方式完成數據同步。在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數據
缺點:
- Redis不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復。
- 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,降低瞭系統的可用性。
- Redis較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。
2.哨兵模式
當主服務器中斷服務後,可以將一個從服務器升級為主服務器,以便繼續提供服務,但是這個過程需要人工手動來操作。 為此,Redis 2.8中提供瞭哨兵工具來實現自動化的系統監控和故障恢復功能。
哨兵的作用就是監控Redis系統的運行狀況。它的功能包括以下兩個。
(1)監控主服務器和從服務器是否正常運行。
(2)主服務器出現故障時自動將從服務器轉換為主服務器。
哨兵的工作方式:
- 每個Sentinel(哨兵)進程以每秒鐘一次的頻率向整個集群中的Master主服務器,Slave從服務器以及其他Sentinel(哨兵)進程發送一個 PING 命令。
- 如果一個實例(instance)距離最後一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel(哨兵)進程標記為主觀下線(SDOWN)
- 如果一個Master主服務器被標記為主觀下線(SDOWN),則正在監視這個Master主服務器的所有 Sentinel(哨兵)進程要以每秒一次的頻率確認Master主服務器的確進入瞭主觀下線狀態
- 當有足夠數量的 Sentinel(哨兵)進程(大於等於配置文件指定的值)在指定的時間范圍內確認Master主服務器進入瞭主觀下線狀態(SDOWN), 則Master主服務器會被標記為客觀下線(ODOWN)
- 在一般情況下, 每個 Sentinel(哨兵)進程會以每 10 秒一次的頻率向集群中的所有Master主服務器、Slave從服務器發送 INFO 命令。
- 當Master主服務器被 Sentinel(哨兵)進程標記為客觀下線(ODOWN)時,Sentinel(哨兵)進程向下線的 Master主服務器的所有 Slave從服務器發送 INFO 命令的頻率會從 10 秒一次改為每秒一次。
- 若沒有足夠數量的 Sentinel(哨兵)進程同意 Master主服務器下線, Master主服務器的客觀下線狀態就會被移除。若 Master主服務器重新向 Sentinel(哨兵)進程發送 PING 命令返回有效回復,Master主服務器的主觀下線狀態就會被移除。
哨兵模式的優缺點
優點:
- 哨兵模式是基於主從模式的,所有主從的優點,哨兵模式都具有。
- 主從可以自動切換,系統更健壯,可用性更高。
缺點:
- Redis較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。
3.Redis-Cluster集群
redis的哨兵模式基本已經可以實現高可用,讀寫分離 ,但是在這種模式下每臺redis服務器都存儲相同的數據,很浪費內存,所以在redis3.0上加入瞭cluster模式,實現的redis的分佈式存儲,也就是說每臺redis節點上存儲不同的內容。
Redis-Cluster采用無中心結構,它的特點如下:
- 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
- 節點的fail是通過集群中超過半數的節點檢測失效時才生效。
- 客戶端與redis節點直連,不需要中間代理層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可。
工作方式:
在redis的每一個節點上,都有這麼兩個東西,一個是插槽(slot),它的的取值范圍是:0-16383。還有一個就是cluster,可以理解為是一個集群管理的插件。當我們的存取的key到達的時候,redis會根據crc16的算法得出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作。
為瞭保證高可用,redis-cluster集群引入瞭主從模式,一個主節點對應一個或者多個從節點,當主節點宕機的時候,就會啟用從節點。當其它主節點ping一個主節點A時,如果半數以上的主節點與A通信超時,那麼認為主節點A宕機瞭。如果主節點A和它的從節點A1都宕機瞭,那麼該集群就無法再提供服務瞭。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。