參考 https://redis.io/topics/cluster-tutorial
下載并解壓
tar -zxvf redis-3.2.4.tar.gz
編譯安裝
cd redis-3.2.4
make && make install
redis-trib.rb 復(fù)制到 /usr/local/bin 目錄下
Redis 官方提供了 redis-trib.rb 這個(gè)工具實(shí)現(xiàn)cluster
cp redis-trib.rb /usr/local/bin/
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
出現(xiàn)的問(wèn)題:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/
core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
注意 :kernel_require.rb:55:in `require': cannot load such file -- redis
解決:
可以去https://rubygems.org/gems/redis 下載相應(yīng)版本的redis-3...gem **
gem install -l ~/Downloads/redis-3.2.1.gem
集群配置
建立目錄
mkdir redis_cluster
cd redis_cluster
mkdir 7000 7001 7002
cp redis.conf redis_cluster/7000
cp redis.conf redis_cluster/7001
cp redis.conf redis_cluster/7002
在另一臺(tái)機(jī)器建立7003-7005作為備份殴瘦,也可以再本機(jī)建立些己。
修改redis.conf
port 7000 //端口7000,7002,7003
bind 本機(jī)ip //默認(rèn)為127.0.0.1改為其他節(jié)點(diǎn)機(jī)器可訪問(wèn)的ip 否則無(wú)法訪問(wèn)集群
daemonize yes //redis后臺(tái)運(yùn)行
pidfile /var/run/redis_7000.pid //pidfile文件對(duì)應(yīng)7000,7001,7002
cluster-enabled yes //開(kāi)啟集群 把注釋#去掉
cluster-config-file nodes_7000.conf // 配置文件首次啟動(dòng)自動(dòng)生成 7000,7001,7002
cluster-node-timeout 15000 //請(qǐng)求超時(shí) 默認(rèn)15秒庆械,可自行設(shè)置
appendonly yes
使用vi的替換命令
:.,$s/700a/700b
啟動(dòng)
redis-server redis_cluster/7000/redis.conf
創(chuàng)建集群
./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;
*replicas 1:表示1個(gè)salve *
啟動(dòng)成功 ,出現(xiàn):
*Can I set the above configuration? (type 'yes' to accept): yes
輸入yes ,然后出現(xiàn): *
[OK] All 16384 slots covered.
原理
redis cluster去中心化,去中間件,集群中的每個(gè)節(jié)點(diǎn)都是平等红且、對(duì)等的,每個(gè)節(jié)點(diǎn)都保存各>自的數(shù)據(jù)和整個(gè)集群的狀態(tài)涤姊。每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接暇番,而且這些連接保持活躍,保
證了我們只需要連接集群中的任意一個(gè)節(jié)點(diǎn)思喊,就可以獲取到其他節(jié)點(diǎn)的數(shù)據(jù)壁酬。
Redis 集群采用哈希槽 (hash slot)的方式來(lái)分配的保證一致性。redis cluster 默認(rèn)分配了16384 個(gè)slot恨课,當(dāng)我們set一個(gè)key 時(shí)舆乔,會(huì)用CRC16算法來(lái)取模得到所屬的slot,然后將這個(gè)>key 分到哈希槽區(qū)間的節(jié)點(diǎn)上剂公,具體算法就是:CRC16(key) % 16384希俩。所以我們?cè)跍y(cè)試>的時(shí)候看到set 和 get 的時(shí)候,直接跳轉(zhuǎn)到了7000端口的節(jié)點(diǎn)纲辽。
Redis 集群會(huì)把數(shù)據(jù)存在一個(gè) master 節(jié)點(diǎn)颜武,然后在這個(gè) master 和其對(duì)應(yīng)的salve 之間進(jìn)行數(shù)>據(jù)同步。當(dāng)讀取數(shù)據(jù)時(shí)拖吼,也根據(jù)一致性哈希算法到對(duì)應(yīng)的 master 節(jié)點(diǎn)獲取數(shù)據(jù)盒刚。只有當(dāng)一個(gè)>master 掛掉之后,才會(huì)啟動(dòng)一個(gè)對(duì)應(yīng)的 salve 節(jié)點(diǎn)绿贞,充當(dāng) master 。
需要注意的是:必須要3個(gè)或以上的主節(jié)點(diǎn)橘原,否則在創(chuàng)建集群時(shí)會(huì)失敗籍铁,并且當(dāng)存活的主節(jié)點(diǎn)>數(shù)小于總節(jié)點(diǎn)數(shù)的一半時(shí),整個(gè)集群就無(wú)法提供服務(wù)了趾断。