• Redis的三种集群方式


    Redis的常用的集群方式主要有以下3种

    1:主从复制

    2:哨兵(Sentinel)

    3:Cluster

    一、主从

    主从其实就是一般包含一个主,一个或多个从,从节点从主节点复制数据,可以实现读写分离,主节点做写,从节点做读。在配置上基本没什么要改的。这里用Linux做演示。

    //这里启动3个docker,就让5678当主节点吧 
     docker run -d -p 5678:6379 redis
     docker run -d -p 5679:6379 redis
     docker run -d -p 5677:6379 redis

    启动之后分别进入容器里面

     在主节点里面添加数据。并且能够查到

     然后我们去随便一个从节点里面去查询,发现并不能查到,这是为什么呢?因为还没有做数据的同步

     要做数据的同步需要执行这个命令

    slaveof host port

     ok,这样就能查到数据了。然后后面无论在主节点添加数据,都能在从节点查询到。

    如果想知道主节点有多少从节点的话可以使用  这个命令

    info replication

     主从节点的优缺点:

    优点:可以实现读写分离,主节点的数据会自动复制到从节点,分担主节点的压力

    缺点:当主节点宕机了,会导致部分数据未同步。也不具备容错和回复功能,无论主节点或者从节点宕机都需要等重启之后才能使用

    二、哨兵模式

    其实哨兵模式也是一种主从,只不过增加了哨兵的功能,用于监控主节点的状态,当主节点宕机之后会进行投票重新选出主节点。

    哨兵的宕机分为两种:主观宕机(我认为你掉线了)和客观宕机(我们认为你掉线了),当客观宕机了之后就会再选举一个从节点作为主节点,而这又可以分为两步

    1:选哨兵领导

    a:我发现了master下线,你们(其他哨兵)选我当哨兵领导吧

    b:其他哨兵没有选过其他人当领导,那我就是领导了

    c:超过一半的其他哨兵同意,我就是领导了

    d:如果有多个哨兵同时参选,等待任意时间后重新发起投票,直到选出了领头的

    2:由哨兵领导推举主节点

    选主节点要遵循以下原则

    a:健康性:从节点响应的时间
    b:完整性:根据从节点备份的完整性,根据数据备份偏移量
    c:稳定性:启动时间周期,心跳检测
    d:如果以上三个条件都相等,则根据节点启动时分配的run id来分配,runid越小越有可能被选择为主节点

    然后开始吧。哨兵需要做一些配置文件。

     配置文件

    主节点:redis-6379.conf:

    port 6379
    requirepass 123456

    从节点如上,端口分别是6380,6381

    port 6380
    slaveof 127.0.0.1 6379
    masterauth 123456
    port 6381
    slaveof 127.0.0.1 6379
    masterauth 123456

    然后是哨兵:

    # 其他两个sentinel节点的端口号分别为26380、26381
    port 26379
    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 3000
    # 必须配置,否则启动后sentinel节点都会是sdown(主观宕机)状态或者odown(客观宕机)状态
    sentinel auth-pass mymaster 123456

    然后启动就行了。可以把哨兵模式做成这个样子,把配置文件都放到Sentinel文件夹里面然后一键启动(哈哈,刚学的)

     启动代码:

    @echo off
    echo Starting Sentinel:
    pushd %~dp0\Sentinel
    echo   Targets: 7010-7011
    @start "Redis (Sentinel-Target): 7010" /min ..\3.0.503\redis-server.exe redis-7010.conf
    @start "Redis (Sentinel-Target): 7011" /min ..\3.0.503\redis-server.exe redis-7011.conf
    echo   Monitors: 26379-26381
    @start "Redis (Sentinel): 26379" /min ..\3.0.503\redis-server.exe sentinel-26379.conf --sentinel
    @start "Redis (Sentinel): 26380" /min ..\3.0.503\redis-server.exe sentinel-26380.conf --sentinel
    @start "Redis (Sentinel): 26381" /min ..\3.0.503\redis-server.exe sentinel-26381.conf --sentinel
    popd

    启动之后可以发现7011是从节点,7010是主节点

     然后通过以下命令进入到26379哨兵查看主从节点状态

    redis-cli -p 26379

     然后我们将主节点7010关闭,可以发现,哨兵就重新将7011选为主节点了(当然这里只启动了两个,可以多启动几个节点,测试效果更佳),而当之前关闭的主节点重启之后,就会变成从节点

     这是重启后的,会连接到现在的主节点7011

     哨兵模式的优缺点

    优点:哨兵模式可以算主从模式的升级吧,主从的优点都有,而且哨兵还有监控的功能,当主节点宕机之后哨兵会推选一个健康的从节点做主节点,这样提高了软件的可用性

    缺点:主从模式的缺点都有,而且配置哨兵啥的比较麻烦,而且在重新选举主节点期间,无法确定主从,无法工作

    三、cluster

    集群采用了多主多从,按照一定的规则进行分片,将数据分别存储,一定程度上解决了哨兵模式下单机存储有限的问题。

    集群模式一般是3主3从,且需要ruby辅助搭建。

    1:复制5个redis出来,作为3主3从,端口可以自定义

    2:修改配置:cluster-enabled yes

    3:安装 Ruby

    4:安装redis驱动: 地址:https://rubygems.org/gems/redis/versions/3.3.2

    将下载的Redis驱动文件redis-3.3.2.gem复制到Ruby安装目录下(即:C:Ruby30-x64),打开CMD,运行如下命令:

    gem install --local C:Ruby30-x64redis-3.3.2.gem

    5:下载集群管理工具,将扩展名为rb的文件拷贝到6379文件夹中

    6:将6个redis启动,在6379的文件夹下cmd,输入命令:

    //replicas 1 表示为集群中的每个主节点创建1个从节点
    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

    接着执行就是了,这里要选yes

     以上,集群搭建完毕。我们可以登录6379查看集群状态

    redis-cli -p 6378
    cluster nodes

     从上面我们可以看到集群中3个主节点被分成了3个分区,可以来单独存储自己的数据。然后我们设置一个值,会自动跳转到相应的节点。

    在部署集群的时候我踩了以下几个坑,希望能够注意下!

    1:invalid byte sequence in UTF-8 解决:文件夹不能含中文
    2:Node 127.0.0.1:6379 is not configured as a cluster node 解决:将cluster-enabled yes的注释取消
    3: Node 127.0.0.1:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0 解决:清除dump和aof文件
    4: ERR Slot 5798 is already busy (Redis::CommandError) 解决:挨个登录客户端,执行flushall和cluster reset命令,然后重新执行命令创建集群
    5:(error) MOVED 6918 127.0.0.1:6380 解决:redis-cli启动时使用 -c -p

    6:销毁之前的集群  解决:将node.conf删除

    集群的优缺点

    优点:配置了多主多从,可以使数据分区,去中心化,减小了单台机子的负担,且可用性更高于哨兵模式

    缺点:搭建麻烦

  • 相关阅读:
    KVM/QEMU/qemu-kvm/libvirt 概念全解
    OpenStack 实现技术分解 (7) 通用库 — oslo_config
    OpenStack 实现技术分解 (7) 通用库 — oslo_config
    OpenStack 实现技术分解 (6) 通用库 — oslo_log
    OpenStack 实现技术分解 (6) 通用库 — oslo_log
    模拟用户注册功能
    007-解决下载文件【中文文件名】乱码
    006-动态生成验证码Servlet代码模板
    CodingLife的CSS样式整理
    Servlet用户登录功能实现
  • 原文地址:https://www.cnblogs.com/fanlin92/p/16006426.html
Copyright © 2020-2023  润新知