接上一篇文章http://www.cnblogs.com/wt645631686/p/8310891.html,虽然已经在原有两台mycat基础上增加了Haproxy作为mycat的中间服务器,不足的是,如果仅仅的一台Haproxy服务器宕机掉,整个架构也就没法运行。

一、准备两台Haproxy服务器

图解说明:
(1) HAProxy 实现了 Mycat 多节点的集群高可用和负载均衡, 而 HAProxy 自身的高可用则可以通过Keepalived 来实现。 因此, HAProxy 主机上要同时安装 HAProxy 和 Keepalived, Keepalived 负责为该服务器抢占 vip(虚拟 ip,图中的 192.168.9.190),抢占到 vip 后,对该主机的访问可以通过原来的 ip(192.168.9.174)访问,也可以直接通过 vip(192.168.9.190)访问。
(2) Keepalived 抢占 vip 有优先级, 在 keepalived.conf 配置中的 priority 属性决定。但是一般哪台主机上的 Keepalived服务先启动就会抢占到 vip,即使是 slave,只要先启动也能抢到(要注意避免 Keepalived的资源抢占问题)。
(3) HAProxy 负责将对 vip 的请求分发到 Mycat 集群节点上, 起到负载均衡的作用。 同时 HAProxy 也能检测到 Mycat 是否存活, HAProxy 只会将请求转发到存活的 Mycat 上。
(4) 如果 Keepalived+HAProxy 高可用集群中的一台服务器宕机, 集群中另外一台服务器上的 Keepalived会立刻抢占 vip 并接管服务, 此时抢占了 vip 的 HAProxy 节点可以继续提供服务。
(5) 如果一台 Mycat 服务器宕机, HAPorxy 转发请求时不会转发到宕机的 Mycat 上,所以 Mycat 依然可用。
综上: Mycat 的高可用及负载均衡由 HAProxy 来实现,而 HAProxy 的高可用,由 Keepalived 来实现。

关于haproxy的配置这里不作说明,根据上一篇文章的步骤配置完成之后,以最快的方式clone一台haproxy就可以了,本篇文章分别是192.168.9.174和192.168.9.175,然后修改一下第二台的配置文件

# vim /usr/local/haproxy/conf/haproxy.cfg
//把global组中的node和description分别修改为02
node edu-haproxy- ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时
description edu-haproxy- ## 当前实例的描述信息

访问一下haproxy的管理页面,发现两个都正常

二、在已安装好 Haproxy 的两个虚拟机上分别安装 Keepalived

# yum install -y keepalived //这里是yum方式
# keepalived -v //查看版本
Keepalived v1.2.13 (/,)
# chkconfig keepalived on //设置开机启动

三、编写 Haproxy 监控脚本

该脚本检测 Haproxy 的运行状态,并在 Haproxy 进程不存在时尝试重新启动 Haproxy ,如果启动失败则停止 keepalived,准备让其它机器接管。

# vim /etc/keepalived/check_haproxy.sh  //添加如下内容保存
#!/bin/sh
if [ $(ps -C haproxy --no-header | wc -l) -eq ]; then
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
fi sleep
if [ $(ps -C haproxy --no-header | wc -l) -eq ]; then
killall keepalived
fi
# chmod +x /etc/keepalived/check_haproxy.sh  //给脚本授权

四、Haproxy + Keepalived 的配置

将192.168.9.174这台服务器上运行的 Haproxy 作为主要的 Haproxy
将192.168.9.175这台服务器上运行的 Haproxy 作为备用的 Haproxy

分别查看一下网卡,我这里主机是eth4,备机是eth5,会用在keepalived配置中

修改主机的keepalived配置文件

! 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
router_id edu-haproxy- ##在当前的haproxy服务配置中有命名
} ## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
## 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
## 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少。
## 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。 vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh" ## 检测haproxy状态的脚本路径
interval ## 检测时间间隔
weight ## 如果条件成立,权重+
} ## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP ##这一项主从都用BACKUP,MASTER会出现问题,会出现抢占的问题,如果主节点宕机掉,然后切换到备节点,如果主节点起来的话主节点就会把VIP抢占。这样就由优先级(priority)来控制同时启动情况下的默认主备,否则先启动的为主设备
interface eth4 ## 绑定虚拟IP的网络接口,与本机IP地址所在的网络接口相同,我的是eth4
virtual_router_id ## 虚拟路由的ID号,两个节点设置必须一样,因为属于同一个组,不同组的id一定不要一样,否则冲突
priority ## 节点优先级,值范围0-,MASTER要比BACKUP高,万一同时启动呢,一定要有一个高低之分
nopreempt ## 主设备(priority值大的)配置一定要加上nopreempt,否则非抢占也不起作用
advert_int ## 组播信息发送间隔,就是两个虚拟路由节点之间会通过组播检测对方是否正常,如果一个有问题,另一个会抢占vip,这里间隔1秒,时间太长可能会出现系统中断 ## 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass
} ## 将track_script块加入instance 配置块
track_script {
chk_haproxy ## 检查HAProxy服务是否存活
} ## 虚拟IP池, 两个节点设置必须一样
virtual_ipaddress {
192.168.9.190 ## 虚拟ip,可以定义多个,每行一个
}
}

修改备机的keepalived配置文件

! 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
router_id edu-haproxy- ##在当前的haproxy服务配置中有命名
} ## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
## 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
## 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少。
## 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。 vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh" ## 检测haproxy状态的脚本路径
interval ## 检测时间间隔
weight ## 如果条件成立,权重+
} ## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP ##这一项主从都用BACKUP,MASTER会出现问题,会出现抢占的问题,如果主节点宕机掉,然后切换到备节点,如果主节点起来的话主节点就会把VIP抢占。这样就由优先级(priority)来控制同时启动情况下的默认主备,否则先启动的为主设备
interface eth5 ## 绑定虚拟IP的网络接口,与本机IP地址所在的网络接口相同,我的是eth4
virtual_router_id ## 虚拟路由的ID号,两个节点设置必须一样,因为属于同一个组,不同组的id一定不要一样,否则冲突
priority ## 节点优先级,值范围0-,MASTER要比BACKUP高,万一同时启动呢,一定要有一个高低之分 //这里一定要比主机小
advert_int ## 组播信息发送间隔,就是两个虚拟路由节点之间会通过组播检测对方是否正常,如果一个有问题,另一个会抢占vip,这里间隔1秒,时间太长可能会出现系统中断 ## 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass
} ## 将track_script块加入instance 配置块
track_script {
chk_haproxy ## 检查HAProxy服务是否存活
} ## 虚拟IP池, 两个节点设置必须一样
virtual_ipaddress {
192.168.9.190 ## 虚拟ip,可以定义多个,每行一个
}
}

特别注意: 如果非抢占模式不生效, 在 Keepalived 的故障节点恢复后会再次导抢占 vip,从而因 vip 切换而闪断带来的风险。 按以上配置,配置了 Keepalived 非抢占模式, 配置及注意点如下:
(1) 主设备、 从设备中的 state 都设置为 BACKUP
(2) 主设备、从设备中都不要配置 mcast_src_ip (本机 IP 地址)
(3) 默认主设备(priority 值大的 Keepalived 节点) 配置一定要加上 nopreempt,否则非抢占不起作用
(4) 防火墙配置允许组播

# iptables -I INPUT -i eth4 -d 224.0.0.0/ -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth4 -d 224.0.0.0/ -p vrrp -j ACCEPT
# service iptables save
# service iptables restart

五、启动keepaived,并验证

# service keepalived start
Starting keepalived: [ OK ]
# ip add  //分别查看ip信息

查看主机的ip信息

查看备机的ip信息,无论如何没有出现192.168.9.190,因为是非抢占模式

六、测试最终效果

a、关掉主机的keepalived服务,然后查看ip信息,发现190已经被切换

b、关掉其中一台机器的haproxy服务,查看状态发现状态仍然运行,是因为脚本的作用

c、关掉当前访问的keepalived服务,并终止当前服务器haproxy服务,通过url访问http://192.168.9.190:48800/admin-status#mycat_servers/mycat_02,发现Statistics Report for pid 3128 切换了pid

d、通过Mysql终端访问192.168.9.190,# mysql -uroot -p123456 -h192.168.9.190 -P3307,发现效果理想

OK~完毕~

高可用Mysql架构_Haproxy+keepalived+mycat集群的配置的更多相关文章

  1. 高可用Mysql架构_Mycat集群部署(HAProxy + 两台Mycat+Mysql双主双从)

    既然大家都知道了Mysql分布式在大型网站架构中的作用,在这里就不再阐述.本片博客文章是基于我曾经搭建过的一个Mysql集群基础上实现的,实现过双主热备.读写分离.分库分表. 博客链接:http:// ...

  2. 高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)

            LVS(负载均衡器).Heartbeat.Corosync.Pacemaker.Web高可用集群.MySQL高可用集群.DRDB.iscsi.gfs2.cLVM等,唯一没有讲解的就是L ...

  3. 高可用OpenStack(Queen版)集群-13.分布式存储Ceph

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  4. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  5. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...

  6. 高可用OpenStack(Queen版)集群-7.Neutron控制/网络节点集群

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  7. 高可用OpenStack(Queen版)集群-3.高可用配置(pacemaker&haproxy)

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  8. 高可用OpenStack(Queen版)集群-2.基础服务

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  9. Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群

    文章转载自:https://i4t.com/5451.html 背景 Kubernetes 1.24新特性 从kubelet中移除dockershim,自1.20版本被弃用之后,dockershim组 ...

随机推荐

  1. Memcache命令及参数用法

    Memcache命令:在linux下: # /usr/local/bin/memcached -d -m 128 -u root -l 192.168.0.10 -p 12121 -c 256 -P ...

  2. Android 使用CheckBox实现多选效果

    CheckBox:复选框1.有两种状态: 选中状态(true),未选中状态(false)2.属性: android:id="@+id/checkbox" android:layou ...

  3. vue脚手架一

    一准备: 在F:/xampp/htdocs/文件夹下检查: 1,node -v; 2,npm -v; 3,淘宝镜像(选装): npm install -g cnpm --registry= https ...

  4. WEB安全第六篇--千里之外奇袭客户端:XSS和HTML注入

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  5. 【BZOJ2901】矩阵求和

    Description 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. Input 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一个矩阵. 接下来n行,每行n个非负整数 ...

  6. 解决:Bitmap too large to be uploaded into a texture exception

    前几天拿锤子手机做测试,启动页面的闪屏直接黑屏.. 所以看下日志,百度一下 找到解决方案,特此记录. 简单说就是硬件加速的时候,对图片的大小有限制.不同设备可能有不同的最大值.这个问题悲催的地方是,程 ...

  7. shell脚本备份日志

    #!/bin/sh # back tomcat catalina.out cd /home/log_bak #the file DATE=`date '+%Y%m%d-%H%M'` ARCHIVE=$ ...

  8. 【vue】---Object.defineProperty基本使用---【巷子】

    1.object.defineProperty 给一个对象定义一个新的属性或者在修改一个对象现有的属性,并返回这个对象 语法: Object.defineProperty(参数1,参数2,参数3) 参 ...

  9. spring-boot集成redis

    application.properties #redis 配置 # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redi ...

  10. linux 统计文件数量

    查找当前目录下compose文件的数量 ls -lr | grep "compose" | wc -l