zoukankan      html  css  js  c++  java
  • redis主从复制

    一、简介

    Redis支持将数据同步到多台slave上,这种特性对提高读取性能非常有益

    1)master可以有多台slave

    2)  除了多个slave连到相同master外,slave也可以连接到其它slave形成图状结构

    3)主从复制不会阻塞master,也就是说当一个或多个slave与master连接进行复制时,master可以继续处理客户端发来的请求,相反slave在初次同步数据时则会阻塞,不能处理客户端请求

    4)主从复制可以用来提高系统的伸缩性,我们可以用多个slave专门负责客户端的读请求,可以做数据冗余

    5)可以在master禁用数据持久化,只需要注释掉master配置文件redis.conf的save配置,然后只在slave配置持久化

    二、Demo

    博主这里就没装多台机器,本来可以用三台虚拟机建一个局域网,来实现redis的主从复制,在这里偷下懒,利用启动多个配置文件来取代,这里一共有三个redis.conf文件,如下:

    [jacky@jacky ~]$ su
    密码:
    [root@jacky jacky]# cd /etc/redis
    [root@jacky redis]# ls -l
    总用量 176
    -rw-r--r--. 1 root root 41576 11月  3 22:03 redis6379.conf
    -rw-r--r--. 1 root root 41560 11月  3 20:08 redis6380.conf
    -rw-r--r--. 1 root root 41560 11月  3 20:08 redis6381.conf

    2.1、主要修改配置文件的以下信息,例如修改redis8381.conf,同理,redis6379.conf和redis6380.conf也一样

    daemonize yes
    
    pidfile /var/run/redis6381.pid
    
    port 6381
    
    logfile "6381.log"
    
    dbfilename dump6381.rdb

    2.2、一主二从

    在这里博主设置79为master;80和81为slave,配置redis主从复制的时候只需要配置从机不需要配置主机(配主补配从)

    6380 配置

    127.0.0.1:6380> SLAVEOF 127.0.0.1 6379

    6381 配置

    127.0.0.1:6380> SLAVEOF 127.0.0.1 6379

    就这样,一主二从配置就完毕了,哈哈,很简单吧,79原来的数据和新的数据都会同步到80和81上,如下

    6379

    127.0.0.1:6379> set k1 v1    #没配置主从之前插入的
    OK
    127.0.0.1:6379> set k2 v2    #没配置主从之前插入的
    OK
    127.0.0.1:6379> set k3 v3    #没配置主从之前插入的
    OK
    127.0.0.1:6379> set k4 v4    #配置主从之后插入的
    OK

    6380

    k1和k4都能拿到

    127.0.0.1:6380> get k4  
    "v4"
    127.0.0.1:6380> get k1
    "v1"

    6381

    k3和k4都能拿到

    127.0.0.1:6381> get k4
    "v4"
    127.0.0.1:6381> get k3
    "v3"

    到这里,一主二从配置成功,但是在生产时,master和slave都有可能突然之间死机,

    1)如果主机死掉了,默认情况下,主机重新启动,角色还是主机

    2)如果从机死掉了,默认情况下,从机重新启动,角色变成没有独立主机了,需要重新配置,除非从机在redis.conf文件里配置了,否则从机不会

         重新连接主机

    3)读写分离,是指redis从机只能负责读,不能写,主机能够写能够读

    2.3、新火相传

    新火相传的意思其实就是去中心化,现在只有80和81两台slave连接master,假如,有100台slave的话,那么master就压力很大了,所以redis又推出了新火相传的解决方案,上一台slave,可以下一台slave的master.

    79和80不改变,在81上配置如下:

    127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
    OK

    这样就在79上插入一个值,也可以同步到81

    2.4、反客为主

    上面提到了,当master死机的时候,重写启动还是master,现在时,我是想当master死机的时候,让某一台从机变成主机,这里是,让80变成主机,

    只要当master死机器的时候,手动在80执行如下命令:

    127.0.0.1:6380> SLAVEOF no one

    同时,81也要重新配置,配置80为主机

    127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
    OK

    2.5、哨兵模式

    简单的说,哨兵模式,就是反客为主的自动版,通过监控主机,当主机挂掉的时候,就几台从机中透过投票选出新的主机

    2.5.1 在 /etc/redis/目录下新建一个sentinel.conf文件

    里面的内容为

    sentinel monitor host6379 127.0.0.1 6379 1 

    host6379为监控的主机名词,自定义的,后面的“1”表示,当主机挂掉的时候,从机自动进行投票,谁的票数首先超过“1”,谁就为主机

    2.5.2 启动sentinel.conf 文件

    [root@jacky bin]# ./redis-sentinel /etc/redis/sentinel.conf
    15482:X 05 Nov 17:44:31.958 * Increased maximum number of open files to 10032 (it was originally set to 1024).
    15482:X 05 Nov 17:44:31.960 # Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.
                    _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 3.0.6 (00000000/0) 32 bit
      .-`` .-```.  ```/    _.,_ ''-._                                   
     (    '      ,       .-`  | `,    )     Running in sentinel mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
     |    `-._   `._    /     _.-'    |     PID: 15482
      `-._    `-._  `-./  _.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |           http://redis.io        
      `-._    `-._`-.__.-'_.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |                                  
      `-._    `-._`-.__.-'_.-'    _.-'                                   
          `-._    `-.__.-'    _.-'                                       
              `-._        _.-'                                           
                  `-.__.-'                                               
    
    15482:X 05 Nov 17:44:31.966 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    15482:X 05 Nov 17:44:31.966 # Sentinel runid is 7cb8075de28bb16320934364995643e41ac24f67
    15482:X 05 Nov 17:44:31.966 # +monitor master host6379 127.0.0.1 6379 quorum 1
    15482:X 05 Nov 17:45:01.982 # +sdown master host6379 127.0.0.1 6379
    15482:X 05 Nov 17:45:01.982 # +odown master host6379 127.0.0.1 6379 #quorum 1/1
    15482:X 05 Nov 17:45:01.982 # +new-epoch 1
    15482:X 05 Nov 17:45:01.982 # +try-failover master host6379 127.0.0.1 6379
    15482:X 05 Nov 17:45:01.997 # +vote-for-leader 7cb8075de28bb16320934364995643e41ac24f67 1
    15482:X 05 Nov 17:45:01.997 # +elected-leader master host6379 127.0.0.1 6379
    15482:X 05 Nov 17:45:01.997 # +failover-state-select-slave master host6379 127.0.0.1 6379
    15482:X 05 Nov 17:45:02.060 # -failover-abort-no-good-slave master host6379 127.0.0.1 6379
    15482:X 05 Nov 17:45:02.129 # Next failover delay: I will not start a failover before Sat Nov  5 17:51:02 2016

    这样就算完成了

    注意:就是当原来的master回来后,不是做独立的mater,而是做新主机的slave

  • 相关阅读:
    Java 中的四种引用
    vue 移动端的开发
    使用java语言实现一个动态数组(详解)(数据结构)
    深度长文回顾web基础组件
    告诉你如何回答"线上CPU100%排查"面试问题
    超实用的mysql分库分表策略,轻松解决亿级数据问题
    【源码解析】凭什么?spring boot 一个 jar 就能开发 web 项目
    java中的守护线程
    Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
    spring-data-redis-cache 使用及源码走读
  • 原文地址:https://www.cnblogs.com/520playboy/p/6028802.html
Copyright © 2011-2022 走看看