52037317 发表于 2018-10-1 09:20:13

keepalived高可用mysql一:判断服务并vip-16期一步一个坑

  简介:
  Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。这段话是截取自百科。既然说到这里一定要说说,keepalived特性:
  1,keepalived的是利用vip功能实现服务漂移,这是一种VRRP虚拟路由技术。VRRP协议在linux主机上以守护进程方式的实现;
  2,keepalived的主备node服务都需要启动。默认是高可用自身和你需要检查的服务。
  但是有些场景可能不适用,例如dhcp或dns。一个网络中不能有两个dhcp或dns,所以适用是要注意了。另外值得注意的是他的LVS功能,这是一个LVS加强版,keepalived具有LVS没有的状态检测功能。
  keepalived本身是没有资源管理层,只有心跳状态层。它实现管理管理是由脚本实现的
  注意:
  所有高可用的通性:ntp时间同步,本地dns相互解析。
  HA Cluster配置前提:
  1,本机的主机名与hosts中定义额主机名保持一致,要与hostname(uname -n)获得的名称保持一致
  contos 6: /etc/sysconfig/network
  contos 7:hostnamectl set-hostname HOSTNAME
  各节点要能互相解析主机名:一般建议通过hosts文件进行解析:
  2,各节点时间同步:
  3,确保iptables及seliux
  准备工作
  web1|web2
  编辑hosts文件
  172.16.90.130   web1.test.com web1
  172.16.90.140   web2.test.com web2
  查看hostname   uname -n
  date;ssh web2 ‘date’
  高可用httpd示例:
  global_defs {
  notification_email {
  nodesite1@163.com
  }
  notification_email_from nodesite1@163.com
  smtp_server smtp.163.com
  smtp_connect_timeout 30
  router_id node1
  vrrp_mcast_group4 224.0.0.18
  }
  vrrp_script chk_httpd {
  script "killall -0 mysql"#代码可以在复杂点
  interval 2
  weight -2
  }
  vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass JXLGOkFnS+8=
  }
  virtual_ipaddress {
  192.168.100.10/24 dev eth0 label eth0:0
  }
  track_script {
  chk_mysql
  }
  }
  启动日志
  两个节点各都要做响应的设置。启动服务后
  1,查看进程
  ps aux
  root       22320.00.2 1107441212 ?      Ss   09:29   0:00 /usr/sbin/keepalived -D
  root       22340.00.6 1129802936 ?      S    09:29   0:00 /usr/sbin/keepalived -D
  root       22350.00.4 1128482020 ?      S    09:29   0:00 /usr/sbin/keepalived -D
  2,查看ip
  eth0:0    Link encap:EthernetHWaddr 00:0C:29:B5:52:67
  inet addr:172.16.200.20Bcast:0.0.0.0Mask:255.255.0.0
  UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
  3,启动keepalived的日志文件默认是LOG_DOMAIN这个级别是没有的
  # keepalived -help
  Usage: keepalived
  -f, --use-file=FILE          Use the specified configuration file
  -P, --vrrp                   Only run with VRRP subsystem
  -C, --check                  Only run with Health-checker subsystem
  -l, --log-console            Log messages to local console
  -D, --log-detail             Detailed log messages 详细的日志消息
  -S, --log-facility=   Set syslog facility to LOG_LOCAL
  -V, --dont-release-vrrp      Don't remove VRRP VIPs and VROUTEs on daemon stop
  -I, --dont-release-ipvs      Don't remove IPVS topology on daemon stop
  -R, --dont-respawn         Don't respawn child processes
  -n, --dont-fork            Don't fork the daemon process
  -d, --dump-conf            Dump the configuration data
  -p, --pid=FILE               Use specified pidfile for parent process
  -r, --vrrp_pid=FILE          Use specified pidfile for VRRP child process
  -c, --checkers_pid=FILE      Use specified pidfile for checkers child process
  -x, --snmp                   Enable SNMP subsystem
  -v, --version                Display the version number
  -h, --help                   Display this help message
  #
  编辑/etc/sysconfig/keepalived
  KEEPALIVED_OPTIONS="-D -S 3"
  添加日志级别3   vim /etc/rsyslog.conf
  # Provides UDP syslog reception
  $ModLoad imudp
  $UDPServerRun 514
  # Provides TCP syslog reception
  $ModLoad imtcp
  $InputTCPServerRun 514
  local3.*                                                /var/log/keepalived
  查看进程
  tcp    LISTEN   0      25                  :::514                  :::*
  tcp    LISTEN   0      25                     *:514                   *:*
  4,指定检查脚本实现手动主备切换
  定义脚本两种不同的形式
  vrrp_script chk_schedown {    #
  script "[[ -f /etc/keepalived/down ] ] &&exit 1 || exit0 " #检查文件是否存在,存在返回为返回0权重-2
  interval 2   每隔两秒钟执行一次
  weight -2 一旦命令失败,权重降低2 (文件不存在返回1 就是失败)
  }
  vrrp_script chk_schedown {
  script "/root/***jiance.sh"
  interval 2
  weight -2
  }
  #!/bin/bash
  #
  [[ -f /etc/keepalived/down ]] && exit 1 || exit 0
  在虚拟路由实例中调用
  vrrp_instance VI_1 {
  track_script {#这是一个检测脚本的方法
  chk_schedown
  }
  }
  说明:
  track_script指定检查脚本,定期运行它们来改变优先级,并最终引发主备切换。
  下面是手册中未更新的两个小功能:
  1、vrrp_script和track_script
  track_script指定检查脚本,定期运行它们来改变优先级,并最终引发主备切换。如果配过交换机的vrrp/hsrp部分的话,应该对这个功能比较熟悉
  2、notify_stop
  keepalived停止运行前运行notify_stop指定的脚本
  下面是我这边应用上面两个功能介绍:
  1、两台双master台数据库,用keepalivd的vrrp模式给客户端提供一个HA的虚拟IP
  这个要求检查mysql数据库的状态,如果mysql出现问题,就降低优先级,这样虽然机器正常,也会引发新一轮的master选举,以保证mysql服务的高可用性
  先定义两个检查脚本
  vrrp_script chk_mysqld {
  script "/usr/bin/mysqladmin -u ganglia extended-status -pganglia_status | grep -q Slave_running"
  interval 10# check every 10 seconds
  weight -40   # if failed, decrease 40 of the priority
  fall   3   # require 2 failures for failures
  rise   1   # require 1 sucesses for ok
  }
  vrrp_script chk_schedown {#chk_NAME名字可以自己定义
  script "if [ -f /var/run/down ]; then exit 1; else exit 0; fi"成功返回1失败返回0
  interval 10# check every 10 seconds
  weight -40   # if failed, decrease 40 of the priority
  fall   1   # require 2 failures for failures
  rise   1   # require 1 sucesses for ok
  }
  上面的chk_schedown脚本,给管理员提供一个切换的地方,如果管理员在master上手工touch /var/run/down,这样,流量会比这台机器上切走了。
  在vrrp对应的地方使用它
  vrrp_instance VI_1 {
  track_script {
  chk_mysqld
  chk_schedown
  }
  }
  2、为一些后台cron脚本提供高可用性
  有些后台脚本,如给用户发短信或邮件,它需要在一台机器上运行,但是不能同时在多台机器上运行。如果只配在某台机器上,当它出现问题的时候,这些后台脚本就停止运行了。
  这边的做法是,利用notify和notify_stop脚本,在MASTER机器上生成一个状态文件,所有机器都配同样的cron配置和定时运行同样的脚本,不同的是脚本在运行时首先检查是不是master,如果不是,则直接退出。这样多台机器都会定期运行后台脚本,但只有一台真正执行。
  注意:做LVS时候一定要把把DIP和VIP统一接口,同时流动
  LVS实现利用了同步组(同步组一般用于一次同步多个ip资源时)
  定义同步组VRRP synchronization group
  vrrp_sync_group VG_1 {#定义一个同步组
  group { #这个组调用了哪些实例
  VI_1
  VI_2
  ...
  }
  }
  vrrp_instance VI_1 {
  eth0
  VIP
  }
  vrrp_instance VI_2{
  eth1
  DIP
  }
  keeplived配置文件详解
  VRRP协议在linux主机上以守护进程方式的实现;
  能够根据配置文件自动生成ipvs规则
  对各RS做健康状态检测
  组件
  vrrp stack
  checkers   检查
  ipvs wrapper
  配置文件
  global configuration全局配置
  vrrpd configuration
  vrrp intstancevrrp实例
  vrrp synchonizayion group 同步组
  lvs configuration
  Global definitions

  global_defs         # Block>  {
  notification_email    # 通知邮箱定义   三个邮箱
  {
  admin@example1.com
  ...
  }
  # From: from address that will be in header
  notification_email_from admin@example.com   发件人
  smtp_server 127.0.0.1      # IP   邮件服务器地址
  smtp_connect_timeout 30      # integer, seconds

  router_id my_hostname      # string>  # (doesn’t have to be hostname).
  vrrp_mcast_group4 224.0.0.18 # optional, default 224.0.0.18定义了多播组地址
  vrrp_mcast_group6 ff02::12   # optional, default ff02::12
  enable_traps               # enable SNMP traps
  }
  vrrp_instance VI_NAME {    #vrrp实例定义虚拟路由,如果有多个实例,实例名称应该不同
  state MASTER         #Initial state, MASTER|BACKUP定义初始状态。优先级最高的将成为master
  interface eth0   #vip配置在哪个接口别名上
  use_vmac#指定VMAC.默认固定格式前五段+VRID后
  virtual_router_id 51   #定义了虚拟路由器的id(VRID)一组实例虚拟路由器应该唯一
  priority 100         #定义优先级
  advert_int 1   #通告广播心跳每个多秒发送一次心跳
  mcast_src_ip   #多播时指明多播源地址 224.0.0.0~239.255.255.255
  unicast_src_ip #单播时指明单播源地址
  authentication {       #认证
  auth_type PASS   #认证(简单字符认证)同一个实例密钥应该一样
  auth_pass 1111   #8位密钥
  }
  track_interface {       #多接口监控,接口出现故障也可以转移
  eth0
  eth1
  ...
  }
  virtual_ipaddress {      #定义VRIP 多种不同的形式,可以定义多个 可以指定掩码 广播地址 设备 作用域 接口别名
  / brddevscopelabel      #scope 作用域
  192.168.200.17/24 dev eth1
  192.168.200.18/24 dev eth2 label eth2:1
  192.16.200.19
  }
  virtual_ipaddress_excluded {#被排除的VRIP地址
  / brddevscope
  / brddevscope
  ...
  }
  virtual_routes {#定义虚拟路由
  # src / via|gw devscopetab
  src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
  192.168.110.0/24 via 192.168.200.254 dev eth1
  192.168.111.0/24 dev eth2
  192.168.112.0/24via192.168.100.254       192.168.113.0/24via192.168.200.254or   192.168.100.254   dev   eth1blackhole 192.168.114.0/24
  }
  nopreempt   #工作在非抢占模式。默认是抢占模式
  }
  简单实现一个互为主备实例:
  web1
  vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 8ab998cd
  }
  virtual_ipaddress {
  172.16.200.20/16 dev eth0 label eth0:0
  }
  track_script {
  chk_schedown1
  }
  }
  vrrp_instance VI_2 {
  state BACKUP
  interface eth0
  virtual_router_id 50
  priority 99
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 8eb998cd
  }
  virtual_ipaddress {
  172.16.200.30/16 dev eth0 label eth0:1
  }
  track_script {
  chk_schedown2
  }
  }
  --------------------
  web2
  vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 99
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 8ab998cd
  }
  virtual_ipaddress {
  172.16.200.20/16 dev eth0 label eth0:0
  }
  track_script {
  chk_schedown1
  }
  }
  vrrp_instance VI_2 {
  state MASTER
  interface eth0
  virtual_router_id 50
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 8eb998cd
  }
  virtual_ipaddress {
  172.16.200.30/16 dev eth0 label eth0:1
  }
  track_script {
  chk_schedown2
  }
  }
  注意:一定要设置一个状态检测方法,实现状态监管。
  注意每一个实例要一个多播地址;如果你有两个实例,全局配置里面最好不要加多播地址,或者你在每一个实例里面设置一个多播地址。又或者不要设置多播地址,这样多播地址是会自动选择的。
  web1 上监听web2 WRRv2报文
  tcpdump -nn -i eth0 host web2 -n
  邮件发送报警功能
  可以定义通知组
  VRRP synchronization group(s)
  #string, name of group of IPs that failover together
  vrrp_sync_group VG_1 {
  # notify scripts and alerts are optional
  #
  # filenames of scripts to run on transitions
  # can be unquoted (if just filename)
  # or quoted (if has parameters)
  # to MASTER transition
  notify_master /path/to_master.sh
  # to BACKUP transition
  notify_backup /path/to_backup.sh
  # FAULT transition
  notify_fault "/path/fault.sh VG_1"
  # for ANY state transition.
  # "notify" script is called AFTER the
  # notify_* script(s) and is executed
  # with 3 arguments provided by keepalived
  # (ie don’t include parameters in the notify line).
  # arguments这个脚本能接受的三个参数
  # $1 = "GROUP"|"INSTANCE"
  # $2 = name of group or instance
  # $3 = target state of transition
  #   ("MASTER"|"BACKUP"|"FAULT")
  notify /path/notify.sh
  # Send email notifcation during state transition,
  # using addresses in global_defs above.
  smtp_alert
  }
  在VI中的主机状态发生改变时发送通知
  vrrp_instance VI_NAME {
  # notify scripts, alert as above
  notify_master |   只有当前节点转换成MASTER才发送指定信息
  notify_backup |
  notify_fault |fault出现故障
  notify |只要状态发生改变就发送
  smtp_alert
  }
  vrrp_instance VI_NAME {
  # notify scripts, alert as above   #通告信息
  notify_master "/etc/keepalived/notify.sh master"
  notify_backup "/etc/keepalive/notify.sh backup"
  notify_fault "/etc/keepalive/notify.sh fault"
  }
  LVS配置
  LVS CONFIGURATION
  contains subblocks of Virtual server group(s) and Virtual server(s)
  Virtual server(s)
  A virtual_server can be a declaration of one of
  vip vport (IPADDR PORT pair)#ip+端口
  fwmark #防火墙标记
  (virtual server) group
  #setup service
  virtual_server IP port |
  virtual_server fwmark int |
  virtual_server group string
  {
  delay_loop 向RS发送健康状态多少次探查命令
  lb_algo rr|wrr|lc|wlc|lblc|sh|dh
  ops   #Enable One-Packet-Scheduling for UDP#每一个UDP报文单独调度
  lb_kind NAT|DR|TUN
  persistence_timeout#持久时长。0就是不持久链接
  protocol TCP#支持哪种协议如果要使用UDP就要ops
  ha_suspend如果没有设置VS IP就不做健康状态监测
  virtualhost #定义虚拟主机 VirtualHost string for HTTP_GET or SSL_GET
  sorry_server
  real_server   定义虚拟服务中的RS
  {
  weight
  inhibit_on_failure
  notify_up |   #通告脚本
  notify_down |
  # pick one healthchecker几种健康状态监测
  # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
  # HTTP and SSL healthcheckers
  HTTP_GET|SSL_GET    #http|https
  {
  url {
  #eg path / , or path /mrtg2/
  path
  # healthcheck needs status_code
  # or status_code and digest
  # Digest computed with genhash
  # eg digest 9b3a0c85a887a256d6939da88aabd8cd
  digest   通过获取资源的md5效验码,进行检测
  # status code returned in the HTTP header
  # eg status_code 200
  status_code通过响应报文状态码,进行检测
  }
  nb_get_retry重试多少次
  delay_before_retry 每一次重试等待多少时间
  connect_ip指明对哪个ip做健康状态检测
  connect_port指明检测端口
  bindto通过ipvs的哪个ip去检测健康状态
  bind_port 通过ipvs的哪个端口
  connect_timeout   链接超时时间
  fwmark定义fwmark检测
  warmup 分散检测,每一次检测多少个节点
  }
  TCP_CHECK基于tcp的健康状态监测
  {
  connect_ip
  connect_port
  bindto
  bind_port
  connect_timeout
  fwmark
  warmup
  }
  注意real_server是有指定ip和端口的。但是检测的时候还是要指定ip和端口是为了日志记录不混淆
  57336
  定义sorry server
  virtual_server IP port | {
  sorry_server
  }

页: [1]
查看完整版本: keepalived高可用mysql一:判断服务并vip-16期一步一个坑