vlan:实现机制 分类
负载均衡技术:分类 技术(LVS keepalive vrrp nginx) 负载均衡技术
数据库:索引 存储引擎 范式 acid
Vlan
虚拟局域网
参考资料
我理解为带Vlan的交换机实现路由器的功能——分离广播域
实现机制:在交换机上加红蓝口,通过vlan上的ID来区分
不同vlan通信:路由器或者三层交换机
同一vlan连接多台交换机:
1:每一个vlan id布线 麻烦
2:汇聚链接,一根线转发多个不同VLAN的通信的端口。
静态vlan
基于Mac:根据Mac地址划分为不同的vlan id
基于IP:根据IP地址划分
基于用户:则是根据交换机各端口所连的计算机上当前登录的用户,这这些用户名信息,属于OSI第四层以上的信息。
计算机中的网络接口卡(NIC)相连的IP地址
虚拟IP地址(VIP) 是一个不与特定计算机或一个计算机中的网络接口卡(NIC)相连的IP地址。
用处:VRRP
负载均衡技术
参考资料
目的:
1)减少用户等待响应的时间;
2)使得单个服务器上的访问分流,减轻负担
分类:
二层负载均衡:多个服务器有相同的VIP,当访问此VIP后,修改目的MAC地址将请求分发给不同的服务器(DR模式)
三层负载均衡:不同的IP转发给不同的服务器(NAT模式)
四层负载均衡LVS:IP地址+端口号
七层负载均衡:也称为“内容交换”,四层负载均衡加上应用层的内容比较URL
具体技术
F5
四层的硬件负载均衡器
LVS
IPVS 模块来实现的在负载调度器上虚拟出VIP,client需要首先访问VIP,之后负载均衡选择合适的服务器进行分配响应
CIP:client IP
DIP:负载均衡IP
RIP:server IP
VIP:虚拟IP
LVS:Linux virtual server
RS:Real Server
DR模式-数据链路层模式 :三角传输,通过修改Mac地址实现负载均衡
特点:
1:路由器和服务器有相同的VIP
2:不能跨网段
3:经过一次负载均衡路由器
NAT:不需要再在应用服务器上配置VIP。
特点:
1:不用相同的VIP
2:不能跨网段
3:经过两次负载均衡路由器
缺点是由于这种模式修改了目的IP地址,这样如果应用服务器直接将应答包发给客户端的话,其源IP是应用服务器的IP,客户端就不会正常接收这个应答(因为会接收很多不同IP的垃圾信息),因此我们需要让流量继续回到负载均衡,负载均衡将应答包的源IP改回VIP再发到客户端,这样才可以保证正常通信
IP隧道:
Ip Tunnel模式下:
负载均衡器:不会改写请求包的IP和端口,但是会在数据包IP层外面再封装一个IP层,源地址为DIP,目的地址为RIP
真实服务器RS:将外面封装的Ip Tunnel头去掉,发现里面还有一层 IP 首部的目标地址是自己 lo 接口上的 VIP,然后处理里面实际的请求报文
特点
1:路由器和服务器有相同的VIP
2:能跨网段
3:与DR模式类似,响应包也不再经过LVS,而是直接返回给客户端。所以Ip Tunnel模式的转发效率虽然弱于DR,但是强于NAT
(分为源地址修改SNAT和目标地址修改DNAT)
FullNAT:
Fullnat主要实现的功能:
1.数据包从外部进来的时候,目标ip更换为realserver ip,源ip更换为内网local ip;
2.数据包发送出去的时候,目标ip更换为client ip,源ip更换为vip;
1:不用相同的VIP
2:可以跨网段(与NAT的不同点 解决扩展问题)
因为可以跨网段,解决单点服务问题这里没有理解到
3:经过两次负载均衡路由器
应用服务器会丢失客户端的真实IP地址。
KeepAlive
TCP的keepalive是侧重在保持客户端和服务端的连接
一方会不定期发送心跳包给另一方,当一方端掉的时候,没有断掉的定时发送几次心跳包,如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前链接。
HTTP的keep-alive:普通的http是非持久性连接。
但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了(转化为持久性连接)
VRRP
(Virtual Router Redundancy Protocol-虚拟路由冗余协议)
参考资料
多台设备(路由器、交换机、防火墙等)虚拟化成一台设备,然后通过配置虚拟IP地址
SW7和SW8若配置了VRRP 那么SW7和SW8就是一个整体,其中一台出现故障都不会对业务造成很大的影响。
初始状态(Initialize)、活动状态(Master)、备份状态(Backup)。
1:主备备份模式:Master工作Backup不工作
2:负载分担模式:通过创建多个拥有不同虚拟IP的VRRP组,client选择特点IP访问即会访问不同的网关。但是若其中一个VIP的网管宕机,则其他的会接收这个VIP提供服务
Nginx
反向代理
参考资料
正向代理代理的是客户端,目的是访问无法访问的资源,单个服务器
如A无法访问谷歌C,但是B能访问C,所以A委托B去访问C
反向代理代理的是服务器,目的是安全,负载均衡,多个服务器
如多个服务器C1,C2,C3,访问服务器前需要访问代理服务器B
区别在于:
是否指定目标服务器:正向代理需要明确,方向不需要
客户端是否要做设置:正向代理需要设置代理服务器的IP或者域名,而反向不需要
反向代理:
1)提高了内部服务器的安全
2)加快了对内部服务器的访问速度
增加不同的代理服务器提升访问速度
3)解决IP地址不够的问题
内部服务器不需要配置全局IP,只需要内部IP
LVS,其实现的功能只是对请求数据包的转发、传递,从负载均衡下的节点服务器来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户
Nginx:而反向代理服务器在接收访问用户请求后,会代理用户重新发起请求代理下的节点服务器, 最后把数据返回给客户端用户。在节点服务器看来,访问的节点服务器的客户端用户就是反向代理服务器,而非真实的网站访问用户
负载均衡策略
轮循均衡(RoundRobin)
每一次来自网络的请求轮流分配给内部中的服务器,从 1 至 N 然后重新开始。
权重轮循均衡(WeightedRoundRobin)
根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
随机均衡(Random)
把来自网络的请求随机分配给内部中的多个服务器。
权重随机均衡(WeightedRandom)
此种均衡算法类似于权重轮循算法,不过在处理请求分担时是个随机选择的过程。
响应速度均衡(ResponseTime探测时间)
负载均衡设备对内部各服务器发出一个探测请求(例如 Ping),然后根据内部中各服务器对探测请求的最快响应时间来决定哪一台服务器来响应客户端的服务请求。此种均衡算法能较好的反映服务器的当前运行状态,但这最快响应时间仅仅指的是负载均衡设备与服务器间的最快响应时 间,而不是客户端与服务器间的最快响应时间。
最少连接数均衡(LeastConnection)
最少连接数均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在 处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡 更加符合实际情况,负载更加均衡。此种均衡算法适合长时处理的请求服务,如 FTP。
处理能力均衡(CPU、内存)
此种均衡算法将把服务请求分配给内部中处理负荷(根据服务器 CPU 型号、CPU 数量、内存大小 及当前连接数等换算而成)最轻的服务器,由于考虑到了内部服务器的处理能力及当前网络运行状况,所以此种均衡算法相对来说更加精确,尤其适合运用到第七层(应用层)负载均衡的情况 下。
DNS响应均衡(FlashDNS)
在此均衡算法下,分处在不同地理位置的负载均衡设备收到同一个客户端的域名解析请求,并在同一时间内把此域名解析成各自相对应服务器的 IP 地址并返回给客户端,则客户端将以最先收到的域名解析 IP 地址来继续请求服务,而忽略其它的 IP 地址响应。
哈希算法
一致性哈希,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
IP 地址散列(保证客户端服务器对应关系稳定)
通过管理发送方 IP 和目的地 IP 地址的散列,将来自同一发送方的分组(或发送至同一目的地的分 组)统一转发到相同服务器的算法。当客户端有一系列业务需要处理而必须和一个服务器反复通信时,该算法能够以流(会话)为单位,保证来自相同客户端的通信能够一直在同一服务器中进行处 理。
URL 散列
通过管理客户端请求 URL 信息的散列,将发送至相同 URL 的请求转发至同一服务器的算法。
数据库
索引
聚集索引=主键索引(一般情况下)
普通索引=非聚集索引 是否加入unique唯一索引
全文索引
聚集索引和非聚集索引:
参考资料
想象一下数据为学生(ID,姓名,年龄,性别,班级)
最开始的时候顺序存储,查找效率O(n)
提高效率利用树,B+树 O(logn)
利用FCB的思想,如果树中每一个节点都是学生的全部数据,则查找时无关内容过多,所以仅仅将ID作为树中的节点,自然ID伴随着指向对应学生数据结构的指针。聚集索引
而如果不想用ID找,而利用其他属性找,则建立其他索引即可非聚集索引
区别:
1: 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据,两次查找即聚集索引是找到数据的唯一途径
2:聚集索引多利用主键,仅仅只有一个。非聚集索引利用其他属性,可以有多个
like:模糊查找效率低,因为用不到索引(有一些可能用到,但是仍然效率低)所以一般用搜索引擎
全文索引:
需要事先设置fulltext
之后利用match against查询
对于长度小于最小搜索长度和大于最大搜索长度的词语都不会成功
效率高于like,但是可能出现精度问题
存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、 更新和删除数据
存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。
InnoDB:B+树
TokuDB(分形树)
每一个 child 指针除了需要指向一个 child 节点外,还会带有一个 Message Buffer ,这个 Message Buffer 是一个 FIFO 的队列,用来缓存更新操作。
例如,一次插入操作只需要落在某节点的 Message Buffer 就可以马上返回了,并不需要搜索到叶 子节点。这些缓存的更新会在查询时或后台异步合并应用到对应的节点中。
MYISAM 执行读取操作的速度很快,而且不占用大量的内存和存储资源。在设计之初就预想数据组织成有固定长度的记录,按顺序存储的。—MYISAM 是一种静态索引结构。
memory
Memory(也叫 HEAP)堆内存:利用内存来创建表。每个 MEMORY 表只实际对应一个磁盘文件。MEMORY 类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用 HASH 索引。但是一旦服务关闭,表中的数据就会丢失掉。
Memory 同时支持散列索引和 B 树索引
四大范式
第一范式的关键词是列的原子性》第二范式的关键词是不能包含部分依赖》第三范式的关键词是不能包含传递依赖。
第一范式:要求数据库表的每一列都是不可分割的原子数据项。
第二范式:表中必须有主键或者联合主键,且其他列必须完全依赖(针对联合主键,不能部分依赖)
如下图,联合主键(订单号+产品号),此时订单金额和订单时间不依赖于产品好,仅仅依赖于订单号,属于部分依赖,所以需要单独列表
第三范式:任何非主属性不依赖其他非主属性,不能由传递依赖
BCNF:消除联合主键之间的部分依赖
联合主键(仓库名,管理员,物品名)
但是物品名却部分依赖于仓库名,并影响数量,所以修改为
ACID
- 原子性(Atomicity)
事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。 - 一致性(Consistency)
数据库在事务执行前后都保持一致性状态。
在一致性状态下,所有事务对一个数据的读取结果都是相同的。 - 隔离性(Isolation)
一个事务所做的修改在最终提交以前,对其它事务是不可见的。即事务之间不会互相影响 - 持久性(Durability)持久化粗处
可能出现的问题
前提:T1,T2都开启事务
丢失修改:T1 和 T2 对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
脏读:T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
不可重复读:T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
幻读:T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
隔离的等级
-
未提交读(READ UNCOMMITTED)
事务彼此并发执行 -
提交读(READ COMMITTED)
一个事务只能读取已经提交的事务所做的修改。
对于select:对数据不加锁,执行“快照读”。即T1第一次select就会生成一张当前数据的照片,之后如果没有其他事务进行commit操作,select都会返回这张照片。
对于update,insert,delete:对数据加锁,并执行操作
解决脏读 -
可重复读(REPEATABLE READ)
保证在同一个事务中多次读取同样数据的结果是一样的。
在T1开启事务后,select的数据不能执行update操作相当于都加锁
解决脏读,不可重复读 -
可串行化(SERIALIZABLE)
事务之间必须串行执行
解决所有