.
数据库设计建立
- 密码与用户信息分开存放
Bug
数据库时区问题
Unknown system variable ‘query_cache_size’
mysql-connecter-java的版本过低,很显然是数据库驱动程序与数据库版本不对应
Mybatis项目启动时报错:The server time zone value ‘�й���ʱ��’ is unrecognize
原因是使用了Mysql Connector/J 6.x以上的版本,然后就报了时区的错误,解决方法:
在配置url的时候不能简单写成 :
jdbc:mysql://localhost:3306/mybatis
而是要写成 :
jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
项目结构示意图
默认内嵌tomcat配置
调优步骤
未优化
修改内置tomcat配置
MySql数据库QPS容量问题
MySql数据库TPS容量问题
nginx反向代理
未优化前:单机容量
改进后:多台虚拟机
动静分离
静态资源
ngnix 配置设置
将地址栏中的/resources/
替换为/usr/local/openresty/nginx/html/resources/
动态反向代理
设置upstream server
upstream backend_server{
server 47.107.149.48 weight=1;
server 120.25.202.247 weight=1;
keepalive 30; 长连接时间
}
weight 表示权重
除开resources
,其余均作为动态请求处理
proxy_pass http://backend_server; 动态请求反向代理到backend_server
proxy_set_header Host $http_host:$proxy_port; 域名+端口
proxy_set_header X-Real-IP $remote_addr; 真正的ip地址是远端服务器的ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这个头尾nginx转发代理请求
proxy_http_version 1.1; http1.1才支持长连接
proxy_set_header Connection ""; Connection为空, 使长连接开启 ,若不适用keepAlive,则Connection "false"
proxy_pass http://backend_server;
动态请求反向代理到backend_server
$http_host:$proxy_port
域名+端口
nginx优化后
数据库服务器cpu消耗减少,可以加大压力
nginx高性能的原因
epoll 多路复用
非阻塞IO操作
- java bio模型,阻塞进程式
- linux select模型,变更触发轮训查找,有1024数量上限
- epoll模型,变更触发回调直接读取,理论上无上限
master worker 进程模型
平滑重启,平滑加载配置,不会断开用户连接
一个 master,多个 worker,master 管理 worker,worker 处理请求,且 worker 进程为单线程
- master 进程用来管理 worker 进程
包含:- 接收来自外界的信号,向各 worker 进程发送信号
- 监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程
- worker进程用来处理基本的网络事件
- 多个 worker 进程间同等竞争来自客户端的请求,各进程间相互独立
- 一个请求,只能在一个 worker 进程中处理,一个 worker 进程,不能处理其它进程的请求
- worker 进程的个数一般与机器 cpu 核数一致
原因: 与 Nginx 的进程模型以及事件处理模型有关
协程机制
将每个用户的请求对应到线程中的某一个协程,然后在协程中,依靠 epoll 多路复用机制来完成同步调用开发
Lua 脚本也是基于协程机制
- 进程的出现是为了更好的利用CPU资源使到并发成为可能
- 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能
- 协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈
会话管理
基于cookie
基于cookie传输sessionid :java Tomcat 容器session实现
基于token(移动端会禁止cookie)
基于token传输sessionid :java 代码session实现迁移到redis
缓存
缓存设计
多级缓存
redis缓存
单机版
哨兵模式
集群cluster模式
Redis集中式缓存商品详情页
本地热点缓存(jvm内存)
redis的存与取都需要通过网络io , 对性能有部分影响
nginx proxy cache缓存实现
依靠文件系统存索引级的文件:性能下降
依靠内存缓存文件地址nginx lua
shared dic
openresty redis 支持
静态资源优化
缓存库存
交易验证优化
库存扣减行锁优化
- 设定索引
- 扣减库存缓存化
- 异步同步数据库
- 库存数据库最终一致性保证
秒杀削峰
防刷限流
令牌桶
限制速度最大值
漏桶
限制速度,平滑流量
服务器2
xyy:
公网ip 120.25.202.247
私网ip 172.18.154.217
vpc-wz9sk1qvkvivfuy8k88w7
1378290721378404
zsb:
112.74.172.117
172.18.117.51
1300590740760986
sg-wz9awjm6q5kmfiyubq59
企业云:
cen-q7ia2ex9kzg6th238l
1486288179337179
sg-wz9anyt65ach969xmsnn
cdq
1336590720791339
47.107.149.48
172.18.97.155