Redis主从复制(Replication)机制介绍,适合新手
发布日期:2021-06-29 15:52:18 浏览次数:2 分类:技术文章

本文共 5317 字,大约阅读时间需要 17 分钟。

redis复制可以实现主机(master)和从机(salve)之间数据同步,这样做可以实现两个目标:读写分离和数据备份。

“复制”是一种架构思想,redis实现了这种思想,除此之外,其他数据库例如MySQL也支持复制。

redis复制的实现

主从配置和状态

  • 配从不配主

    • 配置从库即可,不用配置主库
    • 从库配置使用 slaveof <host> <port>
    • 取消slave配置 slaveof no one
  • 默认从库只读

  • master宕机后,slave会保持原有角色,等待master恢复,不过slave会显示master的连接状态为down

    • master恢复后,slave会自动连接
127.0.0.1:6380> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:down...
  • 在没有配置文件配置配置的情况下,slave宕机之后重启会变为新的master,需要重新连接原来的master才可以继续工作

slave传递(薪火相传)

  • slave同样接受其他服务的slaveof请求,使slave可以传递,从而降低master的压力
  • 有slave的slave角色仍然时slave
  • slave传递时,数据的同步会有延时
# 有slave的slave复制信息127.0.0.1:6380> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:5master_sync_in_progress:0slave_repl_offset:2670slave_priority:100slave_read_only:1connected_slaves:1slave0:ip=127.0.0.1,port=6381,state=online,offset=2670,lag=0master_failover_state:no-failovermaster_replid:0e3ec53a7c32143e7ce760250c80a5f806892b0fmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:2670second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:2670

slave变master(反客为主)

  • master宕机后,需要手动选择一个slave(记作slave1)设置为master

  • 其他slave默认会等待master恢复,需要手动转移到新的master

  • 使用哨兵模式可以实现master宕机时自动将slave变为master

哨兵模式详见作者的另一篇博文

示例

一主两从

环境准备

  • 在同一台设备运行三个redis实例,端口分别为6379、6380、6381

  • 拷贝三份redis.conf配置文件,分别修改以下属性

配置项 默认值 6379 6380 6381
文件名 redis.conf redis_6379.conf redis_6380.conf redis_6381.conf
port 6379 6379 6380 6381
pidfile /var/run/redis.pid xxx/redis_6379.pid xxx/redis_6380.pid xxx/redis_6381.pid
logfile “redis.log” “redis_6379.log” “redis_6380.log” “redis_6380.log”
dbfilename dump.rdb dump_6379.rdb dump_6380.rdb dump_6381.rdb
  • 启动三个redis服务
$ ./redis-server xxx/redis_6379.conf$ ./redis-server xxx/redis_6380.conf$ ./redis-server xxx/redis_6381.conf
  • 至此,三个redis服务同时启动,完成了一台主机运行多个redis服务
  • 客户端连接服务
$ redis-cli -p 6379$ redis-cli -p 6380$ redis-cli -p 6381

客户端操作

  • 查看复制信息 info replication
127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:0master_failover_state:no-failovermaster_replid:e4a19fe31c0f617b3da3a3255e0b63aa03722c4dmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6380> info replication# Replicationrole:masterconnected_slaves:0master_failover_state:no-failovermaster_replid:67e5beb30c793be37999063b9f9eb9470eae8842master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6381> info replication# Replicationrole:masterconnected_slaves:0master_failover_state:no-failovermaster_replid:126f4a1cfc0ede33ad893a9a459a717b078eef0fmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0

三个redis实例角色均为 master

  • 将6380和6381设置为6379的slave
时间序号 操作或命令 6379 6380 6381
0 6379添加测试数据 127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
1 6380设置为6379的slave 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
2 6381设置为6379的slave 127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
3 6379查看keys * 127.0.0.1:6379> keys *
1) "k2"
2) “k1”
4 6380查看keys * 127.0.0.1:6380> keys *
1) "k2"
2) “k1”
5 6381查看keys * 127.0.0.1:6381> keys *
1) "k2"
2) “k1”
6 6381插入数据 127.0.0.1:6381> set k3 5
(error) READONLY You can’t write against a read only replica.

step 3~5: 证明6380和6381已经成功成为6379的slave,并且数据已经同步(添加为slave之前的数据也会同步)

step 6: 默认情况下slave为只读,无法写入数据

此时查看复制信息 info replication

127.0.0.1:6379> info replication# Replicationrole:master  # 6379为masterconnected_slaves:2slave0:ip=127.0.0.1,port=6380,state=online,offset=1092,lag=1slave1:ip=127.0.0.1,port=6381,state=online,offset=1092,lag=0master_failover_state:no-failovermaster_replid:36f2fe0ee9028ba075cdba2bb820b9803221d3b4master_replid2:0000000000000000000000000000000000000000master_repl_offset:1092second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:1092127.0.0.1:6379> 127.0.0.1:6380> info replication# Replicationrole:slave # 6380为slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:6master_sync_in_progress:0slave_repl_offset:1064slave_priority:100slave_read_only:1connected_slaves:0master_failover_state:no-failovermaster_replid:36f2fe0ee9028ba075cdba2bb820b9803221d3b4master_replid2:0000000000000000000000000000000000000000master_repl_offset:1064second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:1064127.0.0.1:6381> info replication# Replicationrole:slave # 6380为slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:7master_sync_in_progress:0slave_repl_offset:1022slave_priority:100slave_read_only:1connected_slaves:0master_failover_state:no-failovermaster_replid:36f2fe0ee9028ba075cdba2bb820b9803221d3b4master_replid2:0000000000000000000000000000000000000000master_repl_offset:1022second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:155repl_backlog_histlen:868

转载地址:https://console.blog.csdn.net/article/details/115413401 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:git问题汇总(不定时更新)
下一篇:Poj百练 4110:圣诞老人的礼物-Santa Clau’s Gifts (分类:贪心)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月17日 23时18分46秒