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

    1.主从复制特点

    1.使用异步复制。
    2.一个主服务器可以有多个从服务器。
    3.从服务器也可以有自己的从服务器。
    4.复制功能不会阻塞主服务器。
    5.可以通过复制功能来让主服务器免于执行持久化操作,由从服务器去执行持久化操作即可。
    
    #详细版本
    1)Redis 使用异步复制。从 Redis2.8开始,从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度。
    2)一个主服务器可以有多个从服务器。
    3)不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器,多个从服务器之间可以构成一个图状结构。
    4)复制功能不会阻塞主服务器:即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。
    5)复制功能也不会阻塞从服务器:只要在 redis.conf 文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。
    6)在从服务器删除旧版本数据集并载入新版本数据集的那段时间内,连接请求会被阻塞。
    7)还可以配置从服务器,让它在与主服务器之间的连接断开时,向客户端发送一个错误。
    8)复制功能可以单纯地用于数据冗余(data redundancy),也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说,繁重的SORT命令可以交给附属节点去运行。
    

    2.主从复制的原理

    1.从库配置主从同步
    2.从库像主库发起sync命令
    3.主库接收sync命令,执行bgsave,生成持久化rdb文件
    4.主库将新的数据临时写入缓冲区
    5.主库将rdb文件推送至从库
    6.从库接收到rdb文件,会清空自己的数据
    7.从库读取并导入rdb文件
    8.主库将缓冲区的数据也传给从库
    9.实现数据同步
    

    3.主从复制的机制

    #SYNC与PSYNC
    
    1)在 Redis2.8版本之前,断线之后重连的从服务器总要执行一次完整重同步(fullresynchronization)操作。
    2)从 Redis2.8开始,Redis使用PSYNC命令代替SYNC命令。
    3)PSYNC比起SYNC的最大改进在于PSYNC实现了部分重同步(partial resync)特性:
    在主从服务器断线并且重新连接的时候,只要条件允许,PSYNC可以让主服务器只向从服务器同步断线期间缺失的数据,而不用重新向从服务器同步整个数据库。
    
    PSYNC这个特性需要主服务器为被发送的复制流创建一个内存缓冲区(in-memory backlog), 并且主服务器和所有从服务器之间都记录一个复制偏移量(replication offset)和一个主服务器 ID(master run id),当出现网络连接断开时,从服务器会重新连接,并且向主服务器请求继续执行原来的复制进程:
    1)如果从服务器记录的主服务器ID和当前要连接的主服务器的ID相同,并且从服务器记录的偏移量所指定的数据仍然保存在主服务器的复制流缓冲区里面,那么主服务器会向从服务器发送断线时缺失的那部分数据,然后复制工作可以继续执行。
    2)否则的话,从服务器就要执行完整重同步操作。
    
    #PSYNC优点:
    1)PSYNC只会将从服务器断线期间缺失的数据发送给从服务器。两个例子的情况是相同的,但SYNC 需要发送包含整个数据库的 RDB 文件,而PSYNC 只需要发送三个命令。
    2)如果主从服务器所处的网络环境并不那么好的话(经常断线),那么请尽量使用 Redis 2.8 或以上版本:通过使用 PSYNC 而不是 SYNC 来处理断线重连接,可以避免因为重复创建和传输 RDB文件而浪费大量的网络资源、计算资源和内存资源。
    

    4.配置主从

    1.准备环境

    角色 主机 IP 端口
    主库 db01 172.16.1.51 6379
    从库 db02 172.16.1.52 6379
    从库 db03 172.16.1.53 6379

    2.配置主从

    # 1.登陆三台redis
    [root@db01 redis]# redis-cli -h 172.16.1.51
    172.16.1.51:6379>
    [root@db02 redis]# redis-cli -h 172.16.1.52
    172.16.1.52:6379>
    [root@db03 redis]# redis-cli -h 172.16.1.53
    172.16.1.53:6379>
    
    # 2.查看主从状态
    172.16.1.51:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    # 3.配置主从
    172.16.1.52:6379> SLAVEOF 172.16.1.51 6379
    OK
    172.16.1.53:6379> SLAVEOF 172.16.1.51 6379
    OK
    
    # 4.再次查看主从状态
    # 主库
    172.16.1.51:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=172.16.1.52,port=6379,state=online,offset=29,lag=0
    slave1:ip=172.16.1.53,port=6379,state=online,offset=29,lag=0
    master_repl_offset:29
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:28
    
    # 从库
    172.16.1.52:6379> info replication
    # Replication
    role:slave
    master_host:172.16.1.51
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:6
    master_sync_in_progress:0
    slave_repl_offset:71
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    ######5.如果主库有密码######
    在从库的配置文件中加上
    masterauth 123
    

    5.如果主库出现故障

    1.模拟主库故障

    [root@db01 redis]# redis-cli shutdown
    

    2.查看从库状态

    172.16.1.52:6379> info replication
    # Replication
    role:slave
    master_host:172.16.1.51
    master_port:6379
    master_link_status:down
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_repl_offset:393
    master_link_down_since_seconds:63
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    172.16.1.52:6379> set k1 v2
    (error) READONLY You can't write against a read only slave.
    
    # 从库仍然还是从库,还是只读权限,没有办法提供写服务
    

    3.选择一台机器,取消主从

    # 取消主从
    172.16.1.52:6379> SLAVEOF no one
    OK
    
    # 再次查看状态
    172.16.1.52:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    

    4.将其他从库指向新的主库

    # 重新做主从
    172.16.1.53:6379> SLAVEOF 172.16.1.52 6379
    OK
    
    172.16.1.53:6379> info replication
    # Replication
    role:slave
    master_host:172.16.1.52
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:1
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
  • 相关阅读:
    Mysql常用语句
    关于nginx的一个错误操作记录
    windows下安装ElasticSearch
    在IIS托管服务中设置Rewrite重定向到webapi接口
    asp.net IHttpHandler浅析
    asp.net IHttpModule浅析
    vscode 创建.net core项目初体验
    批量联表更新
    mysql 关于数据库和数据表的基本操作
    mysql Navicat客户端
  • 原文地址:https://www.cnblogs.com/Applogize/p/13449134.html
Copyright © 2011-2022 走看看