集群搭建步驟
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個槽都有節點在負責時,集群進入上線狀態,可以執行客戶端發送的數據命令;
主節點只會執行和自己負責的槽相關的命令,當節點接收到不屬於自己處理的槽的命令時,它會將處理指定槽的節點的地址返回給客戶端,而客戶端會向正確的節點重新發送命令,這個過程稱為“轉向”;