redis3.0.2 分布式集群安装详细步骤
redis3.0.2 分布式集群安裝詳細(xì)步驟
????????????????????????????? --(centos5.8 X64系統(tǒng))
版本歷史
時間 | 版本 | 說明 | 編寫者 |
2015-06-5 | 1.0 | redis3.0.2 分布式集群安裝詳細(xì)步驟 | csc |
?
?
?
一: redis cluster介紹篇
1:redis cluster的現(xiàn)狀
目前redis支持的cluster特性(已親測):
1):節(jié)點自動發(fā)現(xiàn)
2):slave->master 選舉,集群容錯
3):Hot resharding:在線分片
4):進(jìn)群管理:cluster xxx
5):基于配置(nodes-port.conf)的集群管理
6):ASK 轉(zhuǎn)向/MOVED 轉(zhuǎn)向機(jī)制.
2:redis cluster 架構(gòu)
1)redis-cluster架構(gòu)圖
?
架構(gòu)細(xì)節(jié):
(1)所有的redis節(jié)點彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.
(2)節(jié)點的fail是通過集群中超過半數(shù)的節(jié)點檢測失效時才生效.
(3)客戶端與redis節(jié)點直連,不需要中間proxy層.客戶端不需要連接集群所有節(jié)點,連接集群中任何一個可用節(jié)點即可
(4)redis-cluster把所有的物理節(jié)點映射到[0-16383]slot上,cluster 負(fù)責(zé)維護(hù)node<->slot<->value
2) redis-cluster選舉:容錯
?
(1)領(lǐng)著選舉過程是集群中所有master參與,如果半數(shù)以上master節(jié)點與master節(jié)點通信超過(cluster-node-timeout),認(rèn)為當(dāng)前master節(jié)點掛掉.
(2):什么時候整個集群不可用(cluster_state:fail),當(dāng)集群不可用時,所有對集群的操作做都不可用,收到((error)CLUSTERDOWN The cluster is down)錯誤
? ? a:如果集群任意master掛掉,且當(dāng)前master沒有slave.集群進(jìn)入fail狀態(tài),也可以理解成進(jìn)群的slot映射[0-16383]不完成時進(jìn)入fail狀態(tài).
? ? b:如果進(jìn)群超過半數(shù)以上master掛掉,無論是否有slave集群進(jìn)入fail狀態(tài).
?
?
二.Redis集群安裝篇(centos5.8X64系統(tǒng))
?
(要讓集群正常工作至少需要3個主節(jié)點,在這里我們要創(chuàng)建6個redis節(jié)點,其中三個為主節(jié)點,三個為從節(jié)點,對應(yīng)的redis節(jié)點的ip和端口對應(yīng)關(guān)系如下)
?
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
?
1:下載redis。
官網(wǎng)下載3.0.0版本,之前2.幾的版本不支持集群模式
下載地址:http://download.redis.io/releases/redis-3.0.2.tar.gz
?
2:上傳服務(wù)器,解壓,編譯
tar -zxvf redis-3.0.2.tar.gz.tar.gz
mv redis-3.0.2.tar.gz.tar.gz redis3.0
cd /usr/local/redis3.0
make
make install
?
3:創(chuàng)建集群需要的目錄
mkdir -p /usr/local/cluster
cd /usr/local/cluster
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
?
4:修改配置文件redis.conf
cp /usr/local/redis3.0/redis.conf? /usr.local/cluster
vi redis.conf
##修改配置文件中的下面選項
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
##修改完redis.conf配置文件中的這些配置項之后把這個配置文件分別拷貝到7000/7001/7002/7003/7004/7005目錄下面
cp /usr/local/cluster/redis.conf/usr/local/cluster/7000
cp /usr/local/cluster/redis.conf/usr/local/cluster/7001
cp /usr/local/cluster/redis.conf /usr/local/cluster/7002
cp /usr/local/cluster/redis.conf/usr/local/cluster/7003
cp /usr/local/cluster/redis.conf/usr/local/cluster/7004
cp /usr/local/cluster/redis.conf/usr/local/cluster/7005
?
##注意:拷貝完成之后要修改7001/7002/7003/7004/7005目錄下面redis.conf文件中的port參數(shù),分別改為對應(yīng)的文件夾的名稱
?
5:分別啟動這6個redis實例
cd /usr/local/cluster/7000
redis-server redis.conf
?
cd /usr/local/cluster/7001
redis-server redis.conf
?
cd /usr/local/cluster/7002
redis-server redis.conf
?
cd /usr/local/cluster/7003
redis-server redis.conf
?
cd /usr/local/cluster/7004
redis-server redis.conf
?
cd /usr/local/cluster/7005
redis-server redis.conf
?
?
##啟動之后使用命令查看redis的啟動情況ps -ef|grep redis
如下顯示則說明啟動成功
?# ps -ef|grepredis
root????13703???? 1? 0 10:03 ???????? 00:00:00 redis-server *:7000 [cluster]
root????14015???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7002 [cluster]
root????14133???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7003 [cluster]
root????14172???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7004 [cluster]
root????14187???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7005 [cluster]
root????14323???? 1? 0 10:04 ???????? 00:00:00 redis-server *:7001 [cluster]
6.升級ruby 安裝gem
?
安裝gem 需要ruby的版本在 1.8.7 以上,默認(rèn)的centos5 上都是1.8.5 版本,所以首先你的升級你的ruby ,
rpm -ivh http://yum.puppetlabs.com/el/5/products/x86_64/puppetlabs-release-5-6.noarch.rpm
?
yum install ruby ruby-devel rubygems rpm-build
?
檢查 ruby 版本:
#ruby? -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
?
是否安裝rubygems:
# rpm -qa|grep ruby
ruby-rdoc-1.8.7.374-2.el5
ruby-1.8.7.374-2.el5
ruby-devel-1.8.7.374-2.el5
ruby-devel-1.8.7.374-2.el5
ruby-mode-1.8.5-24.el5
ruby-irb-1.8.7.374-2.el5
ruby-libs-1.8.7.374-2.el5
ruby-libs-1.8.7.374-2.el5
rubygems-1.3.7-1.el5
?
7.gem 安裝redis ruby 接口
gem install redis
8:執(zhí)行redis的創(chuàng)建集群命令創(chuàng)建集群
#redis-trib.rb的create子命令構(gòu)建?
#--replicas 則指定了為Redis Cluster中的每個Master節(jié)點配備幾個Slave節(jié)點?
#節(jié)點角色由順序決定,先master之后是slave
創(chuàng)建方式:
cd /usr/local/redis3.0/src
./redis-trib.rb?create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
錯誤筆記備注:
?
8.1執(zhí)行上面的命令的時候會報錯,因為是執(zhí)行的ruby的腳本,需要ruby的環(huán)境
錯誤內(nèi)容:/usr/bin/env: ruby: No suchfile or directory
所以需要安裝ruby的環(huán)境,這里推薦使用yum install ruby安裝
yum install ruby
?
8.2然后再執(zhí)行第6步的創(chuàng)建集群命令,還會報錯,提示缺少rubygems組件,使用yum安裝
?
錯誤內(nèi)容:
./redis-trib.rb:24:in `require': no such file to load-- rubygems (LoadError)
from ./redis-trib.rb:24
yum install rubygems
8.3再次執(zhí)行第8步的命令,還會報錯,提示不能加載redis,是因為缺少redis和ruby的接口,使用gem 安裝
錯誤內(nèi)容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in`gem_original_require': no such file to load -- redis (LoadError)
from/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
?
gem install redis
?
?
8.4 再次執(zhí)行第8步的命令,正常執(zhí)行
輸入yes,然后配置完成。
注意觀察主從的配置:
默認(rèn)是前三個節(jié)點 7000? 7001?7002 是主,
后3個節(jié)點 7003? 7004?? 7005 是從
如果是部署在不同的服務(wù)器,請根據(jù)主從分部規(guī)則,分開在不同的服務(wù)器
?
?
至此redis集群即搭建成功!
9:使用redis-cli命令進(jìn)入集群環(huán)境
redis-cli?-c?-p?7000 |
?
三.測試篇
1).檢查集群狀態(tài),
# /usr/local/redis-3.0.2/src/redis-trib.rb check 127.0.0.1:7000
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7005: 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:7001: OK
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 6bce685c31ed91d5da07048a8e130bd2cf810690 127.0.0.1:7000
? ?slots:0-5460 (5461 slots) master
? ?1 additional replica(s)
S: a2ed19aaae15d625ff4279d0d8adfb812db9da29 127.0.0.1:7005
? ?slots: (0 slots) slave
? ?replicates af47fc62aacfe80257f820626389693e5f19598e
M: af47fc62aacfe80257f820626389693e5f19598e 127.0.0.1:7002
? ?slots:10923-16383 (5461 slots) master
? ?1 additional replica(s)
S: 5addc020d00fcccf8858e908b5a44d90d3c1ef8e 127.0.0.1:7003
? ?slots: (0 slots) slave
? ?replicates 6bce685c31ed91d5da07048a8e130bd2cf810690
S: d5278a2bf6cd50fbc171bc5e9898402cf815c0a9 127.0.0.1:7004
? ?slots: (0 slots) slave
? ?replicates 0a16fe3fab8a468d402071dcea9f13aac28325c2
M: 0a16fe3fab8a468d402071dcea9f13aac28325c2 127.0.0.1:7001
? ?slots:5461-10922 (5462 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.
#redis-trib.rb的check子命令構(gòu)建?
#ip:port可以是集群的任意節(jié)點?
./redis-trib.rb check ?127.0.0.1:7000
?最后輸出如下信息,沒有任何警告或錯誤,表示集群啟動成功并處于ok狀態(tài)
?
?
2):添加新master節(jié)點
(1)添加一個master節(jié)點:創(chuàng)建一個空節(jié)點(empty node),然后將某些slot移動到這個空節(jié)點上,這個過程目前需要人工干預(yù)
a):根據(jù)端口生成配置文件(ps:establish_config.sh是我自己寫的輸出配置腳本)
?
?
sh establish_config.sh 6386 >conf/redis-6386.conf?
?
b):啟動節(jié)點
?
?
nohup redis-server /opt/redis/conf/redis-6386.conf> /opt/redis/logs/redis-6386.log 2>&1 &?
?
c):加入空節(jié)點到集群
add-node? 將一個節(jié)點添加到集群里面,第一個是新節(jié)點ip:port, 第二個是任意一個已存在節(jié)點ip:port
?
?
redis-trib.rb add-node 10.10.34.14:638610.10.34.14:6381?
?
node:新節(jié)點沒有包含任何數(shù)據(jù),因為它沒有包含任何slot。新加入的加點是一個主節(jié)點,當(dāng)集群需要將某個從節(jié)點升級為新的主節(jié)點時,這個新節(jié)點不會被選中
d):為新節(jié)點分配slot
?
?
redis-trib.rb reshard 10.10.34.14:6386?
#根據(jù)提示選擇要遷移的slot數(shù)量(ps:這里選擇500)?
How many slots do you want to move (from 1 to 16384)?500?
#選擇要接受這些slot的node-id?
What is the receiving node ID?f51e26b5d5ff74f85341f06f28f125b7254e61bf?
#選擇slot來源:?
#all表示從所有的master重新分配,?
#或者數(shù)據(jù)要提取slot的master節(jié)點id,最后用done結(jié)束?
Please enter all the source node IDs.?
? Type 'all' touse all the nodes as source nodes for the hash slots.?
? Type 'done'once you entered all the source nodes IDs.?
Source node #1:all?
#打印被移動的slot后,輸入yes開始移動slot以及對應(yīng)的數(shù)據(jù).?
#Do you want to proceed with the proposed reshard plan(yes/no)? yes?
#結(jié)束?
3):添加新的slave節(jié)點
a):前三步操作同添加master一樣
b)第四步:redis-cli連接上新節(jié)點shell,輸入命令:cluster replicate 對應(yīng)master的node-id
?
?
cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835?
?
note:在線添加slave 時,需要dump整個master進(jìn)程,并傳遞到slave,再由 slave加載rdb文件到內(nèi)存,rdb傳輸過程中Master可能無法提供服務(wù),整個過程消耗大量io,小心操作.
例如本次添加slave操作產(chǎn)生的rdb文件
?
?
-rw-r--r-- 1 root root?34946 Apr 17 18:23 dump-6386.rdb?
-rw-r--r-- 1 root root?34946 Apr 17 18:23 dump-7386.rdb?
?
4):在線reshard 數(shù)據(jù):
對于負(fù)載/數(shù)據(jù)均勻的情況,可以在線reshard slot來解決,方法與添加新master的reshard一樣,只是需要reshard的master節(jié)點是老節(jié)點.
5):刪除一個slave節(jié)點
?
#redis-trib del-node ip:port '<node-id>'?
redis-trib.rb del-node 10.10.34.14:7386'c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378'?
?6):刪除一個master節(jié)點
?
a):刪除master節(jié)點之前首先要使用reshard移除master的全部slot,然后再刪除當(dāng)前節(jié)點(目前只能把被刪除
master的slot遷移到一個節(jié)點上)
?
?
#把10.10.34.14:6386當(dāng)前master遷移到10.10.34.14:6380上?
redis-trib.rb reshard 10.10.34.14:6380?
#根據(jù)提示選擇要遷移的slot數(shù)量(ps:這里選擇500)?
How many slots do you want to move (from 1 to 16384)?500(被刪除master的所有slot數(shù)量)?
#選擇要接受這些slot的node-id(10.10.34.14:6380)?
What is the receiving node ID?c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:10.10.34.14:6380的node-id)?
Please enter all the source node IDs.?
? Type 'all' touse all the nodes as source nodes for the hash slots.?
? Type 'done'once you entered all the source nodes IDs.?
Source node#1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被刪除master的node-id)?
Source node #2:done?
#打印被移動的slot后,輸入yes開始移動slot以及對應(yīng)的數(shù)據(jù).?
#Do you want to proceed with the proposed reshard plan(yes/no)? yes?
?
b):刪除空master節(jié)點
?
?
redis-trib.rb del-node 10.10.34.14:6386'f51e26b5d5ff74f85341f06f28f125b7254e61bf'?
四:redis cluster 客戶端(Jedis)
1:客戶端基本操作使用
?
?
<span style="color: #333333; font-family:Arial, sans-serif;"><span style="color: #333333; font-family:Arial, sans-serif;"> private static BinaryJedisCluster jc;?
? static {?
?????? //只給集群里一個實例就可以?
???????Set<HostAndPort> jedisClusterNodes = newHashSet<HostAndPort>();?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6380));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6381));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6382));?
??????? jedisClusterNodes.add(newHostAndPort("10.10.34.14", 6383));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",6384));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7380));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7381));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7382));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7383));?
???????jedisClusterNodes.add(new HostAndPort("10.10.34.14",7384));?
??????? jc = newBinaryJedisCluster(jedisClusterNodes);?
??? }?
@Test?
??? public voidtestBenchRedisSet() throws Exception {?
??????? finalStopwatch stopwatch = new Stopwatch();?
??????? Listlist = buildBlogVideos();?
??????? for (inti = 0; i < 1000; i++) {?
???????????String key = "key:" + i;?
???????????stopwatch.start();?
???????????byte[] bytes1 = protostuffSerializer.serialize(list);?
???????????jc.setex(key, 60 * 60, bytes1);?
???????????stopwatch.stop();?
??????? }?
??????? System.out.println("time="+ stopwatch.toString());?
???}</span></span>?
2:jedis客戶端的坑.
1)cluster環(huán)境下redis的slave不接受任何讀寫操作,
2)client端不支持keys批量操作,不支持select dbNum操作,只有一個db:select 0
3)JedisCluster 的info()等單機(jī)函數(shù)無法調(diào)用,返回(No way to dispatch thiscommand to Redis Cluster)錯誤,.
4)JedisCluster 沒有針對byte[]的API,需要自己擴(kuò)展(附件是我加的基于byte[]的BinaryJedisCluster? api)
?
?
轉(zhuǎn)載于:https://blog.51cto.com/2574526/1658806
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的redis3.0.2 分布式集群安装详细步骤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode:Two Sum
- 下一篇: 在Linux 上安装WAS7.0