Redis: 主从复制读写分离环境搭建

概述

  • Redis 的单机模式实际上就是在一个服务器上装了一个单节点的Redis
  • 通过简单的配置和简单的命令启动起来就可以使用
  • 这种搭建环境,不保证高可用的情况下,完全没有问题
  • 如果说你的项目必须要具备高可用,而且 Redis 也要提供更高的性能
  • 这个单机的模式肯定是不行的, 需要对 Redis 的架构模式进行升级
    • 升级的过程:从单机变为主从,再变为哨兵
    • 最后搭建一个集群的环境

1 )单机环境的优缺点

  • 优点

    • 部署简单
      • 下载,编译安装
      • 通过一些简单的命令启动就可以使用
    • 成本低
      • 单机搭建不复杂,搭建成本低
      • 多机器则复杂,搭建和资金成本高,节点多了管理成本也高
    • 不需要考虑数据最终一致性
  • 缺点

    • 可靠性低,可能会有节点故障
    • 性能受限于当前cpu,内存和磁盘

2 ) 架构升级

  • 实际上开发中,Redis必然是高可用的,所以单机模式并不是我们的终点
  • 我们需要对目前Redis架构模式进行升级,先整一个主从复制读写分离的环境
  • 我们需要注意以下几点
    • 了解主从复制和读写分离的意义
    • Redis主从复制的环境搭建
    • 了解主从复制的原理和流程,如何保证复制一致性
    • 了解全量同步与部分同步
    • 主从复制的配置和查看复制过程 log 日志

主从复制

  • 围绕着这张图, 可以看到多个客户端发起了读写的操作
  • 这些读写的操作都落在了master这个节点上 (先不考虑 slave 从节点)
  • 把这个 master节点 当成之前的单机,客户端所有的读写,都在这个单节点上
  • 在并发比较少的情况下,完全没有任何问题,当并发现在上来了
  • 无非就是读和写的请求多了,性能降低了,不能在第一时间内反馈你结果
  • 或者说在大量的读的请求下,我们要去写数据,不能及时保证数据落盘
  • Redis 的大部分应用场景是缓存,缓存有一个特性:读多写少
  • 基于这个根本的问题,我们解决方案是:把读的压力释放出去
  • 这就有了 Redis 的主从复制读写分离的环境,就是这么来的
  • 它的目标也非常简单,就是把读压力释放出去
  • 所以说我们就多来几个节点,这些节点就只扮演只读的这个角色
  • 这里的从节点,它就是读操作,它不能写,注意:这个也不是绝对的
  • 因为在 Redis 的配置文件里边,也可以开启从节点读写的配置,一般生产不会这么操作

1 )场景演绎

  • 现在咱们有10万的并发,搞了两个从节点,并发变成15万了,或者说20万了
  • 当现在这个主从的环境,两个从节点依然不够用了,就可以再来一个从节点
  • 所以说在这种模式下,大家可以发现我们只需要一个主节点就够了
  • 因为,我们项目中实际上用 Redis 的写操作是比较少的
  • 业务场景主要的定位就是缓存,所以写操作是比较少的
  • 一般就只要一个主节点就可以轻松应对,无非就是要释放读压力
  • 并发无休止的在增长,那你就根据当前的并发去扩展从节点即可
  • 我们需要考虑的问题是:当无休止的扩展从节点,它们内部的数据是不是都是一致的

2 )主从模式的优缺点

  • 优点
    • 分成了 master/slave 主从角色,各司其职,写操作落在了主节点上,读操作分配给从节点
    • 当并发上来后,可以很方便的进行扩展,不停地加机器来提高读性能
    • 当主节点宕机后,可以手动把一个从节点升级为一个主节点的 (这里为哨兵的应用埋下伏笔)
  • 缺点
    • 数据冗余,比如说主节点上有 10 T 的数据,那从节点也要有 10T 的数据
    • 主从之间会有一个同步数据的过程,在这个过程中,会有全量拷贝和增量拷贝
    • 所谓 全量拷贝
      • 环境搭建好之后,突然并发上来了,
      • 需要去扩展从节点,扩展一个新的从节点进来之后
      • 它第一次跟主节点建立连接关系的时候,它的这个节点上有没有数据
      • 它要把主节点所有的数据全部复制过来,才能提供读的支持
      • 这个时候,它就要做一次全量的复制
    • 所谓 增量拷贝
      • 随着后续客户端的写操作到主节点,根据RDB和AOF模式和心跳机制
      • 从节点和主节点持续通信,就可以把客户端写入的数据复制过来,写一个复制过来一个
      • 这就是增量复制
    • 这意味着,主节点有多少数据,从节点就有多少数据,这个存储压力会越来越成为一个问题
    • 但不要着急,集群是一种分片的机制,解决了存储的压力
    • 另一方面,单独去看 master, 只是一个单节点,没有释放写压力,也会有单点故障
    • 一般我们不会频繁的给 Redis 写数据, 除非有相应的使用场景,这个问题在集群中解决
    • 后期通过哨兵配合,自动切换
    • 最后,master 这个单机性能受限于自身配置

环境搭建

  • 现在搭建一主两从的环境,准备3台机器

  • 准备环境

    IP 角色
    192.168.10.101 Master
    192.168.10.102 Slave
    192.168.10.103 Slave
  • 每台机器上都要进行安装 Redis 和相关配置

    conf 复制代码
    # 创建配置目录
    mkdir -p /usr/local/redis/conf
    # 创建数据目录
    mkdir -p /usr/local/redis/data
    # 创建日志目录
    mkdir -p /usr/local/redis/log
    # 创建配置文件
    vim /usr/local/redis/conf/redis.conf
  • 3台 Redis 节点对配置文件进行编辑,如下

    • 主节点配置

      conf 复制代码
      # 放行访问IP限制,这个需要根据可信ip来配置,目前这个 0.0 做演示
      bind 0.0.0.0
      # 后台启动
      daemonize yes
      # 日志存储目录及日志文件名
      logfile "/usr/local/redis/log/redis.log"
      # rdb数据文件名
      dbfilename dump.rdb
      # aof模式开启和aof数据文件名
      appendonly yes
      appendfilename "appendonly.aof"
      # rdb数据文件和aof数据文件的存储目录
      dir /usr/local/redis/data
      # 设置密码
      requirepass 123456
      # 从节点访问主节点密码(必须与 requirepass 一致)
      masterauth 123456
      # 从节点只读模式
      replica-read-only yes
    • 从节点配置, 除了上述配置,还要添加下面额外的配置

      conf 复制代码
      # 从节点,属于哪个主节点
      slaveof  192.168.10.101  6379
  • 配置好之后,把 3台 Redis 实例分别运行起来

    • $ redis-server /usr/local/redis/conf/redis.conf
  • 现在可以访问测试三台节点, 我们从主节点上来进行连接测试

  • $ bin/redis-cli -a 123456 这里仅作为演示,可以通过 auth 来授权登录

  • 因为这个是主节点,我们看下主从配置 $ info replication

  • 再来看下从节点的主从配置 $ info replication

  • 现在,我们来测试下:主节点可读可写,从节点只能读,不能写的功能

    • 在主节点:
      • $ set username wang 正常
      • $ get username 正常
    • 在从节点:
      • $ get username 正常
      • $ set age 18 发现报错:(error) READONLY You can't write against a read only replica.
  • 这样,我们就搭建测试完毕了

相关推荐
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6751 小时前
数据库基础1
数据库
我爱松子鱼1 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
希忘auto3 小时前
详解Redis在Centos上的安装
redis·centos
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白3 小时前
PostgreSQL:更新字段慢
数据库·postgresql