Redis集群搭建&訪問


集群搭建步驟

1、創建多個節點;

2、為每個節點指派槽,並將多個節點連接起來,組成一個集群;

3、當集群數據庫的16384個槽都有節點在處理時,集群進入上線狀態;

 

要求:搭建一個包含6個節點的Redis集群,其中三個主節點,三個從節點,每個主節點都有一個從節點

注:在極端情況下,如果將16384個槽都指派給一個主節點,那么只有一個主節點也可以讓集群進入上線狀態,但是要讓集群的故障轉移特性生效,最起碼要有3個主節點,而要讓故障轉移真正有意義,至少要為三個主節點分別設置一個從節點,這也是本例子中使用6個節點的原因。

1、創建節點

集群中的節點就是運行在集群模式下的Redis服務器,為了構建一個集群,我們需要一一創建集群中的每個節點;

為了讓Redis服務器以集群模式運行,我們需要在啟動服務器時,打開服務器的集群模式選項:

cluster-enabled yes

另外,如果有多個節點運行在同一台集群上,那么我們還需要為每個節點指定一個不同的端口號

port 7000

將如上的兩個配置值寫入redis.conf文件中,然后執行如下命令來啟動一個Redis節點

redis-server redis.conf

為了能在同一台機器上構建一個包含6個節點的集群,其中三個主節點分別運行在機器的7000、7001和7002端口上,而三個從節點分別運行在7003、7004和7003端口上;

我們可以先創建一個redis-cluster文件夾,然后分別創建7000到7005共6個文件夾,每個文件夾都包含一個redis.conf文件,文件內容如下:

port <number>
cluster-enabled yes

目錄結構如下:

[ochadoop@och165 redis-cluster]$ ll
drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:39 7000
drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7001
drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7002
drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7003
drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7004
drwxrwxr-x 2 ochadoop ochadoop    4096 Oct 13 14:30 7005
drwxrwxr-x 2 ochadoop ochadoop    4096 Sep  1 10:33 7006
drwxrwxr-x 6 ochadoop ochadoop    4096 Aug 30 14:02 redis-3.0.0-beta8
-rwxrwxr-x 1 ochadoop ochadoop 6395711 Aug 30 14:02 redis-server
[ochadoop@och165 redis-cluster]$ cd 7000
[ochadoop@och165 7000]$ ll-rw-rw-r-- 1 ochadoop ochadoop 102 Aug 30 13:34 redis.conf

然后分別執行:

cd 7000
../redis-server ./redis.conf & 

cd 7001
../redis-server ./redis.conf &

cd 7002
../redis-server ./redis.conf &

cd 7003
../redis-server ./redis.conf &

cd 7004
../redis-server ./redis.conf &

cd 7005
../redis-server ./redis.conf &

判斷各個節點的Redis服務是否啟動成功:

[ochadoop@och165 redis-cluster]$ ps -ef|grep redis
ochadoop 26369 23992  0 14:41 pts/0    00:00:00 ../redis-server *:7000 [cluster]
ochadoop 26391 23992  0 14:42 pts/0    00:00:00 ../redis-server *:7001 [cluster]
ochadoop 26401 23992  0 14:42 pts/0    00:00:00 ../redis-server *:7002 [cluster]
ochadoop 26417 23992  0 14:42 pts/0    00:00:00 ../redis-server *:7003 [cluster]
ochadoop 26431 23992  0 14:43 pts/0    00:00:00 ../redis-server *:7004 [cluster]
ochadoop 26436 23992  0 14:43 pts/0    00:00:00 ../redis-server *:7005 [cluster]
ochadoop 26518 23992  0 14:44 pts/0    00:00:00 grep redis

經過如上操作,創建了6個節點。

2、創建集群

在第一步中已經創建了6個節點,此時我們需要將這6個節點互相連接以后吃一個集群,然后為三個主節點指派槽,並為這三個主節點分別設置一個從節點;

創建集群的操作可以通過使用位於Redis安裝文件夾內的redis-trib.rb來完成,redis-trib.rb是使用ruby開發的Redis集群管理程序,具有創建集群,檢查集群的上線情況和槽指派情況、對集群進行重新分片、向集群添加新節點或者從集群中移除節點等功能;

redis-trib.rb的用戶

[ochadoop@och165 src]$ ./redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>

  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  check           host:port
  fix             host:port
  reshard         host:port
                  --from <arg>
                  --to <arg>
                  --slots <arg>
                  --yes
  add-node        new_host:new_port existing_host:existing_port
                  --slave
                  --master-id <arg>
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  call            host:port command arg arg .. arg
  import          host:port
                  --from <arg>
  help            (show this help)

為創建一個包含三個主節點和三個從節點的集群,我們需要執行如下命令:

./redis-trib.rb create --replicas 1 127.0.0.1:7000 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

其中:

create:表示我們要創建一個集群;

replicas:表示讓redis-trib.rb為集群中的每個主節點設置一個從節點;

輸入該命令后,redis-trib會為每個節點指派槽以及角色,並詢問用戶是否接受這種節點配置;

[ochadoop@och165 src]$ ./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
>>> Creating cluster  
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK      ###首先嘗試連接給定的六個節點,檢查它們是否存在
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002  ###在確定這些節點都是可連接之后,redistrib.rb 再將7000、7001和7002設置為主節點,
                                而7003、7004和7005則分別被設置為三個主節點的從節點
M: 86377351db5e39c8ac78ae57d1c9ed747fc6287e 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 41da4216d8011ba56e491fe3a938eaf5d4b30449 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: c98b085a68d26d6e779eaf7802bdd309ac263b8f 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master    ###對於三個主節點,redis-trib.rb 會分別為它們指派5461、5462和5461個槽(默認情況下使用平均分配)

S: a1591907f9a6e8398d6ca76875a4b9d2ae488d4b
127.0.0.1:7003 replicates 86377351db5e39c8ac78ae57d1c9ed747fc6287e S: 23ee21f3992eeea33137f086aaed70e4b0d1926d 127.0.0.1:7004 replicates 41da4216d8011ba56e491fe3a938eaf5d4b30449 S: 36daa7806f59775f09ef4df339737b0973136679 127.0.0.1:7005 replicates c98b085a68d26d6e779eaf7802bdd309ac263b8f Can I set the above configuration? (type 'yes' to accept): yes ###這個配置沒問題的話,就可以鍵入 yes 並按下回車
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
3495:M 13 Oct 17:56:13.768 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
3498:M 13 Oct 17:56:13.768 # configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH
3509:M 13 Oct 17:56:13.769 # configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH
3514:M 13 Oct 17:56:13.769 # configEpoch set to 4 via CLUSTER SET-CONFIG-EPOCH
3517:M 13 Oct 17:56:13.770 # configEpoch set to 5 via CLUSTER SET-CONFIG-EPOCH
3527:M 13 Oct 17:56:13.770 # configEpoch set to 6 via CLUSTER SET-CONFIG-EPOCH
>>> Sending CLUSTER MEET messages to join the cluster
3495:M 13 Oct 17:56:13.787 # IP address for this node updated to 127.0.0.1
3527:M 13 Oct 17:56:13.956 # IP address for this node updated to 127.0.0.1
3509:M 13 Oct 17:56:13.958 # IP address for this node updated to 127.0.0.1
3498:M 13 Oct 17:56:13.988 # Cluster state changed: ok
3517:M 13 Oct 17:56:14.156 # IP address for this node updated to 127.0.0.1
3498:M 13 Oct 17:56:14.375 # IP address for this node updated to 127.0.0.1
3517:M 13 Oct 17:56:14.463 # Cluster state changed: ok
3514:M 13 Oct 17:56:14.563 # IP address for this node updated to 127.0.0.1
Waiting for the cluster to join.3495:M 13 Oct 17:56:15.465 # Cluster state changed: ok
.3509:M 13 Oct 17:56:16.468 # Cluster state changed: ok
3527:M 13 Oct 17:56:16.592 # Cluster state changed: ok
.3514:M 13 Oct 17:56:17.060 # Cluster state changed: ok ###在鍵入yes之后,redis-trib.rb 就會向各個節點發送指令,首先將它們連接為一個集群,然后再為它們指派槽和設置角色
>>> Performing Cluster Check (using node 127.0.0.1:7000) 
M: 86377351db5e39c8ac78ae57d1c9ed747fc6287e
127.0.0.1:7000 slots:0-5460 (5461 slots) master
M: 41da4216d8011ba56e491fe3a938eaf5d4b30449
127.0.0.1:7001 slots:5461-10922 (5462 slots) master
M: c98b085a68d26d6e779eaf7802bdd309ac263b8f
127.0.0.1:7002 slots:10923-16383 (5461 slots) master
M: a1591907f9a6e8398d6ca76875a4b9d2ae488d4b
127.0.0.1:7003 slots: (0 slots) master replicates 86377351db5e39c8ac78ae57d1c9ed747fc6287e
M: 23ee21f3992eeea33137f086aaed70e4b0d1926d
127.0.0.1:7004 slots: (0 slots) master replicates 41da4216d8011ba56e491fe3a938eaf5d4b30449
M: 36daa7806f59775f09ef4df339737b0973136679
127.0.0.1:7005 slots: (0 slots) master replicates c98b085a68d26d6e779eaf7802bdd309ac263b8f
###redis-trib.rb 會對集群進行測試,檢查是否每個節點都按照原先展示的配置設置好了
[OK] All nodes agree about slots configuration.
>>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

  ###如果整個集群數據庫的16384個槽都有節點在處理,那么集群就會進入上線狀態,之后用戶就可以開始向集群發送命令請求了

 

集群訪問

使用集群客戶端向集群發送命令請求

目前主要的 Redis 集群客戶端(或者說,支持集群功能的 Redis 客戶端)有以下這些:

1、redis-rb-cluster:antirez 使用 Ruby 編寫的 Redis 集群客戶端,集群客戶端的官方實現;

2、predis:Redis 的 PHP 客戶端,支持集群功能;

3、jedis:Redis 的 JAVA 客戶端,支持集群功能;

4、StackExchange.Redis:Redis 的 C# 客戶端,支持集群功能;

5、內置的 redis-cli :在啟動時給定 -c 參數即可進入集群模式,支持部分集群功能;


為了讓示例保持簡單,我們這里使用集群模式的 redis-cli 來進行演示。

[ochadoop@och165 src]$ ./redis-cli -p 7000 -c  #連接節點並執行命令 127.0.0.1:7000> SET date 2014-10-10  #鍵date所在的槽位於節點7000 ,節點直接執行命令
OK
127.0.0.1:7000> SET msg "hello world"  #鍵msg所在的槽位於節點7001
-> Redirected to slot [6257] located at 127.0.0.1:7001  #客戶端從7000轉向至7001
OK
127.0.0.1:7001> SADD fruits "apple" "banana" "cherry"  #鍵fruits所在的槽位於節點7002
-> Redirected to slot [14943] located at 127.0.0.1:7002  #客戶端從7001轉向至7002
(integer) 3
127.0.0.1:7002>  #轉向是自動完成的,無需任何用戶操作

 

集群和twemproxy的區別

結論:

如果需要完整的分片、復制和高可用性,並且要避免使用代理帶來的性能瓶頸和資源消耗,那么可以選擇使用Redis集群;

如果只需要一部分特性(比如只需要分片,不需要復制和高可用等),那么可以單獨選擇twemproxy、Redis復制和Redis sentinel中的一個或者多個;

 

Redis集群服務器總結

Redis集群是一個由多個節點組成的分布式服務器群,它具有復制、高可用和分片特性;

Redis集群沒有中心節點,並且帶有復制和故障轉移特性,這可以避免單個節點成為性能瓶頸,或者因為某個節點下線而導致整個集群下線;

集群中的主節點負責處理槽(存儲數據),從節點則是主節點的復制品;

Redis集群將整個數據庫分成16384個槽,數據庫中的每個鍵都屬於16384個槽中的其中一個;

集群中的每個主節點都可以負責0到16384個槽,當16384個槽都有節點在負責時,集群進入上線狀態,可以執行客戶端發送的數據命令;

主節點只會執行和自己負責的槽相關的命令,當節點接收到不屬於自己處理的槽的命令時,它會將處理指定槽的節點的地址返回給客戶端,而客戶端會向正確的節點重新發送命令,這個過程稱為“轉向”;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM