redis-cluster故障切换

前言

redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。

redis cluster
  redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求
  自动将数据进行分片,每个master上放一部分数据
  提供内置的高可用支持,部分master不可用时,还是可以继续工作的

安装部署

点击这里下载>redis源码包下载<

1.解压

 [root@localhost ~] yum -y install gcc gcc-c++
 [root@localhost ~] tar xzf redis-5.0.0.tar.gz

2.安装

 [root@localhost ~] cd redis-5.0.0/
 [root@localhost redis-5.0.0] make && make install

3.将redis-trib.rb 复制到/usr/local/bin

[root@localhost redis-5.0.0] cd src/
[root@localhost src] cp redis-trib.rb /usr/local/bin/

4.开始集群搭建

[root@localhost src] cd ..
[root@localhost redis-5.0.0] vim redis.conf
#修改以下地方
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemon yes

5.新建6个节点:

[root@localhost redis-5.0.0] mkdir -p /usr/local/cluster-test/
[root@localhost redis-5.0.0] cd /usr/local/cluster-test/
[root@localhost cluster-test] mkdir 7000
[root@localhost cluster-test] mkdir 7001
[root@localhost cluster-test] mkdir 7002
[root@localhost cluster-test] mkdir 7003
[root@localhost cluster-test] mkdir 7004
[root@localhost cluster-test] mkdir 7005

6.将redis.conf 分别拷贝到这6个文件夹中,并修改成对应的端口号

#拷贝配置文件
[root@localhost cluster-test] cp /root/redis-5.0.0/redis.conf /usr/local/cluster-test/7000
[root@localhost cluster-test] cp /root/redis-5.0.0/redis.conf /usr/local/cluster-test/7001
[root@localhost cluster-test] cp /root/redis-5.0.0/redis.conf /usr/local/cluster-test/7002
[root@localhost cluster-test] cp /root/redis-5.0.0/redis.conf /usr/local/cluster-test/7003
[root@localhost cluster-test] cp /root/redis-5.0.0/redis.conf /usr/local/cluster-test/7004
[root@localhost cluster-test] cp /root/redis-5.0.0/redis.conf /usr/local/cluster-test/7005
#端口号
[root@localhost cluster-test] sed -i "s/7000/7001/g" /usr/local/cluster-test/7001/redis.conf
[root@localhost cluster-test] sed -i "s/7000/7002/g" /usr/local/cluster-test/7002/redis.conf
[root@localhost cluster-test] sed -i "s/7000/7003/g" /usr/local/cluster-test/7003/redis.conf
[root@localhost cluster-test] sed -i "s/7000/7004/g" /usr/local/cluster-test/7004/redis.conf
[root@localhost cluster-test] sed -i "s/7000/7005/g" /usr/local/cluster-test/7005/redis.conf

分别,启动这6个节点

[root@localhost cluster-test]  cd /usr/local/cluster-test/7000/
[root@localhost 7000]  redis-server redis.conf
[root@localhost 7000]  cd ../7001
[root@localhost 7001]  redis-server redis.conf
[root@localhost 7001]  cd ../7002
[root@localhost 7002]  redis-server redis.conf
[root@localhost 7002]  cd ../7003
[root@localhost 7003]  redis-server redis.conf
[root@localhost 7003]  cd ../7004
[root@localhost 7004]  redis-server redis.conf
[root@localhost 7004]  cd ../7005
[root@localhost 7005]  redis-server redis.conf

查看6个节点的启动进程情况:

[root@localhost 7005] ps -ef | grep redis
root      18794      1  0 11:07 ?        00:00:08 redis-server 127.0.0.1:7005 [cluster]
root      18859      1  0 11:07 ?        00:00:08 redis-server 127.0.0.1:7004 [cluster]
root      18882      1  0 11:07 ?        00:00:08 redis-server 127.0.0.1:7003 [cluster]
root      18923      1  0 11:07 ?        00:00:08 redis-server 127.0.0.1:7002 [cluster]
root      18958      1  0 11:07 ?        00:00:08 redis-server 127.0.0.1:7001 [cluster]
root      19060      1  0 11:07 ?        00:00:08 redis-server 127.0.0.1:7000 [cluster]
root      79202   2191  0 13:27 pts/0    00:00:00 grep --color=auto redis

将6个节点连在一起构招成集群
需要用到的命令就是redis-trib.rb,这是官方的一个用ruby写的一个操作redis cluster的命令,所以,你的机器上需要安装ruby。我们先试一下这个命令:
由于我机子上没安装ruby,所以,会报错:
那先安装ruby和rubygems

[root@localhost 7005] yum install ruby ruby-devel rubygems rpm-build

启动

[root@localhost 7005] redis-cli --cluster create 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 --cluster-replicas 1

启动成功

redis-cli --cluster create 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 
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 1c8997f7e87bac575a700b3591941849ac1f49d8 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
M: 5f04d177e72892993e392f4d25b430eb911971a4 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
M: 52204bf2a022785f0cc465ab0049b261d245ab85 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes  #这儿是yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 1c8997f7e87bac575a700b3591941849ac1f49d8 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
M: 5f04d177e72892993e392f4d25b430eb911971a4 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
M: 52204bf2a022785f0cc465ab0049b261d245ab85 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试集群的状态:

[root@localhost 7005] redis-cli --cluster check 127.0.0.1:7000
127.0.0.1:7000 (69b04525...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (0ee06970...) -> 1 keys | 5461 slots | 1 slaves.
127.0.0.1:7001 (7eca2aa3...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 69b0452515e25097a61d8bdf9efc79b33a5e6e50 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 0ee06970318390c5ba8eea084ac592e45786d3af 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 7eca2aa34b48d4eb7ad83b9cadaac0ce6aa61b0b 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 33d55979e6cb5cee48f168d54c587e5634fd882e 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 7eca2aa34b48d4eb7ad83b9cadaac0ce6aa61b0b
S: 9a729dff638ab1af2a2b05947cb48f7f9fd9402e 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 0ee06970318390c5ba8eea084ac592e45786d3af
S: ae2fdce5b41cf187416ef5c418bf6a5233151f34 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 69b0452515e25097a61d8bdf9efc79b33a5e6e50
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

可以看到有3个主节点,3个从节点。每个节点都是成功的连接状态
3个主节点[M]是

69b0452515e25097a61d8bdf9efc79b33a5e6e50 127.0.0.1:7000
0ee06970318390c5ba8eea084ac592e45786d3af 127.0.0.1:7002
7eca2aa34b48d4eb7ad83b9cadaac0ce6aa61b0b 127.0.0.1:7001

3个从节点[S]是

33d55979e6cb5cee48f168d54c587e5634fd882e 127.0.0.1:7005
9a729dff638ab1af2a2b05947cb48f7f9fd9402e 127.0.0.1:7003
ae2fdce5b41cf187416ef5c418bf6a5233151f34 127.0.0.1:7004

测试连接集群

测试连接集群,它是去中心化,每个节点都是对等的,所以,你连接哪个节点都可以获取和设置数据,我们来试一下。

redis-cli是redis默认的客户端工具,启动时加上`-c`参数,就可以连接到集群。

连接任意一个节点端口:

[root@localhost 7000]# redis-cli -c -p 7000
127.0.0.1:7000>

设置一个值:

[root@localhost 7000] redis-cli -c -p 7000
127.0.0.1:7000> set my_name rj
-> Redirected to slot [12803] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get my_name
"rj"
127.0.0.1:7002>

前面理论知识我们知道了,分配key的时候,它会使用CRC16(‘my_name’)%16384算法,来计算,将这个key 放到哪个节点,这里分配到了12803slot 就分配到了7002(10923-16383)这个节点上。

redis cluster 采用的方式很直接,它直接跳转到7002 节点了,而不是还在自身的7000节点。

好,现在我们连接7005这个从节点:

[root@localhost 7000]  redis-cli -c -p 7005
127.0.0.1:7005> get my_name
-> Redirected to slot [12803] located at 127.0.0.1:7002
"rj"
127.0.0.1:7002>

我们同样是获取my_name的值,它同样也是跳转到了7002上.

测试集群中的节点挂掉

上面我们建立来了一个集群。3个主节点[7000-7002]提供数据存粗和读取,3个从节点[7003-7005]则是负责把[7000-7002]的数据同步到自己的节点上来,我们来看一下[7003-7005]的appendonly.aof的内容。看看是不是不这样:

[root@localhost 7000] cd /usr/local/cluster-test/7003
[root@localhost 7003] vim appendonly.aof
$6^M
SELECT^M
$1^M
0^M
*3^M
$3^M
set^M
$7^M
my_name^M
$3^M
xzp^M
*3^M
$3^M
set^M
$7^M
my_name^M
$2^M
rj^M

我们看下,的确是从7000节点上同步过来的数据,7004,7005也是。

下面,我们先来模拟其中一台Master主服务器挂掉的情况,那就7000挂掉吧:

[root@localhost 7003]  ps -ef | grep redis
root      18794      1  0 11:07 ?        00:00:11 redis-server 127.0.0.1:7005 [cluster]
root      18859      1  0 11:07 ?        00:00:11 redis-server 127.0.0.1:7004 [cluster]
root      18882      1  0 11:07 ?        00:00:11 redis-server 127.0.0.1:7003 [cluster]
root      18923      1  0 11:07 ?        00:00:11 redis-server 127.0.0.1:7002 [cluster]
root      18958      1  0 11:07 ?        00:00:11 redis-server 127.0.0.1:7001 [cluster]
root      19060      1  0 11:07 ?        00:00:11 redis-server 127.0.0.1:7000 [cluster]
root      95280   2191  0 14:12 pts/0    00:00:00 grep --color=auto redis

[root@localhost 7003]# kill 18794   关闭7000

好,安装前面的理论,7000主节点挂掉了,那么这个时候,7000的从节点只有7004一个,肯定7004就会被选举称Master节点了:

[root@localhost 7000] redis-cli -c -p 7001
127.0.0.1:7001> get sex
-> Redirected to slot [2584] located at 127.0.0.1:7004
"1"
127.0.0.1:7004>

数据果真没有丢失,而是从7004上面获取了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值