• 二十三、Redis集群


    一、主从模式

    主从复制中,数据库分为两类:主服务器和从从服务器

    1.1、特点

    • 主服务器可以进行读写操作,当读写操作导致数据变化时自动将数据同步给从数据库;
    • 从数据库一般都是只读的,并且接收主数据库同步过来的数据;
    • 一个主服务器可以拥有多个从服务器,但是一个从服务器只能对应一个主服务器;
    • 从服务器挂了不影响其他从服务器的读和主服务器的读和写,重新启动后会将数据从主服务器同步过来;
    • 主服务器挂了以后,不影响从服务器读,但 Redis 不再提供写服务,主服务器重启后 Redis 将重新对外提供写服务
    • 主服务器挂了以后,不会在从服务器节点中重新选一个主服务器

    1.2、工作机制

    • 当从服务器启动后,主动向主服务器发送 SYNC 命令。主服务器接收到 SYNC 命令后在后台保存快照(RDB 持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给从服务器。从服务器接收到快照文件和命令后加载快照文件和缓存的执行命令;
    • 复制初始化后,主服务器每次接收到的写命令都会同步发送给从服务器,保证主从数据一致性;

    1.3、安全设置

    当主服务器节点设置密码后:

    • 客户端访问主服务器需要密码;
    • 启动从服务器需要密码,在配置文件中配置即可;
    • 客户端访问从服务器不需要密码;

    1.4、缺点

    从上面可以看出,主服务器节点在主从模式中唯一,若主服务器节点挂掉,则 Redis 无法对外提供写服务;

    1.5、主从模式搭建

    环境准备

    master节点   192.168.30.128
    slave节点    192.168.30.129
    slave节点    192.168.30.130
    
    • 1
    • 2
    • 3

    修改配置:192.168.30.128

    # vim /usr/local/redis/redis.conf
    
    # 监听 ip,多个 ip 用空格分隔
    bind 192.168.30.128 
    
    # 允许后台启动        
    daemonize yes    
    
    # 日志路径           
    logfile "/usr/local/redis/redis.log"  
    
    # 数据库备份文件存放目录
    dir /data/redis        
    
    # slave 连接 master 密码,master 可省略         
    masterauth 123456        
    
    # 设置 master 连接密码,slave 可省略       
    requirepass 123456    
             
    # 在/data/redis/目录生成 appendonly.aof 文件
    # 将每一次写操作请求都追加到 appendonly.aof 文件中
    appendonly yes                  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    192.168.30.129

    bind 192.168.30.129
    daemonize yes
    logfile "/usr/local/redis/redis.log"
    dir /data/redis
    replicaof 192.168.30.128 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    192.168.30.130

    bind 192.168.30.130
    daemonize yes
    logfile "/usr/local/redis/redis.log"
    dir /data/redis
    replicaof 192.168.30.128 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查看集群状态:主服务器

    192.168.30.128:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.30.129,port=6379,state=online,offset=168,lag=1
    slave1:ip=192.168.30.130,port=6379,state=online,offset=168,lag=1
    master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:168
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:168
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    查看集群状态:从服务器

    192.168.30.129:6379> info replication
    role:slave
    master_host:192.168.30.128
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:196
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:196
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:196
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    数据演示

    192.168.30.128

    192.168.30.128:6379> keys *
    (empty list or set)
    
    192.168.30.128:6379> set key1 100
    OK
    
    192.168.30.128:6379> set key2 ljh
    OK
    
    192.168.30.128:6379> keys *
    1) "key1"
    2) "key2"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    192.168.30.129

    192.168.30.129:6379> keys *
    1) "key2"
    2) "key1"
    
    192.168.30.129:6379> CONFIG GET dir
    1) "dir"
    2) "/data/redis"
    
    192.168.30.129:6379> CONFIG GET dbfilename
    1) "dbfilename"
    2) "dump.rdb"
    
    192.168.30.129:6379> get key1
    "100"
    
    192.168.30.129:6379> get key2
    "ljh"
    
    192.168.30.129:6379> set key3 aaa
    (error) READONLY You can't write against a read only replica.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    192.168.30.130

    192.168.30.130:6379> keys *
    1) "key2"
    2) "key1"
    
    192.168.30.130:6379> CONFIG GET dir
    1) "dir"
    2) "/data/redis"
    
    192.168.30.130:6379> CONFIG GET dbfilename
    1) "dbfilename"
    2) "dump.rdb"
    
    192.168.30.130:6379> get key1
    "100"
    
    192.168.30.130:6379> get key2
    "ljh"
    
    192.168.30.130:6379> set key3 aaa
    (error) READONLY You can't write against a read only replica.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    可以看到,在主服务器节点写入的数据,很快就同步到从服务器节点上,而且在从服务器节点上无法写入数据

    二、哨兵模式

    主从模式的弊端就是不具备高可用性,当主服务器挂掉以后,Redis 将不能再对外提供写入操作,因此 Sentinel 应运而生

    —未完待续----

  • 相关阅读:
    C++二分查找算法:有序矩阵中的第 k 个最小数组和
    【Linux】线程
    二叉树的存储结构
    问题 A: 求最长公共子串(串)
    windows11应用商店错误:0x800704cf
    springboot+vue+elementUI基于SpringBoot的冬奥会科普平台#毕业设计
    持续集成实战 —— Jenkins自动化测试环境搭建
    Spring Security 6.0 中的新增功能
    AMS 新闻视频广告的云原生容器化之路
    2022小米运维开发笔试1
  • 原文地址:https://blog.csdn.net/weixin_41835916/article/details/126611626