1.Oracle是大型数据库,而MySQL是中小型数据库。但是MySQL是开源的,但是Oracle是收费的,而且比较贵。
2. Oracle的内存占有量非常大,而mysql非常小
3. MySQL支持主键自增长,指定主键为auto increment,插入时会自动增长。Oracle主键一般使用序列。
4. MySQL字符串可以使用双引号包起来,而Oracle只可以单引号
5. Mysql分页用limit关键字,而Oracle使用rownum字段表明位置,而且只能使用小于,不能使用大于。
6. MySQL中0、1判断真假,Oracle中true false
7. MySQL中命令默认commit,但是Oracle需要手动提交
8. MySQL在windows环境下大小写不敏感 在unix,linux环境下区分大小写,Oracle不区分
1.整型
分类:tinyint smallint mediumint int bigint
int(n)里的n是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度
2.浮点型
float double 两种类型
float(5,3) #一共5位,小数占3位.做了限制 整数位不能超过2位,小数位不能超过3位
3.定点数类型
定点数在MySQL内部以字符串形式存储,比浮点数更精确,适合用来表示货币等精度高的数据。
4.字符串类型
字符类型 char varchar --存字符串
char表示定长字符串,长度是固定的;如果插入数据的长度小于char的固定长度时,则用空格填充;因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间。
varchar表示可变长字符串,长度是可变的;插入的数据是多长,就按照多长来存储;varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间。
5.枚举类型
mysql> create table t10(sex enum('m','w'));
只能从tom,jim两个里面2选其1
6.日期类型
时间和日期类型测试:year、date、time、datetime、timestamp
1.主键
每张表里只能有一个主键,不能为空,而且唯一,主键保证记录的唯一性,主键自动为NOT NULL。
一个 UNIQUE KEY 又是一个NOT NULL的时候,那么它被当做PRIMARY KEY主键。
2.auto_insrement自增
自动编号,且必须与主键组合使用默认情况下,起始值为1,每次的增量为1
如果插入的值与已有的编号重复,则会出现出错信息,AUTO_INCREMENT数据列的值必须是唯一的;
3.unique key
字段添加唯一约束之后,该字段的值不能重复,也就是说在一列当中不能出现一样的值。
4.null与not null
是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
5.unsigned属性
整数类型有可选的UNSIGNED属性,表示不允许负值,这大致上可以使正数的上限提高一倍
6.字符集
修改字符集 :在创建表的最后面指定一下: default charset=utf8 #可以指定中文
7.默认约束
设置默认值
ALTER TABLE user ALTER number SET DEFAULT 0;
删除默认值
ALTER TABLE user ALTER number drop DEFAULT;
8.外键
外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性约束的;
外键约束可以是两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性;
七种日志文件
1.重做日志(redo log)
物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的
2. DDL log
定义语句的日志。
3.二进制日志(binlog)
实现备份,增量备份。只记录改变数据,除了select都记。
4. 错误日志(errorlog)
启动,停止,关闭失败报错。rpm安装日志位置 /var/log/mysqld.log
5. 慢查询日志(slow query log)
慢查询日志,指导调优,定义某一个查询语句,执行时间过长,通过日志提供调优建议给开发人员。
6. 中继日志(relay log)
读取主服务器的binlog,在slave机器本地回放。保持与主服务器数据一致。
7. 通用查询日志(general log)
所有的查询都记下来。 #默认关闭,一般不开启
MySQL binlog日志格式有STATEMENT | ROW | MIXED三种.
1.statement
记录的是执行的SQL语句
优点: 日志记录量相对较小, 节约磁盘及网络IO
缺点: 可能造成MySQL复制的主备服务器数据不一致
必须记录上下文信息, 以保证语句在从服务器上执行结果相同
对于特定函数如 UUID(), user() 这种非确定性函数是无法正确复制
2.row
记录的是每一行数据的修改, MySQL5.7+的默认ROW格式.
优点: 可以避免MySQL复制中出现主从不一致的问题
对每一行数据的修改比STATEMENT模式高效
可在误删改数据后, 同时无备份可以恢复时, 通过分析binlog日志进行反向处理达到恢复数据目的
缺点: 由于记录每一行数据的修改, 所以日志量比较大
3.mixed
混合STATEMENT和ROW两种格式, MySQL会根据执行的SQL语句自动选择.
一般的复制使用STATEMENT格式,对于STATEMENT格式无法复制的操作使用ROW格式.
4.如何选择binlog日志格式
在同一个IDC机房中, 建议使用MIXED或ROW格式, 当使用ROW格式时, 建议设置binlog_row_image=MINIMAL
(1)完全备份
备份数据库中所有数据,即对整个数据库,数据库结构和文件结构的备份,保存的是备份时刻完整的数据库,是增量备份与差异备份的基础.
优点:备份与恢复操作简单方便,恢复时一次到位,恢复速度快
缺点:占用空间大,备份速度慢.
(2)增量备份
备份自上一次完全备份之后有变化的数据.
增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需要备份与前一次相比增加和被修改的文件.这就意味着,第一次增量备份的对象是进行全备份后所产生的文件;第二次增量备份的对象是第一次增量备份后所产生的文件,以此类推。
优点:备份数据量小,占用空间少,备份速度快.
缺点:恢复时需要从上一次完整的备份起按照增量备份时间顺序,逐个进行恢复,恢复时间长,操作繁琐,而且,如果中间某次备份数据损坏,则数据会丢失
(3)差异备份
备份自上一次完全备份之后有变化的数据
差异备份是指在一次完全备份后到进行差异备份的这段时间内,对那些增加或者修改的文间进行备份,在进行恢复时,只需要对第一次全备份和最后一次差异备份进行恢复,差异备份避免了全备份和增量备份的缺陷的同时,又具备了它们各自的优点
at是说明事件的起点,end_log_pos是介绍的节点
事件发生的时间 server id 1 服务器的标识id
"exec_time=28" 事件执行花费的时间 error_code=0 错误码
thread_id: 代理线程id (thread_id=162)
执行过的mysql语句
原理图
主从复制主要有三个线程,master (binlog dump) slave(i/o 进程 sql 进程) master中一个线程 ,slave中两个线程
master主要负责主服务器数据库中有数据更新的时候,把执行的命令放入到binlog日志中,所以,主库的binlog日志一定要开启
i/o线程在从slave从数据库中创建,用于请求master,master会返回binlog日志里的内容,然后将binlog保存在relay log(中继日志)中,然后sql线程就会同步中继日志中的内容到数据库然后执行其中的语句
查看 slave 的状态 查看是i/o 线程有问题还是sql 线程有问题 然后查看下方的错误信息
检查主从状态查看file和position是否有错误
关闭slave reset slave 重新做主从
多源主从复制操作 首先先进行master的配置,让master互为主从,这样就算一个主库不可以用,另一个主库也可以正常使用,保证数据的存储更新,然后进行从库的配置把第一个从库先与第一个主库进行主从配置,然后在与剩下的主库依次进行主从配置。然后第二个从库与第一个主库进行主从配置,依次在与剩下的主库进行主从配置。
在从服务器对所有主服务器的数据进行备份,每一个主服务器都需要一个从服务器,这样很容易造成资源浪费,增大了服务成本,多源复制,可以把多个主服务器的数据同步到一个从服务器进行备份。
在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操作,为了实现后期的一些数据统计功能,往往需要把数据汇总在一起再统计
1.http是无状态。
指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
2.HTTP是无连接。
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
3.灵活
HTTP协议允许传输任意类型的数据,如json格式数据、表单数据、xml、文件流等等,需要在HTTP报文中指明Content-Type的类型
1.TCP协议
TCP是一种面向连接的协议,它在传输数据之前会建立一条专用的通信连接。这意味着在数据传输过程中,两台计算机之间会有一条稳定的数据传输通道。因此,TCP可以保证数据传输的可靠性,但会带来一定的延迟。
面向连接,速度慢,可靠传输
2.UDP协议
UDP是一种无连接的协议,它不会建立专用的通信连接。每个数据包都是独立的,可以直接传输。因此,UDP的传输速度比TCP快,但不能保证数据传输的可靠性。
3.区别
连接
服务对象
可靠性
传输方式
应用层:应用层是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,是网络应用程序使用的,即使用互联网的计算机应用,例如谷歌,火狐
表示层:表示层从应用层接收数据。这些数据是以字符和数字的形式出现的,表示层将这些数据转换成为机器可以理解的二进制格式,也就是封装数据,和格式化数据。
会话层:会话层是用户应用程序和网络之间的接口。主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。
传输层:OSI下3层的主要任务是数据通信,上3层的任务是数据处理。而传输层是OSI模型的第4层。因此该层是通信子网和资源子网的接口和桥梁,起到承上启下的作用。传输层涉及到分段、流量控制、差错控制、面向连接和无连接传输。
网络层:网络层的数据单元称为数据包,网络层的功能是逻辑寻址、路由和路径确定。
数据链路层:数据链路层从网络层接收数据包,数据包 包含发送方和接收方的IP地址。有两种寻址方式:逻辑寻址和物理寻址。
物理层:物理层将二进制序列转换成信号并在本地媒体上传输。它可以是铜缆情况下的电信号,也可以是光缆情况下的光信号,也可以是空气情况下的无线电信号。主要作用是传输比特流
请求头
响应头
常见的 HTTP 状态码:
原子性
一个事务中所有的操作,要么全部完成,要么全部不完成,不会结束在中间的某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就行没执行过一样
一致性
在事务开始之前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,
隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同等级,包括 读未提交(read-uncommitted) 不可重复读(read-commited)、可重复读(repeatabe-read)、串行化(serializable)
持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
脏读
事务A读取了事务B更新的数据,然后事务B回滚操作,那么事务A读取到的数据就是脏数据
不可重复读
事务A多次读取同一数据,事务B在事务A多次读取过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读
系统管理员A在数据库中修改数据时,系统管理员B在这个时候插入了一条数据,当系统管理员A修改结束后突然发现了还有一条记录还没有修改过来,就像发生了幻觉一样,这就像幻读。
总结:不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或者删除,解决不可重复读的问题只需要锁住满足条件的行,解决幻读需要锁表。
HTTP1.0定义了3种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了5种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
重点方法:
GET:单纯获取数据(获取一个index.html页面)
POST:上传/创建文件(会产生新的数据)
PUT:保存数据(覆盖/更新文件、图片等,不会产生新的数据)
DELETE:删除
1.反向代理
反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的机器是哪台,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端
2.负载均衡
当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
3.http服务器(动静分离)
4.正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
1.作为web服务器
相比 Apache,Nginx 占用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应。
2.作为负载均衡服务器
Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perl要好的多
3.安装简单,配置文件简洁
Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的热升级。
I/O复用,解决的是并发性请求的问题
处理多个并发请求,要产生多个I/O流来进行系统内核数据的读取。
常用的两种处理方式是串行,前一个阻塞,后面无法继续进行处理、并行处理请求--实现最大并发和吞吐
I/O复用定义为,一个socket作为复用来完成整个I/O流的请求链接来建立,处理请求则采用多线程
多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的复用指的是复用同一个线程。
多路复用--epoll
ngnix会有很多连接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。
epoll可以说是I/O多路复用最新的一个实现,epoll修复了select/poll绝大部分问题,比如
epoll线程是安全的
epoll告诉你具体哪个sock有数据,你不用自己去找了
异步非阻塞
每进来一个request,会有一个worker进程去处理,但不是全程的处理,会处理到可能发生阻塞的地方,比如向后端服务器转发request,并等待返回请求返回。那么这个处理的worker不会这么一直等着,它会在发送完请求后注册一个事件:如果upstream返回了,告诉我一声,我在接着干。于是他就去休息了,这就是异步。此时,如果再有request进来,他就可以很快的再按这种方式来处理,这就是非阻塞和I/O多路复用,而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走,这就是异步回调。
虚拟主机,就是把一台物理服务器划分成多个虚拟的服务器,这样我们的一台物理服务器就可以做多个服务器来使用,从而可以配置多个网站。nginx提供虚拟主机的功能,就是为了让我们不需要安装多个nginx,就可以运行多个域名不同的网站。
配置虚拟主机的方式:基于域名的虚拟主机,基于ip的虚拟主机,基于端口的虚拟主机
需要有一个负载均衡设备(即反向代理服务器)来分发用户请求,将用户请求分发到空闲的服务器上。服务器返回自己的服务到负载均衡设备。负载均衡设备将服务器的服务返回用户。
反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的机器是哪台,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端;我们请求www.baidu.com时,这www.baidu.com就是反向代理服务器,真实提供服务的服务器有很多台,反向代理服务器会把我们的请求转发到真实提供服务的各台服务器。nginx就是性能非常好的反向代理服务器,用来做负载均衡
正向代理:正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求,我们常说的代理也就是正向代理,正向代理代理的是请求方,也就是客户端;比如我们要访问YouTube,可是不能访问,只能先安装个VPN软件代你去访问,这就叫正向代理。
区别
正向代理即是客户端代理,代理客户端,服务端不知道实际发起请求的客户端是谁。
反向代理即是服务端代理,代理服务端,客户端不知道实际提供服务的服务端是谁。
正向代理中,proxy和client21同属于一个LAN,对server透明
反向代理中,proxy和server同属于一个LAN,对client透明
负载均衡是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个节点,以提高系统整体的响应速度和可用性,负载均衡算法采用轮询,
主要作用:
处理系统高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)
提高服务集群弹性:添加或减少服务器数量,然后由负载均衡进行分发控制,这使得应用集群具备伸缩性。
提升服务器集群容错:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
网络安全防护:有些负载均衡软件或者硬件提供了安全性功能,如:黑名单处理、防火墙,防DDos攻击等。
1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器;
Nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB...
upstream myweb {
server 192.168.62.157:80;
server 192.168.62.158:80;
}
2.ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题;
Nginx会让相同的客户端ip请求相同的服务器。
upstream myweb {
ip_hash;
server 192.168.62.157:80;
server 192.168.62.158:80;
}
3.热备:如果你有2台后端服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBB
upstream myweb {
server 192.168.62.157:80;
server 192.168.62.158:80 backup;
}
4.加权轮询:根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....
upstream myweb {
server 192.168.62.157:80 weight=1;
server 192.168.62.158:80 weight=2;
}
5.nginx负载均衡配置状态参数
●down,表示当前的server暂时不参与负载均衡。
●backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
●max_fails,允许请求失败的最大次数,默认为1。当超过最大次数时,返回错误。
●fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。
upstream myweb {
server 192.168.62.157:80 weight=2 max_fails=2 fail_timeout=2;
server 192.168.62.158:80 weight=1 max_fails=2 fail_timeout=1;
}
1.ip_hash
ip_hash使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。
2.sticky_cookie_insert
使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器的同一台服务器。与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。因此可以避免上述ip_hash中来自同一客户端导致负载失衡的情况。(需要引入第三方模块才能实现)
3.jvm_route
jvm_route的原理
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。 在动静分离的tomcat的时候比较明显,因为tomcat解析静态很慢,其实这些原理的话都很好理解,简单来说,就是使用正则表达式匹配过滤,然后交给不同的服务器。
301是请求的资源已经被永久重定向到新的url,返回信息会包括新的url,浏览器会自动定向到新的url,今后任何新的请求都应使用新的url代替
302请求的资源被临时重定向到新的url,只是临时的,客户端应继续使用原有的url
区别:
在302重定向结束后,只需要删除相应的重定向相关代码即可恢复原状,用户点击收藏夹依然可以访问资源。
在301重定向结束后,如果只删除重定向相关代码,客户端的URL缓存是不会改变的
nginx是轻量级,作为web服务器,相比apache来说,nginx使用更少的资源,支持更多的并发连接,体现更高的效率
nginx配置简洁,apache更复杂,nginx的静态处理性能比apache高3倍以上但是nginx的动态处理性能则比较弱
最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接可以对应一个进程
nginx可以作为负载均衡服务器,支持7层负载均衡
1.负载均衡
负载均衡多用在高并发情况下使用的。其原理就是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,多台服务器共同完成工作任务,从而提高了数据的吞吐量。
2.反向代理
反向代理是用来代理服务器的,代理我们要访问的目标服务器,代理服务器接受请求,然后将请求转发给内部网络的服务器,并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器,
3.动静分离
nginx提供的动静分离是把动态请求和静态请求分离开,合适的服务器处理相应的请求,是整个服务器系统的性能、效率更高。
nginx可以根据配置对不同的请求做不同转发,这是动静分离的基础,静态请求对应的静态资源可以直接放在nginx上做缓冲,更好的做法是放在相应的缓冲服务器上,动态请求由相应的后端服务器处理。
1.https协议需要申请证书,一般免费的证书比较少,因此需要一定的费用
2.http是超文本传输协议,信息是明文传输的,https则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式,用的端口也不一样,http用的是80端口,https用的是443端口。
1.对称加密
A要给B发送数据
1、A做一个对称密钥
2、使用密钥给文件加密
3、发送加密以后的文件和密钥
4、B拿密钥解密
加密和解密都是使用的同一个密钥。
2.非对称加密
A要给B发送数据
1、B做一对非对称的密钥(公钥、私钥)
2、发送公钥给A
3、A拿公钥对数据进行加密
4、发送加密后的数据给B
5、B拿私钥解密
3.哈希算法
将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多。
例如:MD5、SHA-1、SHA-2、SHA-256 等
4.数字签名
签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
worker_processes的数量并不是越多越好,要看自己的处理器cpu有多少,也可以设置为auto,自动绑定cpu
2.日志配置成warn
这样错误日志里面就会记载了更少的记录
3.针对 nginx 的访问文件限制 worker_rlimit_nofile
我们可以限制用户的访问文件数量,来降低负载
4.worker_connections
每一个进程可以处理多少个连接,增加该值可以提高系统的并发能力
5.keepalive_timeout 65
长连接的等待时间,可以根据需求进行优化
6.gzip on;
可以打开压缩,压缩访问页面的图片等一些资源提高访问速度, 进而优化Nginx性能
第一步下载证书到本地电脑中
在阿里云控制台中的SSL操作界面中找到刚申请成功的免费SSL证书,点击右侧的下载链接,弹出下载页面,然后点击Nginx右侧的下载按钮,下载证书文件。
下载完是一个zip压缩包文件,需要进行解压,解压下来是两个文件:
以.key为后缀的文件是密钥文件
以.pem为后缀的文件是证书文件
第二步上传到服务器中的特定文件夹目录下
将第1步中的证书文件(.pem结尾)和密钥文件(.key)文件上传到Nginx服务器中,这两个文件具体的放置路径是在Nginx安装目录下的conf/cert文件夹中。
第三步配置nginx.conf,使证书生效
修改nginx的配置文件/usr/local/nginx/conf/nginx.conf,修改之前最好通过复制命令将该配置文件备份一份,在配置文件里添加一些配置即可,完成后重新启动即可
1.服务器资源
增加cpu,内存,硬盘
2.采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器。
3.优化tomcat参数
调优Tomcat线程池:增加线程池中最大的线程数量等
调优tomcat的连接器Connector:关闭DNS解析,减少性能损耗,修改最少最大可以创建的线程数,等
4.jvm优化
Tomcat 是运行在 JVM 上的,所以对 JVM 的调优也是非常有必要的。
找到 catalina.sh;调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。
5.定时重启tomcat
1.将新对象预留在新生代
可以为应用程序分配一个合理的新生代空间,以最大限度避免新对象直接进去老年代。
2.大对象进入老年代
大对象占用空间多,直接放入新生代中会扰乱新生代GC,新生代空间不足将会把大量的较小的年轻代对象移入到老年代中,这对GC来说是相当不利的
3.设置对象进入老年代的年龄
当对象年龄达到阀值时,就移动到老年代,
4.稳定与震荡的堆大小
稳定的堆大小对垃圾回收是有利的,获得一个稳定堆大小的方法就是设置 -Xmx 和 -Xms 一样的值
5.吞入量优先设置
6.降低停顿案例
为了降低应用软件在垃圾回收时的停顿,首先考虑的使用关注系统停顿的 CMS 回收器,为了减少 Full GC 的次数,应尽可能将对象预留在新生代
跨平台的java运行环境--jvm
web server中间件:nginx tomcat OpenResty
缓存中间件:Redis
数据库中间件:mycat
集成部署:Docker jenkins
压力测试:ab
文件系统:OSS NFS
jvm
jre
java库
四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含端口号以及目的端口号。四层均衡负载服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。
七层负载均衡工作在OSI模型的应用层,应用层协议比较多,常用的有http等,七层负载就可以基于这些协议来负载,这些应用层协议中会包含很多有意义的内容,比如同一个web服务器的负载均衡,除了根据IP+端口进行负载外,还可以根据七层的URL、浏览器类别、语言来决定是否要进行负载
四层负载均衡 |
七层负载均衡 |
|
基于 |
基于IP+端口 |
基于URL或主机IP |
类似于 |
路由器 |
代理服务器 |
复杂度 |
低 |
高 |
性能 |
高:无需解析内容 |
中:需要算法识别URL和HTTP head等 |
安全性 |
低 |
高 |
额外功能 |
无 |
会话保持,图片压缩,防盗链,地址重写,流量限制 |
总结:从上面的对比看来四层负载与七层负载最大的区别就是效率与功能的区别。四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,而七层负载均衡的优势则体现在功能多,控制灵活强大。在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑。
LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器/负载均衡器(IP负载均衡,他修改的是IP地址) --利用三层功能
LVS/DR:直接路由模式,只有进站的数据流量经过分发器/负载均衡器(数据链路层负载均衡,因为他修改的是目的mac地址)--利用二层功能mac地址
LVS/TUN: 隧道模式,只有进站的数据流量经过分发器/负载均衡器
LVS/full-nat:双向转换,通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:双向转换
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
LVS:负载能力强、配置性低、工作稳定、无流量、能支持所有应用
nginx:工作在第七层,可以针对HTTP应用本身做分流策略、对网络的依赖小、安装配置比较简单,测试起来也很方便、负载均衡和稳定度差了LVS几个等级
1.nginx工作在网络的第7层,所以它可以针对http应用本身来做分流策略,相比之下lvs并不具备这样的功能,
2.nginx对网络的依赖较小,理论上只要ping得通,网页访问正常,nginx就能连得通,lvs就比较依赖于网络环境,目前来看服务器在同一网段内并且lvs使用direct方式分流,效果较能得到保证。
3.nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。lvs的安装和配置、测试就要花比较长的时间,
4.nginx也同样能承受很高负载且稳定,但负载度很稳定度差lvs还有几个等级
5.nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,
6.nginx 工作在网络的第 7 层,可以作为网页静态服务器,支持 Rewrite 重写规则;支持 GZIP 压缩,节省带宽;可以做缓存;可以针对 http 应用本身来做分流策略,静态分离,针对域名、目录结构等相比之下 LVS 并不具备这样的功能,
高可用我们用的是keepalived
工作原理:keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单节点故障,keepalived是一VRRP协议来实现的,VRRP是虚拟路由冗余协议,在keepalived服务正常时,主master节点会不断的向备用节点发送心跳消息,用以告诉备用节点自己还活着,当主master节点发生故障时,就无法发送心跳消息,备用节点也就无法检测master的心跳了,于是就调用自身的接管程序,接管master节点的vip以及当前的服务,当master节点恢复时,因为master节点的优先级比较高,所以vip就会重新回到master,继续工作
给nginx,lvs做过高可用,
我们做高可用时使用到keepalived,做的是七层的负载均衡,我们用两台机器作为代理服务器,一台作为主服务器,一台备用,我们先给主代理服务器做负载均衡,在nginx的配置文件里进行配置即可,配置成功后直接将配置文件拷贝到另一台备用机器上,然后再测试一下备用机器能用负载均衡不能,然后我们对主服务器做高可用,两台机器都先下载keepalived服务,然后我们修改主服务器的keepalived的配置文件,主要是配置心跳检测,创建一个虚拟的vip,还有就是主服务器和备用的优先级不一样,主服务器的优先级会比较高,配置完启动即可;然后还可以加入检测服务脚本,检测nginx是否可以使用,如果nginx不可用,keepalived的会停止服务,然后备用服务器就会使用vip继续进行服务。
注意事项:要注意添加的vip要在同一网段内,主服务器和备用的定义的名字要不一样,优先级一定要有一定的差距,集群的调度器要一致,
给lvs做高可用,做过lvs/dr lvs/nat,我们用到的高可用软件是keepalived,因为lvs和keepalived的适配度很高,所以我们不用单独对lvs做分配规则和负载均衡,我们可以直接在keepalived的配置文件里做,安装好keepalived之后,修改配置文件,配置文件里先进性集群配置,还是设置一个vip进行访问,然后对lvs进行配置,比如启用几个进程,用什么调度算法,用什么协议等,备用机器的配置文件基本一致,然后配置后端的服务器,我们要把用到的vip添加到lo网卡上,然后忽略arp广播,匹配精确ip地址回包,然后进行测试即可
lvs/nat模式做高可用相比于DR模式就比较复杂了,还是两台机器做keepalived集群,其中一个作为备用,我们要用到俩个网卡所以添加一个桥接模式的网卡,我们需要做两个虚拟ip,一个网卡上添加一个vip,然后我们修改keepalived的配置文件,首先配置桥接网卡的vip,注意在一个网段即可,然后配置集群,在配置ens33的vip两台代理服务器配置好了之后,要开启路由转发,然后把ens33的vip添加到使用到的后端服务器上,开启服务即可。
Ansible由节点和控制机器组成。 控制机器是安装Ansibles的地方,节点由这些机器通过SSH管理。 借助SSH协议,控制机器可以部署临时存储在远程节点上的模块。
控制机器使用ansible或者ansible-playbooks在服务器终端输入的Ansible命令集或者playbook后,Ansible会遵循预先编排的规则将PLAYbook逐条拆解为Play,再将Play组织成Ansible可以识别的任务tasks,随后调用任务涉及到的所有MODULES及PLUGINS,根据主机清单INVENTORY中定义的主机列表通过SSH协议将任务集以临时文件或者命令的形式传输到远程节点并返回结果,如果是临时文件则执行完毕后自动删除。
1.copy
src=:指定源文件路径 dest=:目标地址(拷贝到哪里) owner:指定属主 group:指定属组 mode:指定权限,可以以数字指定比如0644
2.yum模块
state= #状态是什么,干什么
state=absent 用于remove安装包
state=latest 表示最新的
state=removed 表示卸载
3.服务管理的service模块
name=httpd state=started 启动
name=httpd state=stopped 停止
name=httpd state=restarted 重启
4.文件模块file
owner:修改属主
group:修改属组
mode:修改权限
path=:要修改文件的路径
recurse:递归的设置文件的属性,只对目录有效
yes:表示使用递归设置
state:
touch:创建一个新的空文件
directory:创建一个新的目录,当目录存在时不会进行修改
5.command模块
chdir ##执行命令前先进入到指定目录 cmd ##运行命令指定 creates ##如果文件存在将不运行 removes ##如果文件存在将运行
用ansible批量部署一些服务,比如控制多台机器批量下载安装nginx等,
然后还可以查看每台机器上的一些使用信息,比如查看某台机器的cpu使用率
然后还使用ansible批量部署jdk+tomcat+jenkins
主要就是能减少我们的工作重复量,实现控制多台机器进行操作
1.部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2.默认使用SSH协议对设备进行管理;
3.有大量常规运维操作模块,可实现日常绝大部分操作;
4.配置简单、功能强大、扩展性强;
5.支持API及自定义模块,可通过Python轻松扩展;
6.通过Playbooks来定制强大的配置、状态管理;
7.轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
8.提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
关系型数据库有:
非关系型数据库有:
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈;
非关系型数据库
非关系型数据是一种数据结构化存储方法的集合,可以是文档或者键值对等
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
(1) 速度快,因为数据存在内存中。
(2) 支持丰富数据类型,支持string,list,set,hash等
(3) 支持事务,操作都是原子性,就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
redis可以持久化其数据
RDB:是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
RDB 特点:周期性、不影响数据写入、高效但是完整性较差(故障点到上一次备份,之间的数据无法修复)
AOF:将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
特点:实时性、完整性较好、体积大占用内存相对会较多
AOF存储的是执行的命令,RDB存储的是二进制格式数据
一般使用的都是两种结合
从服务器会向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,主服务器将执行的写指令都缓存在内存中。
在BGSAVE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个动作完成后,主服务器会将这段时间缓存的写指令再以redis协议的格式发送给从服务器。
在主从模式下,master节点负责写请求,然后异步同步给slave节点,从节点负责处理读请求。如果master宕机了,需要手动将从节点晋升为主节点,并且还要切换客户端的连接数据源。这就无法达到高可用,而通过哨兵模式就可以解决这一问题。
哨兵模式是Redis的高可用方式,哨兵节点是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。
每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。
如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。
master服务器宕机之后,哨兵自动会在从redis的slave服务器里面 选举一个master主服务器出来
如果之前宕机的主服务器已经修好,可以正式运行了,自动成为slave,然后哨兵监控的master也会进行切换。
有三种集群模式
缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到数据库,从而压垮数据库。
比如客户查询一个根本不存在的东西,首先从Redis中查不到,然后会去数据库中查询,数据库中也查询不到,那么就不会将数据放入到缓存中,后面如果还有类似源源不断的请求,最后都会压到数据库来处理,从而给数据库造成巨大的压力。
缓存雪崩:Redis中缓存的数据大面积同时失效,或者Redis宕机,从而会导致大量请求直接到数据库,压垮数据库。
对于一个业务系统,如果Redis宕机或大面积的key同时过期,会导致大量请求同时打到数据库,这是灾难性的问题。
缓存击穿:Redis中一个热点key在失效的同时,大量的请求过来,从而会全部到达数据库,压垮数据库。
这里要注意的是这是某一个热点key过期失效,和后面介绍缓存雪崩是有区别的。比如淘宝双十一,对于某个特价热门的商品信息,缓存在Redis中,刚好0点,这个商品信息在Redis中过期查不到了,这时候大量的用户又同时正好访问这个商品,就会造成大量的请求同时到达数据库。
GitLab是一个完整的持续集成/持续交付(CI/CD)平台,它提供了从代码托管到部署的一站式服务。GitLab还提供了强大的项目管理和协作工具,例如Wiki、 issue跟踪和代码审查。GitLab也可以在本地部署,因此可以在私有网络中进行安全存储和访问。
GitHub是一个基于Web的Git仓库托管服务,它提供了一个开源的代码托管平台,可以让开发者们共享和协作开发项目。GitHub还提供了一些额外的功能,例如GitHub Pages、GitHub Actions和GitHub Packages等。
Gitee是中国的Git托管服务,类似于GitHub和GitLab,它提供了代码托管、项目管理和协作工具。Gitee也支持私有仓库和企业版服务,可以满足企业的安全和隐私需求。
GitLab和Gitee都提供了数据备份和恢复功能,可以保证数据的安全性。GitHub也提供了数据备份功能,但在数据安全方面的保障相对较弱
GitLab和Gitee都提供了企业版服务,可以满足企业的安全和隐私需求。GitHub也提供了企业版服务,但价格相对较高。
持续集成(CI)可以帮助开发者更加方便地将代码更改合并到主分支。
一旦开发人员将改动的代码合并到主分支,系统就会通过自动构建应用,并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。
如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误。
CI 在完成了构建、单元测试和集成测试这些自动化流程后,持续交付可以自动把已验证的代码发布到企业自己的存储库。
持续交付旨在建立一个可随时将开发环境的功能部署到生产环境的代码库。
在持续交付过程中,每个步骤都涉及到了测试自动化和代码发布自动化。
在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。
对于一个完整、成熟的 CI/CD 管道来说,最后的阶段是持续部署。
它是作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。
实际上,持续部署意味着开发人员对应用的改动,在编写完成后的几分钟内就能及时生效(前提是它通过了自动化测试)。这更加便于运营团队持续接收和整合用户反馈。
总而言之,所有这些 CI/CD 的关联步骤,都极大地降低了应用的部署风险。
不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期工作量还是很大的。
总之, CI/CD 其实就是一个流程(通常形象地表述为管道),用于实现应用开发中的高度持续自动化和持续监控。
1.代码提交: 开发人员将代码提交到代码版本管理系统 (如Git) 中。
2.触发构建: Jenkins会监听代码版本管理系统中的变动,并目检测到代码变更后触发构建过程3.构建环境准备: Jenkins会根据配置的构建要求,准备构建所需的环境,例如安装所需的依赖库、配置构建代理等
4.构建过程: Jenkins会执行预定义的构建脚本或命令,例如编译源代码、运行测试等。
5.构建结果: Jenkins会根据构建过程的结果,判断构建是否成功或失败,并生成相应的构建报告.
6.构建通知: Jenkins可以通过邮件、Slack等方式将构建结果通知相关人员,以便及时了解构建状态。
7.部署和集成测试:在构建成功后,Jenkins可以自动将构建生成的产物部署到指定环境,并进行集成测试
8.持续交付:如果部署和集成测试通过,Jenkins可以自动将产物交付给生产环境,实现持续交付的目标.
在发布新版本时,我们可能会使用Jenkins自动化触发构建,以确保构建过程顺利并生成可用的软件包。这可以节省手动构建的时间和错误,并提高发布效率。
软件或者小程序发布的新版本过多时,我们会部署jenkins自动化触发构建,让版本自动发布
有时候,我们需要在特定时间间隔内自动化触发构建。例如,每天一次、每周一次或每月一次的构建任务。Jenkins提供了定时构建的功能,可以满足这种需求。
zabbix优点:
1、数据采集:可用性和性能检测,自动发现,支持agent、snmp、JMX、telnet等多种采集方式,支持主动和被动模式数据传输、支持用户自定义插件,自定义间隔收集数据
2、高可用:server对设备性能要求低,支持proxy分布式监控,分布式集中管理,有自动发现功能,可以实现自动化监控;开放式接口,扩展性强,插件编写容易
3、告警管理:支持多条件告警,支持多种告警方式,支持多组模板,模板继承。
4、告警设置:告警周期,告警级别,告警恢复通知、告警暂停,时段阈值、支持维护周期、支持单机停用
5、图形化展示:允许自定义创建多监控项视图,网络拓扑,自定义面板展示,自定义IT服务可用性
6、历史数据:历史数据查询可配置,内置housekeeping数据清理机制
7、安全审计:具备安全的用户审计日志,权限认证,用户可以限制允许维护的列表。
zabbix缺点:
1、性能瓶颈,监控系统没有低估高峰期,具有持续性和周期性,机器量越大,数据的增大会使数据库的写入成为一定的瓶颈,官网给出的单机上限5000台,届时就需要增加proxy,增加成本。
2、Zabbix采集数据有pull方式,也就是server主动模式,当目标机器量大之后,pull任务会出现积压。采集数据会延迟
3、项目二次开发,需要分析MySQL表结构,表结构比较复杂,通过API开发对开发能力有要求。
4、内置housekeeping在执行过程中会对数据库增加压力,需要对数据库进行优化
1、firewalld操作的各个区域,iptables操作的四表五链。
2、firewalld可以动态修改单条规则,而不需要像iptables那样,,在修改了规则后必须全部刷新才可以生效
3、firewalld默认是拒绝的,需要设置后才能放行,iptables默认是允许的,需要拒绝的才去限制。