Redis集群

作者: 愤怒的老照 | 来源:发表于2020-03-07 17:35 被阅读0次

    Redis有三种集群模式,分别是:

    • 主从复制
    • Sentinel模式
    • Cluster模式

    主从复制

    主从模式,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。


    image.png

    机制

    当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。

    复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

    实践

    1、创建redis.conf

    #允许外网访问
    bind 0.0.0.0
    daemonize NO
    protected-mode no
    

    2、docker启动至少两个redis

    docker run -p 6888:6379 --name redis-1 -v /etc/redis/redis.conf:/etc/redis/redis.conf -d 44d36d2c2374 redis-server /etc/redis/redis.conf --appendonly yes
    
    docker run -p 6889:6379 --name redis-2 -v /etc/redis/redis.conf:/etc/redis/redis.conf -d 44d36d2c2374 redis-server /etc/redis/redis.conf --appendonly yes
    

    3、启动成功后,进入随便一个redis

    docker exec -it 384d593f0d07 redis-cli
    

    4、执行info


    image.png

    每个redis服务器启动都是master

    5、进入想要为slave的redis

    SLAVEOF ip port
    

    6、查看每个redis的info
    slave:


    image.png

    master:


    image.png

    connected_slaves为1,配置成功

    Sentinel模式

    主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此哨兵模式应运而生。也就是启动一个哨兵,观察redis的状态,当master挂掉之后,哨兵可以将其中slave服务器改为master,可以继续写。

    当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。

    sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群

    实践

    在上一步的基础上,增加一个sentinel服务器就可以了
    1、创建/etc/redis/sentinel.conf

    # 日志
    logfile "sentinel.log"
    # sentinel monitor master名称 master-ip master-port 将这个主服务器标记为失效至少需要1个哨兵进程的同意
    sentinel monitor mymaster 192.168.0.1 6379 1
    # master密码
    sentinel auth-pass mymaster 1234
    

    2、启动sentinel

    docker run -p 26379:26379 -v /etc/redis/sentinel.conf:/etc/redis/sentinel.conf --name redis-26379 -d docker.io/redis redis-sentinel /etc/redis/sentinel.conf
    

    3、进入sentinel,查看info

    docker exec -it 25 /bin/bash
    
    # 连接
    root@aa55601cb0c7:/data# redis-cli -h 127.0.0.1 -p 26379
    # 查看info
    127.0.0.1:26379> info
    
    
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    sentinel_simulate_failure_flags:0
    master0:name=mymaster,status=ok,address=172.17.0.3:6379,slaves=1,sentinels=1
    

    sentinel启动成功,查看slave服务器

    # Replication
    role:slave
    master_host:172.17.0.3
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:66932
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:6f5c552953ef4708b2b9382c9b9051cd5b1c7d5c
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:66932
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:66932
    

    关闭master

    docker stop abbe9edc6c4a
    

    查看sentinel日志:

    1:X 07 Mar 2020 09:10:33.599 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    1:X 07 Mar 2020 09:10:33.599 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
    1:X 07 Mar 2020 09:10:33.599 # Configuration loaded
    1:X 07 Mar 2020 09:10:33.601 * Running mode=sentinel, port=26379.
    1:X 07 Mar 2020 09:10:33.601 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    1:X 07 Mar 2020 09:10:33.608 # Sentinel ID is a0637a079feb583c0952a4d7679a0e9b11e34729
    1:X 07 Mar 2020 09:10:33.608 # +monitor master mymaster 172.17.0.3 6379 quorum 1
    1:X 07 Mar 2020 09:10:33.609 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:31.923 # +sdown master mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:31.923 # +odown master mymaster 172.17.0.3 6379 #quorum 1/1
    1:X 07 Mar 2020 09:25:31.923 # +new-epoch 1
    1:X 07 Mar 2020 09:25:31.923 # +try-failover master mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:31.927 # +vote-for-leader a0637a079feb583c0952a4d7679a0e9b11e34729 1
    1:X 07 Mar 2020 09:25:31.927 # +elected-leader master mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:31.927 # +failover-state-select-slave master mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:32.011 # +selected-slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:32.011 * +failover-state-send-slaveof-noone slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:32.082 * +failover-state-wait-promotion slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:32.907 # +promoted-slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:32.907 # +failover-state-reconf-slaves master mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:32.975 # +failover-end master mymaster 172.17.0.3 6379
    1:X 07 Mar 2020 09:25:32.975 # +switch-master mymaster 172.17.0.3 6379 172.17.0.4 6379
    1:X 07 Mar 2020 09:25:32.975 * +slave slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.4 6379
    1:X 07 Mar 2020 09:26:02.989 # +sdown slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.4 6379
    

    master已经更改,重新启动宕机的redis后只会充当slave

    Cluster模式

    sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。

    cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。

    使用集群,只需要将redis配置文件中的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。

    相关文章

      网友评论

        本文标题:Redis集群

        本文链接:https://www.haomeiwen.com/subject/mqucdhtx.html