Redis的性能,哨兵模式,集群,

Redis的性能管理;

redis的数据保存在内存中

redis-cli info memory

redis内存使用info memory命令参数解析

used_memory:236026888     由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)为单位

used_memory_rss:274280448     redis向操作系统申请的内存大小

used_memory_peak:458320936   redis的内存消耗峰值(以字节为单位)

内存碎片率

used_memory_rss/used_memory系统已经分配给了redis,但是redis未能够有效利用的内存

如何查看内存碎片率:

redis-cli info memory | grep ratio

allocator frag ratio:1.19

分配碎片的比例,redis 主进程调度时产生的内存,比例越小,值越高,内存的浪费越多

allocator rss ratio:7.15

分配器占用物理内存的比例,告诉你主进程调度执行时占用了多少物理内存

rss overhead ratio:0.31

rss是向系统申请的内存空间,Redis占用物理空间额外的开销比例,比例越低好,redis实际占用的物理内存和向系统申请的内存月接近,额外的开销越低

mem_fragmentation ratio:3.33

内存碎片的比例,越低越好,内存的使用率越高

如何自动清理碎片:

vim /etc/redis/6379.conf

.....

activedefrag yes 

#最后一行添加

如何手动清理碎片:

redis-cli memory purge

设置redis的内存最大阈值:

一但到达阈值,会自动清理碎片,开启key的回收机制

vim /etc/redis/6379.conf

........

#568行添加

maxmemory 1gb

key的回收策略

vim /etc/redis/6379.conf

.......

#598行添加如下(一般保留最后一个策略,根据需求添加):

maxmemory-policy volatile-lru:使用redis内资的lru算法,把已经设置了过期时间的键值对对中淘汰数据,移除最少使用的键值对。对已经设置了过期时间的键值对

maxmemory-policy volatile-ttl:已经设置了时间的键值对,从当中挑选一个即将过期的键值对,针对有设置过期时间的键值对

maxmemory-policy-volatile-random:从已经设置了过期时间的键值对当中,挑选数据随机淘汰键值对。对设置时间的键值对进行随机移除

mllkey-lru:lru算法当中,对所有的键值对进行淘汰,移除最少使用的键值对,针对所有的键值对

allkeys-random:从所有键值对中任意选择键值对进行淘汰

maxmemory-policy noeciction:禁止键值对回收,(不删除任何键值对,直到Redis内存塞满了)

在工作中一定要 给redis占用内存设置阈值

面试:

redis占用 内存的效率问题如何解决

1 日常巡检中。对redis 占用内存情况做监控

2  设置redis占用系统内存的阈值,避免占用系统全部内存

3  内存碎片清理,手动.自动清理

4  配置合适的Key的回收机制

Redis的报错问题:

1 雪崩:

缓存雪崩,大量的应用请求无法在redis缓冲中处理,会把所有的请求发送到后台数据库,数据库的压力会大,数据库本身并发能力差,一旦高并发,数据库会崩溃

redis集群大面积故障,Redis缓存中,大量数据同时过期,大量的请求无法得到处理。Redis实例宕机

1.1解决方案:

事前:高可用架构,防止整个缓存故障, ,主从复制,和哨兵模式,Redis集群。

事中:在国内用的比较多的方式,hystrix,熔断,限流三个手段来降低雪崩发生之后的损失,数据库不死即可,慢可以,但是不能没有响应

事后,Redis备份。快速缓存预热

2  redis的缓存击穿(重要)

主要是热点数据缓存过期,或者删除,多个请求并发访问热点数据,请求转发到数据库,导致数据库的性能下降,经常请求的缓存数据,最好设置为永不过期

3 Redis的缓存穿透

缓存中没有数据,数据库也没有对应的数据,但是有用户一直发起这个请求,而且请求的数据是很大,一般是被黑客利用

Redis的主从复制

主从复制的作用:

是redis实现高可用的基础,哨兵模式和集群都是在主从复制的基础之上实现高可用,主从复制实现数据的多机备份,以及读写分离(主服务器负责写,从服务器只读)

缺陷:故障无法自动恢复,需要人工干预,写操作的负载均衡

主从复制的工作原理

主节点从节点组成,数据复制是单向,只能从主节点到从节点

1 主节点:主节点收到请求之后,他不管slave是第一次连接还是重新连接,主节点都会启动一个后台进程,执行bgsave主节点会把所有修改数据记录的命令加载到缓存和数据文件之中,

主从复制推荐使用AOF

建立连接:slave向主发送一个syn command,请求和主节点建立连接

数据文件创建完毕之后,master把数据文件传送到salve,slave 会把这个数据文件,先保存到硬盘,然后在加载到内存

实验架构:

192.168.233.7 主

192.168.233.8 从

192.168.233.9 从

依赖环境 Redis 先准备好

主:

从1 和从2

查看日志是否建好

验证是否主从

同时登录redis ,主写入  从节点无法写

哨兵模式

先有主从,再有哨兵,再主从复制的基础之上,实现主节点故障的自动切换,

哨兵模式的原理:

哨兵是一个分布式系统,用于在主从结构之间,对每台redis的服务器进行监控,主节点出现故障时,从节点通过投票的方式选择一个新的master 哨兵模式也需要至少三个节点,

哨兵模式的结构:

哨兵节点:监控节点,不存储数据

数据节点:主从节点,都是数据节点

主节点的选举过程:

1 已经下线的从节点,不会被选为主节点

2  选择配置文件当中,从节点优先级最高的replica-priority 100

3  选择一个复制数据最完整的从节点

哨兵节点通过raft算法(选举算法),每个节点共同投票选举出一个新的master,然后新的master实现主节点转移和故障恢复通知

每个哨兵节点每隔一秒,通过ping命令方式,检测主从之间的心跳线,主节点在一定时间内没有回复或者恢复了错误的信息,这个时候哨兵就会主观的判断主节点下线了,超过半数的节点哨兵认为主节点下线了,这个时候才会认为主节点是客观下线

主:

sentinel monitor mymaster 192.168.233.7 6379 2 

#指向表示至少需要2台服务器认为主已经下线,才会进行主从切换。

从1和从2:

启动配置文件 先启动再启动从,挨个执行一遍

查看状态信息

日志查看从节点的信息

Redis 集群:

Redis3.0引入的分布式存储方案

工作模式:

集群有多个node节点组成,Redis数据分布在这些节点上,在集群之中,分为主节点和从节点

集群模式中 主从一一对应,数据写的读取和主从模式一样,主负责写,从模式只能写,集群模式自带哨兵模式,可以自动实现故障切换,但是故障切换中,整个集群不能使用,切换完毕之后集群会立刻恢复

集群模式是按照数据分片划分:

1 数据分片:是集群的核心功能,每个主都要提供读写的功能,但是数据一一对应写入对应的从节点,在集群模式中,可以容忍数据的不完整

2 高可用 :集群的主要目的

数据分片的实现过程:

redis集群引入了 哈希槽的概念

redis集群当中16384个哈希槽位(0-16384)

根据集群当中主节点从节点,分配哈希槽位,每个主从节点只负责一部分的

哈希槽位是连续的哈希槽位,如果出现不连续的哈希值,或者哈希槽位没有被分配,集群将会报错

主宕机之后,主节点原来负责的哈爷槽位将会不可用,需要从节点代替主节点继续负责原有的哈希操作。保证集群正常工作,故障切换的过程中,会提示集群不可用。切换完成,集群恢复继续工作。

每次读写都涉及到哈希槽位,Keyt通过crc16验证之后,对16384取余数,余数值决定数据放入哪个哈希槽位,通过这个值去找到对应的槽位所在的节点,然后直接跳转到这个节点

集群的流程:

1  集群自带主从和哨兵模式,

2  每个主从是互相隔的可以容忍数据的不完整,目的:高可用

3  哈希槽位为决定每个节点的读写槽位,在创建Key时,系统已经分配好了指定槽位

4 如果是出现MOVED不是报错,是提醒客户端取分配好的槽位节点,获取数据

实验

实验需求:需要6台装有redis的虚拟机

                                六台redis服务器都配置
vim /etc/redis/6379.conf
*****************************************************************************************
 
1、默认监听所有网卡-----70行
bind 0.0.0.0
 
2、关闭保护模式-----89行
protect-mode no
 
3、开启守护进程,以独立进程启动-----137行
daemonize yes
 
4、开启AOF持久化-----700行
appendonly yes
 
5、开启集群功能-----833行
cluster-enabled yes
 
6、集群名称文件设置-----841行
cluster-config-file nodes-6003.conf
 
7、集群超时时间设置-----847行(15000毫秒)
cluster-node-timeout 15000
 
*****************************************************************************************

 
创建集群:redis-cli -h 所在服务器ip --cluster create ip地址:6379 --cluster-replicas 1
 
此时在192.168.10.80主机创建
redis-cli -h 192.168.10.80 --cluster create 192.168.10.80:6379  192.168.10.150:6379 179 192.168.10.152:6379 192.168.10.153:6379 192.168.10.154:6379 --cluster-replicas 1
 
[root@localhost ~]# redis-cli -h 192.168.10.80 --cluster create 192.168.10.80:6379  192.168.79 192.168.10.152:6379 192.168.10.153:6379 192.168.10.154:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.10.153:6379 to 192.168.10.80:6379
Adding replica 192.168.10.154:6379 to 192.168.10.150:6379
Adding replica 192.168.10.152:6379 to 192.168.10.151:6379
M: f9a09e3ededa9767aafc6aca98fcaad8e28272b6 192.168.10.80:6379
   slots:[0-5460] (5461 slots) master
M: 508caf1dfeab313b2df0173dc015b62591b012fb 192.168.10.150:6379
   slots:[5461-10922] (5462 slots) master
M: 68d8e79f5b4478dcd8143ef024607f17d02820c6 192.168.10.151:6379
   slots:[10923-16383] (5461 slots) master
S: 6c1dc5ae608ca1c20f80f4762933ee07aa4a77c5 192.168.10.152:6379
   replicates 68d8e79f5b4478dcd8143ef024607f17d02820c6
S: d82924c43dd5c907fda4abf35ffe33ad2b295abf 192.168.10.153:6379
   replicates f9a09e3ededa9767aafc6aca98fcaad8e28272b6
S: 8ae774dce41372b08e38904ef81adba51413d072 192.168.10.154:6379
   replicates 508caf1dfeab313b2df0173dc015b62591b012fb
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 192.168.10.80:6379)
M: f9a09e3ededa9767aafc6aca98fcaad8e28272b6 192.168.10.80:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 8ae774dce41372b08e38904ef81adba51413d072 192.168.10.154:6379
   slots: (0 slots) slave
   replicates 508caf1dfeab313b2df0173dc015b62591b012fb
S: 6c1dc5ae608ca1c20f80f4762933ee07aa4a77c5 192.168.10.152:6379
   slots: (0 slots) slave
   replicates 68d8e79f5b4478dcd8143ef024607f17d02820c6
M: 68d8e79f5b4478dcd8143ef024607f17d02820c6 192.168.10.151:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: d82924c43dd5c907fda4abf35ffe33ad2b295abf 192.168.10.153:6379
   slots: (0 slots) slave
   replicates f9a09e3ededa9767aafc6aca98fcaad8e28272b6
M: 508caf1dfeab313b2df0173dc015b62591b012fb 192.168.10.150:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost ~]# 

查看hash槽位CLUSTER nodes

验证从节点不能读

此处error不是报错,表明客户端尝试读取键值对test1,但是实际槽位在4768,因此集群要求客户端移动到4768槽位所在的主机节点获取数据

(2)验证从节点能不能写。不能

(3)验证分配hash槽位后,不在相应的hash槽位上的主节点能不能写。不能,只能到指定节点上操作

模拟故障

任意一台主服务器故障

主20.0.0.34——redis3故障,从20.0.0.44——redis4成为新主

 monitor 查看哨兵的ping命令

监控redis实时工作日志,检测主从节点之间的心跳线

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值