Redis--主从同步

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis--主从同步

前戏


redis集群中的数据库复制是通过主从同步来实现的,主节点(master)把数据分发给从节点(slave),主从同步的好处在于高可用。

redis主从同步的原理:

1.从服务器向主服务器发送SYNC命令。

2.接到SYNC的主服务器会调用BGSAVE命令,创建一个RDB文件,并使用缓冲区记录接下来执行的所有命令。

3.当主服务器执行完BGSAVE命令时,它会向从服务器发送RDB文件,而从服务器则会接收并载入这个文件。

4.主服务器将缓冲区存储的所有写命令发送给从服务器执行。


环境准备


1.关掉所有redis服务,使用ps查看

[root@HH redis-5.0.6]# ps -ef |grep  redis
root      4388  8523  0 18:44 pts/1    00:00:00 grep --color=auto redis

2.准备6380,6381,6382三个文件夹,后面会用到,创建到data目录下

[root@HH redis-5.0.6]# mkdir /data/{6380,6381,6382}
[root@HH redis-5.0.6]# ls /data/
6380  6381  6382

3.准备三个redis的配置文件,放到redis的目录下,这里分别命名为redis-6380.conf,redis-6381.conf,redis-6382.conf

redis-6380.conf

port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no

redis-6381.conf

port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no

redis-6382.conf

port 6382 
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no

到此为止我们的准备工作就做好了


主从同步


1.启动三个redis实例

[root@HH redis-5.0.6]# redis-server redis-6380.conf 
[root@HH redis-5.0.6]# redis-server redis-6381.conf 
[root@HH redis-5.0.6]# redis-server redis-6382.conf

2.此时可以查看redis身份信息,通过info参数(此时还未配置主从,因此都是master身份)

[root@HH redis-5.0.6]# redis-cli -p 6380 info Replication
# Replication
role:master   # 角色是master
connected_slaves:0  # 连接的slave数
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
[root@HH redis-5.0.6]# redis-cli -p 6381 info Replication
# Replication
role:master  # master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
[root@HH redis-5.0.6]# redis-cli -p 6382 info Replication
# Replication
role:master  # 也是master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

3.配置从节点的身份(6380为主,6381,6382为从),通过命令指明master节点信息即可

[root@HH conf]# redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
[root@HH conf]# redis-cli -p 6382
127.0.0.1:6382> slaveof 127.0.0.1 6380
OK
127.0.0.1:6382> exit  # 退出

也可以直接执行命令行同步

redis-cli -p 6381 SLAVEOF 127.0.0.1 6380  #指明主的地址
redis-cli -p 6382 SLAVEOF 127.0.0.1 6380  #指明主的地址

4.查看各个各个节点的身份信息

[root@HH redis-5.0.6]# redis-cli -p 6380 info Replication
# Replication
role:master  # 6380还是master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=141,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=141,lag=1
master_repl_offset:141
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:140
[root@HH redis-5.0.6]# redis-cli -p 6381 info Replication
# Replication
role:slave  # 6381是slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:155
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
[root@HH redis-5.0.6]# redis-cli -p 6382 info Replication
# Replication
role:slave  # 6382是slave了
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:7
...

5.检查,在主的里面写如数据,从的里面查看

[root@HH redis-5.0.6]# redis-cli -p 6380
127.0.0.1:6380> keys *
(empty list or set)
127.0.0.1:6380> set name zouzou
OK
[root@HH conf]# redis-cli -p 6381
127.0.0.1:6381> keys *
1) "name"
[root@HH conf]# redis-cli -p 6382
127.0.0.1:6382> keys *
1) "name"

注意:这样设置好之后,从服务器是不能写入的,只能读

127.0.0.1:6382> set name2 lala
(error) READONLY You can't write against a read only slave.


主从切换


上面我们已经配置好了主从同步,并且测试之后没有问题,假设有一天我们的主服务器挂了,我们可以手动切换到从服务器。

1.关闭主服务器,模拟主服务器挂掉了

[root@HH redis-5.0.6]# ps -ef | grep redis
root      5545     1  0 18:54 ?        00:00:00 redis-server *:6380
root      5555     1  0 18:54 ?        00:00:00 redis-server *:6381
root      5566     1  0 18:54 ?        00:00:00 redis-server *:6382
root      7092 18093  0 19:07 pts/0    00:00:00 redis-cli -p 6382
root      7540  8523  0 19:11 pts/1    00:00:00 grep --color=auto redis
[root@HH redis-5.0.6]# kill -9 5545  # 杀掉主服务器的进程
[root@HH redis-5.0.6]# ps -ef | grep redis
root      5555     1  0 18:54 ?        00:00:00 redis-server *:6381
root      5566     1  0 18:54 ?        00:00:00 redis-server *:6382
root      7092 18093  0 19:07 pts/0    00:00:00 redis-cli -p 6382
root      7608  8523  0 19:11 pts/1    00:00:00 grep --color=auto redis

2.检查从库主从信息,此时master_link_status:down

[root@HH redis-5.0.6]# redis-cli -p 6381 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:down   # 主服务器是挂了的
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1095
master_link_down_since_seconds:125
slave_priority:100
slave_read_only:1
connected_slaves:0

3.既然现在没有从库了,那我们选择6382作为主服务器

将6382去掉slave的身份

[root@HH redis-5.0.6]# redis-cli -p 6382 slaveof no one 
OK

设置完之后将6381的主服务器设置为6382

[root@HH redis-5.0.6]# redis-cli -p 6381 slaveof 127.0.0.1 6382 
OK

4.检查6381和6382的主从信息

[root@HH redis-5.0.6]# redis-cli -p 6382 info Replication
# Replication
role:master  # 6382为主服务器
connected_slaves:1  
slave0:ip=127.0.0.1,port=6381,state=online,offset=155,lag=1
master_repl_offset:155
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:154
[root@HH redis-5.0.6]# redis-cli -p 6381 info Replication
# Replication
role:slave  # 6381为从服务器
master_host:127.0.0.1
master_port:6382
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:155
slave_priority:100
...


通过配置文件决定主从身份


上面我们是使用命令行的方式来设置主从身份的,还有一种方式是直接在配置文件里决定主从身份

在配置文件中,添加一条参数即可(主节点不做配置,从节点指明主人的ip端口信息即可)

6380还是主,6381和6382是从

redis-6381.conf

port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
slaveof 127.0.0.1 6380  # 指明主服务器的地址和ip

redis-6382.conf

port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
slaveof 127.0.0.1 6380  # 指明主服务器的地址和ip

这样就可以了


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
3月前
|
缓存 运维 NoSQL
Redis主从模式部署
Redis主从模式部署
50 4
|
3月前
|
缓存 NoSQL Redis
Redis主从架构
当看到图示中红色标记的,就代表从节点挂载成功了。
28 0
|
8天前
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
36 2
|
2月前
|
监控 NoSQL Ubuntu
|
3月前
|
NoSQL Java 关系型数据库
考考你Redis主从,就知道有没深入Redis
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天继续给大家带来新的一篇Java进阶指南。如果是单机版的数据库,像MySQL、Redis,看起来实现并不复杂。只要支持保存一条数据,同时要能够查询出来。但如果是多机版的数据库呢,各个节点的配合联调是比较复杂的过程,看起来就不是那么简单喽。要考你对Redis深不深入理解,问问Redis多机版相关的问题就知道了。我们今天就来指南下Redis主从架构。
考考你Redis主从,就知道有没深入Redis
|
2月前
|
安全 NoSQL Java
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
|
4月前
|
存储 缓存 NoSQL
Redis与数据库同步指南:订阅Binlog实现数据一致性
本文由开发者小米分享,探讨分布式系统中的一致性问题,尤其是数据库和Redis一致性。文章介绍了全量缓存策略的优势,如高效读取和稳定性,但也指出其一致性挑战。为解决此问题,提出了通过订阅数据库的Binlog实现数据同步的方法,详细解释了工作原理和步骤,并分析了优缺点。此外,还提到了异步校准方案作为补充,以进一步保证数据一致性。最后,提醒在实际线上环境中需注意日志记录、逐步优化和监控报警。
228 3
|
4月前
|
负载均衡 NoSQL 网络协议
Redis(主从模式)
Redis(主从模式)
61 1
|
4月前
|
监控 NoSQL Redis
Redis分区容错秘诀:解密主从模式
Redis主从模式用于提高高可用性、负载均衡和数据备份。主节点处理写入,从节点复制数据并分担读取,实现故障切换和读写分离。配置主从关系后,从节点连接主节点进行全量和增量复制。当主节点故障,从节点可接管服务。然而,主从延迟和数据不一致性是挑战,可通过优化网络、使用Sentinel和Redis Cluster等解决。关注“软件求生”获取更多内容。
175 1
Redis分区容错秘诀:解密主从模式