
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
一致性(C): 在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A): 在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(P): 以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
(1)CAP关注的是数据,而不是整个系统。比如账号信息是CP,而用户资料是AP。
(2)CAP是忽略网络延迟的。数据复制是有延迟的,即时在内网也有几毫秒,对于金钱和秒杀类的场景,一致性C是无法完美实现的。但并不是说这类业务不能做分布式,可以把同一用户、同一商品放在同一个机器,同一用户做不了分布式,但是整个业务是个做的,比如根据uid分布在不同机器。
(3)正常情况下,是可以同时满足CAP的。P强调的是网络分区错误时,CA二选一。但是在网络正常情况下,CAP就可以同时满足。分区故障时,选择CP的,节点1可以注册,节点2不可以注册,可以节点1打日志,恢复注册后同步到节点2,CA同时存在。选择AP的,节点1和节点2是用户两次不同的修改,恢复后可以根据时间优先来进行覆盖,最终达到同时满足AP。
BA(基本可用)和S(软状态)和E(最终一致性)。是对CAP理论的AP的补充。AP分区时放弃的是网络分区这段时间的一致性,但恢复后最终会一致。
(1)基本可用:允许损失部分可用性,保证核心可用。如可以不注册,但是要保证登陆,否则影响更大。
(2)软状态:允许出现中间状态,不影响整体可用性。这种中间状态就是CAP理论的数据不一致。
(3)最终一致性:数据同步一定是有延迟的,只要保证最终一致性即可。如注册后不超过一分钟可以在各个节点登陆。明星发微博后可以三十分钟内同步到所有用户
1、主备: 简单,但是浪费资源,手动扶正。 2、主从: 主挂后可以继续读,但客户端调用时需要知道谁主谁从。故障后需要人工扶正。 3、双机切换: 在主备和主从上加入了切换功能,数据库自己做还是加入第三方、状态如何传递、如何判定故障、自动还是半自动、是否切换角色。 4、互链式: 主备之间除了数据同步,还要状态同步,可以是网络连接和有线连接等VIP自动飘移。但是这个链接管理是难点,可能出现两个都是主。 5、中介式: 引入第三方,弥补互链式缺点。 6、模拟式: 备机当作客户端访问主机。 7、主主: 客户端任写其一,主主互相同步,不做状态和切换。缺点是主键和数据冲突,如用户id商品库存等无法这么做。
降级: 指服务内部处理方案,如关闭注册、看帖不能发帖、应用日志接口。有内部提供URL和独立模块实现的方式。
熔断: 指依赖的其他服务异常。实现的机制是要对对方服务采样统计,设计阈值。
限流: 基于流量限流如1分钟超过一万就丢弃;基于资源限流如负载高低和队列容量等。
当我们使用一个 Nginx 来为一个 Tomcat 集群做负载均衡时,突然间,这个 Nginx 服务器宕机了,该怎么办!!!此时,我们所有的访问均无法正常到达相应的服务器。此时为了防止这种情况的出现,我们需要另一个 Nginx 服务器作为备用。
keepalived 是基于 vrrp 协议的一款高可用软件。keepalived 有一台主服务器和和多个备份服务器。在主服务器和备份服务器上部署相同的服务配置,使用一个虚拟 ip 地址对外提供服务,当主服务器出现故障时,虚拟 ip 会自动切换到备份服务器。
TIP VRRP (Virtual Router Redundancy Protocol,虚拟路由冗余协议)。主要为了解决静态路由高可用问题。
为了防止某一台 linux 服务器宕机,我们需要在两台服务器上都进行 Nginx 和 keepalived 的安装。
假如一台服务器的ip地址为 192.168.17.129,另一台服务器的 ip地址为 192.168.17.131。
然后我们需要在这两台服务器上都安装 Nginx 和 keepalived
安装 keepalived
# 安装keepalived
yum install keepalived -y
# 查看keepalived 是否安装成功
rpm -q -a keepalived修改配置文件
# 打开 keepalived 配置文件
vi /etc/keepalived/keepalived.conf将配置文件内的内容进行修改
以主服务器的 keepalived 配置文件为例
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129 // 本机的ip地址
smtp_connect_timeout 30
router_id LVS_DEVEL // 访问到主机
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight -20 # 代表当主服务器出现故障时,主服务器权重降低20
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}注 网卡的查看方式 使用 ifconfig 命令 其中 ruoter_id 是服务器的一个名字,我么可以使用 vim 修改 host 文件添加相应的id
# 打开 host 文件
vi /etc/hosts然后我们在末尾添加上
127.0.0.1 LVS_DEVEL添加脚本代码
# linux 检测脚本代码,改脚本主要用于检测 Nginx 是否还处于运行状态
# 注意创建的脚本要放在 /usr/local/src/目录下,名称为 nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi当一切配置完成后启动 Nginx 和 keepalived
# 启动 Nginx
cd /usr/local/nginx/sbin
./nginx
# 启动 keepalived
systemctl start keepalived.service