高并发性能瓶颈点:
商品秒杀的业务场景为什么说跟其他的业务场景不一样呢?不一样在哪里呢?
用户扎堆现象很严重。
大数据时代的 3V:
海量 (Volume)、多样 (Variety) 、实时 (Velocity)
海量:现在的股票,期货的开盘时间固定的,这样就有海量的用户同时登陆
多样:电商,打车...
实时:操作软件的时候,1,2 秒钟没有响应的活,几乎就失去用户了
互联网需求的 3 高:
高并发,高性能(高可用),高可扩。
如果用传统的数据库来做,IO 操作很频繁。因为 mysql 是以文件的形式存储在硬盘上的
现在 redis 是缓存级别的,一般在项目里面是单独部署在一个服务器上面的。 对内存要求比较高。
关于数据库,有好多种:
一般文件的话,有文件服务器:mongdb
redis 是缓存的,阶段性的高频信息适合用 redis 来做。
高并发一般就是两种做法:
1.加缓存:一般就是 redis
2.队列:rabbitmq(用户的并发量来了,内部的机制,可以做一个基本的队列)
输入验证的同时,就是把时间拉长了。就是异步的机制。还有其他的一些策略。排队啊。倒计时。。。其实就是在分散好多压力
如果没有缓存、异步化这些技术,A 所有的请求都直接去访问 DB 话,不管你的数据库是 mysql 还是 oracle,都扛不住。
Redis 方案简介
Redis 就是将高频的数据放在 redis 的内存服务器上,减轻 mysql 的 IO 操作。对磁盘的读写的操作
优点:
最重要的就是解决并发的时候,对数据库的操作
一般 tomcat 和 nginx 挂了,是在页面上面能直接看出来的。都不能访问的
Redis 是存数据的,存频繁常用的数据。如果直接挂了,存在里面的 token 值,就是不能用了
分布式:
不同服务器一般放不同的模块(订单就是订单,购买就是购买)
集群:
不同服务器一般放相同的模块
相关操作:
为什么使用 Redis?
在项目中使用 Redis,主要考虑两个角度:性能和并发。否则用 Redis 干嘛??
性能角度
传统:
我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓
存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
特别是在秒杀系统,在同一时间,几乎所有人都在点,都在下单。。。执行的是同一操作———向数据库查数据
并发角度
在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。
传统:
1.Redis 安装:
wget http://download.redis.io/releases/redis-5.0.8.tar.gz #下载redis
tar zxvf redis-5.0.8.tar.gz #解压redis文件
mv redis-5.0.8 /usr/local #移到local目录下
cd /usr/local #进入local目录
mv redis-5.0.8 redis #重命名为redis目录
cd redis #进入redis目录
make #编译文件
2、Redis 常用工具
redis 最主要的工具都在 src 里面
绿色的表示可以执行的,
.c:redis是c语言写的。.c表示源文件
.h: 表示头文件
.o:out 文件,编译后的文件
redis-benchmark:
基准测试工具,相当于一个自检的东西。
redis-cli:
Redis 命令行工具,客户端
redis-server:
启动 Redis,服务端
redis有服务端和客户端
redis-check-aof:
AOF :持久化文件检测工具和修复工具,检测文件类的
启 redis 就是启启动 Redis 服务端
(页面能打开,不代表 tomcat 和 nginx 是正常的,如果有 redis 的话,不代表 redis 是正常的)
关闭redis
ps -ef|grep redis kill -9 进程ID
启动redis
cd /usr/local/redis/src
./redis-server ../redis.conf
:./redis-server是直接启;./redis-server ../redis.conf:从配置参数里面启
../:表示上一层目录
这个页面,不能关
正常来说是不应该有警告的,
通常会有 3 个警告:
1.tcp 连接数 (TCP 监听队列),默认是 128 个,一般改成 3 万多以上。
2.内存分配策略
3.THP
有这些警告,就需要让开发改
TCP 监听队列(somaxconn)
该内核参数默认值是128,作用是定义了系统中每一个端口最大的监听队列长度。对于负载很大的服务
程序来说大大的不够。一般会将它修改为32768(最大值65535的一半)。
使用:
cat /proc/sys/net/core/somaxconn 查看
修改方法:
编辑/etc/sysctl.conf ,改net.core.somaxconn =32768,再sysctl -p 使配置文件生效(永久有效)
echo 32768 > /proc/sys/net/core/somaxconn(重启操作系统失效)
内存分配策略
overcommit_memory是操作系统内核对内存分配的一种策略。取值有0、1、2三种。
cat /proc/sys/vm/overcommit_memory 查看策略设置
grep -i commit /proc/meminfo最大可申请内存和已分配内存
0:操作系统默认值。内核检查是否有足够的内存;有则允许申请;无则申请失败,返回错误给进程。
1:不管需要多少内存,都允许申请
2:当系统分配的内存超过:swap+物理RAM*N%时,会被拒绝(N%由vm.overcommit_ratio参数指
定)
优化:
redis在备份数据时,会fork出一个子进程,理论上子进程所占用的内存和父进程是一样的,如父进程占
用内存为5G,这个时候也要同样分配5G的内存给子进程,如果内存无法负担,往往会造成redis服务器
的宕机或者IO负载过高,效率下降。所以内存分配策略应该设置为 1。vm.overcommit_ratio参数默认为
50,且当vm.overcommit_memory=2才生效,所以暂时可以不用管。
设置方法有三种:
编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,再sysctl -p 使配置文件生效(永久有效)
sysctl vm.overcommit_memory=1(临时有效)
echo 1 > /proc/sys/vm/overcommit_memory(临时有效)
关闭 THP
THP是Transparent Huge Pages的缩写,透明大页。linux内存采用分段分页机制,默认请求下一页大小
为4096kb,1M内存被分为256页。内存越大大页越多,就有大量的内存映射表需要去管理,对Oracle、
Redis等数据库,需要操作大量的内存,会影响系统性能。Huge Pages是提高内存页的大小来的,对于
G级别的内存,内存页大小设置为2M。由于 Huge pages 很难手动管理。于是引入了THP。但是在某些
情况下,THP会导致异常节点重启,和性能问题。因此建议禁用。
如何查看HTP是否启动呢?可以运行:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled#小红帽
cat /sys/kernel/mm/transparent_hugepage/enabled #其他Linux下。
结果是:[always]表示已启用,[never]表示已禁用。
禁用THP的方法如下(先临时禁用,再加入到配置文件):
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# vi /etc/rc.local #添加如下代码(重启服务器生效)
if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
fi
Redis 的 redis-benchmark 工具
进入命令行工具
cd /usr/local/redis/src
./redis-cli
输入密码命令:auth 密码
若显示OK则登录成功:
Redis 常见命令
可以有多个客户端,退出的话:ctrl+c
查看 redis 所有的信息
info
redis_version:redis版本号
gcc_version:linux里面编辑的版本
process_id:redis的进程号
uptime_in_seconds:redis启了多长时间(秒)
uptime_in_days:启了多少天
connected_clients:连接的客户端数
这个里面的值通过grafana是可以收集的
redis 配置文件
在 redis 的根目录下,有一个 redis.conf 文件,则是 redis 的配置文件。
它的参数非常多,主要参数有:
daemonize no #是否后台运行,一般改为yes
logfile “” #日志文件,可设为:logfile “/usr/local/redis/redis.log”
requirepass sq #启用Redis密码,sq是设置的密码
protected-mode yes #保护模式,外部网络不能使用
bind 127.0.0.1 #哪些ip可以连redis,后面可以带多个地址
maxmemory #redis作为缓存一般需要设置,作为数据库不需要
maxmemory-policy #key的回收策略。一共有6种策略
maxclients 10000 #允许最大的连接数10000
6 种 key 的回收策略:
1. volatile-lru: 在所有带有过期时间的 key 中使用 LRU 算法淘汰数据;
2. alkeys-lru: 在所有的 key 中使用最近最少被使用 LRU 算法淘汰数据,保证新加入的数据正常;
3. volatile-random: 在所有带有过期时间的 key 中随机淘汰数据;
4. allkeys-random: 在所有的 key 中随机淘汰数据;
5. volatile-ttl: 在所有带有过期时间的 key 中,淘汰最早会过期的数据;
6. noeviction: 不回收,当达到最大内存的时候,在增加新数据的时候会返回 error,不会清除旧数
据,这是 Redis 的默认策略;
redis 基准测试
Redis 的 redis-benchmark 工具(不需要装,可以模拟 redis 性能)
如果有人问,你这个项目里面 redis 的性能怎么样?可以通过这个工具来测。好的话,性能 QPS 能到几十万。
这个工具就是测试不同的操作的 QPS 是多少?
cd /usr/local/redis/src
./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
以上实例中:主机为 127.0.0.1,端口号为 6379(默认),执行的命令为 set,lpush(redis不同的操作),请求数为 10000,通过-q 参数让结果只显示每秒执行的请求数(QPS)
redis 是内存服务器,就是把数据放在内存里面的,所以有就是内存服务器
有 IO 型的服务器,比如文件型的服务器
有 cpu 型的服务器等等
redis 还有一个叫持久化技术
如果说 redis 有故障的时候,会主动把数据写到磁盘里面去