书接上回这次加了个keepalived
一、集群与分布式
1.1 集群介绍
**集群(Cluster)**是将多台计算机组合成一个系统,以解决特定问题的计算机集合。集群系统可以分为以下三种类型:
- **LB(Load Balancing,负载均衡):**多个主机组成的集群,每个主机只承担一部分访问请求,从而平衡负载。
- **HA(High Availability,高可用):**通过冗余和故障切换机制,避免单点故障(SPOF)。
- **HPC(High-performance computing,高性能计算):**用于需要高计算能力的任务,如科学计算和复杂的数据处理。
1.2 分布式系统
分布式系统是指将计算和存储分散在多台计算机上,以提高系统的性能、可靠性和可扩展性。分布式系统的常见应用包括:
- **分布式存储:**例如Ceph,GlusterFS,FastDFS,MogileFS等。
- **分布式计算:**例如Hadoop和Spark。
- **分布式应用:**通过功能拆分和微服务架构,将单一应用程序划分成多个小服务,服务之间相互协调,为用户提供最终价值。
- **分布式静态资源:**将静态资源存储在不同的存储集群上,以提高访问效率。
- **分布式数据和存储:**使用key-value缓存系统来提高数据访问速度。
- **分布式计算:**如使用Hadoop集群处理大数据业务。
1.3 集群设计原则
- **可扩展性:**集群的横向扩展能力,即增加更多节点来提高性能。
- **可用性:**系统的无故障时间(SLA,服务级别协议)。
- **性能:**系统的访问响应时间。
- **容量:**单位时间内的最大并发吞吐量(如C10K问题)。
二、LVS(Linux Virtual Server)
2.1 LVS工作原理
LVS通过请求报文的目标IP、目标协议和端口,将其调度转发至某个真实服务器(RS)。根据调度算法选择RS。LVS作为内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行处理。
2.2 LVS集群体系架构
LVS的架构包括代理服务器(VS)、真实服务器(RS)、客户机IP(CIP)、虚拟服务器IP(VIP)、调度器IP(DIP)和真实服务器IP(RIP)。
2.3 LVS功能及组织架构
LVS主要用于高访问量业务,通过负载均衡提高应用程序的可用性和可靠性。
2.4 LVS集群类型中的术语
- **VS(代理服务器):**也称为Director Server (DS)或Dispatcher,负责调度和负载均衡。
- **RS(真实服务器):**提供实际服务的服务器。
- **CIP(客户机IP):**客户端的IP地址。
- **VIP(虚拟服务器IP):**代理服务器的外网IP。
- **DIP(调度器IP):**代理服务器的内网IP。
- **RIP(真实服务器IP):**真实服务器的IP地址。
访问流程:CIP <–> VIP == DIP <–> RIP
三、LVS工作模式和命令
3.1 LVS集群的工作模式
LVS支持多种工作模式:
- **LVS-NAT:**修改请求报文的目标IP,通过DNAT实现多目标IP的负载均衡。
- **LVS-DR:**直接路由模式,通过封装新的MAC地址转发报文。
- **LVS-TUN:**隧道模式,通过IP隧道实现负载均衡。
- **LVS-FullNAT:**修改请求报文的源和目标IP。
3.1.1 LVS的NAT模式
- **请求阶段:**客户端请求报文的源IP是CIP,目的IP是VIP。
- **转发阶段:**代理服务器修改目的IP为RIP,转发给真实服务器。
- **响应阶段:**真实服务器将响应报文发送回代理服务器,代理服务器修改源IP为VIP,再转发给客户端。
NAT模式的特点包括支持端口映射、必须是Linux系统等。
3.1.2 LVS的DR模式
DR模式(Direct Routing)通过直接路由实现负载均衡,特点如下:
- 代理服务器与RS在同一个物理网络。
- 请求报文经由代理服务器,但响应报文直接由RS发回客户端。
- 不支持端口映射,RS可以使用大多数操作系统。
3.1.3 工作模式总结比较
| 模式 | 优点 | 缺点 | 真实服务器要求 | 支持网络 | 真实服务器数量 | 真实服务器网关 | 
|---|---|---|---|---|---|---|
| DR | 性能最好 | 不支持跨网段 | Non-arp device | LAN | High (100) | Own router | 
| TUN | 支持WAN | 服务器支持隧道模式 | Tunneling | LAN/WAN | High (100) | Own router | 
| NAT | 端口转换 | 性能瓶颈 | any | Private | Low (10~20) | LVS内网地址 | 
3.2 LVS调度算法
LVS调度算法分为静态方法和动态方法:
- **静态方法:**不考虑服务器状态,仅根据算法进行调度。常见算法有轮询(RR)、加权轮询(WRR)、源地址哈希(SH)和目标地址哈希(DH)。
- **动态方法:**根据服务器的负载状态进行调度。常见算法有最少连接(LC)、加权最少连接(WLC)、最短预期延迟(SED)、永不排队(NQ)等。
四、ipvsadm工具
4.1 ipvsadm工具选项
- -A:添加虚拟服务器。
- -D:删除整个虚拟服务器。
- -C:清空所有规则。
- -R:重新加载规则。
- -s:指定负载调度算法(如轮询:rr、加权轮询:wrr、最少连接:lc、加权最少连接:wlc)。
- -a:添加真实服务器(节点服务器)。
- -d:删除某个节点。
- -t:指定VIP地址及TCP端口。
- -r:指定RIP地址及TCP端口。
- -m:使用NAT集群模式。
- -g:使用DR模式。
- -i:使用TUN模式。
- -w:设置权重(权重为0时表示暂停节点)。
- -p 60:保持长连接60秒。
- -l:列出LVS虚拟服务器。
- -n:以数字形式显示地址、端口等信息,常与“-l”选项组合使用。
安装与配置:
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
- ipvs调度规则文件:/etc/sysconfig/ipvsadm
通过扩展后的内容,进一步解释了每个部分的概念和具体操作,有助于更全面地理解集群与分布式系统的设计与实现。
192.168.10.10
192.168.10.20
192.168.10.30
location ~ \.jsp$ { proxy_pass http://192.168.10.50:8080; } location ~ \.(jsp|html)$ { root /usr/share/nginx/html; }192.168.10.40
192.168.10.50
结果验证:
自此出起开始本章内容
对192.168.10.20进行如下配置:
! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30
   router_id LVS01
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_down {
  script "/etc/keepalived/ng.sh"
  interval 1
  weight -30
  fall 3
  rise 2
  timeout 2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.188
    }
   track_script {
   check_down
    }
}
下面对该配置文件进行注释和讲解
# Configuration File for keepalived
global_defs {
   # 定义接收通知的电子邮件地址列表
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   
   # 定义发送通知的电子邮件地址
   notification_email_from Alexandre.Cassen@firewall.loc
   
   # 定义SMTP服务器的地址,用于发送电子邮件通知
   smtp_server 127.0.0.1 
   
   # 定义与SMTP服务器连接的超时时间(秒)
   smtp_connect_timeout 30
   
   # 定义路由器的唯一标识符
   router_id LVS01
   
   # 跳过对接收到的VRRP通告中的地址进行检查,这可以避免因网络配置问题导致的误报
   vrrp_skip_check_adv_addr
   
   # #vrrp_strict 是一个可选的指令,如果启用,它将强制执行VRRP协议的严格检查。在这里,它被注释掉了。
   #vrrp_strict
   
   # 定义GRATUITOUS ARP请求的发送间隔(秒),0表示不发送
   vrrp_garp_interval 0
   
   # 定义组播NA(Neighbor Advertisement)消息的发送间隔(秒),通常与garp_interval保持一致,0表示不发送
   vrrp_gna_interval 0
}
# 定义一个VRRP脚本检查,用于监控服务或资源的状态
vrrp_script check_down {
   # 指定要执行的脚本路径
   script "/etc/keepalived/ng.sh"
   
   # 定义脚本执行的间隔时间(秒)
   interval 1
   
   # 定义脚本执行失败时,本机的优先级调整值
   weight -30
   
   # 定义脚本连续失败多少次后,认为服务不可用
   fall 3
   
   # 定义脚本连续成功多少次后,认为服务已恢复
   rise 2
   
   # 定义脚本执行的超时时间(秒)
   timeout 2
}
# 定义一个VRRP实例
vrrp_instance VI_1 {
   # 设置VRRP实例的初始状态,可以是MASTER或BACKUP
   state MASTER
   
   # 指定绑定的网络接口
   interface ens33
   
   # 设置虚拟路由器的ID,同一个网络内的不同VRRP实例应该使用不同的ID
   virtual_router_id 51
   
   # 设置本机的优先级,值越大优先级越高
   priority 100
   
   # 设置VRRP通告的发送间隔(秒)
   advert_int 1
   
   # 定义VRRP实例的认证方式和密码
   authentication {
       auth_type PASS  # 使用密码认证
       auth_pass 1111  # 设置认证密码
   }
   
   # 定义虚拟IP地址列表
   virtual_ipaddress {
       192.168.10.188
   }
   
   # 指定要跟踪的脚本检查,当脚本检查失败时,会调整本机的优先级
   track_script {
       check_down
   }
}所需要的脚本
#!/bin/bash
#check_nginx 
killall -0 nginx
if [[ $? -ne 0 ]];then
    systemctl stop keepalived
fi对192.168.10.30进行如下配置:
! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30
   router_id LVS01
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.188
    }
   track_script {
   check_down
    }
}
由此可见实验是成功的
































