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 v2OK | ||
1 | 6380设置为6379的slave | 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379OK | ||
2 | 6381设置为6379的slave | 127.0.0.1:6381> SLAVEOF 127.0.0.1 6379OK | ||
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月17日 23时18分46秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
DM365 应用层gpio控制
2019-04-29
linux i2c子系统abc
2019-04-29
力扣的环形链表解法 (Python)
2019-04-29
CSS3 帧动画(Sprite,直译叫雪碧图)
2019-04-29
Java 父线程与子线程相互通信的方法
2019-04-29
Redis 六种淘汰策略和三种删除策略
2019-04-29
Java LinkedHashMap
2019-04-29
JPA 多线程同时对一条数据进行Update的问题
2019-04-29
JPA 多线程对数据进行更新,Update和Insert同时存在的问题
2019-04-29
Java 高性能队列Disruptor
2019-04-29
SpringBoot 使用https
2019-04-29
Java 读写锁
2019-04-29
JVM Minor GC、Full GC和Major GC
2019-04-29
SpringBoot @Scheduled 执行两次的问题
2019-04-29
tomcat配置JVM
2019-04-29
Ubuntu软件安装&卸载
2019-04-29
面试笔试易错知识点Java篇八
2019-04-29
弹性事务框架ETF4J——面向Java微服务的交易最终一致性解决方案
2019-04-29
【Scala 教程】Scala 条件与循环语句
2019-04-29
【Scala 教程】Scala 集合类型
2019-04-29