经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
Redis全方位讲解--主从复制和哨兵模式
来源:cnblogs  作者:JohnsonChung  时间:2018/11/2 9:04:29  对本文有异议

前言

  前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一些应用。因为本人没有那么多服务器或机器,所以这里主要介绍下如何在docker容器中搭建主从复制以及搭建过程中遇到的一些问题。关于redis的深入讲解,这边博客《深入学习Redis(3):主从复制》介绍的非常详细,有兴趣的可以学习一下。

 

主从复制运行的机制

  • 当一个 master 实例和一个 slave 实例连接正常时, master 会发送一连串的命令流来保持对 slave 的更新,以便于将自身数据集的改变复制给 slave :包括客户端的写入、key 的过期或被逐出等等。
  • 当 master 和 slave 之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, slave 重新连接上 master 并会尝试进行部分重同步:这意味着它会尝试只获取在断开连接期间内丢失的命令流。
  • 当无法进行部分重同步时, slave 会请求进行全量重同步。这会涉及到一个更复杂的过程,例如 master 需要创建所有数据的快照,将之发送给 slave ,之后在数据集更改时持续发送命令流到 slave 。

关于全量重同步和部分重同步,在文章开头介绍的那篇博客中都有详细的介绍。在搭建之前,让我们先了解关于redis的几个重要的事实。

  • Redis 使用异步复制,slave 和 master 之间异步地确认处理的数据量。也正是因为异步复制,所以有可能会造成数据延迟或不同步。
  • 一个 master 可以拥有多个 slave,slave也可以有sub-slave,但从 Redis 4.0 起,所有的 sub-slave 将会从 master 收到完全一样的复制流。
  • Redis 复制在 master 侧是非阻塞的。这意味着 master 在一个或多个 slave 进行初次同步或者是部分重同步时,可以继续处理查询请求。
  • 复制在 slave 侧大部分也是非阻塞的。当 slave 进行初次同步时,它可以使用旧数据集处理查询请求,假设你在 redis.conf 中配置了让 Redis 这样做的话。否则,你可以配置如果复制流断开, Redis slave 会返回一个 error 给客户端。但是,在初次同步之后,旧数据集必须被删除,同时加载新的数据集。 slave 在这个短暂的时间窗口内(如果数据集很大,会持续较长时间),会阻塞到来的连接请求。自 Redis 4.0 开始,可以配置 Redis 使删除旧数据集的操作在另一个不同的线程中进行,但是,加载新数据集的操作依然需要在主线程中进行并且会阻塞 slave 。
  • 复制既可以被用在可伸缩性,以便只读查询可以有多个 slave 进行(例如 O(N) 复杂度的慢操作可以被下放到 slave ),或者仅用于数据安全。
  • 可以使用复制来避免 master 将全部数据集写入磁盘造成的开销:一种典型的技术是配置你的 master Redis.conf 以避免对磁盘进行持久化,然后连接一个 slave ,其配置为不定期保存或是启用 AOF。但是,这个设置必须小心处理,因为重新启动的 master 程序将从一个空数据集开始:如果一个 slave 试图与它同步,那么这个 slave 也会被清空。

关于最后一点,一般主从复制一般会采用读写分离,master都用来接受所有的写操作,这样为了减少master的压力,就不会开启数据持久化,而是在slave中开启数据持久化。

 

redis主从复制在docker中搭建

redis.conf文件配置

  这里需要注意的一点是,最好所有的主从redis要么没有设置密码,要么设置的密码都一样。

  两个slave需要配置的是

  1. ################################# REPLICATION #################################
  2. # Master-Slave replication. Use slaveof to make a Redis instance a copy of
  3. # another Redis server. A few things to understand ASAP about Redis replication.
  4. #
  5. # 1) Redis replication is asynchronous, but you can configure a master to
  6. # stop accepting writes if it appears to be not connected with at least
  7. # a given number of slaves.
  8. # 2) Redis slaves are able to perform a partial resynchronization with the
  9. # master if the replication link is lost for a relatively small amount of
  10. # time. You may want to configure the replication backlog size (see the next
  11. # sections of this file) with a sensible value depending on your needs.
  12. # 3) Replication is automatic and does not need user intervention. After a
  13. # network partition slaves automatically try to reconnect to masters
  14. # and resynchronize with them.
  15. #
  16. slaveof redis 6379   # redis是master的容器名
  17. # If the master is password protected (using the "requirepass" configuration
  18. # directive below) it is possible to tell the slave to authenticate before
  19. # starting the replication synchronization process, otherwise the master will
  20. # refuse the slave request.
  21. #
  22. masterauth 123455
  23. slave-read-only yes  # slave只读

三个配置文件配置好后,就可以配置docker-composer.yml文件了

  1. version: "3.7"
  2. networks:
  3. backend:
  4. driver: bridge
  5. services:
  6. ### Redis ################################################
  7. # master
  8. redis:
  9. image: johnson19900110/redis:latest
  10. restart: always
  11. volumes:
  12. - ${DATA_PATH_HOST}/redis/master:/data
  13. - ./redis/config/redis-master.conf:/usr/local/etc/redis/redis.conf
  14. ports:
  15. - 6379:6379
  16. networks:
  17. - backend
  18. # slave 1
  19. redis-slave1:
  20. image: johnson19900110/redis:latest
  21. restart: always
  22. volumes:
  23. - ${DATA_PATH_HOST}/redis/slave1:/data
  24. - ./redis/config/redis-slave1.conf:/usr/local/etc/redis/redis.conf
  25. ports:
  26. - 6380:6379
  27. networks:
  28. - backend
  29. depends_on:
  30. - redis
  31. # slave 2
  32. redis-slave2:
  33. image: johnson19900110/redis:latest
  34. restart: always
  35. volumes:
  36. - ${DATA_PATH_HOST}/redis/slave2:/data
  37. - ./redis/config/redis-slave2.conf:/usr/local/etc/redis/redis.conf
  38. ports:
  39. - 6381:6379
  40. networks:
  41. - backend
  42. depends_on:
  43. - redis
  44. - redis-slave1

然后就可以启动redis容器了

  1. docker-composer up -d redis-slave2

  这时候3个redis就已经启动起来了

这是我们进入master容器。在redis-cli命令下执行 info replication ,就可以看到如下信息。 

从上面信息可以看到,这个是master角色,有两个从slave,并且可以看到slave的状态和同步的offset。然后再进入slave容器,可以看到。 

可以看到它的角色是slave和一些master的信息。因为我们设置了slave是只读模式。所以当我们想在slave下进行写入操作时会报错。

 

所以只能去master里进行写操作。

这时我们可以去slave看下slave是否复制成功。

这就表明我们这次redis的主从复制在docker中搭建成功了。

notice:这里还要重申一遍的是,1、如果你的redis设置了密码,那么所有的都设置成一样。2、如果你的rendis设置了密码,那么master配置文件中的masterauth 这一项一定要配置。不然在后面搭建redis哨兵模式的时候,肯定会有一些你意想不到我的问题。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号