keepalived应用:漂移IP的实现

1.集群的介绍

  每个服务器都叫做一个节点,集群节点之间是可以相互通信的,通信方式有两种:一种是基于RS232心跳线实现心跳监控,另一种用一块单独的网卡来跑心跳。心跳就是用来判断集群每个服务器之间网络、服务是否正常,判断方法就是用连接线,这个连接线可以是网卡,也可以是RS232,一般用网卡网线。
  集群必须拥有这几个特性:1.服务实体的扩展功能,可以灵活的增加和剔除某个服务实体。2.当一个节点出现故障时,集群的另一个节点可以自动接管故障节点资源。3.一个集群系统必须拥有共享的数据存储。
  所以要构建一个集群系统,至少需要两台服务器,串口线、集群软件、共享存储设备(磁盘阵列)。

1.1 集群有的特点与功能

① 高可用性与可扩展性(为满足需求动态加入节点)
  高可用指的是24小时不间断使用,可扩展性指的是能满足需求动态加入节点。

② 负载均衡与错误恢复
负载均衡主要用于分流。而错误恢复指的是当一个任务在一个节点没有完成时因为某种原因执行失败,此时  另一个服务节点就会接着完成此任务,等出错的节点恢复好后重新回到这个集群。

③ 心跳检测与漂移IP地址
  心跳检测是通过心跳线来实现的,可以做心跳线的可以有RS232串口线、独立网卡、共享磁盘阵列,心跳线的数量应该是集群节点数量减1,集群系统就是通过心跳技术保持着节点之间的内部有效通信。
  而漂移IP地址又叫做VIP,也就是虚拟IP,这个IP不是服务器固定的IP,可能一会在这个节点,也可能出现在另一个节点。例如正常情况下VIP位于主节点上,当主节点出现故障后,漂移IP地址自动切换到备用节点,因此为了保证服务的不间断,在集群系统中对外提供的服务IP一定要是这个VIP,否则如果是节点本身对外提供服务的话,当该节点失效后服务切换到另一个节点,但是服务IP仍是故障IP地址。

1.2 集群的分类

① 高可用集群HA
  常说的高可用集群有双机热备、双机互备、多机互备等,这类集群一般都有两个或者两个以上节点组成。我们使用的高可用集群配置软件:keepalived
在这里插入图片描述
  双机热备:是一台作为主服务器运行应用程序对外提供服务,另一台作为备机,但不启动服务处于待机状态。主机备机通过心跳技术相互监控,监控的资源可以是网络、操作系统、也可以是服务。当备机监控到主机某个资源出现故障,就可以根据预先设定好的策略将IP、服务切换过来。
  双机互备:两个相互独立的应用在两个机器上同时运行,互为主备。缺点是某个节点出现问题时,另一个节点就同时运行两个应用的服务,有可能出现负载过大的情况。
  多机互备:一主多备,当主机出现问题会根据选举机制把某个备机选出来使用。

② 负载均衡集群
  负载均衡集群是为了应对业务量大的情况,实现负载分流。他负载均衡集群也是有两台或者两台以上的服务器组成,分为前端负载调度和后端节点服务两个部分,负载调度部分负责把客户端的请求按照不同的策略分配给后端服务节点,而后端节点是真正提供应用程序服务的部分。
  与高可用集群相比,负载均衡集群中所有的后端节点都处于活动状态,都对外提供服务,分摊工作负载,从而把一个高负荷的应用分散到多个节点共同完成,适用于业务繁忙、大负荷的应用系统,但是又不足:当一个节点出现故障时,前端调度系统并不知道此节点已经不能提供服务,仍然会把客户端的请求调度到故障节点上来,所以为了解决这个问题,负载调度系统都会引入节点监控系统,前端调度系统就会把这个节点剔除,当然这里面可能会涉及一致性hash。
  负载均衡集群可以通过软件方式实现,也可以由硬件设备来完成。Linux下典型的负载均衡软件又:开源LVS集群。硬件负载均衡器F5(贼贵)

2. HA集群软件Keepalived

  在集群中又四个相关术语:节点、资源、事件和动作。节点就是服务器,资源就是一个节点可以控制的实体,当节点发生故障时,这些资源可以被其他节点接管。事件指的是集群中可能发生的事,例如网卡故障、应用程序故障等,而应用程序故障需要我们写脚本来判断应用程序是否出现故障。动作指的是事件发生时HA的响应方式,动作由shell脚本控制的,例如当一个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务的关闭或启动,进而接管故障节点的资源。
  Keepalived主要通过虚拟路由冗余来实现高可用功能。他一方面具有服务器状态检测和故障隔离功能,另一方面也具有高可用集群的功能(主要因为VRRP虚拟路由器冗余协议)。

① VRRP协议与工作原理
  在现实网络环境中,主机之间的通信都是通过配置静态路由来完成的,但是一旦主机之间的路由器出现故障通信就会失败。因此引入了VRRP协议。
  VRRP就是一种主备模式的协议,通过VRRP可以在网络发生故障时透明地进行设备切换而不影响主机之间的数据通信,这里引入两个概念:物理路由器和虚拟路由器。
  VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务。在虚拟路由器内部,同一时间只有一台物理路由器在对外提供服务,这台物理路由器被称为主路由器(MASTER),一般而言MASTER通过选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能。而其他物理路由器不拥有对外的虚拟IP,仅仅接收MASTER的VRRP状态通告信息,这部分路由器叫做备份路由器。当主路由器失效的时候,备份路由器重新进行选举,产生一个新的路由器成为MASTER。

② Keepalived的配置
  Keepalived的配置分为三类,分别是全局配置、VRRPD配置和LVS配置。
全局配置HA配置:
在这里插入图片描述
  全局配置以“global_defs”作为标识,在global_defs区域内的都是全局配置选项。
  里面可以设置报警邮件地址、邮件的发送地址等信息,主要是报警的。

VRRPD配置:
  a. vrrp_sync_group
  VRRPD配置是Keepalived所有配置的核心,主要来实现高可用的。VRRPD配置又分为VRRP同步组配置和VRRP实例配置。同步组是相对于多个VRRP实例而言的,把所有的VRRPD实例都加入到同步组中,这样任何一个实例出现问题都会导致keepalived进行主备切换。下面是同步组:
在这里插入图片描述
  其中G1同步组包含了三个实例,G2包含了2个实例,这五个实例都会在vrrp_instance段中进行定义。除此之外,还有三个nofify的通知机制。
  notify_master:指定当Keepalived进入Master状态时要执行的脚本,这个脚本可以是一个状态报警脚本。
  notify_bacup:当keepalived进入备机backup状态时要执行的脚本
  notify_fault:进入fault状态时要执行的脚本。
  notify_stop:进入终止状态时执行的脚本。

  下面是实例组的配置。

  b. vrrp_instance
在这里插入图片描述
  VRRP实例段主要用来配置节点角色(主或从)、实例绑定的网络接口、节点间验证机制、集群服务IP等。这里只给了一部分的配置。
  vrrp_instance:是vrrp实例开始的标志,后面跟vrrp实例名称。
  State:指定keepalived的角色,分为MASTER和BACKUP。
  Virtual_router_id:是虚拟路由标识,是一个数字,主机和备机的Virtual_router_id一定是一样的,一样的就可以统一认为在一个集群里(例如上面的3台机器)。
  Virtual_ipaddress:其中还有一个比较重要的设置虚拟IP地址(VIP),又叫做漂移ip地址。可以设置多个虚拟IP地址,当keepalived切换到master状态时,vip就会自动添加到系统中,切换到BACKUP状态时,vip又会自动从系统中删除。
  nopreempt:配置在主节点上配置,设置高可用集群中的不抢占功能。也就是当主节点出现问题后备机接上,我们希望的是当之前的主机修好之后服务不会切回来。
  advent_int:设定MASTER与BACKUP主机之间同步检查时间间隔。

  c. vrrp_script模块(监控模块)
  第一种:用killall -0的方式来进行监控
  这个模块专门用于对集群中服务资源进行监控。与此模块一起使用的还有track_script模块,track_script模块用于调用vrrp_script模块来实现对集群资源的检测。这里需要注意的是,vrrp_script是单独的一个模块,而track_script属于某一个实例vrrp_instance当中的。一般而言,我们通过killall -0来实现检测,当我们killall的时候,是用来关闭进程的,我们这里要用到的是kill -0,这是标识对程序进程的运行状态进行监控,如果发现进程关闭或者其他异常,将返回状态码1,反之如果发现进程运行正常,将返回状态吗0.即可以通过监控脚本的返回状态来识别服务器是否正常。代码如下:
在这里插入图片描述
  这里例子就是定义了一个服务监控模块check_mysqld,采用的监控方式就是killall -0 mysqld方式,时间间隔是2秒。当主的mysql关闭时,返回状态码1,然后就会根据vrrp_script模块中设定的weight值重新设置keepalived主备优先级发生主备切换。

  第二种:还可以通过检查端口运行状态也是最常见的服务监控方式
在这里插入图片描述
  检测本机的80端口,当检测到失败最大次数为2时标识发生故障进行切换操作。Rise标识请求成功一次就认为此节点资源恢复正常。

  第三种:通过shell语句进行状态监控
在这里插入图片描述
  通过一个shell判断语句,检测httpd.pid文件是否存在,存在就为正常否则异常。

  第四种:通过脚本进行服务状态监控
在这里插入图片描述
  一个简单的实现mysql服务状态检测的shell脚本,它通过登陆mysql数据库后执行查询操作来检测mysql运行是否正常,正常返回状态码0,否则为1。

3. keepalived实现mysql故障转移高可用

  我们设置的master1: 172.26.0.8 master2: 172.26.0.7 漂移ip:172.26.0.13

① master1机器上的keepalived.conf配置

! 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 192.168.200.1  #发送email的smtp地址
   smtp_connect_timeout 30   #超时时间
   router_id lb01   #运行Keepalived的机器标识号,主从机必须不同
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0     #指定虚拟ip的网卡接口
    virtual_router_id 100    #路由器标识,MASTER和BACKUP必须是一致的
    priority 150    #定义优先级,数字越大,优先级越高。
    unicast_src_ip  172.26.0.8    #本地IP地址
    unicast_peer {
                  172.26.0.7   #对端IP地址,此地址一定不能忘记
                }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.26.0.13   #虚拟ip
    }
}

  如果需要编写监听脚本,这个脚本的作用是当mysql服务挂掉后关闭keepalived服务。可以添加参数实现这个功能:

vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等
    script "/opt/chk_mysql.sh"   #这里通过脚本监测
    interval 2      #脚本执行间隔,每2s检测一次
    weight -5      #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1      #检测1次成功就算成功。但不修改优先级
}
             
track_script {  #再vrrp_instance VI_1中             
   chk_mysql_port             
}

② 在master2机器上的keepalived.conf配置 ip为172.26.0.7

! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    unicast_src_ip  172.26.0.7
    unicast_peer {
                  172.26.0.8
                 }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
         172.26.0.13
    }
}

  然后启动两个master的keepalived。service keepalived start,之后也是编写脚本。这里需要注意的是master2的权值priority一定要小于master1。在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来。
  配置好后,我们在172.26.0.16主机端通过ip add|grep 172可以看到两个ip,一个是本机的,一个是挂在的漂移ip。
  只有当主机宕机了,漂移Ip就会挂在到从机上,直到恢复。
  这里特别注意,在配置的时候unicast_src_ip和unicast_peer一定要手动配置,否则会出现漂移ip挂载两台服务器上的情况,这是因为在服务器网络环境中,路由交换层禁用了ARP的广播限制,造成KEEPALIVE主备协议无法通过广播的方式进行通信,造成主备两台服务器都强占HAVIP地址,出现同时两台服务器都有VIP地址的情况出现,必须通过配置来指定IP的两台服务器间进行通讯。
  state BACKUP:在keepalived中2种模式,分别是master->backup模式和backup->backup模式。这两种模式有很大区别。在master->backup模式下,一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,还会把虚拟ip抢占过来,即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。在backup->backup模式下,当主库宕机后虚拟ip会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip,即使是优先级高于从库的优先级别,也不会发生抢占。

③ 在两台master的Mysql中允许root用户远程访问权限。
  进入到mysql,然后grant all privileges on . to root@’%’ identified by “password”,则之后再第三台测试机登陆时就用root登陆,密码是password。
  但这里需要注意的是,这里的grant方法是mysql5.7的,在mysql8.0后,不能用原来的命令(同时创建用户和赋权),必须先创建用户,再授权:

mysql>create user lianjie@'%' identified  by 'password';
mysql>grant all privileges on *.* to lianjie@'%' with grant option;
最后刷新一下:mysql>flush privileges;

  select user,host from mysql.user; 可以查看所有用户和权限
④ 防火墙关闭
⑤ 测试高可用
  这样就可以用第三台测试机通过漂移ip用root用户访问进数据库,此时访问的就是权值最大的master1,当我们的master1挂掉后就会发现漂移ip变到matser2上了。
  mysql -h172.26.0.13 -ulianjie -pz5482681b
  查看飘移ip的挂在情况的命令:ip addr。
在这里插入图片描述
  想要让用户可以被远程访问,则host必须是%或者在创建用户的时候@‘10.10.10.10’这样设置好被远程访问的ip。%意味着本机localhost和远程都可以访问。
  注意: 我们设置的漂移ip一定要和服务器在一个网段里,其次,我们设置的漂移ip要确保没有被其他服务器所使用。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值