參考文章:html
https://www.cnblogs.com/boshen-hzb/p/7699783.htmljava
sentinel monitor mymaster 127.0.0.1 7001 2node
一:安裝redisredis
1.參照網上的例子。確保機器上面有gcc、ruby環境。驗證的命令是:gcc -v、ruby-v。若是沒有這兩個環境,就須要安裝。brew install gcc;brew install rubyruby
2.下載redis源碼。下載地址:http://www.redis.cn/。服務器
3.編譯安裝redis測試
make make install PREFIX=/usr/local/redis cp redis.conf /usr/local/redis/bin/redis.conf
4.運行redis命令行
在/usr/local/redis/bin/目錄下面,運行 ./redis-server redis.conf 命令線程
5.驗證redis是否啓動成功,仍是在usr/local/redis/bin/目錄下面3d
MacBook-Pro:bin a$ ./redis-cli -p 6379 127.0.0.1:6379> get (error) ERR wrong number of arguments for 'get' command 127.0.0.1:6379> set a abc OK 127.0.0.1:6379> get a "abc" 127.0.0.1:6379>
二:安裝集羣(集羣模式)
1.建立文件夾:usr/local/redis-cluster/
2.將redis文件複製到該目錄下面,而且從新命名redis1.複製redis1文件夾五分,從reidis1到redis6
3.要作集羣就應當修改這些裏面的配置文件。主要的修改內容以下:端口修改從7001-7006
daemonize yes port 7001 #日誌文件 logfile "./redis-7001.log" protected-mode no pidfile /var/run/redis_7001.pid cluster-enabled yes
#注意,這裏必定要改,否則默認是經過nodes-6379配置啓動,當你啓動第二臺的時候,就會爆文件被佔用的錯誤
cluster-config-file nodes-7001.conf
2.修改文件權限,不然可能會爆沒有權限訪問對應的日誌文件
chmod 777 xxx
最好將配置redis集羣的文件夾的全部者改成當前系統登陸人,不然可能會出現一些莫名其妙的錯誤
chown -R a /usr/local/redis-cluster/
3。配置完後,逐個啓動cluster。
MacBook-Pro:redis-cluster a$ ./redis1/redis-server ./redis1/nodes-7001.conf MacBook-Pro:redis-cluster a$ ./redis3/redis-server ./redis3/nodes-7003.conf MacBook-Pro:redis-cluster a$ ./redis4/redis-server ./redis4/nodes-7004.conf MacBook-Pro:redis-cluster a$ ./redis5/redis-server ./redis5/nodes-7005.conf MacBook-Pro:redis-cluster a$ ./redis6/redis-server ./redis6/nodes-7006.conf
查看已經啓動的線程信息
MacBook-Pro:redis-cluster a$ ps aux|grep redis a 3084 0.0 0.0 4276968 884 s003 S+ 4:43下午 0:00.00 grep redis a 3080 0.0 0.0 4293756 2200 ?? Ss 4:43下午 0:00.01 ./redis6/redis-server 127.0.0.1:7006 [cluster] a 3078 0.0 0.0 4301948 2204 ?? Ss 4:43下午 0:00.03 ./redis5/redis-server 127.0.0.1:7005 [cluster] a 3075 0.0 0.0 4293756 2208 ?? Ss 4:42下午 0:00.04 ./redis4/redis-server 127.0.0.1:7004 [cluster] a 3072 0.0 0.0 4301948 2216 ?? Ss 4:42下午 0:00.05 ./redis3/redis-server 127.0.0.1:7003 [cluster] a 3068 0.0 0.0 4293756 2188 ?? Ss 4:41下午 0:00.09 ./redis1/redis-server 127.0.0.1:7001 [cluster] a 3062 0.0 0.0 4310140 2256 ?? Ss 4:41下午 0:00.12 ./redis2/redis-server 127.0.0.1:7002 [cluster]
啓動成功後輸出。能夠看到,01,02,03是master。其餘的做爲從
#該命令告訴系統個人redis集羣由哪些節點組成
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
MacBook-Pro:redis-cluster a$ ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7006 to 127.0.0.1:7002 Adding replica 127.0.0.1:7004 to 127.0.0.1:7003 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001 slots:0-5460 (5461 slots) master M: c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002 slots:5461-10922 (5462 slots) master M: a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003 slots:10923-16383 (5461 slots) master S: 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004 replicates c3414bd40496b9f2910f72a41b17463d6ac9d708 S: 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005 replicates a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 S: 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006 replicates 9ced24811d441e90c1eb45a52a8cb53912ecfced Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join..... >>> Performing Cluster Check (using node 127.0.0.1:7001) M: 9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004 slots: (0 slots) slave replicates c3414bd40496b9f2910f72a41b17463d6ac9d708 S: 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005 slots: (0 slots) slave replicates a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 S: 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006 slots: (0 slots) slave replicates 9ced24811d441e90c1eb45a52a8cb53912ecfced M: c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
4.測試
必定得使用參數 ./redis6/redis-cli -c -p 7006
-c -p
-c
鏈接集羣結點時使用,此選項可防止moved和ask異常。
啓動一次後,redis的集羣就創建好了。從上面的實驗能夠看出。從庫在獲取數據的時候,會有一種給人飄忽不定的感受,在網上查詢相關原理是是這樣解釋的:redis提供的slot(插槽)有16383個,而後在獲取的時候是經過CRC(key) % 16383取模的,飄到哪一個節點就算是哪一個節點。
用集羣的方式去部署redis集羣,在停掉一個master節點後,在slave上面使用get命令的時候可能會偏移到已經停掉的節點上面,這時會報錯
(error) CLUSTERDOWN The cluster is down
猜測可能使用集羣方式部署redis集羣,一個master節點掛掉以後,整個集羣也就掛掉了。
猜測。可能在7001上面set的值並無同步到其餘節點。7001重啓以後整個集羣就從新恢復工做了,可是,7001沒有關閉以前,7006是7001的從節點,當7001關閉後,7006升級爲主節點,從新開啓7001後,7001變爲7006的從節點。
查看節點信息命令:
./redis1/redis-cli -p 7001 cluster nodes
返回結果:
9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001@17001 myself,slave 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 0 1527641808000 1 connected 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006@17006 master - 0 1527641807000 7 connected 0-5460 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005@17005 slave a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 0 1527641807547 5 connected c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002@17002 master - 0 1527641808000 2 connected 5461-10922 a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003@17003 master - 0 1527641808556 3 connected 10923-16383 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004@17004 slave c3414bd40496b9f2910f72a41b17463d6ac9d708 0 1527641809563 4 connected
查看集集羣狀態:
cluster nodes
返回結果
給slave節點賦值master節點命令:
#最後這個參數是經過cluster node命令獲得的master的hash值
./redis4/redis-cli -p 7006 cluster replicate a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1
讓全部節點相互感知:cluster meet 命令
MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7001 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7002 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7004 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7005 OK MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7006
查看集羣狀態
查看對應節點的集羣狀態:cluster info
若是查看到對應的節點的集羣狀態是fail,那麼使用cluster meet命令與其餘節點相互感知。而後在從新啓動。
127.0.0.1:7003> cluster info cluster_state:fail //代表集羣已經掛了。 cluster_slots_assigned:16381 cluster_slots_ok:16381 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 //集羣節點數 cluster_size:3 cluster_current_epoch:8 cluster_my_epoch:3 cluster_stats_messages_ping_sent:1962 cluster_stats_messages_pong_sent:1954 cluster_stats_messages_sent:3916 cluster_stats_messages_ping_received:1953 cluster_stats_messages_pong_received:1962 cluster_stats_messages_meet_received:1 cluster_stats_messages_received:3916
當經過cluster info命令查看到狀態是fail而且其餘參數都是正常的時候,說明此時redis集羣已經掛了。因此你在命令行輸入獲取或者添加的命名就會報異常,此時須要將全部節點重啓。
redis集羣掛掉的緣由:
1.集羣的任意master掛掉,而且該master沒有相應的slave
2.超過半數以上的master掛掉
二:哨兵模式創建redis集羣(sentinel)
工做模式:
設置一個節點爲master,多個監控器(sentinels)。當sentinel主觀判斷master下線時,系統會自動從slave節點中選舉一個做爲新的master節點。
使用哨兵模式搭建的redis集羣,slave節點不容許寫數據,只可以讀取數據,要想寫數據智能切換到master節點
同上,須要創建幾個節點信息。修改對應的配置文件。
複製創建redis1,redis2,redis3.。。。。
修改配置文件。須要將 cluster-enable yes改成no
daemonize yes Port 7001 #Bind 127.0.0.1 logfile "./redis-7001.log" protected-mode no cluster-config-file nodes-7001.conf
改完後,分別啓動對應的節點。並進入到該節點中手動指定對應的主節點.
#若是以前的cluster-enable yes沒改的話。運行這個命令就會報錯
salveof 127.0.0.0 7001
sentinel
從redis的壓縮包複製sentinel.conf過來。修改對應的配置信息
port 7005
#設置127.0.0.1 的7001是master,而且當2個sentinel監控他掛掉再從slave中選舉節點來作爲master
sentinel monitor mymaster 127.0.0.1 7001 2
protected-mode no
啓動sentinel實例
./redis-sentinel/sentinel1/redis-sentinel ./redis-sentinel/sentinel1/sentinel.conf &
進入sentinel查看相關的監控信息
MacBook-Pro:local a$ ./redis/bin/redis-cli -p 27001
127.0.0.1:27001> sentinel masters
相關命令
① INFO
sentinel的基本狀態信息
②SENTINEL masters
列出全部被監視的主服務器,以及這些主服務器的當前狀態
③ SENTINEL slaves
列出給定主服務器的全部從服務器,以及這些從服務器的當前狀態
④SENTINEL get-master-addr-by-name
返回給定名字的主服務器的 IP 地址和端口號
⑤SENTINEL reset
重置全部名字和給定模式 pattern 相匹配的主服務器。重置操做清除主服務器目前的全部狀態, 包括正在執行中的故障轉移, 並移除目前已經發現和關聯的, 主服務器的全部從服務器和 Sentinel 。
⑥SENTINEL failover
當主服務器失效時, 在不詢問其餘 Sentinel 意見的狀況下, 強制開始一次自動故障遷移,可是它會給其餘sentinel發送一個最新的配置,其餘sentinel會根據這個配置進行更新。
如今默認的主是7001節點。當手動殺掉7001節點後,27001,27002這兩個哨兵主觀判斷7001節點已經掛掉就選舉出7003來當選新的master節點。