欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

10 Redis 主从复制

发布时间:2025/3/19 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 10 Redis 主从复制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 1 是什么
    • 2 能干嘛
    • 3 主从复制搭建
      • 3.1 根目录下创建目录/myredis
      • 3.2 修改/myredis中redis.conf
      • 3.3 vim redis6379.conf
        • 3.3.1 在/myredis 目录下增加配置文件redis6379.conf,并添加配置
        • 3.3.1 在/myredis 目录下增加配置文件redis6380.conf,并修改配置
        • 3.3.1 在/myredis 目录下增加配置文件redis6381.conf,并修改配置
      • 3.4 分别启动三个redis服务
        • 3.4.1 查看进程是否正常启动
      • 3.5 通过客户端连接加端口号查看redis信息
        • 3.5.1 通过客户端连接加端口号查看redis6379信息 info replication
        • 3.5.2 通过客户端连接加端口号查看redis6380信息 info replication
        • 3.5.3 通过客户端连接加端口号查看redis6381信息 info replication
      • 3.6 配置从库不配置主库
        • 3.6.1 在6380客户端执行slaveof 127.0.0.1 6379
        • 3.6.1 在6381客户端执行slaveof 127.0.0.1 6379
      • 3.7 验证主从复制
        • 3.7.1 在主库写入键值对,在从机查看可以复制成功
        • 3.7.2 在从机查看可以取到键值,说明复制成功
        • 3.7.3 如果在从库写入键值对是提示失败
      • 3.8 一主二从
      • 3.9 薪火相传
      • 3.10 反客为主
      • 3.11 主从复制原理
    • 4 哨兵模式sentinel
      • 4.1 首先配置一主二从的基本环境
      • 4.2 配置哨兵
      • 4.3 启动哨兵
      • 4.4 模拟主服务器shutdown
      • 4.5 此时再启动之前的主服务器6379变为从服务器slave了
      • 4.6 复制延时
      • 4.7 故障恢复
        • 4.7.1 新主登基
        • 4.7.2 群臣俯首
        • 4.7.3 旧主俯首

1 是什么

主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为主

2 能干嘛

读写分离,性能扩展
容灾快速恢复

3 主从复制搭建

3.1 根目录下创建目录/myredis

将/etc/redis.conf 配置文件拷贝到/myredis中

[root@localhost chengwen]# mkdir /myredis [root@localhost chengwen]# cd /myredis/ [root@localhost myredis]# cp /etc/redis.conf /myredis/redis.conf [root@localhost myredis]# ls redis.conf

3.2 修改/myredis中redis.conf

appendonly 修改为 no

appendonly no

3.3 vim redis6379.conf

3.3.1 在/myredis 目录下增加配置文件redis6379.conf,并添加配置

include /myredis/redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb

3.3.1 在/myredis 目录下增加配置文件redis6380.conf,并修改配置

[root@localhost myredis]# cp redis6379.conf redis6380.conf [root@localhost myredis]# vim redis6380.conf include /myredis/redis.conf pidfile /var/run/redis_6380.pid port 6380 dbfilename dump6380.rdb

3.3.1 在/myredis 目录下增加配置文件redis6381.conf,并修改配置

[root@localhost myredis]# cp redis6379.conf redis6381.conf [root@localhost myredis]# vim redis6381.conf include /myredis/redis.conf pidfile /var/run/redis_6381.pid port 6381 dbfilename dump6381.rdb

3.4 分别启动三个redis服务

[root@localhost myredis]# redis-server redis6379.conf [root@localhost myredis]# redis-server redis6380.conf [root@localhost myredis]# redis-server redis6381.conf [root@localhost myredis]#

3.4.1 查看进程是否正常启动

[root@localhost myredis]# ps -ef|grep redis root 152843 2158 0 04:30 ? 00:00:00 redis-server *:6380 root 152856 2158 0 04:31 ? 00:00:00 redis-server *:6381 root 152966 2158 0 04:33 ? 00:00:00 redis-server *:6379 root 152972 123376 0 04:33 pts/0 00:00:00 grep --color=auto redis [root@localhost myredis]#

3.5 通过客户端连接加端口号查看redis信息

3.5.1 通过客户端连接加端口号查看redis6379信息 info replication

role:master 说明是角色是主机Master

[root@localhost myredis]# redis-cli -p 6379 127.0.0.1:6379> info replication # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:1ecba680652395416fe8bd719da26c6564a957d5 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 127.0.0.1:6379>

3.5.2 通过客户端连接加端口号查看redis6380信息 info replication

role:master 说明是角色是主机Master

[chengwen@localhost redis]$ redis-cli -p 6380 127.0.0.1:6380> info replication # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:ad3b7ea9b5309fe5b1974333a68cd95a2c60e2df 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 127.0.0.1:6380>

3.5.3 通过客户端连接加端口号查看redis6381信息 info replication

role:master 说明是角色是主机Master

[chengwen@localhost ~]$ redis-cli -p 6381 127.0.0.1:6381> info replication # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:08aebaa422e9096f8efb3ec263e8334f208ae017 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 127.0.0.1:6381>

3.6 配置从库不配置主库

slaveof
ip为主库的ip
port为主库的port

3.6.1 在6380客户端执行slaveof 127.0.0.1 6379

127.0.0.1:6380> slaveof 127.0.0.1 6379 OK

6380 角色变为role:slave

127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14 127.0.0.1:6380>

6379主库信息显示了从库信息 slave0:ip=127.0.0.1,port=6380

127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=154,lag=1 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:154 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:154 127.0.0.1:6379>

3.6.1 在6381客户端执行slaveof 127.0.0.1 6379

在6381客户端执行

127.0.0.1:6381> slaveof 127.0.0.1 6379 OK

6381 角色变为role:slave

127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:1120 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1120 second_repl_offset:-1 repl_backlog_active

6379主库信息显示了从库信息slave1:ip=127.0.0.1,port=6381

127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=1232,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=1232,lag=1 master_failover_state:no-failover master_replid:8a4e81ca75627b83cf7fc1d68f1b07f26680c845 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1232 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1232 127.0.0.1:6379>

3.7 验证主从复制

3.7.1 在主库写入键值对,在从机查看可以复制成功

127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379>

3.7.2 在从机查看可以取到键值,说明复制成功

127.0.0.1:6380> get k1 "v1" 127.0.0.1:6380>

3.7.3 如果在从库写入键值对是提示失败

127.0.0.1:6380> set k2 v2 (error) READONLY You can't write against a read only replica. 127.0.0.1:6380>

3.8 一主二从

如果从slave服务器shutdown,重启启动后会变为独立的master;
通过slaveof 127.0.0.1 6379 配置为从服务器后,会从master复制全部数据

如果master服务器shutdown,重启后还是master
通过redis-server redis6379.conf 启动后还是主服务器

3.9 薪火相传

上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力,去中心化降低风险

用slaveof
中途变更转向,会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave无法备份
主机挂了,从机还是从机,无法写数据了

3.10 反客为主

当一个master宕机后,后面的slave可以立刻升为master,后面的slave不用做任何修改
用slaveof no one 将从机变为主机

3.11 主从复制原理

当从服务器slave连接上主服务器master后,会发送sync命令
master接到命令后启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以完成一次完全同步

全量复制 slave服务器在接收到数据库文件后,将其存盘并加载到内存中

增量复制 master继续将新的所有收集到的修改命令依次传给slave,完成同步

只要是重新连接master,一次完全同步(全量复制)将被自动执行

4 哨兵模式sentinel

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

4.1 首先配置一主二从的基本环境

[root@localhost myredis]# redis-server redis6379.conf [root@localhost myredis]# redis-server redis6380.conf [root@localhost myredis]# redis-server redis6381.conf [root@localhost myredis]# redis-cli -p 6379 [chengwen@localhost ~]$ redis-cli -p 6381 127.0.0.1:6381> slaveof 127.0.0.1 6379 OK [chengwen@localhost redis]$ redis-cli -p 6380 127.0.0.1:6380> slaveof 127.0.0.1 6379 OK

4.2 配置哨兵

[root@localhost myredis]# vim /myredis/sentinel.conf

在sentinel.conf中添加如下配置

sentinel monitor mymaster 127.0.0.1 6379 1

其中mymaster 为监控对象起的服务器名称,
1为至少有多少个哨兵同意迁移的数量

4.3 启动哨兵

[root@localhost ~]# redis-sentinel /myredis/sentinel.conf

启动信息,包含主机名称 端口,从机端口等

168706:X 05 May 2021 10:00:40.739 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 168706:X 05 May 2021 10:00:40.750 # Sentinel ID is 09cecc8460e8981db67146daa636f7ec6ccb2cdf 168706:X 05 May 2021 10:00:40.750 # +monitor master mymaster 127.0.0.1 6379 quorum 1 168706:X 05 May 2021 10:00:40.752 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:00:40.754 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379

4.4 模拟主服务器shutdown

127.0.0.1:6379> shutdown nosave not connected> exit [root@localhost myredis]#

此时再看sentinel 信息

168706:X 05 May 2021 10:05:09.971 # +sdown master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:09.971 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1 168706:X 05 May 2021 10:05:09.971 # +new-epoch 1 168706:X 05 May 2021 10:05:09.971 # +try-failover master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:09.974 # +vote-for-leader 09cecc8460e8981db67146daa636f7ec6ccb2cdf 1 168706:X 05 May 2021 10:05:09.974 # +elected-leader master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:09.974 # +failover-state-select-slave master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.050 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.050 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.109 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.696 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.696 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:10.775 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.782 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.782 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.874 # +failover-end master mymaster 127.0.0.1 6379 168706:X 05 May 2021 10:05:11.874 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381 168706:X 05 May 2021 10:05:11.874 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 168706:X 05 May 2021 10:05:11.874 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 168706:X 05 May 2021 10:05:41.940 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

上述信息 selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
表明新的master 为6381,查看6381的info replication为

127.0.0.1:6381> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=48619,lag=0 master_failover_state:no-failover master_replid:8bedc64549b81b2c8b0fd6aaedfabda6339831c3 master_replid2:298dd1f7362edcaccde0774f694b9be161acf698 master_repl_offset:48619 second_repl_offset:16537 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:48619 127.0.0.1:6381>

4.5 此时再启动之前的主服务器6379变为从服务器slave了

[root@localhost myredis]# redis-server redis6379.conf [root@localhost myredis]# redis-cli -p 6379 127.0.0.1:6379> info replication # Replication role:slave master_host:127.0.0.1 master_port:6381 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:64126 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:8bedc64549b81b2c8b0fd6aaedfabda6339831c3 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:64126 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:62879 repl_backlog_histlen:1248 127.0.0.1:6379>

4.6 复制延时

由于所有的写操作都是先在master上操作,然后同步的更新到slave,所以从master同步到slave机器有一定的延迟,当系统繁忙的时候,延迟问题更加严重,slave机器数量的增加也会使这个问题更加严重

4.7 故障恢复

4.7.1 新主登基

从宕机的主服务的所有从服务里面挑选一个从服务,将其转换成主服务
选择条件依次为:
选择优先级靠前的
选择偏移量最大的
选择runid最小的服务

4.7.2 群臣俯首

挑选出新的主服务器之后,sentinel向原主服务器的从服务发送slaveof新主服务的命令 复制新master

4.7.3 旧主俯首

当宕机的服务重新上线时,sentinel会向其发送slaveof命令,让其成为新的从机

优先级在redis.conf 中默认:slave-priority 100 ,值越小优先级越高replica-priority 100 (新版本配置优先级)
偏移量是指获得原主机数据最安全的
每个redis实例启动后都会随机生成一个40位的runid

文章目录

    • 1 是什么
    • 2 能干嘛
    • 3 主从复制搭建
      • 3.1 根目录下创建目录/myredis
      • 3.2 修改/myredis中redis.conf
      • 3.3 vim redis6379.conf
        • 3.3.1 在/myredis 目录下增加配置文件redis6379.conf,并添加配置
        • 3.3.1 在/myredis 目录下增加配置文件redis6380.conf,并修改配置
        • 3.3.1 在/myredis 目录下增加配置文件redis6381.conf,并修改配置
      • 3.4 分别启动三个redis服务
        • 3.4.1 查看进程是否正常启动
      • 3.5 通过客户端连接加端口号查看redis信息
        • 3.5.1 通过客户端连接加端口号查看redis6379信息 info replication
        • 3.5.2 通过客户端连接加端口号查看redis6380信息 info replication
        • 3.5.3 通过客户端连接加端口号查看redis6381信息 info replication
      • 3.6 配置从库不配置主库
        • 3.6.1 在6380客户端执行slaveof 127.0.0.1 6379
        • 3.6.1 在6381客户端执行slaveof 127.0.0.1 6379
      • 3.7 验证主从复制
        • 3.7.1 在主库写入键值对,在从机查看可以复制成功
        • 3.7.2 在从机查看可以取到键值,说明复制成功
        • 3.7.3 如果在从库写入键值对是提示失败
      • 3.8 一主二从
      • 3.9 薪火相传
      • 3.10 反客为主
      • 3.11 主从复制原理
    • 4 哨兵模式sentinel
      • 4.1 首先配置一主二从的基本环境
      • 4.2 配置哨兵
      • 4.3 启动哨兵
      • 4.4 模拟主服务器shutdown
      • 4.5 此时再启动之前的主服务器6379变为从服务器slave了
      • 4.6 复制延时
      • 4.7 故障恢复
        • 4.7.1 新主登基
        • 4.7.2 群臣俯首
        • 4.7.3 旧主俯首

总结

以上是生活随笔为你收集整理的10 Redis 主从复制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。