第二章 云端部署
数据库部署
- 启动服务器的数据库服务
systemctl start mariadb.service
- 将
miaosha
数据库表备份
/usr/local/mysql/bin/mysqldump -uroot -p283619 --databases miaosha > ~/Downloads/miaosha.sql
- 然后将备份文件,上传到服务器中
- 将文件在服务器中执行一遍,相当于导入表结构和表数据到服务器的数据库
mysql -uroot -p283619 < //tmp/miaosha.sql
打包上传
- 使用 IDEA 自带的 maven 进行打包,生成
miaosha-1.0-SNAPSHOT.jar
文件
- 注意要记得添加 Spring Boot maven 打包的 plugin,不然打包后运行失败
- 上传
miaosha-1.0-SNAPSHOT.jar
文件到服务器中
- 移动
miaosha-1.0-SNAPSHOT.jar
文件到我们自己新建的目录下,重命名为:miaosha.jar
,然后给当前目录授予读写和可执行权限
mkdir www // 新建一个www目录
pwd www // 查询当前目录,/var/www
mv /目录1 /目录2 // 移动目录1的文件到目录2下
chmod -R 777 * // 给当前目录授予读写和可执行权限
tail -f nohup.out // 查看运行日志
ps -ef | grep java // 查看当前运行的java进程(包含进程号)
netstat -anp | grep 1302 // 查看进程号为1302的端口号
netstat -lntp // 查看开放端口号
编写 deploy 脚本
编写deploy脚本,实现自动打包上传并java执行的操作。
服务端 SpringBoot 配置文件 application.properties
里面的配置可能随着设备环境的不同而发生变化,每次直接修改源码又很复杂,可以采用外挂配置文件的方式。
- 在项目目录下新建
vim application.properties
外挂配置文件,修改文件,指定服务器端口server.port=80
- 执行
java -jar miaosha.jar --spring.config.addition-location=/var/www/miaosha/application.properties
- 新建
deploy.sh
文件,编辑nohup
指令,设置最大/最小堆栈为 400m,JVM新生代 200m,最大新生代 200m,指定额外配置文件
nohup java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar
--spring.config.addition-location=/var/www/miaosha/application.properties
- 重新给当前目录授予读写和可执行权限
chmod -R 777 *
- 后台方式启动应用程序
./deploy.sh &
避免关闭控制台,应用程序关闭的风险。输出nohup.out
文件
- 前台实时查看
nohub.out
文件内容:
tail -f nohup.out
Jmeter 性能压测
- 线程组
- Http请求
- 查看结果树
- 聚合报告
具体步骤
- 添加线程组
- 创建HTTP请求
- 添加对应的结果树
- 添加聚合报告
组装 Http 请求,模拟压测
sudo vim //etc/hosts //本机电脑添加一个映射到服务器ip地址的域名
43.138.131.175 miaoshaserver //当客户端访问miaoshaserver,会自动在host文件里面查找到对应的ip地址
- 压测1000个线程启动时间为10s 运行10次
优化系统
设置 tomcat 参数
线程数
首先打开 SpringBoot 内置的 tomcat 配置,在 spring-configuration-metadata.json
里面,有几个参数特别重要:
server.tomcat.accept-count
:等待队列长度:默认是100server.tomcat.max-connections
:最大可被连接数,默认10000server.tomcat.max-threads
:最大工作线程数,默认200server.tomcat.min-spare-threads
:最小工作线程数,默认10- 默认配置下,连接超过10000后出现拒绝连接
- 默认配置下,触发的请求线程超过200 + 100后拒绝处理
server.port=80
server.tomcat.accept-count=1000
server.tomcat.max-threads=800
server.tomcat.min-spare-threads=100
- 设置以上参数后,我们的操作系统可以有充足的时间进行反应,把这100个线程先用着,然后再慢慢开到800个线程,满了再丢到1000个等待队列里面,超过1800个线程后就拒绝处理,连接超过10000后就拒绝连接。
- 结果展示:可以提高到 118 个线程数量了
- 400 个并发情况下的压测
KeepAlive
KeepAliveTimeOut
: 多少毫秒后若客户端不响应则断开对应的连接MaxKeepAliveRequests
: 多少次请求后连接失效- 使用
WebServerFactoryCustomizer<ConfigurableWebServerFactory>
定制化内置 tomcat配置
//当Spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,
// 会把此bean加载到Spring中
@Component
public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
// 使用对应工厂类提供给我们的接口定制化我们的tomcat connector
((TomcatServletWebServerFactory) factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocolo = (Http11NioProtocol) connector.getProtocolHandler();
// 设置 keepalivetimeout 超过30秒没有请求则服务端自动断开keepalive连接
protocolo.setSelectorTimeout(30000);
// 当客户端发送超过10000个请求则自动断开keepalive连接
protocolo.setMaxKeepAliveRequests(10000);
}
});
}
}
单Web容量上限
- 线程数量:对于4核CPU 8G内存的服务器来说,配置800~1000个线程是最好的,再多的话就会消耗在cpu调度上
- 等待队列长度:一般为1000~2000,队列做缓冲池用,但也不能无限长,队列太长还消耗内存,而且出队入队也消耗cpu
MySQL 数据库QPS容量问题
- 主键查询:千万级别数据 = 1-10毫秒
- 唯一索引查询:千万级别数据 = 10-100毫秒
- 非唯一索引查询:千万级别数据 = 100-1000毫秒
- 无索引:百万条数据 = 1000毫秒 +
MySQL 数据库TPS容量问题
- 非插入更新删除操作:同查询
- 插入操作:1w~10w tps (依赖配置优化,后续)