本文共 3796 字,大约阅读时间需要 12 分钟。
主从复制解决什么问题:
主从复制应用场景分析
搭建主从复制
1.第一种方式:命令
# 连接需要实现从节点的redis,执行下面的命令
slaveof [ip] [port2.配置文件,redis.conf
# 配置文件中增加
slaveof [ip] [port] # 从服务器是否只读(默认yes) slave-read-only yes退出集群
slaveof no one
master节点127.0.0.1:6379> info replication# Replication# 角色 主role:master# 当前从服务器数量1connected_slaves:1# 从服务器信息slave0:ip=127.0.0.1,port=6380,state=online,offset=15,lag=1# 计数器,主节点复制偏移量(复制的字节数)master_repl_offset:351# 主从同步缓存区repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:14slave节点127.0.0.1:6380> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:7master_sync_in_progress:0slave_repl_offset:351# 从节点优先级slave_priority:100# 是否为只读节点slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0
1. 从服务器通过psync命令发送服务器已有的同步进度(同步源ID、同步进度offset)
2. master收到请求,同步源为当前master,则根据偏移量增量同步 3. 同步源非当前master,则进入全量同步:master生成rdb,传输到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 monitor1339518083.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
转载地址:http://rujdi.baihongyu.com/