当前位置: 移动技术网 > IT编程>数据库>Redis > Redis Cluster集群

Redis Cluster集群

2020年07月17日  | 移动技术网IT编程  | 我要评论

简介

集群模式是实际使用最多的模式。
Redis Cluster是社区版推出的Redis分布式集群解决方案,主要解决Redis分布式方面的需求,比如当遇到单机内存,并发和流量等瓶颈时,Redis Cluster能祈祷很好的负载均衡的目的。

为什么使用redis-cluster?
为了在大流量访问下提供稳定的业务,集群化是存储的必然形态
未来的发展趋势肯定是云计算和大数据的紧密集合
只有分布式架构能满足要求

Redis Cluster集群描述

Redis集群搭建方案:
1、Twitter开发的twemproxy
2、豌豆荚开发的codis
3、redis官方的redis-cluster redis3.0版本后支持
Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态 ,每个节点和其他所有节点连接。
在这里插入图片描述
Redis Cluster集群节点最小配置6个节点以上(3主3从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。

Redis Cluster集群特点

在这里插入图片描述
1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽
2、节点的fail是通过集群中超过半数的节点检测失效时才生效
3、客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
4、redis-cluster把所有的物理节点映射到【0-16383】slot上(不一定是平均分配),cluster负责维护
5、Redis集群预分好16384个哈希值,当需要在redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希值,redis会根据节点数最大致均等的将哈希值映射到不同的节点

Redis Cluster容错

容错性,是指软件检测应用程序所运行的软件或硬件中发生的错误并从错误中恢复的能力,通过可以从系统的可靠性、可用性、可测性等几方面来衡量。
1、什么时候判断master不可用?
投票机制,投票过程是集中中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。
2、什么时候整个集群不可用(cluster_state:fail)?
如果集群任意master挂掉,且当前master没有slave,集群进入fail状态,也可以理解成集群的slot映射【0-16383】不完整时进入fail状态,如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态

Redis Cluster节点分配

Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0-16383个整数槽内,每个节点负责维护一部分槽以及槽所映射的键值数据

三个主节点分别是A、B、C三个节点,他们可以是一台机器上的三个端口,也可以是三台不同的服务器,那么采用哈希槽(hash slot)的方式来分配16384个slot的话,他们三个节点分别承担的slot区间是:
节点A:覆盖 0-5460
节点B:覆盖5461-10922
节点C:覆盖10923-16383

Redis Cluster集群搭建

集群搭建参考官网:
redis集群需要至少三个master节点,每个master再搭建一个slave节点,总共6个redis节点,这里用一台机器部署6个redis实例,三主三从,搭建集群步骤如下:

1、创建Redis节点安装目录

mkdir redis-cluster

2、在redis-cluster目录下,创建7000-7005个文件夹

mkdir 7000 7001 7002 7003 7004 7005

3、将redis.conf分别拷贝到7000-7005文件夹下

cd /home/redis/app/redis-6.0.5
cp redis.conf   /home/redis/app/redis-cluster/700*

4、修改Redis配置文件

#关闭保护模式 
protected-mode no
port 7000
#开启集群模式
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
#后台启动
daemonize yes
pidfile /home/redis/app/redis-6.0.5/log/redis_7000.pid
logfile "7000.log"
#bind 127.0.0.1
#用于连接主节点密码
masterauth ***
#设置redis密码,各个节点请保持密码一致
requirepass  ***

5、依次复制并修改6个redis.conf

cp ./7000/redis.conf ./7001/
vi ./7001/redis.conf
执行全部替换
:%s/old/new/g  
:wq保存并退出

6、依次启动6个节点
将安装的redis目录下的src复制到cluster下,方便启动服务端

#进入redis安装目录
cd /home/redis/app/redis-6.0.5
#将src文件复制到redis-cluster目录中
cp -r src/ /home/redis/app/redis-cluster
#启动节点
./src/redis-server ./7000/redis.conf
./src/redis-server ./7001/redis.conf
./src/redis-server ./7002/redis.conf
./src/redis-server ./7003/redis.conf
./src/redis-server ./7004/redis.conf
./src/redis-server ./7005/redis.conf
#启动后,用ps查看redis进程
 ps -ef|grep -i redis
redis     2904     1  0 09:56 ?        00:00:00 ./src/redis-server 0.0.0.0:7000 [cluster]
redis     2912     1  0 09:56 ?        00:00:00 ./src/redis-server 0.0.0.0:7001 [cluster]
redis     2918     1  0 09:56 ?        00:00:00 ./src/redis-server 0.0.0.0:7002 [cluster]
redis     2924     1  0 09:56 ?        00:00:00 ./src/redis-server 0.0.0.0:7003 [cluster]
redis     2930     1  0 09:56 ?        00:00:00 ./src/redis-server 0.0.0.0:7004 [cluster]
redis     2936     1  0 09:56 ?        00:00:00 ./src/redis-server 0.0.0.0:7005 [cluster]

7、创建集群

[redis@localhost redis-cluster]$ ./src/redis-cli -a kathryn --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
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 67f4aecee730bb288ae0119cde46d8aa07daa860 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
M: d9ef828ea515bf5f57924ba58b3178f1e197b850 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
M: 3296ad98e3a4dfe4493ab30190d86737e13a2650 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
S: e31dc25ed5ec935ad196570b51d99855fbf48561 127.0.0.1:7003
   replicates d9ef828ea515bf5f57924ba58b3178f1e197b850
S: b104857e18e9e7747e2ac7f1489c8a39dbefca6d 127.0.0.1:7004
   replicates 3296ad98e3a4dfe4493ab30190d86737e13a2650
S: 9d86a5965980133ab85a14e6501611df019dc15e 127.0.0.1:7005
   replicates 67f4aecee730bb288ae0119cde46d8aa07daa860
Can I set the above configuration? (type 'yes' to accept): 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: 67f4aecee730bb288ae0119cde46d8aa07daa860 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 3296ad98e3a4dfe4493ab30190d86737e13a2650 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: d9ef828ea515bf5f57924ba58b3178f1e197b850 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e31dc25ed5ec935ad196570b51d99855fbf48561 127.0.0.1:7003
   slots: (0 slots) slave
   replicates d9ef828ea515bf5f57924ba58b3178f1e197b850
S: b104857e18e9e7747e2ac7f1489c8a39dbefca6d 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 3296ad98e3a4dfe4493ab30190d86737e13a2650
S: 9d86a5965980133ab85a14e6501611df019dc15e 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 67f4aecee730bb288ae0119cde46d8aa07daa860
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Redis Cluster集群验证

redis cluster 在设计的时候,就考虑到了去中心化、去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态,每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他所有节点的数据

在某台机器上连接集群的7000端口的节点

#-c 可连接到集群
./src/redis-cli -h 127.0.0.1 -c -p 7000 -a kathryn

基本命令
通过Cluster Nodes和Cluster info命令来看集群效果
info replication

127.0.0.1:7000> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7005,state=online,offset=784,lag=0
master_replid:c42da7021132d3e644af8438e8729750d956bae4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:784
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:784

cluster nodes

127.0.0.1:7000> cluster nodes
3296ad98e3a4dfe4493ab30190d86737e13a2650 127.0.0.1:7002@17002 master - 0 1594867072511 3 connected 10923-16383
67f4aecee730bb288ae0119cde46d8aa07daa860 127.0.0.1:7000@17000 myself,master - 0 1594867071000 1 connected 0-5460
d9ef828ea515bf5f57924ba58b3178f1e197b850 127.0.0.1:7001@17001 master - 0 1594867072000 2 connected 5461-10922
e31dc25ed5ec935ad196570b51d99855fbf48561 127.0.0.1:7003@17003 slave d9ef828ea515bf5f57924ba58b3178f1e197b850 0 1594867072511 4 connected
b104857e18e9e7747e2ac7f1489c8a39dbefca6d 127.0.0.1:7004@17004 slave 3296ad98e3a4dfe4493ab30190d86737e13a2650 0 1594867072612 5 connected
9d86a5965980133ab85a14e6501611df019dc15e 127.0.0.1:7005@17005 slave 67f4aecee730bb288ae0119cde46d8aa07daa860 0 1594867071608 6 connected

每个Redis的节点都有一个ID值,此ID将被此特定Redis实例永久使用,以便实例在集群上下文中具有唯一的名称。每个节点都会记住使用此ID的每个其他节点,而不是通过IP或端口。IP地址和端口可能会发生变化,但唯一的节点标标识符在节点的整个生命周期内都不会改变,这个标识符为节点ID.

cluster info

127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1906
cluster_stats_messages_pong_sent:1901
cluster_stats_messages_sent:3807
cluster_stats_messages_ping_received:1896
cluster_stats_messages_pong_received:1906
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:3807

测试数据

127.0.0.1:7000> set aa 123
OK
127.0.0.1:7000> keys *
1) "aa"
127.0.0.1:7000> get aa
"123"
127.0.0.1:7000> set bb 123
-> Redirected to slot [8620] located at 127.0.0.1:7001
OK
127.0.0.1:7001> keys *
1) "bb"
127.0.0.1:7001> exit
[redis@localhost redis-6.0.5]$ ./src/redis-cli -h 127.0.0.1 -c -p 7000 -a kathryn
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7000> keys *
1) "aa"

Redis Cluster总结

Redis Cluster为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会由从节点选择一个来充当主节点,从而保证集群不会挂掉。
集群中有ABC三个主节点,如果这三个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
因此在集群建立时,一定要为每个主节点添加从节点,如集群包含主节点ABC以及从节点A1、B1、C1,那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务,当B节点重新开启后,它就会变成B1的从节点。
不过需要注意,如果节点B和B1同事挂了,Redis集群就无法继续正确地提供服务了。

Redis Cluster关闭集群

启动集群

开启全部Redis节点 redisall.sh
vi redisall.sh

./src/redis-server ./7000/redis.conf
./src/redis-server ./7001/redis.conf
./src/redis-server ./7002/redis.conf
./src/redis-server ./7003/redis.conf
./src/redis-server ./7004/redis.conf
./src/redis-server ./7005/redis.conf

添加可执行权限

chmod u+x redisall.sh
./redisall.sh

启动集群startCluster.sh
vi startCluster.sh

./src/redis-cli -a kathryn --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

添加可执行权限

chmod u+x startCluster.sh
./startCluster.sh

关闭集群

vi shutdownCluster.sh

./src/redis-cli -a kathryn -c -h 127.0.0.1 -p 7000 shutdown
./src/redis-cli -a kathryn -c -h 127.0.0.1 -p 7001 shutdown
./src/redis-cli -a kathryn -c -h 127.0.0.1 -p 7002 shutdown
./src/redis-cli -a kathryn -c -h 127.0.0.1 -p 7003 shutdown
./src/redis-cli -a kathryn -c -h 127.0.0.1 -p 7004 shutdown
./src/redis-cli -a kathryn -c -h 127.0.0.1 -p 7005 shutdown

添加可执行权限

chmod u+x shutdownCluster.sh
./shutdownCluster.sh

本文地址:https://blog.csdn.net/qq_29443327/article/details/107160206

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网