Redis主从复制

  • 使用异步复制
  • 一个服务器可以有多个从服务器
  • 从服务器也可以有自己的从服务器
  • 复制功能不会阻塞主服务器
  • 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化操作即可。

以下是关于Redis复制功能的几个重要方面:

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

环境准备

首先需要准备环境,我这里准备四个redis实例:

主节点:6379

从节点:6380 - 6382

  1. port6379-6382 4个实例:
  2. [root@192.168.32.130 /etc/redis]$ netstat -tunlp|grep redis
  3. tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 123988/redis-server
  4. tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 107646/redis-server
  5. tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 108096/redis-server
  6. tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 108110/redis-server

启动多个实例的方法:

  1. 启动脚本: 复制到你的脚本中即可
  2. #!/bin/sh
  3. #
  4. # Simple Redis init.d script conceived to work on Linux systems
  5. # as it does use of the /proc filesystem.
  6. REDISPORT=$1
  7. EXEC=/data/app/redis/src/redis-server
  8. CLIEXEC=/data/app/redis/src/redis-cli
  9. PIDFILE=/var/run/redis_${REDISPORT}.pid
  10. CONF="/etc/redis/${REDISPORT}.conf"
  11. PWD="root"
  12. case "$2" in
  13. start)
  14. if [ -f $PIDFILE ]
  15. then
  16. echo "$PIDFILE exists, process is already running or crashed"
  17. else
  18. echo "Starting Redis server..."
  19. $EXEC $CONF
  20. fi
  21. ;;
  22. stop)
  23. #PID=$(cat $PIDFILE)
  24. echo "Stopping ..."
  25. $CLIEXEC -a ${PWD} -p $REDISPORT shutdown
  26. echo "Redis stopped"
  27. ;;
  28. *)
  29. echo "Please use start or stop as first argument"
  30. ;;
  31. esac
  1. [root@192.168.32.130 /etc/redis]$ cp 6379.conf 6380.conf
  2. [root@192.168.32.130 /etc/redis]$ cp 6379.conf 6381.conf
  3. [root@192.168.32.130 /etc/redis]$ cp 6379.conf 6382.conf
  4. # 批量修改端口号
  5. [root@192.168.32.130 /etc/redis]$ sed -i 's/6379/6380/g' 6380.conf
  6. [root@192.168.32.130 /etc/redis]$ sed -i 's/6379/6381/g' 6381.conf
  7. [root@192.168.32.130 /etc/redis]$ sed -i 's/6379/6382/g' 6382.conf

启动多个redis实例:

  1. [root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6380 start
  2. Starting Redis server...
  3. [root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6381 start
  4. Starting Redis server...
  5. [root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6382 start
  6. Starting Redis server...

主从复制命令

命令行临时生效

  1. [root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6380
  2. 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
  3. OK
  4. [root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6381
  5. 127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
  6. OK
  7. [root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6382
  8. 127.0.0.1:6382> SLAVEOF 127.0.0.1 6379
  9. OK

修改配置文件重启永久生效

  1. # 向各个实例的配置文件中追加配置:
  2. [root@192.168.32.130 /etc/redis]$ echo 'slaveof 127.0.0.1 6379' >> 6380.conf
  3. [root@192.168.32.130 /etc/redis]$ echo 'slaveof 127.0.0.1 6379' >> 6381.conf
  4. [root@192.168.32.130 /etc/redis]$ echo 'slaveof 127.0.0.1 6379' >> 6382.conf
  5. # 因为主节点有密码,所有需要使用密码验证:
  6. [root@192.168.32.130 /etc/redis]$ echo 'masterauth root' >> 6380.conf
  7. [root@192.168.32.130 /etc/redis]$ echo 'masterauth root' >> 6381.conf
  8. [root@192.168.32.130 /etc/redis]$ echo 'masterauth root' >> 6382.conf
  9. # redis全部实例重启
  10. [root@192.168.32.130 /etc/redis]$ killall redis-server
  11. [root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6379 start
  12. Starting Redis server...
  13. [root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6380 start
  14. Starting Redis server...
  15. [root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6381 start
  16. Starting Redis server...
  17. [root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6382 start
  18. Starting Redis server...
  19. [root@192.168.32.130 /etc/redis]$ netstat -tunlp|grep redis
  20. tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 109549/redis-server
  21. tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 109563/redis-server
  22. tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 109577/redis-server
  23. tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 109591/redis-server
  24. [root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6379 info Replication
  25. # Replication
  26. role:master
  27. connected_slaves:3 # 表示有三个从节点
  28. slave0:ip=127.0.0.1,port=6380,state=online,offset=155,lag=0
  29. slave1:ip=127.0.0.1,port=6381,state=online,offset=155,lag=1
  30. slave2:ip=127.0.0.1,port=6382,state=online,offset=155,lag=0
  31. [root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6380 info Replication
  32. # Replication
  33. role:slave
  34. master_host:127.0.0.1
  35. master_port:6379
  36. master_link_status:up # 表示已经连接到主节点
  37. [root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6381 info Replication
  38. # Replication
  39. role:slave
  40. master_host:127.0.0.1
  41. master_port:6379
  42. master_link_status:up # 表示已经连接到主节点
  43. [root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6382 info Replication
  44. # Replication
  45. role:slave
  46. master_host:127.0.0.1
  47. master_port:6379
  48. master_link_status:up # 表示已经连接到主节点
  49. 主从复制状态监控命令:
  50. info replication
  51. -a :指定密码连接
  52. -p :指定端口连接
  53. 主从切换:
  54. slaveof no one

Redis Sentinel

Redis-Sentinel是Redis官方推荐的高可用性(HA)接近方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,他能监控多个master-slave集群,发现master宕机后能进行自动切换。

Sentinel是一个监视器,它可以根据被监视实例的身份和状态来判断应该执行何种动作。

功能

  • 监控(Monitoring)

    Sentinel会不断地检查你的主服务器和从服务器是否运作正常。

  • 提醒(Notification)

    当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。

  • 自动故障迁移(Automatic failover)

    当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效服务器的其他从服务器改为负值新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel配置

  1. [root@192.168.32.130 /usr/local/redis]$ cp /usr/local/redis/sentinel.conf /etc/redis/
  2. # 去掉空行和注释后的配置文件:
  3. [root@192.168.32.130 /etc/redis]$ cat sentinel.conf | grep -v "#" | grep -v "^$" > sentinel_26379.conf
  4. # 编辑添加以下内容:
  5. port 26379
  6. bind 127.0.0.1
  7. dir './'
  8. pidfile /var/run/redis-sentinel.pid
  9. daemonize yes
  10. logfile "sentinel_26379.log"
  11. sentinel monitor mymaster 127.0.0.1 6379 2
  12. sentinel auth-pass mymaster root
  13. sentinel down-after-milliseconds mymaster 30000
  14. sentinel parallel-syncs mymaster 1
  15. sentinel failover-timeout mymaster 180000
  16. # 拷贝其他端口的
  17. [root@192.168.32.130 /etc/redis]$ cp sentinel_26379.conf sentinel_26380.conf
  18. [root@192.168.32.130 /etc/redis]$ cp sentinel_26379.conf sentinel_26381.conf
  19. [root@192.168.32.130 /etc/redis]$ cp sentinel_26379.conf sentinel_26382.conf
  20. [root@192.168.32.130 /etc/redis]$
  21. [root@192.168.32.130 /etc/redis]$ sed -i 's/26379/26380/g' sentinel_26380.conf
  22. [root@192.168.32.130 /etc/redis]$ sed -i 's/26379/26381/g' sentinel_26381.conf
  23. [root@192.168.32.130 /etc/redis]$ sed -i 's/26379/26382/g' sentinel_26382.conf
  24. [root@192.168.32.130 /usr/local/redis/src]$ cp /usr/local/redis/src/redis-sentinel /usr/bin/
  25. [root@192.168.32.130 /usr/local/redis/src]$ redis-sentinel /etc/redis/sentinel_26380.conf
  26. [root@192.168.32.130 /usr/local/redis/src]$ redis-sentinel /etc/redis/sentinel_26381.conf
  27. [root@192.168.32.130 /usr/local/redis/src]$ redis-sentinel /etc/redis/sentinel_26382.conf
  28. [root@192.168.32.130 /usr/local/redis/src]$ netstat -tunlp|grep redis
  29. tcp 0 0 127.0.0.1:26379 0.0.0.0:* LISTEN 111670/redis-sentin
  30. tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 109993/redis-server
  31. tcp 0 0 127.0.0.1:26380 0.0.0.0:* LISTEN 111701/redis-sentin
  32. tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 110007/redis-server
  33. tcp 0 0 127.0.0.1:26381 0.0.0.0:* LISTEN 111714/redis-sentin
  34. tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 110022/redis-server
  35. tcp 0 0 127.0.0.1:26382 0.0.0.0:* LISTEN 111727/redis-sentin
  36. tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 110037/redis-server
  37. # 都配置好之后,再来看配置文件,发现配置文件被重写了。:
  38. # 出现以下像md5值一样的字符串就说明已经配置好了。
  39. [root@192.168.32.130 /etc/redis]$ cat sentinel_26379.conf
  40. port 26379
  41. bind 127.0.0.1
  42. dir "/usr/local/redis/src"
  43. pidfile "/var/run/redis-sentinel.pid"
  44. daemonize yes
  45. logfile "sentinel_26379.log"
  46. sentinel myid 3067717f666b6cb157172e270f85441ecaa0c692
  47. sentinel monitor mymaster 127.0.0.1 6379 2
  48. sentinel auth-pass mymaster root
  49. sentinel config-epoch mymaster 0
  50. sentinel leader-epoch mymaster 0
  51. # Generated by CONFIG REWRITE
  52. sentinel known-slave mymaster 127.0.0.1 6381
  53. sentinel known-slave mymaster 127.0.0.1 6380
  54. sentinel known-slave mymaster 127.0.0.1 6382
  55. sentinel known-sentinel mymaster 127.0.0.1 26381 97cad0c94d3ee7927e11eb9d6edd90d3cfb16f01
  56. sentinel known-sentinel mymaster 127.0.0.1 26382 62c515d8e0f7098fc1b66a81282c28ba83be24fd
  57. sentinel known-sentinel mymaster 127.0.0.1 26380 b5514c5530497046ce6f9407a1386e0573b2b82f
  58. sentinel current-epoch 0
  59. portdaemonizelogfiledirbind 这些我就不介绍了,之前也介绍过了,这边重点介绍一下sentinel的配置
  60. sentinel monitor <master-name> <ip> <redis-port> <quorum>
  61. 告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效
  62. sentinel auth-pass <master-name> <password>
  63. 设置连接masterslave时的密码,注意的是sentinel不能分别为masterslave设置不同的密码,因此masterslave的密码应该设置相同。
  64. sentinel down-after-milliseconds <master-name> <milliseconds>
  65. 这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30
  66. sentinel parallel-syncs <master-name> <numslaves>
  67. 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
  68. sentinel failover-timeout <master-name> <milliseconds>
  69. failover-timeout 可以用在以下这些方面:
  70. 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
  71. 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
  72. 3.当想要取消一个正在进行的failover所需要的时间。
  73. 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。

Redis集群

Redis集群略,

请移步:

redis cluster集群部署

redis cluster 集群畅谈(一)

redis cluster 集群畅谈(二)

redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移

Redis高可用及集群的更多相关文章

  1. Redis高可用之集群配置(六)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  2. Redis高可用复制集群实现

    redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis 与其他 key - value 缓存产品有以下三个特点: 支持数据的持久化,可以将 ...

  3. redis高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...

  4. Redis 高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...

  5. Redis之高可用、集群、云平台搭建

    原文:Redis之高可用.集群.云平台搭建 文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Clu ...

  6. 一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_185 2021年,君不言容器技术则已,欲言容器则必称Docker,毫无疑问,它是当今最流行的容器技术之一,但是当我们面对海量的镜像 ...

  7. 构建高可用ZooKeeper集群

    ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...

  8. 搭建高可用mongodb集群(四)—— 分片(经典)

    转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还 ...

  9. 构建高可用ZooKeeper集群(转载)

    ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...

随机推荐

  1. 解决k8s gcr.io被墙下载不了镜像的问题

    gcr.io镜像 根据开源项目: https://github.com/anjia0532/gcr.io_mirror 作者将gcr.io相关镜像pull下来,然后push到docker官方仓库htt ...

  2. python和go对比字符串的链式处理

    一.什么是链式处理 对数据的操作进行多步骤的处理称为链式处理,链式处理器是一种常见的编程设计,链式处理的开发思想将数据和操作拆分,解耦,让开发者可以根据自己的技术优势和需求,进行系统开发,同时将自己的 ...

  3. VS2010-MFC(菜单:菜单及CMenu类的使用)

    转自:http://www.jizhuomi.com/software/212.html 上一节讲的是VS2010的菜单资源,本节主要讲菜单及CMenu类的使用. CMenu类的主要成员函数 MFC为 ...

  4. 初识OpenCV-Python - 007: 平滑图像

    本节内容主要将如何平滑图像.如通过低通道滤波模糊图像.或者自定义滤波处理图像. import cv2import numpy as npfrom matplotlib import pyplot as ...

  5. 谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用

    /*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,基于并行查询要启动并行进程.分配任务与系统资源.合并结果集,这些都是比较消耗资源,但我们为能够减少执行事务的时间使用paral ...

  6. spring:bean的作用范围和生命周期

    bean的作用范围调整: <!--bean的作用范围调整 bean标签的scope属性: 作用:用于指定bean的作用范围 取值:常用的就是单例的和多例的 singleton:单例的(默认值) ...

  7. [NOIP2019模拟赛]数数(gcd)

    题目大意: 求l~r中有多少数与x互质,带单点修改 分析: 两个30的部分分很好打: ·n<=1000暴力O(nq)就好了 ·$a_i<=100$用树状数组维护每个x的前缀和就好了 100 ...

  8. MVVM test

    示例代码 public class RegisterUserViewModel { public UserInfo userInfo { get; set; } public ICommand Cli ...

  9. differential related impedance and termination

    Impedance (1) Z0 Z0 is the impedance of one T-line while other lines are held at 0. Single end. (2) ...

  10. 代码内存泄露检测工具(linux gcc + valrind)

    参考博客: https://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111248.html linux命令如下:valgrind --tool ...