• Redis 集群


    集群简介

    业务发展过程中碰到的峰值瓶颈

    • 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 集群结构搭建

    1. 先新建一个配置 redis-6379.conf,然后在从这个配置修改出6份配置,如下

      ...
      # 证明该节点是一个 cluster 节点
      cluster-enabled yes
      # 指定 cluster 节点启动的配置文件
      cluster-config-file nodes-6379.conf
      # 节点超时时间10s,企业开发一般不会设置这么短
      cluster-node-timeout 100000 
      
    2. 启动所有服务

      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]标识

    3. 连接启动的 cluster 服务

      提示:

      查询 redis 命令在 redis-4.0.0src 中执行 ll | grep redis-这里面有个命令叫redis-trib.rb这其实是一个 ruby 的脚本,需要 ruby 和 rubyg,如果命令运行有问题,根据提示安装相应东西,要保证 ruby 与 gem 版本一样,可以通过 reby -vgem -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 的倍数个服务器

    4. 存取数据测试

      连接 6379 master 服务,连接命令: redis-cli -c 这是专门用来操作 cluster 集群的操作,然后执行set name zhangsan

      连接 6382 slave 服务,连接命令: redis-cli -c -p 6382 然后再执行 get name

    5. 如果某个 slave 服务停止掉,slave 服务连接的 master 服务会得到通知,其余的 master 服务都会得到通知(不过信息与有关系的那个master不一样),并不会对整个集群造成多大影响

    6. 如果某个 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

  • 相关阅读:
    用c和c++的方式实现栈
    类的static成员并用其实现一个单例模式
    windows安装mongodb
    centos 安装beanstalkd
    使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
    Git Windows客户端保存用户名与密码
    PHP 输入流 php://input
    yii accessRules用法
    php curl
    yii 初步安装
  • 原文地址:https://www.cnblogs.com/wuyongqiang/p/12742249.html
Copyright © 2020-2023  润新知