精华内容
下载资源
问答
  • STM32:F103/F407定时器主从模式输出精准脉冲个数。用开发板资料的表达方式,这个程序是库函数版的。适用于对步进电机进行较为精准的控制,不过是开环的。
  • 已验证可行用的是stm32c8t6最小系统板,有什么不对的地方欢迎大家指正一起探讨,有更好的方案可以一起交流通过stm32cubemx进行配置的文件
  • hc-05 主从模式的设置

    2017-12-27 15:08:44
    结合AT指令集和 网友提供的一些资料,针对HC-05 模块调试的 主模式和从模式 对常用的AT指令进行了详细的使用说明,及测试方法
  • 主从复制是数据库运维中一种常见的备份方式,这里我们来看一下MongoDB的Master-Slave主从模式配置及主从复制要点解析,需要的朋友可以参考下
  • 该SPI IP核通过状态机来控制数据传输模块端口的方向,以此来解决主从模式下数据传输方向相反的问题,通过对移位寄存器的复用减少了逻辑资源消耗,利用时钟分频模块来实现不同传输速率下的数据交换,设计了配置数据...
  • stm32硬件spi主从模式

    2018-06-13 10:48:57
    使用stm32cubemx生成是hal库工程.工程包括spi主机和从机程序,引脚连接时只需4根线GND/CLK/MOSI/MISO即可
  • Nginx+keepalived双机热备(主从模式),根据文档操作,本人部署和测试过,可运行
  • 此文件为redis主从模式修改的配置文件,对应的博文见我个人主页,有兴趣的小伙伴可以下载下来自己试试
  • 搞了一个多星期才调试通过的stm32f030及stm8l052的iic主从模式DMA配置,stm32f030主模式+DMA发送,stm8l052从模式+DMA配置
  • mysql主从实时备份,提高效率,提升数据安全性,mysql主从实时备份,提高效率,提升数据安全性mysql主从实时备份,提高效率,提升数据安全性
  • Redis主从模式

    千次阅读 2019-01-14 14:16:25
    Redis主从模式  目录: 1、Redis主从模式简单介绍: 2、Redis主从模式的部署安装: 3、测试从服务器的只读: 4、测试主节点宕机故障恢复: 1、Redis主从模式简单介绍: 图1.1 主从模式架构 主从模式: ...

    Redis主从模式

     目录:

    1、Redis主从模式简单介绍:

    2、Redis主从模式的部署安装:

    3、测试从服务器的只读:

    4、测试主节点宕机故障恢复:

    1、Redis主从模式简单介绍:

    图1.1 主从模式架构

    主从模式:

    使用一个Redis实例作为主机,其余的作为备份机。主机和备份机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取。也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。

    主节点宕机:

    slave从节点不会竞选成为master。因为每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接。

     

    2、Redis主从模式的部署安装:

    (1)wget http://download.redis.io/releases/redis-4.0.8.tar.gz

    wget命令:后台执行下载任务,通过网络下载资源,下载资源默认为当前目录。

    (2)tar -xzvf redis-4.0.8.tar.gz

    解压文件:x参数:解压文件;z参数:通过gzip指令处理备份文件;v参数:显示执行过程;f参数:指定备份文件

    (3)cd redis-4.0.8

    (4)make命令进行安装

    使用默认的makefile文件进行编译。

    (5)安装完毕后,将redis-server、redis-cli、redis.conf文件复制到新建的目录中:/usr/local/redis,然后修改redis.conf文件。

    图2.1 截图1

    (6)修改主服务器中conf文件中的以下参数:

    daemonize yes
    
    port 6379
    
    requirepass qinyi123456
    
    bind 172.18.6.92
    
    dir /usr/local/redis/snap
    
    logfile "./logs/redis_master.log"

    (7)修改另外两台从服务器中conf文件中的以下参数:

    daemonize yes

    port 6379

    slaveof 172.18.6.92 6379

    一台为:bind 172.18.6.93以及另一台为:bind 172.18.6.91

    dir /usr/local/redis/snap

    一台为:logfile "./logs/redis_slave1.log"以及另一台为:logfile "./logs/redis_slave2.log"

    附注(部分参数说明):

    ①daemonize yes:使得Redis可以以守护进程的形式运行

    ②port 6379:指定Redis监听的端口,默认端口是6379

    ③bind 172.18.6.92:配置绑定的主机地址,这个地址用于外部主机的访问

    ④timeout 1800:设置客户端闲置多久后会关闭连接,此处设置为1800秒,如果指定为0,表示关闭此功能

    ⑤loglevel notice:设置日志的记录级别,有四个级别:

    图2.2 截图2

    debug:大量信息,对开发和测试适用

    verbose:很多精简有用的信息

    notice:生产环境中需要的适量的信息

    warning:只记录重要的或严重的信息

    ⑥logfile "./logs/redis_master.log":设置日志文件

    ⑦databases 16:设置数据库的数量为16

    ⑧save 900 1:表示900秒后至少有1个更新操作,就将数据同步到数据文件

    save 300 10:表示300秒后至少有10个更新操作,就将数据同步到数据文件

    save 60 10000:表示60秒后至少有10000个更新操作,就将数据同步到数据文件

    ⑨stop-writes-on-bgsave-error yes:如果开启了RDB快照,并且最新的后台保存失败,Redis默认会停止接受写操作,使得用户知道数据没有正确的持久化到硬盘中。

    ⑩dbfilename qinyi.rdb:指定本地数据库文件名,默认值是dump.rdb

    ①①dir /usr/local/redis/snap:指定本地数据库存放目录

    ①②slaveof <masterip> <masterport>:当本机为slave服务时,设置master服务的IP地址和端口,在Redis启动时,它会自动从master进行数据同步

    ①③masterauth qinyi123456:当master服务设置了密码保护时,slave服务连接master的密码

    ①④requirepass qinyi123456:设置redis连接密码,如果配置了连接密码,客户端在连接redis时需要通过auth <密码>命令提供密码

    ①⑤slave-read-only yes:配置salve实例只读而不能进行写操作

    ①⑥maxclients 10000:设置同一时间客户端的最大连接数

    (8)启用Redis-server:/usr/local/redis/redis-server /usr/local/redis/redis.conf

    (9)使用客户端登入主服务器:/usr/local/redis/redis-cli -h 172.18.6.92 -p 6379  -a qinyi123456

    图2.3 截图3

    (10)使用客户端登入从服务器,并测试从服务器是否可以写:

    图2.4 截图4

    因为有slave-read-only yes的配置,所以从服务器可以读,但不能写,在写入时会报错。

    (11)info Replication:查看master主服务器的主从复制的信息

    图2.5 截图5

    查看到role角色是master,连接的从服务器有两台(connected_slaves:2),

    (11)info Replication:查看slave从服务器的信息

    图2.6 截图6

    查看到slave从服务器的信息,包括slave的优先级(这里是100,当出现master宕机时,优先级数字小的slave会优先考虑提升为master)、只读状态(这里是1,表示启用了只读),连接的slave数为0。

     

    3、测试从服务器的只读:

    package com.remoa.redis.action;
     
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
     
    /**
     * @author  qinyi
     * @since 2018/02/23
     */
    public class Test {
        private static JedisPool jedisPool = null;
        public static void main(String[] args) {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(100);
            //超时时间为10 * 1000,即十秒
            jedisPool = new JedisPool(jedisPoolConfig, "172.18.6.92", 6379, 10 * 1000, "qinyi123456");//测试连接主节点,因为redis.conf文件中配置了连接密码“requirepass qinyi123456”,所以这里需要指定密码
            Jedis resource = jedisPool.getResource();
            System.out.println("master服务器返回:" + resource.ping());//使用客户端向Redis服务器发送一个ping,如果服务器运作正常的话, 会返回一个pong
            resource.set("remoa", "boy");
            System.out.println(resource.get("remoa"));
            resource.set("remoa", "senior students");
            System.out.println(resource.get("remoa"));
            jedisPool = new JedisPool(jedisPoolConfig, "172.18.6.93", 6379, 10 * 1000, "qinyi123456");//测试连接从节点
            resource = jedisPool.getResource();
            System.out.println("slave服务器返回:" + resource.ping());
            resource.set("remoa", "male");
            System.out.println(resource.get("remoa"));
        }
    }


    运行结果:


    图3.1 运行结果

    4、测试主节点宕机故障恢复:

    (1)首先修改防火墙配置打开三台机器中相应的redis端口:/etc/sysconfig/iptables

    重启防火墙配置:service iptables restart

    外部主机使用telnet进行端口测试: telnet 172.18.6.91 6379

    (2)使用外部机器进行测试,连接redis主节点,

    (3)kill掉主节点master的实例:

    ps aux | grep redis

    kill -9 6995

    图4.1 截图7

    (4)然后再尝试连接redis master节点

    发现master主节点无法连接,而从节点可以连接。也就是说,当主节点宕机时,slave节点不会重新竞选为master节点,因此需要人工进行故障转移工作。

    图4.2 截图8

    展开全文
  • Redis基础:主从模式的优点和缺点

    千次阅读 2020-06-07 09:19:54
    主从模式最为常见的场景就是主写从读的模式,读写分离,降低读的压力。 优点:从节点宕机,影响较小 事前确认 liumiaocn:redis liumiao$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19ed07e...

    上篇文章使用容器化的方式构建了一个一主两丛的Redis服务,这篇文章继续在此基础之上确认一下相应的优点和缺点。

    环境构建

    详细可参看:https://liumiaocn.blog.csdn.net/article/details/106582498
    使用一个docker-compose.yml即可拉起一主两丛的Redis,详细如下所示:

    liumiaocn:redis liumiao$ cat docker-compose.yml
    version: '2'
    services:
      # redis master
      master:
        image: redis:6.0.4
        container_name: redis-master
        restart: always
        command: redis-server --port 6379 --requirepass liumiaocn@server  --appendonly yes
        ports:
          - 6379:6379
        volumes:
          - ./data:/data
    
      # redis slave 1 
      slave1:
        image: redis:6.0.4
        container_name: redis-slave-1
        restart: always
        command: redis-server --slaveof 192.168.31.242 6379 --port 6380 --requirepass liumiaocn@server --masterauth liumiaocn@server  --appendonly yes
        ports:
          - 6380:6380
        volumes:
          - ./data:/data
    
      # redis slave 2 
      slave2:
        image: redis:6.0.4
        container_name: redis-slave-2
        restart: always
        command: redis-server --slaveof 192.168.31.242 6379 --port 6381 --requirepass liumiaocn@server --masterauth liumiaocn@server  --appendonly yes
        ports:
          - 6381:6381
        volumes:
          - ./data:/data
    liumiaocn:redis liumiao$ 
    liumiaocn:redis liumiao$ docker-compose up -d
    Creating network "redis_default" with the default driver
    Creating redis-master  ... done
    Creating redis-slave-2 ... done
    Creating redis-slave-1 ... done
    liumiaocn:redis liumiao$ docker-compose ps
        Name                   Command               State                Ports              
    -----------------------------------------------------------------------------------------
    redis-master    docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp          
    redis-slave-1   docker-entrypoint.sh redis ...   Up      6379/tcp, 0.0.0.0:6380->6380/tcp
    redis-slave-2   docker-entrypoint.sh redis ...   Up      6379/tcp, 0.0.0.0:6381->6381/tcp
    liumiaocn:redis liumiao$
    

    优点:主写,从读,降低读的压力

    liumiaocn:redis liumiao$ redis-cli -p 6379
    127.0.0.1:6379> auth liumiaocn@server
    OK
    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> set greeting "hello liumiao"
    OK
    127.0.0.1:6379> get greeting
    "hello liumiao"
    127.0.0.1:6379> keys *
    1) "greeting"
    127.0.0.1:6379> 
    127.0.0.1:6379> exit
    liumiaocn:redis liumiao$
    

    Master写,Slave可读

    liumiaocn:redis liumiao$ redis-cli -p 6380
    127.0.0.1:6380> auth liumiaocn@server
    OK
    127.0.0.1:6380> keys *
    1) "greeting"
    127.0.0.1:6380> get greeting
    "hello liumiao"
    127.0.0.1:6380>
    
    liumiaocn:redis liumiao$ redis-cli -p 6381
    127.0.0.1:6381> auth liumiaocn@server
    OK
    127.0.0.1:6381> keys *
    1) "greeting"
    127.0.0.1:6381> get greeting
    "hello liumiao"
    127.0.0.1:6381> 
    

    缺点:Master的写的压力难以降低

    从节点无法进行写操作

    liumiaocn:redis liumiao$ redis-cli -p 6380
    127.0.0.1:6380> auth liumiaocn@server
    OK
    127.0.0.1:6380> set name "liumiao"
    (error) READONLY You can't write against a read only replica.
    127.0.0.1:6380> 
    

    注:虽然也可设定使得slave可写,但在数据的同步等方面使用上都有很多问题。主从模式最为常见的场景就是主写从读的模式,读写分离,降低读的压力。

    优点:从节点宕机,影响较小

    事前确认

    liumiaocn:redis liumiao$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
    19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
    66e84b66542e        redis:6.0.4         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:6379->6379/tcp             redis-master
    e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
    liumiaocn:redis liumiao$ redis-cli -p 6380
    127.0.0.1:6380> auth liumiaocn@server
    OK
    127.0.0.1:6380> keys *
    1) "greeting"
    127.0.0.1:6380> 
    127.0.0.1:6380> exit
    liumiaocn:redis liumiao$
    

    模拟slave1宕机

    liumiaocn:redis liumiao$ docker stop redis-slave-1
    redis-slave-1
    liumiaocn:redis liumiao$ 
    liumiaocn:redis liumiao$ redis-cli -p 6380
    Could not connect to Redis at 127.0.0.1:6380: Connection refused
    not connected> exit
    liumiaocn:redis liumiao$ 
    

    剩余一主一从仍可使用

    liumiaocn:redis liumiao$ redis-cli -p 6379
    127.0.0.1:6379> auth liumiaocn@server
    OK
    127.0.0.1:6379> keys *
    1) "greeting"
    127.0.0.1:6379> set version 0.1
    OK
    127.0.0.1:6379> keys *
    1) "version"
    2) "greeting"
    127.0.0.1:6379> exit
    liumiaocn:redis liumiao$ 
    liumiaocn:redis liumiao$ redis-cli -p 6381
    127.0.0.1:6381> auth liumiaocn@server
    OK
    127.0.0.1:6381> keys *
    1) "greeting"
    2) "version"
    127.0.0.1:6381> exit
    liumiaocn:redis liumiao$ 
    

    启动slave1后即可继续使用

    liumiaocn:redis liumiao$ docker start redis-slave-1
    redis-slave-1
    liumiaocn:redis liumiao$ 
    liumiaocn:redis liumiao$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
    19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
    66e84b66542e        redis:6.0.4         "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       0.0.0.0:6379->6379/tcp             redis-master
    e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   11 minutes ago      Up 2 seconds        6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
    liumiaocn:redis liumiao$ 
    

    启动后,在宕机期间更新的数据也已经同步

    liumiaocn:redis liumiao$ redis-cli -p 6380
    127.0.0.1:6380> auth liumiaocn@server
    OK
    127.0.0.1:6380> keys *
    1) "greeting"
    2) "version"
    127.0.0.1:6380> get version
    "0.1"
    127.0.0.1:6380> exit
    liumiaocn:redis liumiao$
    

    缺点:主节点宕机,无法继续使用

    liumiaocn:redis liumiao$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
    19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
    66e84b66542e        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:6379->6379/tcp             redis-master
    e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up About a minute   6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
    liumiaocn:redis liumiao$ docker stop redis-master
    redis-master
    liumiaocn:redis liumiao$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
    19ed07e594b2        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       6379/tcp, 0.0.0.0:6381->6381/tcp   redis-slave-2
    e1bc030fc87d        redis:6.0.4         "docker-entrypoint.s…"   13 minutes ago      Up About a minute   6379/tcp, 0.0.0.0:6380->6380/tcp   redis-slave-1
    liumiaocn:redis liumiao$ 
    

    只能连接从节点进行读操作,无法执行写操作,需要进行手工干预

    liumiaocn:redis liumiao$ redis-cli -p 6380
    127.0.0.1:6380> auth liumiaocn@server
    OK
    127.0.0.1:6380> keys *
    1) "greeting"
    2) "version"
    127.0.0.1:6380> 
    127.0.0.1:6380> set name "liumiao"
    (error) READONLY You can't write against a read only replica.
    127.0.0.1:6380> 
    
    展开全文
  • 本片详细记录了Nginx+keepalived双机热备(主从模式)高可用集群方案-完整部署过程,讲解十分到位,可作为线上实操手册。特在此分享,希望能帮助到有用到的朋友。
  • redis 集群方案的介绍(主从模式、哨兵模式、Redis Cluster模式) Redis Cluster 的部署和使用 本次演示使用的Redis版本为 redis-5.0.3 一、主从模式 将数据完全存储在单个redis中主要存在两个问题:数据备份和数据...

    分享内容:

    redis 集群方案的介绍(主从模式、哨兵模式、Redis Cluster模式)

    Redis Cluster 的部署和使用

    本次演示使用的Redis版本为 redis-5.0.3

    一、主从模式

    将数据完全存储在单个redis中主要存在两个问题:数据备份和数据体量较大造成的性能降低。
    Redis的主从模式为这两个问题提供了一个较好的解决方案。主从模式指的是使用一个redis实例作为主机,其余的实例作为备份机。
    主机和从机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取,也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。
    主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。

    实现主从复制(Master-Slave Replication)的工作原理:Slave从节点服务启动并连接到Master之后,它将主动发送一个SYNC命令。Master服务主节点收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave从节点服务在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master主节点继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
    如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,在连接成功之后,一次完全同步将被自动执行。

    在这里插入图片描述
    我们可以利用master来处理写操作,slave提供读操作。这样可 以有效减少单个机器的并发访问数量。

    主从模式的搭建
    Redis配置文件常用配置

    # 通用配置
    # bind 127.0.0.1 # 绑定监听的网卡IP,注释掉或配置成0.0.0.0可使任意IP均可访问
    port 6379  # 设置监听端口
    #是否开启保护模式,默认开启。
    # 设置为no之后最好设置一下密码
    protected-mode no
    #是否在后台执行,yes:后台运行;no:不是后台运行
    daemonize yes
    # 复制选项,slave复制对应的master。
    # replicaof <masterip> <masterport>
    #如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来
    # 配置master的密码,这样可以在连上master后进行认证。
    # masterauth <master-password>
    

    更多配置参数

    部署演示
    分别复制4份Redis配置文件 命名为 master.conf slave1.conf slave2.conf slave3.conf
    对4份配置文件进行简单配置
    Master节点的配置文件一般不需要特殊设置 port默认为6379
    Slave1 节点 port设置 6380 再配置一行 replicaof 127.0.0.1 6379
    Slave2 节点 port设置 6381 再配置一行 replicaof 127.0.0.1 6379
    Slave3 节点 port设置 6382 再配置一行 replicaof 127.0.0.1 6379
    分别开启 Master节点和3个Slave节点

    redis-server  master.conf
    redis-server  slave1.conf
    redis-server  slave2.conf
    redis-server  slave3.conf
    

    在这里插入图片描述
    在这里插入图片描述
    操作Redis读写
    在这里插入图片描述
    Master可读写 Slave只读
    在这里插入图片描述
    主从模式的优缺点

    1、优点:

    • 同一个Master可以同步多个Slaves。
    • master能自动将数据同步到slave,可以进行读写分离,分担master的读压力
    • master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求

    2、缺点:

    • 不具备自动容错与恢复功能,master或slave的宕机都可能导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复
    • master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题
    • 难以支持在线扩容,Redis的容量受限于单机配置

    其实redis的主从模式很简单,在实际的生产环境中很少使用,不建议在实际的生产环境中使用主从模式来提供系统的高可用性,之所以不建议使用都是由它的缺点造成的,在数据量非常大的情况,或者对系统的高可用性要求很高的情况下,主从模式也是不稳定的。虽然这个模式很简单,但是这个模式是其他模式的基础,所以理解了这个模式,对其他模式的学习会很有帮助。

    二、哨兵模式(Sentinel)

    哨兵顾名思义,就是来为Redis集群站哨的,一旦发现问题能做出相应的应对处理。其功能包括
    监控master、slave是否正常运行
    当master出现故障时,能自动将一个slave转换为master(大哥挂了,选一个小弟上位)
    多个哨兵可以监控同一个Redis,哨兵之间也会自动监控

    当自动发现slave和其他哨兵节点后,哨兵就可以通过定期发送PING命令定时监控这些数据库和节点有没有停止服务。
    如果被PING的数据库或者节点超时(通过 sentinel down-after-milliseconds master-name milliseconds 配置)未回复,哨兵认为其主观下线(sdown,s就是Subjectively —— 主观地)。如果下线的是master,哨兵会向其它哨兵发送命令询问它们是否也认为该master主观下线,如果达到一定数目(即配置文件中的quorum)投票,哨兵会认为该master已经客观下线(odown,o就是Objectively —— 客观地),并选举领头的哨兵节点对主从系统发起故障恢复。若没有足够的sentinel进程同意master下线,master的客观下线状态会被移除,若master重新向sentinel进程发送的PING命令返回有效回复,master的主观下线状态就会被移除。

    哨兵认为master客观下线后,故障恢复的操作需要由选举的领头哨兵来执行,
    选出领头哨兵后,领头者开始对系统进行故障恢复,从出现故障的master的从数据库中挑选一个来当选新的master,
    挑选出需要继任的slave后,领头哨兵向该数据库发送命令使其升格为master,然后再向其他slave发送命令接受新的master,最后更新数据。将已经停止的旧的master更新为新的master的从数据库,使其恢复服务后以slave的身份继续运行。

    在这里插入图片描述
    部署演示
    哨兵模式基于前面的主从复制模式。哨兵的配置文件为sentinel.conf,在文件中添加以下配置

    # mymaster定义一个master数据库的名称,后面是master的ip, port,1表示至少需要一个Sentinel进程同意才能将master判断为失效
    # 如果不满足这个条件,则自动故障转移(failover)不会执行
    sentinel monitor mymaster 127.0.0.1 6379 1 
    
    # master的密码
    # sentinel auth-pass mymaster 123456 
    
    # 5s未回复PING,则认为master主观下线,默认为30s
    sentinel down-after-milliseconds mymaster 5000 
    
     # 指定在执行故障转移时,最多可以有多少个slave实例在同步新的master实例,在slave实例较多的情况下
     # 这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
    sentinel parallel-syncs mymaster 2 
    
    # 如果在该时间(ms)内未能完成故障转移操作,则认为故障转移失败,生产环境需要根据数据量设置该值
    sentinel failover-timeout mymaster 300000 
    

    更多哨兵配置参数
    使用命令 redis-server sentinel.conf --sentinel 或者 redis-sentinel sentinel.conf 启动哨兵进程

    在这里插入图片描述
    在这里插入图片描述
    哨兵模式优缺点:
    优点:
    哨兵模式基于主从复制模式
    哨兵模式下,master挂掉可以自动进行切换,系统可用性更高

    缺点:
    同样也继承了主从模式难以在线扩容的缺点,Redis的容量受限于单机配置
    需要额外的资源来启动sentinel进程,实现相对复杂一点

    三、redis cluster 介绍

    在这里插入图片描述
    Cluster采用无中心结构,它的特点如下:
    客户端与redis节点直连,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

    Cluster模式的具体工作机制:
    在Redis的每个节点上,都有一个插槽(slot),取值范围为0-16383 ,一共16384个槽
    当我们存取key的时候,Redis会根据CRC16的算法得出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

    为了保证高可用,Cluster模式也引入主从复制模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。

    当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点都宕机了,那么该集群就无法再提供服务了。

    Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。
    为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,如果主节点失效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务,Redis Cluster本身提供了故障转移容错的能力。

    Cluster模式集群节点最小配置6个节点(根据cluster的选举机制和主从备份的实现,redis要求至少三主三从共6个节点才能组成redis集群,因为至少需要半数以上才能确定某个节点是否宕机且需要主从备份),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。

    cluster集群部署

    根据cluster的选举机制和主从备份的实现,redis要求至少三主三从共6个节点才能组成redis集群,测试环境可一台物理机器上启动6个redis节点,但生产环境至少要准备2~3台物理机。(这里使用三台虚拟机)

    服务端口IP地址配置文件名
    7001192.168.200.200redis.conf
    7002192.168.200.201redis.conf
    7003192.168.200.202redis.conf
    7004192.168.200.200redis.conf
    7005192.168.200.201redis.conf
    7006192.168.200.202redis.conf

    redis 配置修改

    redis.config 配置支持集群,需要修改部分配置项,所有节点(不分主从)修改都是一致的,修改配置完成后启动对应的所有节点即可,和启动普通单例没有区别。

    配置项说明
    port指定端口,默认值:6379
    cluster-enabled开启集群,去掉#: cluster-enabled yes
    cluster-config-file集群的配置文件,去掉#,首次启动会自动生成,命名修改: nodes-{port}.conf
    cluster-node-timeout请求超时 默认15秒,可自行设置
    appendonly指定是否在每次更新操作后进行日志记录,默认不开启,即aof模式备份数据
    include指定包含其它的配置文件
    daemonizeredis 是否后台运行,默认值:no
    pidfiledaemonize方式运行时,pid可以通过pidfile指定: /var/run/redis_6379.pid
    requirepass对集群设置密码
    masterauth如果设置,requirepass和masterauth都需要设置,并且每个节点的密码要一致

    以上修改 6 份实例,然后正常启动即可。

    创建集群

    创建redis集群命令(三主三从,每个主一个从,注意redis-5.0.0版本开始才支持“–cluster”,redis-cli --cluster 为 redis-5.0.0/src 下的 redis-cli ,老版本不支持,之前的版本会报错。)

    redis-cli --cluster create 192.168.200.200:7001 192.168.200.201:7002 192.168.200.202:7003 192.168.200.200:7004 192.168.200.201:7005 192.168.200.202:7006 --cluster-replicas 1
    

    如果配置项 cluster-enabled 的值不为yes,则执行时会报错“[ERR] Node 192.168.0.251:6381 is not configured as a cluster node.”。这个时候需改为yes,然后重启 redis-server 进程,之后才可以重新执行 redis-cli 创建集群。

    redis-cli的参数说明:

    1. create
      表示创建一个redis集群。

    2. –cluster-replicas 1
      表示为集群中的每一个主节点指定一个从节点,即一比一的复制。

    运行过程中,会有个提示,输入yes 回车即可。从屏幕输出,可以很容易地看出哪些是主(master)节点,哪些是从(slave)节点:
    在这里插入图片描述
    在这里插入图片描述

    集群测试

    客户端测试,6个节点等价,在单机版redis基础上指定参数“-c”,链接仍意一个节点即可: redis-cli -a 123456 -p 7001 -c
    查看当前集群信息 : cluster info
    查看集群里有多少个节点: cluster nodes

    添加一个新主(master)节点
    假设要添加新的节点“192.168.200.200:6390”,先以单机版配置和启动好6390,然后执行命令(“127.0.0.1:6381”为集群中任一可用的节点)

    redis-cli --cluster add-node 192.168.200.200:6390 127.0.0.1:6381
    

    添加一个新从(slave)节点
    以添加“192.168.200.200:6390”为例

    redis-cli --cluster add-node 192.168.0.251:6390 127.0.0.1:6381 --cluster-slave
    

    “192.168.200.200:6390” 为新添加的从节点,“127.0.0.1:6381”可为集群中已有的任意节点,这种方法随机为6390指定一个master,如果想明确指定master,假设目标master的ID为“123546”,则:

    redis-cli --cluster add-node 192.168.200.200:6390 127.0.0.1:6381 --cluster-slave --cluster-master-id 123456
    

    删除节点
    从集群中删除一个节点命令格式:
    redis-cli --cluster del-node 127.0.0.1:7000 <node-id>
    “127.0.0.1:7000”为集群中任意一个非待删除节点,“node-id”为待删除节点的ID。如果待删除的是master节点,则在删除之前需要将该master负责的slots先全部迁到其它master。

    $ ./redis-cli --cluster del-node 127.0.0.1:7000   082c079149a9915612d21cca8e08c831a4edeade 
    >>> Removing node 082c079149a9915612d21cca8e08c831a4edeade from cluster 127.0.0.1:7000 
    >>> Sending CLUSTER FORGET messages to the cluster...
    >>> SHUTDOWN the node.
    

    青谷云结合redis集群

    qgyun-core-starter-redis 基于青谷云框架,封装的支持redis插件的分布式缓存的start ,是spring-boot-starter-data-redis 和 redisson-spring-boot-starter 的二次封装,本质上没有任何区别,扩展了默认配置以及 同时支持单例和集群并存的模式,支持redis 单例和集群,同时兼容 单例或集群模式下的分布式式锁(redisson)实现,这也是两个默认starter合并核心,默认所有WEB 项目必须依赖的服务之一。
    ​ 基本核心的配置原则仍然保持原有springcloud 相关配置规则,不做任何特殊处理,降低学习成本。

    pom 依赖

    <dependency>
       <groupId>com.qgutech.qgyun.framework</groupId>
       <artifactId>qgyun-core-starter-redis</artifactId>
       <version>2.1.0-SNAPSHOT</version>
    </dependency>
    

    yml 配置

    server:
      port: 9999
    
    spring:
      redis:
        password: 123456
        cluster:
          nodes:
          - 192.168.200.200:7001
          - 192.168.200.201:7002
          - 192.168.200.202:7003
          - 192.168.200.200:7004
          - 192.168.200.201:7005
          - 192.168.200.202:7006
    
    
    

    参考《Redis中文网》

    展开全文
  • Redis主从模式 什么是Redis主从模式 使用一个 Redis 实例作为主机,其余的作为备份机。主机和备份机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取。也就是说,客户端...

    本文参考 嗨客网 Redis面试题

    Redis主从模式

    什么是Redis主从模式

    使用一个 Redis 实例作为主机,其余的作为备份机。主机和备份机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取。也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。

    主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。

    Redis 的主从复制功能非常强大,一个 master 可以拥有多个 slave,而一个 slave 又可以拥有多个 slave,如此下去,形成了强大的多级服务器集群架构。

    主从模式架构

    Redis 主从模式的架构图如下图所示:

    嗨客网(www.haicoder.net)

    我们可以看到,在主从模式中,只有一个是主机,其他的都是从机,并且从机下面还可以有任意多个从机。

    Redis主从复制注意点

    1. 默认配置下,master 节点可以进行读和写,slave 节点只能进行读操作,写操作被禁止。
    2. 不要修改配置让 slave 节点支持写操作,没有意义,因为,首先写入的数据不会被同步到其他节点,其次,当 master 节点修改同一条数据后,slave 节点的数据会被覆盖掉。
    3. master 节点挂了以后,redis 就不会对外提供写服务了,因为剩下的 slave 节点不会成为 master。
    4. master 节点挂了以后,不影响 slave 节点的读,master 节点启动后 Redis 将重新对外提供写服务。
    5. slave 节点挂了不影响其他 slave 节点的读和 master 节点的读和写,重新启动后会将数据从 master 节点同步过来。

    主从复制优缺点

    优点

    1. 读写分离,提高效率
    2. 数据热备份,提供多个副本

    缺点

    1. 主节点故障,集群则无法进行工作,可用性比较低,从节点升主节点需要人工手动干预
    2. 单点容易造成性能低下
    3. 主节点的存储能力受到限制
    4. 主节点的写受到限制(只有一个主节点)
    5. 全量同步可能会造成毫秒或者秒级的卡顿现象

    特点

    只能 master 到 slave,单向的

    Redis主从模式配置

    我们首先使用 vim 创建 master 的配置文件,具体命令如下:

    vim redis/master-6739.conf
    

    如下图所示:

    嗨客网(www.haicoder.net)

    我们写入如下配置:

    bind 0.0.0.0
    port 6379
    logfile "6379.log"
    dbfilename "dump-6379.rdb"
    daemonize yes
    rdbcompression yes
    

    即,我们配置了主节点的端口为 6379,现在,我们再次创建 slave1 节点的配置,具体命令如下:

    vim redis/slave1-6380.conf
    

    我们写入如下配置:

    bind 0.0.0.0
    port 6380
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    daemonize yes
    rdbcompression yes
    
    slaveof 192.168.33.133 6379
    

    即,我们配置了第一个从节点的端口为 6380,同时,我们通过 slaveof 配置指定了该从节点的主节点是什么,现在,我们再次创建 slave2 节点的配置,具体命令如下:

    vim redis/slave2-6381.conf
    

    我们写入如下配置:

    bind 0.0.0.0
    port 6381
    logfile "6381.log"
    dbfilename "dump-6381.rdb"
    daemonize yes
    rdbcompression yes
    
    slaveof 192.168.33.133 6379
    

    我们指定了 slave2 节点的端口为 6381,并且指定了其主节点为 6379 的配置,现在,我们分别启动三个服务器,具体命令如下:

    redis-server redis/master-6739.conf
    redis-server redis/slave1-6380.conf
    redis-server redis/slave2-6381.conf
    

    启动完毕之后,我们使用 ps 命令 查看所有的 redis-server 服务,具体命令如下:

    ps -ef | grep redis-server
    

    执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    至此,我们的所有配置都已经完成了,并且服务都已经启动成功了,现在,我们分别登录到 master 和两个 slave 查看键 name 是否存在,具体命令如下:

    get name
    

    执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    我们看到,此时三个节点都没有 name 键,现在,我们在 master 上设置 name 的值,具体命令如下:

    set name haicoder
    

    执行完毕后,我们再次分别在 master 和两个 slave 获取数据,如下图所示:

    嗨客网(www.haicoder.net)

    我们可以看出,我们在 master 上设置了一个键,最后在两个 slave 都获取到了这个键的值,即,master 的数据会自动同步到 slave 节点。现在,我们尝试在 slave 设置键,具体命令如下:

    set name1 haicoder1
    

    执行完毕后,如下图所示:

    嗨客网(www.haicoder.net)

    我们看到,此时提示我们不能在 slave 写入数据,即 master 可以读写数据,但 slave 只能读取数据。

    注意,使用主从模式时应注意 matser 节点的持久化操作,matser 节点在未使用持久化的情况详情下如果宕机,并自动重新拉起服务,从服务器会出现丢失数据的情况。因为 master 服务挂了之后,重启服务后,slave 节点会与 master 节点进行一次完整的重同步操作,所以由于 master 节点没有持久化,就导致 slave 节点上的数据也会丢失掉。所以在配置了 Redis 的主从模式的时候,应该打开主服务器的持久化功能。

    查看主从节点

    我们要查看当前节点是 master 节点还是 slave 节点,我们可以使用 info 命令,具体命令如下:

    info
    

    我们在 master 上执行如下图所示:
    嗨客网(www.haicoder.net)

    我们可以看到,此时显示的 Replication 配置项下面的 role 为 master,现在,我们再次在 slave 节点下查看,执行如下图所示:

    嗨客网(www.haicoder.net)

    我们看到,此时显示的是 slave,同时,我们还可以直接使用 info 加要查看的节点,来查看具体的配置,具体命令如下:

    info Replication
    

    我们首先在 master 上查看,输出如下:

    嗨客网(www.haicoder.net)

    我们看到,此时直接显示了 Replication 节点的信息,现在,我们再次查看 slave 节点的信息,输出如下:

    嗨客网(www.haicoder.net)

    我们看到,此时就显示了是 slave 节点了。

    主从复制原理

    流程

    当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node。

    如果这是 slave node 初次连接到 master node,那么会触发一次 full resynchronization 全量复制。此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端 client 新收到的所有写命令缓存在内存中。

    RDB 文件生成完毕后, master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中,接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。

    slave node 如果跟 master node 有网络故障,断开了连接,会自动重连,连接之后 master node 仅会复制给 slave 部分缺少的数据。

    嗨客网(www.haicoder.net)

    主从复制的断点续传

    从 Redis2.8 开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。

    master node 会在内存中维护一个 backlog,master 和 slave 都会保存一个 replica offset 还有一个 master run id,offset 就是保存在 backlog 中的。如果 master 和 slave 网络连接断掉了,slave 会让 master 从上次 replica offset 开始继续复制,如果没有找到对应的 offset,那么就会执行一次 resynchronization。

    无磁盘化复制

    master 在内存中直接创建 RDB ,然后发送给 slave,不会在自己本地落地磁盘了。只需要在配置文件中开启 repl-diskless-sync yes 即可。具体配置如下:

    repl-diskless-sync yes
    
    # 等待 5s 后再开始复制,因为要等更多 slave 重新连接过来
    repl-diskless-sync-delay 5
    

    过期key处理

    slave 不会过期 key,只会等待 master 过期 key。如果 master 过期了一个 key,或者通过 LRU 淘汰了一个 key,那么会模拟一条 del 命令发送给 slave。

    主从复制的完整流程

    流程

    slave node 启动时,会在自己本地保存 master node 的信息,包括 master node 的 host 和 ip ,但是复制流程没开始。

    slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接。然后 slave node 发送 ping 命令给 master node。

    如果 master 设置了 requirepass,那么 slave node 必须发送 masterauth 的口令过去进行认证。master node 第一次执行全量复制,将所有数据发给 slave node。而在后续,master node 持续将写命令,异步复制给 slave node。

    嗨客网(www.haicoder.net)

    全量复制

    1. master 执行 bgsave ,在本地生成一份 rdb 快照文件。

    2. master node 将 rdb 快照文件发送给 slave node,如果 rdb 复制时间超过 60 秒(repl-timeout),那么 slave node 就会认为复制失败,可以适当调大这个参数(对于千兆网卡的机器,一般每秒传输 100MB,6G 文件,很可能超过 60s)

    3. master node 在生成 rdb 时,会将所有新的写命令缓存在内存中,在 slave node 保存了 rdb 之后,再将新的写命令复制给 slave node。

    4. 如果在复制期间,内存缓冲区持续消耗超过 64MB,或者一次性超过 256MB,那么停止复制,复制失败。

      client-output-buffer-limit slave 256MB 64MB 60
      
    5. slave node 接收到 rdb 之后,清空自己的旧数据,然后重新加载 rdb 到自己的内存中,同时基于旧的数据版本对外提供服务。

    6. 如果 slave node 开启了 AOF,那么会立即执行 BGREWRITEAOF,重写 AOF。

    增量复制

    1. 如果全量复制过程中,master-slave 网络连接断掉,那么 slave 重新连接 master 时,会触发增量复制。
    2. master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB。
    3. master 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。

    heartbeat

    主从节点互相都会发送 heartbeat 信息。

    master 默认每隔 10 秒发送一次 heartbeat,slave node 每隔 1 秒发送一个 heartbeat。

    异步复制

    master 每次接收到写命令之后,先在内部写入数据,然后异步发送给 slave node。

    更多

    原文链接链接

    其他目录

    更多文章,可以关注下方公众号:

    嗨客网(www.haicoder.net)

    展开全文
  • 本节开始介绍mysql的集群架构设计与主从模式 集群架构设计 架构设计理念 在集群架构设计时,主要遵从下面三个维度 可用性 扩展性 一致性 可用性设计 站点高可用,冗余站点 服务高可用,冗余服务 数据高可用,冗余...
  • 目录1、Redis主从模式概述1.1、同步方式2、哨兵模式3、Redis一主两从模式案例3.1、同步会话模式,关闭防护墙,放入安装包3.2、取消会话模式,进入主模式配置文件,进行修改3.3、进入Slave1节点配置文件进行修改3.4、...
  • Redis主从配置前言一、主从模式优缺点?二、搭建步骤三、启动看效果总结 前言 Redis有三种类型模式: 主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)、redis cluster模式(redis...
  • 一般的文档,都把redis的集群方式分成三种:主从、哨兵、集群(这里的集群只是广义集群的一种)。但是这么分类很不严谨,哨兵模式,单独使用是没有意义的,哨兵的作用有两个: 监控:监控主节点和从节点是否正常...
  • MySQL主从模式可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。本文使用 半同步复制模式 。 mysql主从复制用途: 实时灾备,用于故障切换(高可用) 读写分离,提供查询服务(读扩展) 数据备份,避免...
  • Redis三种集群模式-主从模式

    千次阅读 2020-01-07 16:52:18
     Redis有三种集群模式,第一个就是主从模式,第二种“哨兵”模式,第三种是Cluster集群模式,第三种的集群模式是在Redis 3.x以后的版本才增加进来的,我们今天就来说一下Redis第一种集群模式:主从集群模式。...
  • 两块STM32,一个做主机一个做从机,能够实现主机发送数据以及主机读取从机数据。通过串口调试,以及LED灯来提示工作状态。
  • redis 主从模式的配置

    千次阅读 2019-03-30 12:57:23
    这里redis的主从模式为这两个问题提供了一个较好的解决方案。 主从模式指的是使用一个redis实例作为主机,其余的实例作为备份机。主机和从机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与...
  • 主从模式 哨兵模式(sentinel) 集群模式(cluster) 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景。 ...
  • jenkins主从模式配置

    2020-07-15 20:11:01
    主机清单: master:192.168.182.151 node1:192.168.182.150 1、安装 slave 子节点前提:slave 所在服务器必须有 java环境,不需要安装jenkins服务 子节点部署jdk环境 wget ... ...tar xf jdk-8u251-.
  • mysql 主从模式配置原理及步骤详解

    千次阅读 2018-12-11 21:57:14
    文章目录mysql 主从模式配置场景描述实现原理开始配置前提主机配置从机配置额外配置选项验证主从模式 mysql 主从模式配置 MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。...
  • Android9.0 蓝牙主从模式动态切换

    千次阅读 2020-08-17 18:16:57
    Android9.0 蓝牙主从模式动态切换调试环境代码修改调试过程 本文属于原创,转载请注明原作者,否者将追究法律责任。 调试环境 Android版本:Android9.0; 蓝牙版本:RTL8723DU,而且该蓝牙前提要支持主从模式; ...
  • Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 主从模式:是三种集群方式里最简单的。它主要是基于Redis的主从复制特性架构的。通常我们会设置一个主节点,N个从节点;默认情况下,主节点负责处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,116
精华内容 48,846
关键字:

主从模式