Redis集羣學習

參考文章: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節點。

相關文章
相關標籤/搜索