主从复制

主从复制解决什么问题:
- redis-server单点故障
- 单节点QPS有限
- 持久化,从处理持久化,避免对主性能影响
主从复制应用场景分析
- 读写分离场景,规避redis单机瓶颈
- 故障切换,master出问题后还有slave节点可以使用
搭建主从复制
1.第一种方式:命令
# 连接需要实现从节点的redis,执行下面的命令
slaveof [ip] [port
2.配置文件,redis.conf
# 配置文件中增加
slaveof [ip] [port]
# 从服务器是否只读(默认yes)
slave-read-only yes
退出集群
slaveof no one
查看主从复制信息
master节点
127.0.0.1:6379> info replication
# Replication
# 角色 主
role:master
# 当前从服务器数量1
connected_slaves:1
# 从服务器信息
slave0:ip=127.0.0.1,port=6380,state=online,offset
=15,lag=1
# 计数器,主节点复制偏移量(复制的字节数)
master_repl_offset:351
# 主从同步缓存区
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14
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:351
# 从节点优先级
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
主从复制流程
1. 从服务器通过psync命令发送服务器已有的同步进度(同步源ID、同步进度offset)
2. master收到请求,同步源为当前master,则根据偏移量增量同步
3. 同步源非当前master,则进入全量同步:master生成rdb,传输到slave,加载到slave内存
主从复制核心知识
- Redis 默认使用异步复制,slave 和 master 之间异步地确认处理的数据量
- 一个 master 可以拥有多个 slave
- slave 可以接受其他 slave 的连接。 slave 可以有下级sub slave
- 主从同步过程在 master 侧是非阻塞的
- slave初次同步需要删除旧数据,加载新数据,会阻塞到来的连接请求
主从复制应用场景
- 主从复制可以用来支持读写分离
- slave服务器设定为只读,可以用在数据安全的场景下。
- 可以使用主从复制来避免 master 持久化造成的开销。master 关闭持久化,slave 配置为不定期保存或是启用 AOF。(注意:重新启动的 master 程序将从一个空数据集开始,如果一个 slave试图与它同步,那么这个 slave 也会被清空。 )
主从复制的注意事项
读写分离场景:
数据复制延时导致读到过期数据或者读不到数据(网络原因、slave阻塞)
从节点故障(多个client如何迁移)
全量复制情况下:
第一次建立主从关系或者runid不匹配会导致全量复制
故障转移的时候也会出现全量复制
复制风暴:
master故障重启,如果slave节点较多,所有slave都要复制,对服务器的性能,网络的压力都有很大影响。
如果一个机器部署了多个master
写能力有限
主从复制还是只有一台master,提供的写服务能力有限
master故障情况下:
如果是master无持久化,slave开启持久化来保留数据的场景,建议不要配置redis自动重启。
启动redis自动重启,master启动后,无备份数据,可能导致集群数据丢失的情况。
带有效期的key:
slave不会让key过期,而是等待 master 让 key 过期
在Lua脚本执行期间,不执行任何 key 过期操作
主从复制/同步示意图

montior命令
monitor 是一个调试命令,返回服务器处理的每个命令
注意:使用此命令会降低吞吐量
$ redis-cli monitor
1339518083.107412 [0 127.0.0.1:60866] "keys" "*"
1339518087.877697 [0 127.0.0.1:60866] "dbsize"
1339518090.420270 [0 127.0.0.1:60866] "set" "x" "6"
1339518096.506257 [0 127.0.0.1:60866] "get" "x"
1339518099.363765 [0 127.0.0.1:60866] "del" "x"
1339518100.544926 [0 127.0.0.1:60866] “get” “x”
info 命令
INFO命令关于Redis服务器的各种信息和统计数值。
| info命令 | 返回信息 |
| server Redis | 服务器的一般信息 |
| clients | 客户端的连接部分 |
| memory | 内存消耗相关信息 |
| persistence | 持久化相关信息 |
| stats | 一般统计 |
| replication | 主/从复制信息 |
| cpu | 统计CPU的消耗 |
| commandstats | Redis命令统计 |
| cluster | Redis集群信息 |
| keyspace | 数据库的相关统计 |
客户端代码示例
import io.lettuce.core.ReadFrom;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
@Configuration
// 主从 - 读写分离模式
class ReplicationRWRedisAppConfig {
@Value("${redis_host}")
private String redisHost;
@Value("${redis_port}")
private int redisPort;
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
System.out.println("使用读写分离版本");
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.readFrom(ReadFrom.SLAVE_PREFERRED)
.build();
// master:192.168.1.128 slave:192.168.1.145
// 默认slave只能进行读取,不能写入
// 如果你的应用程序需要往redis写数据,建议连接master
RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(redisHost, redisPort);
return new LettuceConnectionFactory(serverConfig, clientConfig);
}
}
图形化监控工具-RedisLive

Redis主从复制用于解决单点故障和性能瓶颈问题,实现读写分离和故障切换。复制过程包括命令同步和全量同步,异步进行且支持多级奴隶。应用场景包括读写分离和数据安全性。搭建主从复制可通过命令或配置文件实现,注意事项涉及数据丢失风险和性能影响。
3317

被折叠的 条评论
为什么被折叠?



