zoukankan      html  css  js  c++  java
  • 企业——Redis的主从复制的搭建

    一.Redis的基本简介

      redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是:redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

      存储方式:

      redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。

      redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。

        1.save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。

        2.appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。

        3.appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。

    二.Redis的主从拓扑

    1.一主一从:用于主节点故障转移从节点,当主节点的“写”命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免持久化对主节点的影响

          

    2.一主多从:针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的稳定

          

    3.树状主从:一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点B,再由从节点B推送到C,减轻主节点推送的压力。

          

    三.同步的类型

    1.全量复制

    Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
      1)从服务器连接主服务器,发送SYNC命令;
      2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
      3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
      4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
      5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
      6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;


          

    2 增量同步

      Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
      增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

    3 Redis主从同步策略

      主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。

      当然,如果有需要,slave 在任何时候都可以发起全量同步。

      redis 策略是:无论如何,slave首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

      注意:如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。

     四.Redis的主从复制的过程

    1.实验环境

      172.25.254.1  Redis master   server1

      172.25.254.2  Redis slave   server2

      172.25.254.3  Redis slave   server3

      172.25.254.4  client(用来做测试)   server4

    2.准备安装相应的安装包

      tar zxf redis-5.0.3.tar.gz
      cd redis-5.0.3
      yum insatall gcc -y   ##安装gcc

    安装下载,编译生成可执行文件。由于makefile文件已经写好,我们只需要直接在源码目录执行make命令进行编译即可。

      make    ##make命令执行完成后,会在当前目录下生成几个可执行文件,分别是redis-server(Redis服务器的daemon启动程序)、redis-cli(Redis命令行操作工具)、redis-benchmark(Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能)、redis-stat(Redis状态检测工具,可以检测Redis当前状态参数及延迟状况)

      make install   
      cd utils/
      ./install_server.sh    ##执行redis的安装脚本

      下面的操作不是必须的,只是为了将Redis相关的资源统一管理而进行的操作。

      mkdir -p /usr/local/redis/bin    ##存放Redis的二进制的可执行文件

      mkdir -p /usr/local/redis/etc    ##存放Redis的配置文件

      mkdir -p /usr/local/redis/var

      cp redis-server redis-cli redis-benchmark redis-stat /usr/local/redis/bin/

      cp redis.conf  /usr/local/redis/etc/

    3.修改相关的配置文件

    (1)在master上:

      vim /etc/redis/6379.conf    ##Redis使用的端口号是:6379

        70 bind 0.0.0.0

      注意:在配置文件redis.conf中,默认的 bind 接口是127.0.0.1,也就是本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接,这样可以避免将redis服务暴露于危险的网络环境中,防止一些不安全的人随随便便通过远程连接到redis服务。如果将bind选项注释的话,那会接受所有来自于可用网络接口的连接。

    (2)在两个slave上:

      vim /etc/redis/6379.conf 

        70 bind 0.0.0.0
        282 slaveof 172.25.254.1 6379   ##添加salve指向master为server1

    (3)重启服务器:

      systemctl restart redis_6379.service

    (4)测试:

      <1>查看各个节点的服务状态:  redis-cli

      master的:

          

          

      slave的:

          

          

      <2>在server1(master)添加key-value值:

          

      <3>在server2,server3上可以看到数据同步过来了:

          

  • 相关阅读:
    MyEclipse2014中SVN的使用方法
    使用Navicat V8.0创建数据库,外键出现错误ERROR 1005: Can’t create table (errno: 121)
    个人简历
    Android Studio集成SVN报错:can't use subversion command line client : svn
    面向对象原型的七种方法详解(前)
    js中return的用法
    面试题总结
    Ajax 是什么?Ajax 的交互模型?同步和异步的区别?如何解决跨域问题?以及 HTTP状态码
    css3实现的3中loading动画效果
    CSS3绘制弹球动画效果
  • 原文地址:https://www.cnblogs.com/wf-aiyouwei/p/10714986.html
Copyright © 2011-2022 走看看