state BACKUP:在keepalived中2种模式,分别是master->backup模式和backup->backup模式。这两种模式有很大区别。在master->backup模式下,一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,还会把虚拟ip抢占过来,即便设置了非抢占模式(nopreempt)抢占ip的动做也会发生。在backup->backup模式下,当主库宕机后虚拟ip会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip,即便是优先级高于从库的优先级别,也不会发生抢占。前端
每一个服务器都叫作一个节点,集群节点之间是能够相互通讯的,通讯方式有两种:一种是基于RS232心跳线实现心跳监控,另外一种用一块单独的网卡来跑心跳。心跳就是用来判断集群每一个服务器之间网络、服务是否正常,判断方法就是用链接线,这个链接线能够是网卡,也能够是RS232,通常用网卡网线。
集群必须拥有这几个特性:1.服务实体的扩展功能,能够灵活的增长和剔除某个服务实体。2.当一个节点出现故障时,集群的另外一个节点能够自动接管故障节点资源。3.一个集群系统必须拥有共享的数据存储。
因此要构建一个集群系统,至少须要两台服务器,串口线、集群软件、共享存储设备(磁盘阵列)。mysql
① 高可用性与可扩展性(为知足需求动态加入节点)
高可用指的是24小时不间断使用,可扩展性指的是能知足需求动态加入节点。算法
② 负载均衡与错误恢复
负载均衡主要用于分流。而错误恢复指的是当一个任务在一个节点没有完成时由于某种缘由执行失败,此时 另外一个服务节点就会接着完成此任务,等出错的节点恢复好后从新回到这个集群。sql
③ 心跳检测与漂移IP地址
心跳检测是经过心跳线来实现的,能够作心跳线的能够有RS232串口线、独立网卡、共享磁盘阵列,心跳线的数量应该是集群节点数量减1,集群系统就是经过心跳技术保持着节点之间的内部有效通讯。
而漂移IP地址又叫作VIP,也就是虚拟IP,这个IP不是服务器固定的IP,可能一会在这个节点,也可能出如今另外一个节点。例如正常状况下VIP位于主节点上,当主节点出现故障后,漂移IP地址自动切换到备用节点,所以为了保证服务的不间断,在集群系统中对外提供的服务IP必定要是这个VIP,不然若是是节点自己对外提供服务的话,当该节点失效后服务切换到另外一个节点,可是服务IP还是故障IP地址。shell
① 高可用集群HA
常说的高可用集群有双机热备、双机互备、多机互备等,这类集群通常都有两个或者两个以上节点组成。咱们使用的高可用集群配置软件:keepalived
双机热备:是一台做为主服务器运行应用程序对外提供服务,另外一台做为备机,但不启动服务处于待机状态。主机备机经过心跳技术相互监控,监控的资源能够是网络、操做系统、也能够是服务。当备机监控到主机某个资源出现故障,就能够根据预先设定好的策略将IP、服务切换过来。
双机互备:两个相互独立的应用在两个机器上同时运行,互为主备。缺点是某个节点出现问题时,另外一个节点就同时运行两个应用的服务,有可能出现负载过大的状况。
多机互备:一主多备,当主机出现问题会根据选举机制把某个备机选出来使用。数据库
② 负载均衡集群
负载均衡集群是为了应对业务量大的状况,实现负载分流。他负载均衡集群也是有两台或者两台以上的服务器组成,分为前端负载调度和后端节点服务两个部分,负载调度部分负责把客户端的请求按照不一样的策略分配给后端服务节点,然后端节点是真正提供应用程序服务的部分。
与高可用集群相比,负载均衡集群中全部的后端节点都处于活动状态,都对外提供服务,分摊工做负载,从而把一个高负荷的应用分散到多个节点共同完成,适用于业务繁忙、大负荷的应用系统,可是又不足:当一个节点出现故障时,前端调度系统并不知道此节点已经不能提供服务,仍然会把客户端的请求调度到故障节点上来,因此为了解决这个问题,负载调度系统都会引入节点监控系统,前端调度系统就会把这个节点剔除,固然这里面可能会涉及一致性hash。
负载均衡集群能够经过软件方式实现,也能够由硬件设备来完成。Linux下典型的负载均衡软件又:开源LVS集群。硬件负载均衡器F5(贼贵)后端
在集群中又四个相关术语:节点、资源、事件和动做。节点就是服务器,资源就是一个节点能够控制的实体,当节点发生故障时,这些资源能够被其余节点接管。事件指的是集群中可能发生的事,例如网卡故障、应用程序故障等,而应用程序故障须要咱们写脚原本判断应用程序是否出现故障。动做指的是事件发生时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区域内的都是全局配置选项。
里面能够设置报警邮件地址、邮件的发送地址等信息,主要是报警的。app
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文件是否存在,存在就为正常不然异常。
第四种:经过脚本进行服务状态监控
benw
一个简单的实现mysql服务状态检测的shell脚本,它经过登录mysql数据库后执行查询操做来检测mysql运行是否正常,正常返回状态码0,不然为1。
咱们设置的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 } }1234567891011121314151617181920212223242526272829303132
若是须要编写监听脚本,这个脚本的做用是当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 }1234567891011
② 在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 } }1234567891011121314151617181920212223242526272829303132
而后启动两个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;123
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要确保没有被其余服务器所使用。
本文出自https://blog.csdn.net/qq_22996201/article/details/98091210