集群简介
业务发展过程中碰到的峰值瓶颈
- redis 提供的服务 OPS(操作) 可以达到 10万/秒,当前业务 OPS 已经达到 20万/秒
- 内存单机容量达到 256G,当前业务需求内存容量 1 T
使用集群方式可以解决上述问题
集群架构
- 集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果
集群作用
-
分散单台服务器的访问压力,实现负载均衡
-
分散单台服务器的存储压力,实现可扩展性
-
降低单台服务器宕机带来的业务灾难
Redis 集群结构设计
数据存储设计
在 redis 的每个节点上,都有两个东西:
- slot(插槽): 一个可以存储两个数值的变量,取值范围 0~1383
- cluster(群):能够进行集群管理
当我们向 redis 集群(cluster)中加入一个 key 时,redis 会根据 CRC16 的算法对 key 计算得到一个值(类似求哈希值)然后把结果对 16384 取余,计算出的结果,就是 key 存储的 slot(插槽)位置。
- 通过算法设计,计算出 key 应该保存的位置
- 将所有的存储空间计划切割成 16384 份,每台主机保存一部分
- 每份代表的是一个存储空间,可以存多个 key
- 将 key 按照计算出的结果放到对应的存储空间
- 增加机器,会在原有的机器上分一部分槽给到新的机器
- 减少机器,会把该机器上的槽分到其他机器
集群内部通讯设计
- 各个数据库相互通信,保存各个库中槽的编号数据
- 当查找 key 时,一次命中直接返回,如果没有命中会获取到确切的槽在哪台机器上,然后再次请求数据,这次肯定能成功
cluster 集群结构搭建
-
先新建一个配置 redis-6379.conf,然后在从这个配置修改出6份配置,如下
... # 证明该节点是一个 cluster 节点 cluster-enabled yes # 指定 cluster 节点启动的配置文件 cluster-config-file nodes-6379.conf # 节点超时时间10s,企业开发一般不会设置这么短 cluster-node-timeout 100000
-
启动所有服务
redis-server /redis-4.0.0/conf/redis-6379.conf redis-server /redis-4.0.0/conf/redis-6380.conf redis-server /redis-4.0.0/conf/redis-6381.conf redis-server /redis-4.0.0/conf/redis-6382.conf redis-server /redis-4.0.0/conf/redis-6383.conf redis-server /redis-4.0.0/conf/redis-6384.conf
6379、6380、6381 后面用作 master
6382、6383、6384 后面用作 slave使用
ps -ef | grep redis
命令查看服务状态
发现每个服务后面都有一个[cluster]标识
-
连接启动的 cluster 服务
提示:
查询 redis 命令在 redis-4.0.0src 中执行
ll | grep redis-
这里面有个命令叫redis-trib.rb
这其实是一个 ruby 的脚本,需要 ruby 和 rubyg,如果命令运行有问题,根据提示安装相应东西,要保证 ruby 与 gem 版本一样,可以通过reby -v
与gem -v
查看对应版本创建集群(在 redis-4.0.0src 目录下):
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
- --replicas 表示指定集群内部结构,后面跟 1 代表 1 个 master 服务连接 1 个 slave 服务;如果跟 2 代表 1 个 master 服务连接 2 个 slave 服务;匹配规则是按照写的个数进行比对的,如果是 2 的话,后面要写 1+2=3 的倍数个服务器
-
存取数据测试
连接 6379 master 服务,连接命令:
redis-cli -c
这是专门用来操作 cluster 集群的操作,然后执行set name zhangsan
连接 6382 slave 服务,连接命令:
redis-cli -c -p 6382
然后再执行get name
-
如果某个 slave 服务停止掉,slave 服务连接的 master 服务会得到通知,其余的 master 服务都会得到通知(不过信息与有关系的那个master不一样),并不会对整个集群造成多大影响
-
如果某个 master 服务停止掉,slave 多次尝试连接 master 失败,会自己转为 master, 等到原先的 master 再次启动时,会作为 slave 去同步数据。总结一下就是会出现角色互换
cluster 配置
-
设置加入 cluster, 成为其中的节点
cluster-enabled yes|no
-
cluster 配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容
cluster-config-file <filename>
-
节点服务响应超时时间,用于判断该节点是否下线或切换为从节点,线上一般30s1min,测试的话5s10s
cluster-node-timeout <milliseconds>
-
master 连接的 slave 最小数量
cluster-migration-barrier <count>
cluster 节点指令操作
-
查看集群节点信息
cluster nodes
-
进入一个从节点 redis,切换其主节点
cluster replicate <master-id>
-
发现一个新节点,新增主节点
cluster meet ip:port
-
忽略一个没有 solt 的节点
cluster forget <id>
-
手动故障转移
cluster failover