把服务包部署到多台设备
多台机器一起向外提供服务,合并在一起的软件:niginx
多台机器合并在一起:集群
nginx负载均衡,反向代理
nginx里面记录不同机器的ip,配置不同的分配策略
nginx:web服务器,并不一定是一般理解的前台服务
前后分离:front+server
需要有jdk
在执行startup文件启动tomcat时,会去执行catalina文件
JAVA_OPTS="-server -Xms256m -Xmx512m -Xss256k -XX:PermSize=128m"
-server:第一个参数,指定为服务,多核时使用
-Xms:启动时,初始堆大小;没有配置时,从最小逐步增加到最大值
-Xmx:运行时分配的最大堆大小;默认64M
-Xmn:新生代堆大小
-Xss:每个线程栈大小
-XX:PermSize:初始化非内存大小
-XX:MaxPermSize:永久代(非堆)最大内存大小
-XX:MaxNewSize:新生代最大大小
JAVA_OPTS="-verbose:gc -XX+PrintGC -XX:PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename"
-verbose:gc:显示垃圾回收信息
-XX:+UseParNewGC:设置minor收集的时间
-XX:+UseConcMarkSweepGC:设置major收集时间
-XX:ParallelGCThreads=n:设置并行收集器收时使用的CPU数,并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数,并行收集线程数
写GC日志,是要消耗IO的,所以在生成环境,一般不配置这个
Tomcat中最顶层的是server,代表整个服务器,一个server可以包含至少一个service,每个service可以包含多个connector和一个container。Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;Container用于封装和管理Servlet,以及具体Request请求;多个connector就可以配置多种类型连接,如http、https
Connector在处理HTTP请求时,会使用不同的protocol,典型的有:
Protocol默认是HTTP/1.1,不同版本,会自动选择上面的模式(APR模式需要有相应的包才会自动选择)
修改如下内容:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" acceptCount="1000"/>
gragana + prometheus监控tomcat
下载地址:https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/
将jvm_exporter.jar
放到tomcat的bin文件夹下
---
lowercaseOutputLabelNames: true
lowercaseOutputName: true
rules:
- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
name: tomcat_$3_total
labels:
port: "$2"
protocol: "$1"
help: Tomcat global $3
type: COUNTER
- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount):'
name: tomcat_servlet_$3_total
labels:
module: "$1"
servlet: "$2"
help: Tomcat servlet $3 total
type: COUNTER
- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount):'
name: tomcat_threadpool_$3
labels:
port: "$2"
protocol: "$1"
help: Tomcat threadpool $3
type: GAUGE
- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
name: tomcat_session_$3_total
labels:
context: "$2"
host: "$1"
help: Tomcat session $3 total
type: COUNTER
- pattern: ".*"
JAVA_OPTS="-javaagent:./jmx_prometheus_javaagent-0.14.0.jar=3088:./tomcat.yml"
配置prometheus.yml文件
- job_name:"tomcat_export"
static_configs:
- targets:["被监控机器IP:3088"]
http://prometheus_ip:9000
https://gceasy.io/
是一个用C语言编写的高性能HTTP服务器,反向代理web服务器
image-20210628215410866
worker_processes 1;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_app {
server 192.168.114.139:8080 weight=1 max_fails=2 fail_timeout=30;
server 192.168.114.139:8880 weight=1 max_fails=2 fail_timeout=30;
}
server {
listen 80;
server_name 192.168.114.139;
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web_app;
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
默认策略,如果服务器down掉了,会自动剔除该服务器,此策略适合服务器配置相当,无状态且短平快的服务使用
权重越高分配到需要处理的请求越多,此策略可以与least_conn和ip_hash结合使用,此策略比较适合服务器的硬件配置差别比较大的情况
ip_hash不能与backup同时使用,此策略适合有状态服务,比如session,服务器需要剔除,必须手动down掉
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况
负载均衡策略的实现需要安装第三方插件,按照服务器端的响应时间来分配请求,响应时间短的优先分配
按访问url结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用
niginx常用配置
使用nginx-module-vts
与nginx-vts-exporter
首先,需要有一个集群,就要安装项目的集群环境搭建的标准,搭建一套集群环境,只是此时,集群规模不需要做那么大,自己搭建一套最小的集群(至少是两个相同服务构成的一个集群)
然后,对该集群进行性能测试,得到最小规模的集群的性能指标
然后,再在集群中,添加服务,此时集群有3个服务,然后再对集群进行一次性能测试,此时3个服务构成的集群的性能指标tps增加了多少,并发用户增加了多少,那么理论上,可以计算出增加服务后tps等指标的增加情况
数据:描述事物的符号记录,符号可以是数字,文字,图片,图像,声音,语言 数据库:存放数据的仓库,这个仓库是计算机存储设备,而且数据是按一定的格式存放的
在企业项目中,数据库的读操作更频繁
采用关系模型来组织数据库的数据,以行+列方式存储数据
sql有四种
数据库的缓存有两部分
存储引擎
mysql数据库建表的时候,有一个存储引擎,可以选择,默认为InnoDB
数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据库引擎进行创建,查询,更新和删除数据操作。
存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的存储引擎还可以获得特定的功能
例如,存在两张表:一个配置表,一个用户表
所以,它们的使用场景不一样,创建表时会选择不同的搜索引擎
配置表一般选用MyISM
存储引擎
用户信息表一般选用InnoDB
mysql数据库5.5版本及以前
MyISM
mysql数据库5.5版本及以后
InnoDB
B+树的优点:
是一种数据结构,用于帮助我们在大量数据中快速定位我们要查找的数据
建索引:使用空间换时间,索引有一定大小,占磁盘、内存空间,以此来换取时间更少。是为了提升查询数据的速度,它会降低修改速度
主键索引:有且仅有一个
唯一索引:不可重复,但是可以存储NULL
create unique index 索引名 on 表名(字段);
create index 索引名 on 表名(字段1,字段2....)
create index index_name on name(id,co3,co2);
select * from tb_name where id=?,co3=? 使用了索引
select * from tb_name where id=?,co2=?
select * from tb_name where co3=?,co2=?
select * from tb_name where co2=?,co3=?
select * from tb_name where id=?,co3=?,co2=? 使用了索引
select * from tb_name where id=?,co2=?,co3=?
select * from tb_name where id=? 使用了索引
SELECT {*|字段列名} 查询要显示的列名
FROM <表名1>,<表名2> join, on 数据来源表
WHERE <表达式> 限制条件
GROUP BY<字段> 查询的结果,按照条件字段分组
HAVING <expression> 过滤分组
ORDER BY <字段> 按照字段排序
LIMIT <offset>[<row count>] 显示数据条数
sql语句的执行顺序,与编写顺序会不一致
sql执行过程:
关系型数据库
数据库管理系统dbms,写数据时,把你的数据,转化为日志文件,对日志文件进行解读,还原你的日志过程
SHOW VARIABLES LIKE '%slow_query_log%' 查看慢查询的开关与日志路径 默认10秒为慢查询
SHOW VARIABLES LIKE 'long_query_time' 慢查询的阈值默认10秒
SHOW VARIABLES LIKE 'max_connections%' 查看系统配置的最大连接数
SHOW VARIABLES LIKE 'Max_used_connections' 查看当前用户已经建立的连接数
当出现ERROR 1040:Too many connections
可以通过修改连接数来解决
因为,数据中慢查询日志,一般情况下都是关闭的,因为慢查询的开启,就要写日志,会消耗IO。 所以在生产数据库中,建议千万不要去开启
我们用jmeter做性能测试,设计了一个性能场景,运行,发现在一定量的并发用户时,平均响应时间,已经超过了1秒钟,那么,我们可以说,可能存在了慢查询日志。
响应时间都没有超过1秒(阈值),那么肯定没有慢查询日志。
explain sql语句
性能效率:system > const > eq_ref > ref > range > index > all 左边效率高于右边
using where 使用where条件过滤,但是where条件不在索引,那我们就要考虑用和where后面的字段来建索引
在主数据库中做任何操作,在从数据库中,都会重复一次
在从数据库中修改,主数据库是不会变化的
所以主数据库进行写操作,从数据库进行读操作
可以手动设置同步时间间隔
表字段变少,行数不变
表字段不变,行数变少
把数据存到不同地方