博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis 主从集群
阅读量:4037 次
发布时间:2019-05-24

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

主从复制

主从复制解决什么问题:

  •  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# 当前从服务器数量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内存

主从复制核心知识

  • 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 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/

你可能感兴趣的文章
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>