15.redis的主从复制

概念:
    主从复制,是指将一台Reedis服务器的数据,复制到其他的redis服务器。前者成为主节点(master/leader),后者成为从节点(slave/follower);
    数据的复制是单向的(),只能从主节点到从和节点。
    Master以写为主,slave以读为主
    默认情况下:每天reids服务器都是主节点
    且一个主节点可以有很多从节点(或没有从节点),但是一个从节点只能由一个主节点(父亲可以由很多儿子,但是儿子只能由一个父亲)
    
主从复制的作用:
     1.数据冗余:主从复制实现了数据的热备份,是持久化的一种数据冗余方式
    2.故障恢复:当主节点出现问题,可以由从节点提供服务,实现快速的故障恢复;实际是一种服务的冗余
    3.负载均衡:从主从复制的基础上,配合读写分离,可以从主机点提供写服务,从节点提供读服务(即写Redis数据时应用连接住主节点
      读Reedis数据应用时连接从节点),分担服务器负载;尤其时在写少读多的情况下,通过多个节点分担负载,可以大大提高redis服务器的并发量
    4.高可用(集群)基石:出了上述作用意外,主从复制还是哨兵和集权能够实施的基础,因此说主从复制是redis高可用的基础
    
    
一般来说,要将redis运用于工程项目中,必须使用集群(最少三台:一主两从)
    原因如下:
        1.从结构上,单个redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大
        2.从容量上,单个redis服务器的内存容量有限,就算一台redis服务器的内存容量是256g,也不能将所有的内存用于redis存储内存
         一般来说,单台redis最大使用内存不应该超过20G
        3.

环境配置:

只需要配置从库,默认每个redis服务器都是主节点
    命令1:查看当前redis的信息
        127.0.0.1:6379> info replication
            # Replication
            role:master---->角色:主节点
            connected_slaves:0:从机个数
            master_replid:7d537d9cb615f9341f2c941e1bf5ccd086eb4ff6
            master_replid2:0000000000000000000000000000000000000000
            master_repl_offset:0
            second_repl_offset:-1
            repl_backlog_active:0
            repl_backlog_size:1048576
            repl_backlog_first_byte_offset:0
            repl_backlog_histlen:0

集群搭建

在192.168.2.128(主),192.168.2.129(从),192.168.2.130(从)三台服务器上搭建redis集群
1.每台机器上安装redis(步骤和前面一样)
2.启动每台服务器的redis
3.因为每隔redis服务器都默认是主节点,所以只需要在要做从节点的服务器上认主节点即可
    3.1在129服务器的客户端执行
        127.0.0.1:6379> SLAVEOF 192.168.2.128 6379(认主节点:主节点的IP 和端口)
                OK
        在执行查看命令:
            127.0.0.1:6379> info replication(查看)
                # Replication
                role:slave---->成了从节点
                master_host:192.168.2.128(主节点的ip)
                master_port:6379(主节点的端口)
                master_link_status:down
                master_last_io_seconds_ago:-1
                master_sync_in_progress:0
                slave_repl_offset:0
                master_link_down_since_seconds:1603622777
                slave_priority:100
                slave_read_only:1
                connected_slaves:0
                master_replid:50ccc030bd4f59f00ee0132036b7ab007e236e04
                master_replid2:0000000000000000000000000000000000000000
                master_repl_offset:0
                second_repl_offset:-1
                repl_backlog_active:0
                repl_backlog_size:1048576
                repl_backlog_first_byte_offset:0
                repl_backlog_histlen:0
        3.2在128服务器上执行一样
            SLAVEOF 192.168.2.128 6379(认主节点:主节点的IP 和端口)
4.这里搭建集群会出现问题:
        1.主机和从机都无法telnet 主机的6379端口
        2.主redis启动失败:
            Could not create server TCP listening socket 192.168.2.128:6379: bind: Cannot assign requested address
            1:M 25 Oct 2020 03:09:01.270 # Configured to not listen anywhere, exiting.
        3.从机启动失败:
            1:S 25 Oct 2020 10:51:26.056 * MASTER <-> REPLICA sync started
            1:S 25 Oct 2020 10:51:26.056 # Error condition on socket for SYNC: Operation now in progress
    
    改变:
        主机的配置中:
            bind 0.0.0.0或直接注释掉bind这行(不设置默认将处理所有请求)
            protected-mode no(保护模式改为no)
        从机:
            注释掉bind  xxxxx
            直接加上:slaveof 192.168.2.128 6379(这样不用每次重启redis都得执行主从复制命令)
    
5.主机客户端上执行:
    127.0.0.1:6379> info replication
        # Replication
        role:master
        connected_slaves:2(有两个从机)
        slave0:ip=192.168.2.129,port=6379,state=online,offset=308,lag=1(从机1)
        slave1:ip=192.168.2.130,port=6379,state=online,offset=308,lag=1(从机2)
        master_replid:74fe9ac84343467f580cb2a175c00914648d37d3
        master_replid2:0000000000000000000000000000000000000000
        master_repl_offset:308
        second_repl_offset:-1
        repl_backlog_active:1
        repl_backlog_size:1048576
        repl_backlog_first_byte_offset:1
        repl_backlog_histlen:308
细节1:主机负责写,从机负责读
    主机负责写,从机负责读!主机中的所有数据和信息都会被从机保存
    测试:
        在主机上:
            127.0.0.1:6379> set k1 v1(可以写入)
                OK
            127.0.0.1:6379> get k1(也可以获取出来)
                "v1"
       在从机上:
           127.0.0.1:6379> keys *
                1) "k1"
            127.0.0.1:6379> get k1(只能读)
                "v1"
            127.0.0.1:6379> set k2 v2(不能写)
                (error) READONLY You can't write against a read only replica.
                
                
细节2:主机宕机
    1.当主机断了或宕机了,从机的info replication依旧是从机,没有配置哨兵模式,不会在从机中推举出主机
    2.在此期间,从机依旧可以进行读操作
    3.当主机恢复了,重新写入数据,从机依旧是可以获取到的
    
    
细节3:从机宕机
    1.当从机宕机了,主机在此期间内发生了写操作,
    2.从机恢复了,依旧是可以拿到主机在从机宕机期间内写的值

复制原理:

slave(从机)启动成功后连接到master(主机)会发送一个sync(全量)同步命令

Master接收到命令后,启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕之后,master
将传送整个数据文件到slave,并完成一次完全同步

全量复制:slave服务在接收到主机的数据文件后,将其存盘,并加载到内存中
增量复制:master继续将新的所有收集到的修改命令依次传给slave,完成同步

结论:当从机重新连接主机时,会自动进行一次全量复制,我们的数据一定会被看到

 

posted @ 2022-05-25 21:46  努力的达子  阅读(77)  评论(0编辑  收藏  举报