redis cluster
-
支撑N个redis master node,每个master node都可以挂载多个slave node
-
读写分离的架构,对于每个master来说,写就写到master,然后读就从mater对应的slave去读
-
高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master
-
redis cluster(多master + 读写分离 + 高可用)
redis cluster vs. replication + sentinal
-
如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个G,单机足够了
-
replication,一个mater,多个slave,要几个slave跟你的要求的读吞吐量有关系,然后自己搭建一个sentinal集群,去保证redis主从架构的高可用性,就可以了
-
redis cluster,主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster
redis cluster
(1)自动将数据进行分片,每个master上放一部分数据
(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的
在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379
16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权
cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间
哈希算法
-
1、最老土的hash算法和弊端(大量缓存重建)
-
2、一致性hash算法(自动缓存迁移)+虚拟节点(自动负载均衡)
一致性hash算法的讲解和优点.png
一致性hash算法的虚拟节点实现负载均衡.png
- 3、redis cluster的hash slot算法
redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot
redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot
hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去
移动hash slot的成本是非常低的
客户端的api,可以对指定的数据,让他们走同一个hash slot,通过hash tag来实现
redis cluster 搭建
单机集群
#创建redis 日志目录
mkdir -p /var/log/redis/7001
mkdir -p /var/log/redis/7002
mkdir -p /var/log/redis/7003
mkdir -p /var/log/redis/7004
mkdir -p /var/log/redis/7005
mkdir -p /var/log/redis/7006
#创建redis 集群 配置 目录
mkdir -p /etc/redis-cluster
# redis目录
mkdir -p mkdir -p /var/redis/7001
mkdir -p mkdir -p /var/redis/7002
mkdir -p mkdir -p /var/redis/7003
mkdir -p mkdir -p /var/redis/7004
mkdir -p mkdir -p /var/redis/7005
mkdir -p mkdir -p /var/redis/7006
配置文件 主要配置 其他几分类似
port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7001.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log
bind 0.0.0.0
appendonly yes
安装必备软件
- 步骤1 - 安装 RVM
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 $ curl -sSL https://get.rvm.io | bash -s stable 如果上面的连接失败,可以尝试: $ curl -L https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable #成功之后 source /usr/local/rvm/scripts/rvm rvm install 2.3.3 rvm use 2.3.3 gem install redis
启动集群
```shell
redis-trib.rb create --replicas 1 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 127.0.0.1:7006
out:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 127.0.0.1:7001
slots:0-5460,5999,12706,14559 (5464 slots) master
M: 63035068bbbc1ee1df40a050d5d47b7779f86043 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: be557259c0ea02517557931251df7120c00cd4c2 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: 210ae237bb73aa3c876eb9933a9926c575fba0cd 127.0.0.1:7004
replicates 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c
S: 3cb4215cb614950f9e68be6a995bf98ea81d52a6 127.0.0.1:7005
replicates 63035068bbbc1ee1df40a050d5d47b7779f86043
S: 65e578ed3fe7d5947a4f9c621c8157ab6c1251b5 127.0.0.1:7006
replicates be557259c0ea02517557931251df7120c00cd4c2
Can I set the above configuration? (type 'yes' to accept):
简单解释一下这个命令:调用 ruby 命令来进行创建集群,--replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16383 个 solt ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配。
目前来看,7001-7003 为主节点,7004-7006 为从节点,并向你确认是否同意这么配置。输入 yes 后,会开始集群创建。
集群搭建成功之后
验证一下:
依然是通过客户端命令连接上,通过集群命令看一下状态和节点信息等。
redis-cli -c -p 7001
cluster info
cluster nodes
可以看到
127.0.0.1:7001> 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_sent:372
cluster_stats_messages_received:372
127.0.0.1:7001> cluster nodes
65e578ed3fe7d5947a4f9c621c8157ab6c1251b5 127.0.0.1:7006 slave be557259c0ea02517557931251df7120c00cd4c2 0 1515656195286 6 connected
3cb4215cb614950f9e68be6a995bf98ea81d52a6 127.0.0.1:7005 slave 63035068bbbc1ee1df40a050d5d47b7779f86043 0 1515656197299 5 connected
5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 127.0.0.1:7001 myself,master - 0 0 1 connected 0-5460
210ae237bb73aa3c876eb9933a9926c575fba0cd 127.0.0.1:7004 slave 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 0 1515656193268 4 connected
63035068bbbc1ee1df40a050d5d47b7779f86043 127.0.0.1:7002 master - 0 1515656194275 2 connected 5461-10922
be557259c0ea02517557931251df7120c00cd4c2 127.0.0.1:7003 master - 0 1515656196295 3 connected 10923-16383
设置一个key
127.0.0.1:7001> set name mafly
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002>
你会发现,当我们 set name mafly 时,出现了 Redirected to slot 信息并自动连接到了7002节点。这也是集群的一个数据分配特性,这里不详细说了。
出现问题
1. 使用 ruby 创建集群 yes 之后 出现 in `call': ERR Slot 8579 is already busy (Redis::CommandError)
用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。
网友评论