设为首页 收藏本站
查看: 905|回复: 0

[经验分享] lvs(linux virtual server)、keepalived-linux运维小站

[复制链接]

尚未签到

发表于 2018-10-19 09:41:40 | 显示全部楼层 |阅读模式
  Linux Cluster:
  httpd: ab,  benchmark;
  系统的扩展方式:
  Scale up:向上扩展;
  ×××能更好的服务器替代现有的服务器;
  Scale out:向外扩展;
  提供更多的服务器来满足同一个需求;
  集群:将多台主机组织起来满足某一特定需求;
  集群类型:
  1、LB:Load Balancing, 负载均衡集群;
  负载均衡器,调度器;
  上游服务器(upstream server),后端服务器,“真”服务器(real server);
  SPOF:Single Point Of Failure
  2、HA:High Avalilability, 高可用集群;
  Active:活动服务器
  Passive:备用服务器
  Availability = 平均无故障时间/(平均无故障时间+平均修复时间)
  增大分子
  减小分母:降低平均修复时间;
  冗余:
  90%, 95%, 99%, 99.9%, 99.99%, 99.999%
  3、HP:High Performance:高性能集群
  www.top500.org
  DS:Distributed System
  hadoop:
  mapreduce
  hdfs
  LB集群的实现:
  硬件:
  F5 BIG-IP
  Citrix Netscaler
  A10 A10
  Array
  Redware
  软件:
  lvs: Linux Virtual Server
  haproxy
  nginx
  ats (apache traffic server)
  perlbal
  基于工作的协议层次划分:
  传输层:
  lvs, haproxy (mode tcp)
  应用层:
  haproxy (mode http), nginx, ats, perlbal
  HA集群的实现:
  keepalived:通过实现vrrp协议来实现地址漂移;
  AIS:
  heartbeat
  cman+rgmanager (RHCS: redhat cluster suite)
  corosync+pacemaker
  系统构建:分层、分割
  分布式:应用、数据、存储、计算
  lvs:Linux Virtual Server
  layer 4:四层交换,四层路由;
  根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法);
  lvs工作于director的netfilter表的INPUT链,其数据流向PREROUTING------>INPUT------->POSTROUTING
  lvs集群的术语:
  vs:Virtual Server
  Director, Dispatcher, Balancer
  rs:Real Server
  CIP: Client IP
  Director Virtual IP: VIP
  Directory IP: DIP
  Real Server IP: RIP
  负载均衡集群中设计时的要点:
  (1) session保持;
  session 绑定(sticky) (source ip hash);
  session 集群(cluster) (multicast/broadcast/unicast);
  session 服务器 (server);
  (2) 数据共享;
  共享存储;
  NAS:Network Attached Storage (文件级别);
  SAN:Storage Area Network (块级别);
  DS:Distributed Storage;
  数据同步:
  rsync
  ...
  lvs的类型:
  lvs-nat
  lvs-dr (direct routing)
  lvs-tun (ip tunneling)
  lvs-fullnat (同时改变请求报文的源IP和目标IP)
  注意:前三种为标准类型;fullnat为后来添加的类型,内核默认可能不支持;
  lvs-nat:
  多目标的DNAT:通过将请求报文的目标地址和目标端口修改为挑选出某RS的RIP和PORT来实现;
  (1) RIP和DIP应该使用私网地址,RS的网关应该指向DIP;
  (2) 请求和响应报文都要经由director转发;极高负载的场景中,Director可能会成为系统瓶颈;
  (3) 支持端口映射;
  (4) VS必须为Linux,RS可以是任意的OS;
  (5) RS的RIP与Director的DIP必须在同一IP网络;
  lvs-dr:direct routing
  通过修改请求报文的MAC地址进行转发;IP首部不会发生变化(源IP为CIP,目标IP始终为VIP);
  (1) 确保前端路由器将目标IP为VIP的请求报文一定会发送给Director;
  解决方案:
  1、静态绑定;
  2、禁止RS响应VIP的ARP请求;
  (a) arptables;
  (b) 修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;
  (2) RS的RIP可以使用私有地址,也可以使用公网地址;
  (3) RS跟Director必须在同一物理网络中;
  (4) 请求报文必须由Director调度,但响应报文必须不能经由Director;
  (5) 不支持端口映射;
  (6) 各RS可以使用大多数的OS;
  lvs-tun:ip tunneling,ip隧道;
  转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原有的IP首部之外再次封装一个IP首部(源IP为DIP,目标IP为RIP);
  (1) RIP,DIP,VIP全得是公网地址;
  (2) RS的网关不能也不可能指向DIP;
  (3) 请求报文经由Director调度,但响应报文将直接发给CIP;
  (4) 不支持端口映射;
  (5) RS的OS必须支持IP隧道功能;
  lvs-fullnat:
  通过同时修改请求报文的源IP地址(cip-->dip)和目标IP地址(vip --> rip)实现转发;
  (1) VIP是公网地址;RIP和DIP是私网地址,且可以不在同一IP网络中,但需要通过路由互相通信;
  (2) RS收到的请求报文的源IP为DIP,因此其响应报文将发送给DIP;
  (3) 请求报文和响应报文都必须经由director;
  (4) 支持端口映射;
  (5) RS可使用任意OS;
  lvs scheduler:调度算法
  a、静态方法:仅根据算法本身进行调度;
  RR:round robin, 轮调,轮询,轮叫;
  WRR:weighted rr, 加权轮询;
  SH:source ip hash, 源地址哈希;实现session保持的机制;将来自于同一个IP的请求始终调度至同一RS;
  DH:desination ip hash, 目标地址哈希;提高缓存命中的机制(lvs不支持);将对同一个目标的请求始终发往同一个RS;
  b、动态方法:根据算法及各RS的当前负载状态(Overhead)进行调度;
  LC:least connection,最少连接;Overhead=Active256+Inactive
  WLC: weighted LC,加权最少连接;Overhead=(Active256+Inactive)/weight
  SED:Shortest Expection Delay,最短期望延迟;Overhead=(Active+1)*256/weight
  NQ: Nerver Queue,永不排队
  LBLC:Locality-Based LC,即为动态的DH算法;正向代理情形下的cache server调度;
  LBLCR:LBLC with Replication,带复制功能的LBLC;
  lvs:
  ipvsadm/ipvs
  ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
  ipvs:工作于内核上的netfilter INPUT钩子之上的程序代码;
  其集群功能依赖于ipvsadm定义的集群服务器规则;
  支持基于TCP,UDP,SCTP,AH,ESP,AH_ESP等协议的众多服务;
  (1)一个ipvs主机可以同时定义多个cluster service;
  (2)一个cluster service上至少应该有一个real server;
  定义时,指明lvs-type,以及lvs scheduler;
  管理集群服务:
  ipvsadm  -A|E  -t|u|f  service-address  [-s scheduler]
  ipvsadm  -D  -t|u|f service-address
  -A:添加
  -E:修改
  -D:删除
  service-address:
  tcp:-t  vip:port
  udp:-u  vip:port
  fwm:-f    MARK
  -s scheduler:默认为wlc;
  管理集群服务上的RS:
  ipvsadm -a|e  -t|u|f service-address -r server-address [-g|i|m] [-w weight]
  ipvsadm -d -t|u|f service-address -r server-address
  -a:添加一个RS
  -e:修改一个RS
  -d:删除一个RS
  server-address:
  rip[:port]
  -g:lvs-dr模型(默认)
  -i:lvs-tun模型
  -m:lvs-nat模型
  查看:
  ipvsadm -L|l [options]
  -n:numeric,数字格式显示地址和端口;
  -c:connection,显示ipvs连接;
  --stats:统计数据;
  --rate:速率
  --exact:精确值
  清空规则:
  ipvsadm  -C
  保存和重载:
  保存:
  ipvsadm -S  > /PATH/TO/SOME_RULE_FILE
  ipvsadm-save  > /PATH/TO/SOME_RULE_FILE
  重载:
  ipvsadm  -R < /PATH/FROM/SOME_RULE_FILE
  ipvsadm-restore < /PATH/FROM/SOME_RULE_FILE
  计数器清零:
  ipvsadm  -Z  [-t|u|f service-address]
  fwm:firewall mark
  ipvsadm -A|E -t|u|f service-address [-s scheduler]
  -t, -u: service-address
  ip:port
  -f: service-address
  firewall mark
  iptables的功能:
  filter, nat, mangle, raw
  mangle:
  target: MARK
  --set-mark value[/mask]
  基于fwm定义集群服务的步骤:
  (1) 打标
iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $serviceport -j MARK --set-mark
  #:整数
  (2) 定义集群服务
ipvsadm -A -f # [-s scheduler]
  lvs persistence:持久连接;在定义集群服务时附加上  -p  #
  功能:无论ipvs使用何种scheduler,其都能够实现在指定时间范围内始终将来自同一个ip地址的请求发往同一个RS;此功能是通过lvs持久连接模板实现,其与调度方法无关;
  ipvs持久连接的模式:默认时间为5分钟
  每端口持久(PPC):单服务持久调度
  每FWM持久(PFWMC):单防火墙标记(FWM)持久调度
  每客户端持久(PCC):定义tcp或udp协议的0号端口为集群服务端口;director将用户的任何请求都识别为集群服务,并向RS进行调度
  示例:
ipvsadm -A -t 172.20.120.71:0 -s rr -p
ipvsadm -a -t 172.20.120.71:0 -r 172.20.120.41 -g
ipvsadm -a -t 172.20.120.71:0 -r 172.20.120.42 -g
  示例lvs-nat模型:拓扑图如下所示;要点:1、请求和响应报文都经由director;2、各RS网关必须指向dip;
  director:
ipvsadm -A -t 172.20.120.40:80 -s rr
ipvsadm -a -t 172.20.120.40:80 -r 192.168.20.11 -m
ipvsadm -a -t 172.20.120.40:80 -r 192.168.20.12 -m
  示例lvs-dr模型:拓扑图如下;要点:1、请求报文经由director,响应报文直接由各rs响应;2、各rs由于都有vip,因此需要解决arp广播跟arp回应的问题;3、请求报文到达director,通过修改mac地址到达挑选后的realserver;4、director跟各rs在同一物理网络中;
  director:
ifconfig eno16777736:0 172.20.120.71/32 up
route add -host 172.20.120.71 dev eno16777736:0
ipvsadm -A -t 172.20.120.71:80 -r ss
ipvsadm -a -t 172.20.120.71:80 -r 172.20.120.41 -g
ipvsadm -a -t 172.20.120.71:80 -r 172.20.120.42 -g
  各rs:脚本如下lvs-dr.sh
  #!/bin/bash
  vip=172.20.120.71
  interface=lo
  case $1 in
  start)
  echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  ifconfig $interface:0 $vip/32 up
  route add -host $vip dev $interface:0
  ;;
  stop)
  route del -host $vip dev $interface:0
  ifconfig $interface:0 dow
  echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
  echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
  echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
  ;;
  esac
  另外一种情况:vip跟rip不在同一网段
  lvs HA功能:
  director:在节点级别进行冗余;HA集群解决方案:keepalived;
  real server:让director对其做健康状态检测,并且根据检测的结果自动完成添加或移除等管理功能;
  健康时:online
  非健康时:offline
  1、如何对real server做健康状态检测:
  (1) 网络层:探测主机的存活状态;icmp ping
  (2) 传输层:探测端口的可用性;tcp ping
  (3) 应用层:请求关键的某资源;curl
  2、检查频率:
  3、状态判断:
  下线:ok --> failure --> failure --> failure                       rs: down
  上线:failure --> ok --> ok                                                 rs: up
  4、backup_server(sorry_server):即所有realserver都下线的情况,临时提供的web页面;
  HA:提供冗余主机来提升系统可用性;
  Availability=(MTBF)平均无故障时间/(平均无故障时间+平均修复时间(MTTR))
  衡量值:95%,99%,99.9%,99.99%,99.999%
  HA Cluster的实现方案:
  1、vrrp协议的实现;keepalived
  2、ais:完备的HA集群;heartbeat、corosync
  keepalived是vrrp的实现,原生设计目的为ipvs服务提供高可用;
  vrrp协议在Linux主机上以守护进程方式的实现; 能够根据配置文件生成ipvs规则,并对各RS的健康做检测;vrrp_script, vrrp_track;
  vrrp的术语:virtual redundant routing protocol 虚拟冗余路由协议
  虚拟路由器、VRID(虚拟路由器的标识0-255)、Master、Backup、VIP、VMAC(00-00-5e-00-01-VRID)、优先级、抢占式、非抢占式;keepalived使用gratuitous arp(免费arp);
  工作方式:抢占式、非抢占式
  工作模式:主备、主/主(配置多个虚拟路由器)
  认证方式:无认证、简单字符串认证(预共享密钥)、MD5认证
  组件:
  1、控制组件:配置文件分析器
  2、内存管理
  3、IO复用
  4、核心组件:vrrp stack、checker、ipvs wrapper、watch dog
  HA Cluster的配置前提( keepalived):
  1、各节点时间要同步;
  ntp协议、chrony;
  2、确保iptables及selinux不会成为障碍;
  3、(keepalived可选)各节点之间可通过主机名互相通信;即名称解析服务的解析结果必须与“uname -n”命令的结果一致;
  4、(keepalived可选)各节点之间的root用户可以基于密钥认证的ssh通信;
  组播地址:224-239
  安装keepalived:centos6.4+,程序包已在base源提供
yum install keepalived -y
  主配置文件:/etc/keepalived/keepalived.conf
  unit file:/usr/lib/systemd/systemd/keepalived.service,其配置文件/etc/sysconfig/keepalived
  配置文件内容块分为三段:
  1、全局配置段:global_defs {  ...  }
  2、VRRP配置段:
  a、vrrp_sync_group  GROUP_NAME    {  ... }
  b、vrrp_instance  INSTANCE_NAME    {  ...  }
  3、LVS配置段:virtual_server_group  VSG_NAME    {    ...    }
  virtual_server   IP  PORT  |  fwmark  int   {
  protocol   TCP
  ...
  real_server        {
  ...
  }
  real_server        {
  ...
  }
  }
  全局配置:
  global_defs {
  notification_email {
  ...
  }:收件人邮箱地址
  notification_email_from:发件人邮箱地址
  smtp_server:邮件发送服务器IP;
  smtp_connect_timeout:邮件服务器建立连接的超时时长;
  router_id LVS_DEVEL:物理节点的标识符;建立使用主机名;
  vrrp_mcast_group4:IPV4多播地址,默认224.0.0.18;
  VRRP实例配置:
  vrrp_instance NAME {
  ...
  }
  常用配置:
  state MASTER|BACKUP:在当前VRRP实例中此节点的初始状态;
  interface   IFACE_NAME:vrrp用于绑定vip的接口;
  virtual_router_id  #:当前VRRP实例的VRID,可用范围为0-255,默认为51;
  priority #:当前节点的优先级,可用范围0-255;
  advert_int 1:通告时间间隔;
  authentication {     # Authentication block 认证机制
PASS||AH
PASS - Simple Passwd (suggested)
AH - IPSEC (not recommended))
  auth_type PASS
Password for accessing vrrpd.
should be the same for all machines.
Only the first eight (8) characters are used.
  auth_pass 1234
  }
  virtual_ipaddress {
  / brd  dev  scope  label
  }
  track_interface{#定义要监控的接口
  eth0
  eth1
  }
  nopreempt:工作于非抢占模式(默认为抢占模式)
  定义通知脚本:
  vrrp_instance     {
  ...
  notify_master  |
  notify_backup  |
  notify_fault  |
  notify  |
  }
  示例脚本:
  #!/bin/bash
Author: MageEdu
Description: An example of notify script
  #
  contact='root@localhost'
  notify() {
  mailsubject=&quot;$(hostname) to be $1: vip floating&quot;
  mailbody=&quot;$(date +'%F %H:%M:%S'): vrrp transition, $(hostname) changed to be $1&quot;
  echo $mailbody | mail -s &quot;$mailsubject&quot; $contact
  }
  case $1 in
  master)
  notify master
  exit 0
  ;;
  backup)
  notify backup
  exit 0
  ;;
  fault)
  notify fault
  exit 0
  ;;
  *)
  echo &quot;Usage: $(basename $0) {master|backup|fault}&quot;
  exit 1
  ;;
  esac
  调用方法:
  vrrp_instance  {
  ...
  notify_master  &quot;/etc/keepalived/notify.sh master&quot;
  notify_backup  &quot;/etc/keepalived/notify.sh backup&quot;
  notify_fault  &quot;/etc/keepalived/notify.sh fault&quot;
  }
  注意:要使用双引号;
  ipvs服务定义方法:
  虚拟服务器:
  virutal_server  vip  port |
  virtual_server fwmark int  {
  ...
  }
  常用的参数:
  delay_loop      定义服务轮询时间间隔;
  lb_algo   rr|wrr|lc|wlc|lblc|sh|dh    定义负载均衡调度方法;
  lb_kind  NAT|DR|TUN   定义集群的类型
  persistence_timeout     持久连接时长;
  protocol TCP  服务协议;
  sorry_server      所有RS均故障时,提供say sorry的服务器;
  定义RS的方法:
  real_server    {
  ...
  }
  常用的参数:
  weight   权重;
  notify_up  | 节点上线时调用的通知脚本;
  notify_down  |  节点离线时调用的通知脚本;
  HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
  支持的所有健康状态检测方式;
  健康状态检测机制
  1、web应用层检测
  HTTP_GET|SSL_GET
  {
  ...
  }
  检测参数:
  url  {
  path   健康状态检测时请求的资源的URL;
  status_code    基于页面的状态码进行健康状态判定;
  digest 基于获取内容的摘要码进行健康状态判定;借助keepalived提供/usr/bin/genhash生成摘要码
  nb_get_retry :get请求的重试次数;
  delay_before_retry :两次重试之间的时间间隔;
  connect_timeout :连接超时时长,默认为5s;
  connect_ip :向此处指定的地址发测试请求;
  connect_port :向此处指定的端口发测试请求;
  bindto :指定测试请求报文的源IP;
  bindport :指定测试请求报文的源端口;
  warmup :健康状态检测延迟;
  }
  2、传输层健康状态检测(tcp协议层)
  TCP_CHECK
  {
  ...
  }
  检测参数:
  connect_timeout  
  其它:
  connect_ip
  connect_port
  bindto
  bind_port
  定义外部脚本来检测高可用功能依赖到的资源的监控
  vrrp_script  NAME  {
  script
  interval
  weight
  }
  在实例追踪定义脚本,用于作为实例的当前节点的监控机制
  track_script {
  NAME
  }
  监控关注的网络接口
  track_interface {
  IFACE_NAME
  }
  使用非抢占模式
  nopreempt
  使用延迟抢占模式
  preempt_delay  TIME
  vrrp_script:自定义一个资源监控脚本;vrrp实例能根据脚本状态返回值来
  公共定义,可被多个实例调用,因此定义在vrrp实例之外;
  track_script:调用vrrp_script定义的脚本去监控资源;
  定义在实例之内,调用事先定义好的vrrp_script;
  脚本实例:通过检测httpd服务是否正常的返回值来减少weight,达到ip漂移。
  vrrp_script chk_httpd {
  script &quot;killall -0 httpd&quot;
  interval 2
  weight -5
  }
  track_script {
  chk_httpd
  }
  然后可以借助通知脚本进一步扩展功能;
  调用方法:
  vrrp_instance  {
  ...
  notify_master  &quot;/etc/keepalived/notify.sh master&quot;
  notify_backup  &quot;/etc/keepalived/notify.sh backup&quot;
  notify_fault  &quot;/etc/keepalived/notify.sh fault&quot;
  }
  注意:要使用双引号;
  示例脚本:
  #!/bin/bash
Author: MageEdu
Description: An example of notify script
  #
  contact='root@localhost'
  notify() {
  mailsubject=&quot;$(hostname) to be $1: vip floating&quot;
  mailbody=&quot;$(date +'%F %H:%M:%S'): vrrp transition, $(hostname) changed to be $1&quot;
  echo $mailbody | mail -s &quot;$mailsubject&quot; $contact
  }
  case $1 in
  master)
  notify master
  exit 0
  ;;
  backup)
  notify backup
  exit 0
  ;;
  fault)
  notify fault
  exit 0
  ;;
  *)
  echo &quot;Usage: $(basename $0) {master|backup|fault}&quot;
  exit 1
  ;;
  esac


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623458-1-1.html 上篇帖子: 使用SCVMM2012R2从Server2008平台往Server2012R2迁移虚拟机 下篇帖子: mssql sqlserver SQL 位运算举例权限应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表