maxc1017 发表于 2018-12-30 11:49:26

Keepalived简介及安装

  1. 什么是Keepalived?
  keepalived是一个类似与layer3,4,5交换机制的软件,也就是我们平时说的第3,4,5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器集群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.
  2. Keepalived作用
  负载均衡方案
  高可用性HA
  实现对是小机器/服务的故障隔离
  负载均衡器间的失败切换failover,是通过VRRPv2(Virtual Router Redundancy Protocol) stack实现
  3. Keepalived体系结构
  Keepalived大致分为两层结构: 用户空间(User space)和内核空间(kernel space)
http://blog.运维网.com/e/u261/themes/default/images/spacer.gif
  WatchDog    负责监控checkers和VRRP进程的状况
  Checkers      负责真实服务器的健康检查healthchecking,是Keepalived最主要的功能.换句话说--可以没有VRRP Stack,但健康检查healthchecking是一定要有的.
  CRRP Stack      负责负载均衡器之间失败切换FailOver. 如果只用一个负载均衡器,则VRRP不是必须的.
  IPVS wrapper      用来发送设定的规则到内核ipvs代码
  Netlink Reflector      用来设定vrrp 的vip地址等
  3. Keepalived的安装
  # ln -s /usr/src/kernels/2.6.18-238.el5-i686/ /usr/src/linux
  ## 否则 Use IPVS Framework : No
  # ./configure --prefix=/opt/keepalived121/
  # make
  # make install
  # cd /opt/keepalived121/
  # 设置 service 方式启动服务
  # mkdir /etc/keepalived
  # cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
  # cp etc/sysconfig/keepalived /etc/sysconfig/
  # cp etc/keepalived/keepalived.conf /etc/keepalived/
  # cp sbin/keepalived /usr/sbin/
  #启动进程
  # service keepalived start
  Starting keepalived: [ OK ]
  # ps aux | grep keep
  root 15417 0.0 0.2 5032 576 ? Ss 19:58 0:00 keepalived -D
  root 15418 0.0 0.5 5104 1452 ? S 19:58 0:00 keepalived -D
  root 15419 0.0 0.3 5104 972 ? S 19:58 0:00 keepalived -D
  Keepalived正常运行时,共启动3个进程,其中一个进程是父进程,负责监控其子进程,一个是vrrp子进程,另外一个是checkers子进程.
  4. Keepalived的配置文件
  位置:
  # cat /etc/keepalived/keepalived.conf
  Keepalived的所有配置都在一个配置文件里设置,支持的配置项也比较多,可以分为三类:
  a. 全局配置(Global configuration)
  就是对整个Keepalived起作用的配置,不管是否使用LVS
  b. VRRPD配置
  是Keepalived的核心
  c. LVS配置
  只在使用Keepalived来配置和管理LVS时需要使用,如果仅使用Keepalived来做HA,LVS的配置完全是不需要的
  4.1 全局配置
  全局配置包括两个子配置: 全局定义(global definition), 静态地址路由(static ipaddress routes)
  A: 全局定义主要设置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.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
  }
  notification_email : 指定Keepalived在发生事件时,需要发送Email到的对象,可以有多个,每行一个
  smtp_* : 指定发送email的smtp服务器
  route_id : 运行Keepalived的机器的一个标识
  B: 静态地址和路由
  所谓静态,就是说不会随vrrpd instance的开/关的变化的,VIP就不是static的,会随着vrrp而添加/删除,这个配置可以用来给服务器配置静态的IP地址/路由
  静态地址和路由的配置结构:
  static_ipaddress {
  192.168.1.1/24 brd + dev eth0 scope global
  }
  static_routes {
  src $SRC_IP to $DST_IP dev $SRC_DEVICE
  .....
  src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
  }
  4.2 VRRPD配置
  VRRPD的配置也包括两个部分: VRRP同步组(synchronization group), VRRP实例(VRRP instance)
  A: VRRP同步组
  如果机器或路由有两个网段,一个内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么外网出现问题时,VRRPD认为自己仍然健康,那么不会发送Master和Backup的切换,sync group就是为了解决这个问题,可以把两个实例都放进一个sync group. 这样group里任何一个实例出现问题都会发生切换.
  VRRP同步组的配置结构:
  vrrp_sync_group VG_1 {
  group {
  inside_network
  outside_network
  }
  notify_master /path/to/to_master.sh
  notify_backup /path/to/to_backup.sh
  notify_fault "/path/fault.sh VG_1"
  notify /path/to/notify.sh
  smtp_alert
  }
  # notify_master : 指定当切换到master时,执行的脚本,这个脚本可以传入参数
  # smtp_alert : 使用global_defs里面定义的邮件地址和smtp服务器在切换后发送邮件通知
  B: VRRP实例
  VRRP实例表示在上面开启了VRRP协议,这个实例说明了VRRP的一些特性.
  VRRP实例的配置结构:
  vrrp_instance VI_1 {
  state MASTER# 实例的初始状态
  interface eth0# 实例绑定的网卡
  dont_track_primary# 忽略VRRP的interface错误
  lvs_sync_daemon_interface eth0# 绑定eth0作为lvs同步的
  track_interface {# 设置额外的监控,里面的任意一个出现问题,都会进入fault状态
  eth0
  eth1
  }
  mcast_src_ip # 发送多播包地址,默认使用绑定的网卡
  garp_master_delay 10# 在切换到master状态后,延迟进行gratuitous ARP请求
  virtual_router_id 51# VRID标记
  priority 100# 高优先级竞选为master,至少高backup 50
  advert_int 1# 检查间隔
  authentication {# 设置验证
  auth_type PASS# 认证方式,支持PASS和AH
  auth_pass 1111# 认证的密码
  }
  virtual_ipaddress {   # 虚拟IP
  # /brddevscopelabel
  192.168.200.16
  192.168.200.17
  192.168.200.18
  }
  }
  C: 检查服务是否正常配置:
  vrrp_script chk_http_port {
  script "killall -0 httpd"#检查httpd服务是否正常
  # script "/tcp/127.0.0.1/80"
  interval 1#检查时间间隔
  }
  使用:
  在vrrp_instance里面
  track_script {
  chk_http_port
  }
  4.3 LVS配置
  LVS的配置有两个部分: 虚拟主机组(virtual server group), 虚拟主机(virtual server)
  A: 虚拟主机组
  可选的,目的是为了让一台RealServer上的某个service可以属于多个virtual server并且只做一次健康检查
  virtual_server_group{
  # VIP port
  
  
  .....
  fwmark
  }
  B: 虚拟主机   --虚拟服务器定义部分
  virtual_server 10.10.10.3 1358 { # 设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
  delay_loop 3# 设置健康检查时间,单位是秒
  lb_algo rr # 设置负载调度算法
  lb_kind NAT # 设置LVS实现负载均衡的机制,可以有NAT,TUN和DR三个模式
  nat_mask 255.255.255.0
  persistence_timeout 50# 会话保持时间,单位的秒
  protocol TCP# 指定转发协议类型,有tcp和udp两种
  sorry_server# 备机IP端口,所有的real server失效后启用
  # 节点服务器配置部分
  real_server 192.168.200.4 1358 { # 配置服务节点,需要指定real server的真实IP地址和端口,ip与端口之间用空格隔开
  weight 1# 配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,
  # 设置权值的大小可以为不同性能的服务器分配不同的负载,
  # 可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值
  # 这样就合理的利用和分配了系统资源
  inhibit_on_failure# 健康检查失败后,将weight设置为0,不从IPVS里面删除
  TCP_CHECK {# realserver的状态检查设置部分,单位是秒
  connect_timeout 10# 10秒无响应超时
  nb_get_retry 3# 重试次数
  delay_before_retry 3# 重试间隔
  }
  HTTP_GET {
  url {
  path /testurl/test.jsp
  digest 640205b7b0fc66c1ea91c463fac6334d
  }
  url {
  path /testurl2/test.jsp
  digest 640205b7b0fc66c1ea91c463fac6334d
  }
  url {
  path /testurl3/test.jsp
  digest 640205b7b0fc66c1ea91c463fac6334d
  }
  connect_timeout 3
  nb_get_retry 3
  delay_before_retry 3
  }
  }
  }
  5. 测试
http://blog.运维网.com/e/u261/themes/default/images/spacer.gif
  clust3 -> keepalived.conf
  # cat /etc/keepalived/keepalived.conf
  ! Configuration File for keepalived
  global_defs {
  router_id Haweb_1
  }
  vrrp_sync_group VGM {
  group {
  VI_HA
  }
  }
  vrrp_instance VI_HA {
  state MASTER
  interface eth1
  lvs_sync_daemon_interface eth1
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  virtual_ipaddress {
  192.168.98.155/24 dev eth1
  }
  }
  clust4 -> keepalived.conf
  # cat /etc/keepalived/keepalived.conf
  ! Configuration File for keepalived
  global_defs {
  router_id Haweb_1
  }
  vrrp_sync_group VGM {
  group {
  VI_HA
  }
  }
  vrrp_instance VI_HA {
  state BACKUP
  interface eth1
  lvs_sync_daemon_interface eth1
  virtual_router_id 51
  priority 90
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  virtual_ipaddress {
  192.168.98.155/24 dev eth1
  }
  }
  # 查看日志输出
  # tail -f /var/log/messages
  # stop master/backup查看IP地址变化
  # ip a
  # cluster3 -> service keepalived stop
  # 浏览器输入 192.168.98.155 看现实的哪台服务器的页面内容
  # cluster3 -> service keepalived start
  # 浏览器输入 192.168.98.155 看现实的哪台服务器的页面内容
  问题:
  1. Keepalived抢占问题如何优化?
  两台服务器组成高可用集群,分别处于Master和Backup状态,当Master出现故障时由Backup来接管所有任务,那么当Master恢复时,Master会抢回所有权.虽然是高可用,但是对客户来说,来回的切换是比较烦恼的事.
  解决: 可将两服务器均设置成backup状态是因为 nopreempt(不抢占)只支持backup模式,而让那一台成为master,这个由优先级priority来决定

页: [1]
查看完整版本: Keepalived简介及安装