Redis学习笔记九(主从复制)

打印 上一主题 下一主题

主题 523|帖子 523|积分 1569

主从复制

主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
存在复制延迟的缺点,主机的数据不一定能在挂掉前,完全复制到从机,从机过多,会加剧这一缺点
[img=50%,50%]https://img2022.cnblogs.com/blog/2891068/202206/2891068-20220624203202900-640719865.png[/img]

  • 实现读写分离
  • 容灾快速恢复(一台从服务器挂掉,可以切换到其他从服务器)
  • 一主多从(防主机挂掉,使用集群)
配置主从复制(一主两从为例)


  • 创建新的文件夹用来配置
  1. root@LK:~# mkdir /myredis
  2. root@LK:~# cd /myredis
复制代码

  • 将redis.conf配置文件复制到新的文件夹下
  1. root@LK:/myredis# cp /etc/redis.conf /myredis/redis.conf
  2. root@LK:/myredis# ls
  3. redis.conf
复制代码

  • 配置一主两从,需要三个配置文件
    [img=50%,50%]https://img2022.cnblogs.com/blog/2891068/202206/2891068-20220624211209980-304822337.png[/img]

    • 创建redis6379.conf
    1. vi redis6379.conf
    复制代码

    • 主要在文件中写入以下内容
    1. include /myredis/redis.conf
    2. pidfile /var/run/redis_6379.pid
    3. port 6379
    4. dbfilename dump6379.rdb
    复制代码

    • 仿照上面的内容创建redis6380.conf、redis6381.conf,文件内容修改对应的数字即可
    • 启动配置文件
    1. root@LK:/myredis# redis-server redis6379.conf
    2. root@LK:/myredis#  redis-server redis6380.conf
    3. root@LK:/myredis#  redis-server redis6381.conf
    4. root@LK:/myredis#  ps -ef|grep redis
    5. lk         57615    2002  0 21:15 ?        00:00:00 redis-server 127.0.0.1:6379
    6. lk         57623    2002  0 21:15 ?        00:00:00 redis-server 127.0.0.1:6380
    7. lk         57631    2002  0 21:15 ?        00:00:00 redis-server 127.0.0.1:6381
    8. lk         57668   57291  0 21:16 pts/0    00:00:00 grep --color=auto redis
    复制代码

    • 查看当前redis的主从配置
    1. root@LK:/myredis# redis-cli -p 6379
    2. 127.0.0.1:6379> info replication
    复制代码
    1. #结果
    2. # Replication
    3. #当前角色是主机
    4. role:master
    5. #没有从服务器
    6. connected_slaves:0
    7. master_failover_state:no-failover
    8. master_replid:98ff0d93dbe4c1492ff7f7f1ff6284dac86414dc
    9. master_replid2:0000000000000000000000000000000000000000
    10. master_repl_offset:0
    11. second_repl_offset:-1
    12. repl_backlog_active:0
    13. repl_backlog_size:1048576
    14. repl_backlog_first_byte_offset:0
    15. repl_backlog_histlen:0
    复制代码

    • 修改主从配置(令6379为主机)
      在6380、6381从机上执行slaveof 主机ip 端口号
    1. slaveof 127.0.0.1 6379
    复制代码

    • 查看6379的主从配置
    1. 127.0.0.1:6379> info replication
    复制代码
    1. # Replication
    2. role:master
    3. #从服务器2个
    4. connected_slaves:2
    5. slave0:ip=127.0.0.1,port=6380,state=online,offset=0,lag=5
    6. slave1:ip=127.0.0.1,port=6381,state=online,offset=0,lag=5
    7. master_failover_state:no-failover
    8. master_replid:e003ed0236c8d42eaebef789c116a3f4091e2961
    9. master_replid2:0000000000000000000000000000000000000000
    10. master_repl_offset:112
    11. second_repl_offset:-1
    12. repl_backlog_active:1
    13. repl_backlog_size:1048576
    14. repl_backlog_first_byte_offset:1
    15. repl_backlog_histlen:112
    复制代码
  • 测试

    • 在主服务进行写操作
    1. 127.0.0.1:6379> set k1 v1
    2. OK
    3. 127.0.0.1:6379> keys *
    4. 1) "k1"
    复制代码

    • 在从服务器上进行读操作
    1. 127.0.0.1:6380> keys *
    2. 1) "k1"
    复制代码
主从操作特点

主从复制原理


  • 从机连上主机之后,从机向主机发送进行数据同步消息
  • 主机接到消息后,把主机数据进行持久化为rdb文件,把rdb文件发送给从机,从机读取数据
  • 每次主机进行写操作之后,和从服务器同步数据
从属关系(主机一直是主机)


  • 从服务器在使用过程中挂掉,重启后需要重新配置从属关系,配置后仍可以同步主服务器的内容
  • 主服务器在使用中挂掉,重启后仍是主机,从机不会因为主机挂掉而丢失从属关系
薪火相传(从机后面还可以挂载从机)


  • 如果从机过多,为了降低主机负担,主机只对固定的几个从机进行数据传递,剩下的由从机一层层传递下去,类似与树的结构。
  • 传递过程中如果一个从机挂掉,则其下层的所有从机都不能完成同步。
反客为主(从机可以变成主机)


  • 主机挂掉,下层从机可以设置slaveof no one,变成主机
  • 缺点是不能自动完成配置,自动完成配置需要哨兵模式
哨兵模式

能够后台监视主机是否故障,如果故障根据投票数自动将从机转换为主机
[img=50%,50%]https://img2022.cnblogs.com/blog/2891068/202206/2891068-20220624224531413-587329428.png[/img]

  • 建立所有服务器的主从关系(具体步骤参照上面)
  • 在当前文件夹下加入sentinel.conf文件,名字不能错
  1. root@LK:/myredis# vi sentinel.conf
复制代码

  • 配置哨兵,填写内容
  1. sentinel monitor mymaster 127.0.0.1 6379 1
复制代码
mymaster为监控对象起的服务器别名,1表示为至少有1个哨兵同意迁移服务器
4. 启动哨兵/usr/local/bin/redis-sentinel
  1. root@LK:/myredis# redis-sentinel sentinel.conf
复制代码
  1. 66666:X 25 Jun 2022 00:39:56.063 * monotonic clock: POSIX clock_gettime
  2.                 _._                                                  
  3.            _.-``__ ''-._                                             
  4.       _.-``    `.  `_.  ''-._           Redis 7.0.2 (00000000/0) 64 bit
  5.   .-`` .-```.  ```\/    _.,_ ''-._                                 
  6. (    '      ,       .-`  | `,    )     Running in sentinel mode
  7. |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
  8. |    `-._   `._    /     _.-'    |     PID: 66666
  9.   `-._    `-._  `-./  _.-'    _.-'                                   
  10. |`-._`-._    `-.__.-'    _.-'_.-'|                                 
  11. |    `-._`-._        _.-'_.-'    |           https://redis.io      
  12.   `-._    `-._`-.__.-'_.-'    _.-'                                   
  13. |`-._`-._    `-.__.-'    _.-'_.-'|                                 
  14. |    `-._`-._        _.-'_.-'    |                                 
  15.   `-._    `-._`-.__.-'_.-'    _.-'                                   
  16.       `-._    `-.__.-'    _.-'                                       
  17.           `-._        _.-'                                          
  18.               `-.__.-'                                               
  19. 66666:X 25 Jun 2022 00:39:56.065 * Sentinel new configuration saved on disk
  20. 66666:X 25 Jun 2022 00:39:56.065 # Sentinel ID is d788eafe8daf0f8c748239fe6cb52e7e55b64d8a
  21. 66666:X 25 Jun 2022 00:39:56.065 # +monitor master mymaster 127.0.0.1 6379 quorum 1
  22. 66666:X 25 Jun 2022 00:39:56.066 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
  23. 66666:X 25 Jun 2022 00:39:56.068 * Sentinel new configuration saved on disk
  24. 66666:X 25 Jun 2022 00:39:56.068 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
  25. 66666:X 25 Jun 2022 00:39:56.069 * Sentinel new configuration saved on disk
复制代码

  • 哨兵机制

    • 如果主机挂掉,哨兵会根据选择条件选取从机作为新的主机,
    • 此时原来主机的从机也会变成现在主机的从机
    • 如果主机进一步重启,会直接作为新主机的从机

  • 哨兵选择条件

    • 优先级靠前的(默认slave-priority 100,值越小,优先级越高,新版本replica-priority 100)
    • 偏移量最大的(获得主机原数据最全的)
    • runid最小的(redis实例启动后都会随机生成一个40位的runid)

jedis实现
  1. private static JedisSentinelPool jedisSentinelPool=null;
  2. public static  Jedis getJedisFromSentinel(){
  3.         if(jedisSentinelPool==null){
  4.                 Set<String> sentinelSet=new HashSet<>();
  5.                 sentinelSet.add("127.0.0.1:26379");
  6.                 JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();
  7.                 jedisPoolConfig.setMaxTotal(10); //最大可用连接数
  8.                 jedisPoolConfig.setMaxIdle(5); //最大闲置连接数
  9.                 jedisPoolConfig.setMinIdle(5); //最小闲置连接数
  10.                 jedisPoolConfig.setBlockWhenExhausted(true); //连接耗尽是否等待
  11.                 jedisPoolConfig.setMaxWaitMillis(2000); //等待时间
  12.                 jedisPoolConfig.setTestOnBorrow(true); //取连接的时候进行一下测试 ping pong
  13.                 jedisSentinelPool=new JedisSentinelPool("mymaster",sentinelSet,jedisPoolConfig);
  14.                 return jedisSentinelPool.getResource();
  15.         }else{
  16.                 return jedisSentinelPool.getResource();
  17.         }
  18. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表