Redis集群架構(gòu)圖


上圖藍色為redis集群的節(jié)點。
節(jié)點之間通過ping命令來測試連接是否正常,節(jié)點之間沒有主區(qū)分,連接到任何一個節(jié)點進行操作時,都可能會轉(zhuǎn)發(fā)到其他節(jié)點。
1、Redis的容錯機制
節(jié)點之間會定時的互相發(fā)送ping命令,測試節(jié)點的健康狀態(tài),當(dāng)節(jié)點接受到ping命令后,會返回一個pong字符串。
投票機制:如果一個節(jié)點A給節(jié)點B發(fā)送ping沒有得到pong返回,會通知其他節(jié)點再次給B發(fā)送ping,如果集群中有超過一半的節(jié)點收不B節(jié)點的pong。那么就認(rèn)為B節(jié)點掛了。一般會為每個節(jié)點提供一個備份節(jié)點,如果掛掉會切換到備份節(jié)點。
2、Redis集群存儲原理
Redis對于每個存放的key會進行hash操作,生成一個[0-16384]的hash值(先進行
crc 算法再對16384取余)。
集群的情況下,就是把[0-16384]的區(qū)間進行拆分,放到不同的redis中。
3、Redis的持久化
Snapshotting:定時的將Redis內(nèi)存中的數(shù)據(jù)保存到硬盤中
AOF:將所有的command操作保存到aof中,AOP的同步頻率很高,數(shù)據(jù)即使丟失,粒度也很小,但會在性能上造成影響。
redis集群管理工具redis-trib.rb依賴ruby環(huán)境,首先需要安裝ruby環(huán)境
安裝ruby
yum install ruby yum install rubygems
安裝ruby和redis的接口程序
拷貝redis-3.0.0.gem至/usr/local下
執(zhí)行:
gem install /usr/local/redis-3.0.0.gem
三、創(chuàng)建Redis集群
在一臺服務(wù)器上,可以用不同端口號來表示不同redis服務(wù)器。
Redis集群最少需要三臺服務(wù)器,而每臺服務(wù)器有需要備用服務(wù)器,所以最少需要6臺服務(wù)器。端口規(guī)劃如下:
主服務(wù)器:192.168.100.66 :7001 :7002 :7003
從服務(wù)器:192.168.100.66 :7004 :7005 :7006
在/usr/local 創(chuàng)建文件夾用來存放服務(wù)器程序
mkdir 7001 7002 7003 7004 7005 7006
如果想讓redis支持集群需要修改redis.config配置文件的cluster-enabled yes
本例中我們以端口來區(qū)別不同的redis服務(wù),所以還需要修改redis.config的port為對應(yīng)端口
修改完配置文件,將redis安裝目錄的bin復(fù)制到上面每個目錄中。
分別進入7001/bin/ 7002/bin .....
啟動服務(wù)./redis-server ./redis.conf
查看redis進程:ps -aux|grep redis 如下圖則說明啟動成功

創(chuàng)建集群:
將之前解壓的文件夾的redis-3.0.0/src/redis-trib.rb復(fù)制到redis-cluster目錄
運行
./redis-trib.rb create --replicas 1 192.168.100.66:7001 192.168.100.66:7002 192.168.100.66:7003 192.168.100.66:7004 192.168.100.66:7005 192.168.100.66:7006
如果執(zhí)行時報如下錯誤:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解決方法是刪除生成的配置文件nodes.conf,如果不行則說明現(xiàn)在創(chuàng)建的結(jié)點包括了舊集群的結(jié)點信息,需要刪除redis的持久化文件后再重啟redis,比如:appendonly.aof、dump.rdb
如果成功最終輸入如下:

查詢集群信息:

說明:
./redis-cli -c -h 192.168.101.3 -p 7001 ,其中-c表示以集群方式連接redis,-h指定ip地址,-p指定端口號
cluster nodes 查詢集群結(jié)點信息
cluster info 查詢集群狀態(tài)信息

hash槽重新分配
第一步:連接上集群
./redis-trib.rb reshard 192.168.101.3:7001(連接集群中任意一個可用結(jié)點都行)
第二步:輸入要分配的槽數(shù)量

輸入 500表示要分配500個槽
第三步:輸入接收槽的結(jié)點id

這里準(zhǔn)備給7007分配槽,通過cluster nodes查看7007結(jié)點id為15b809eadae88955e36bcdbb8144f61bbbaf38fb
輸入:15b809eadae88955e36bcdbb8144f61bbbaf38fb
第四步:輸入源結(jié)點id

這里輸入all
第五步:輸入yes開始移動槽到目標(biāo)結(jié)點id

添加從節(jié)點
集群創(chuàng)建成功后可以向集群中添加節(jié)點,下面是添加一個slave從節(jié)點。
添加7008從結(jié)點,將7008作為7007的從結(jié)點。
./redis-trib.rb add-node --slave --master-id 主節(jié)點id 添加節(jié)點的ip和端口 集群中已存在節(jié)點ip和端口
執(zhí)行如下命令:
./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 192.168.101.3:7008 192.168.101.3:7001
cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 是7007結(jié)點的id,可通過cluster nodes查看。

注意:如果原來該結(jié)點在集群中的配置信息已經(jīng)生成cluster-config-file指定的配置文件中(如果cluster-config-file沒有指定則默認(rèn)為nodes.conf),這時可能會報錯:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解決方法是刪除生成的配置文件nodes.conf,刪除后再執(zhí)行./redis-trib.rb add-node指令
查看集群中的結(jié)點,剛添加的7008為7007的從節(jié)點:

刪除結(jié)點:
./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017
刪除已經(jīng)占有hash槽的結(jié)點會失敗,報錯如下:
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
需要將該結(jié)點占用的hash槽分配出去(參考hash槽重新分配章節(jié))。
測試:
Maven:
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.10.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>普通測試:
@Test
public void redisClusterTest1(){
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(30);
config.setMaxIdle(2);
Set<HostAndPort> jedisNode=new HashSet<HostAndPort>();
jedisNode.add(new HostAndPort("192.168.100.66",7001));
jedisNode.add(new HostAndPort("192.168.100.66",7002));
jedisNode.add(new HostAndPort("192.168.100.66",7003));
jedisNode.add(new HostAndPort("192.168.100.66",7004));
jedisNode.add(new HostAndPort("192.168.100.66",7005));
jedisNode.add(new HostAndPort("192.168.100.66",7006));
JedisCluster jc=new JedisCluster(jedisNode,config);
jc.set("name","老王");
String value=jc.get("name");
System.out.println(value);
}Spring測試:
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 連接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 大連接數(shù) -->
<property name="maxTotal" value="30" />
<!-- 大空閑連接數(shù) -->
<property name="maxIdle" value="10" />
<!-- 每次釋放連接的大數(shù)目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 釋放連接的掃描間隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 連接最小空閑時間 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 連接空閑多久后釋放, 當(dāng)空閑時間>該值 且 空閑連接>大空閑連接數(shù) 時直接釋放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 獲取連接時的大等待毫秒數(shù),小于零:阻塞不確定的時間,默認(rèn)-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在獲取連接的時候檢查有效性, 默認(rèn)false -->
<property name="testOnBorrow" value="true" />
<!-- 在空閑時檢查有效性, 默認(rèn)false -->
<property name="testWhileIdle" value="true" />
<!-- 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認(rèn)true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
</bean>
</beans>測試類:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-config.xml"})
public class RedisClusterTest {
@Autowired
private JedisCluster jedisCluster;
@Test
public void redisClusterTest2(){
jedisCluster.set("username","小明啦啦");
String name=jedisCluster.get("username");
System.out.println(name);
}
}以上就是redis分布式集群搭建介紹的詳細(xì)內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
標(biāo)題名稱:如何部署redis分布式集群-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article36/dpsosg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容