一、介绍

有些情况下,可能MySQL Router不便装在每个应用所在的服务器上,那么这时候要解决MySQL Router的单点故障,就需要用到keepalived或者pacemaker了,本文介绍了MySQL Router HA通过keepalived来实现。

二、环境准备

IP地址 角色
172.16.8.53 MySQL Router+MASTER
172.16.8.68 MySQL Router+BACKUP
172.16.8.24 VIP

keepalived版本:2.0.18

三、安装步骤

3.1下载软件包,解压

mkdir /software
wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz -P /software
tar -zxvf /software/keepalived-2.0.18.tar.gz ; cd /software/keepalived

3.2源码安装

yum -y install openssl* libnl‐dev* gcc-c++
./configure --prefix=/usr/local/keepalived
make
make install

3.3配置keepalived

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /data/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
cp /data/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

3.4修改keepalived配置文件

3.4.1以下在Keepalived MASTER上修改

! Configuration File for keepalived

global_defs {
notification_email {
xxx@xxx.com
}
notification_email_from 13912345678@139.com
smtp_server smtp.139.com
smtp_connect_timeout 30
router_id Router1
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_script chk_mysqlrouter {
script "/usr/bin/killall -0 /usr/bin/mysqlrouter" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
fall 2
} vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 102
advert_int 1
virtual_ipaddress {
172.16.8.24
}
track_script {
chk_mysqlrouter
}
notify_master "/usr/bin/python /data/keepalived_monitor/keepalived_notify.py master 172.16.8.53 172.168.8.24"
notify_backup "/usr/bin/python /data/keepalived_monitor/keepalived_notify.py backup 172.16.8.53 172.168.8.24"
}

3.4.2以下在Keepalived BACKUP上修改

! Configuration File for keepalived

global_defs {
notification_email {
xxx@xxx.com
}
notification_email_from 13912345678@139.com
smtp_server smtp.139.com
smtp_connect_timeout 30
router_id Router2
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_script chk_mysqlrouter {
script "/usr/bin/killall -0 /usr/bin/mysqlrouter" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
fall 2
} vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 101
advert_int 1
virtual_ipaddress {
172.16.8.24
}
track_script {
chk_mysqlrouter
}
notify_master "/usr/bin/python /data/keepalived_monitor/keepalived_notify.py master 172.16.8.68 172.168.8.24"
notify_backup "/usr/bin/python /data/keepalived_monitor/keepalived_notify.py backup 172.16.8.68 172.168.8.24"
}

说明:

  • /usr/bin/killall -0 /usr/bin/mysqlrouter,每2秒钟会执行一次,监测mysqlrouter进程是否存在,一旦超过2次不正常,则会且换vip到BACKUP,并且执行keepalived_notify.py邮件报警脚本发送告警邮件
  • 发送邮箱请自行设置

3.5启动keepalived

systemctl start keepalived
systemctl enable keepalived

启动参数说明:

使用systemctl start keepalived命令启动服务时,默认会将/etc/sysconfig/keepalived文件中KEEPALIVED_OPTIONS参数作为keepalived服务启动时的参数,并从/etc/keepalived/目录下加载keepalived.conf配置文件,或用-f参数指定配置文件的位置。

3.6查看VIP绑定情况

以下是MASTER

[root@node3 keepalived_monitor]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:99:45:ad brd ff:ff:ff:ff:ff:ff
inet 172.16.8.53/24 brd 172.16.8.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 172.16.8.24/32 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::170e:b457:5dbd:d629/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:c3:9f:ab:0e brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
4: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 10.233.71.0/32 scope global tunl0
valid_lft forever preferred_lft forever

可以看到VIP:172.16.8.24已经绑定到ens160网卡上

以下是BACKUP

[root@node4 mysqlrouter]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:99:1c:0f brd ff:ff:ff:ff:ff:ff
inet 172.16.8.68/24 brd 172.16.8.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::25a1:8b8d:a00e:70dd/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:00:4f:fb:9b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
4: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1440 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
inet 10.233.74.64/32 scope global tunl0
valid_lft forever preferred_lft forever

BACKUP是没有绑定VIP的,只有当MASTER发生故障,触发了VIP切换,BACKUP才会绑定VIP

四、邮件告警

邮件告警脚本如下,需要在MASTER和BACKUP上都部署

[root@node3 keepalived_monitor]# cat keepalived_notify.py
#!/usr/bin/python
# -*- coding:utf-8 -*- import smtplib
from email.mime.text import MIMEText
from email.header import Header
import sys, time, subprocess # 第三方 SMTP 服务
mail_host="smtp.139.com" #设置服务器
mail_user="13912345678@139.com" #用户名
mail_pass="xxx" #口令 sender = '13912345678@139.com' # 邮件发送者
receivers = ['xxx@xxx.com', 'xxx@xxx.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 p = subprocess.Popen('hostname', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
hostname = p.stdout.readline().split('\n')[0] message_to = ''
for i in receivers:
message_to += i + ';' def print_help():
note = '''python script.py role ip vip
'''
print(note)
exit(1) time_stamp = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) if len(sys.argv) != 4:
print_help()
elif sys.argv[1] == 'master':
message_content = '%s server: %s(%s) change to Master, VIP: %s' %(time_stamp, sys.argv[2], hostname, sys.argv[3])
subject = '%s change to Master -- keepalived notify' %(sys.argv[2])
elif sys.argv[1] == 'backup':
message_content = '%s server: %s(%s) change to Backup, VIP: %s' %(time_stamp, sys.argv[2], hostname, sys.argv[3])
subject = '%s change to Backup -- keepalived notify' %(sys.argv[2])
else:
print_help() message = MIMEText(message_content, 'plain', 'utf-8')
message['From'] = Header(sender, 'utf-8')
message['To'] = Header(message_to, 'utf-8') message['Subject'] = Header(subject, 'utf-8') try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print("Error: 无法发送邮件")
print(e)

五、问题汇总

5.1没有killall命令

解决办法:yum install psmisc

5.2VIP无法ping通

解决办法:关闭防火墙和SELinux,如果要开启防火墙的话,需要开放keepalived的组播端口

MySQL Router单点隐患通过Keepalived实现的更多相关文章

  1. MYSQL router 自动均衡负载

    配制文件: /etc/mysqlrouter/mysqlrouter.ini [DEFAULT] logging_folder = /var/log/mysql-router plugin_folde ...

  2. mysql router 自动failover测试

    mysql router 启动服务文件内容: [root@monitor mysqlrouter]# cat /etc/init.d/mysqlrouter#! /bin/bash## mysqlro ...

  3. MySQL Router 测试使用 转

    MySQL Router 测试使用 . 特性 MySQL Router 并没有包括一些特别新的特性, 总体上看中规中矩, 不过 first-available 和插件两个特性挺有意思, 后续会进行讲解 ...

  4. MySQL高可用基础之keepalived+双主复制【转】

    环境:MySQL-VIP:192.168.1.3MySQL-master1:192.168.1.1MySQL-master2:192.168.1.2 OS版本:CentOS release 6.4 ( ...

  5. 高可用-mysql安装,双主模式+keepalived

    mysql安装 1.添加用户 groupadd mysql useradd -r -g mysql mysql

  6. MySQL Router实现MySQL的读写分离

    1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...

  7. MySQL router

    MySQL Router is a building block for high availability (HA) solutions. It simplifies application dev ...

  8. mysql router使用配置

    mysql router使用配置 参考资料: https://www.jianshu.com/p/7fc8d77bea59 一.架构图 介绍: MySQL Router是处于应用client和dbse ...

  9. MySQL Router重装后重新连接集群进行引导出现的——此主机中之前已配置过的问题

    问题出现的前因: 因为重新安装了MySQL Router,然后打算重新连接上目标集群进行MySQL Router的初始化引导,结果报错了! [root@linux666 system]# mysqlr ...

随机推荐

  1. 安装ATS(apache traffic server)正向代理

    一 traffic server简介 Traffic Server是一种高性能Web代理缓存,可通过在网络边缘缓存频繁访问的信息来提高网络效率和性能.这使内容在物理上更接近最终用户,同时实现更快的交付 ...

  2. 009 Ceph RBD增量备份与恢复

    一.RBD的导入导出介绍 Ceph存储可以利用快照做数据恢复,但是快照依赖于底层的存储系统没有被破坏 可以利用rbd的导入导出功能将快照导出备份 RBD导出功能可以基于快照实现增量导出 二.RBD导出 ...

  3. 【他山之石】IntelliJ Idea 内存设置

    最近一次使用idea,删掉target目录内容,准备让项目重新编译的时候,整个mac系统崩溃然后黑屏重启了.紧接着就是重启后自动恢复原先打开的程序,结果再次黑屏重启.最开始以为是系统问题,还怀疑过最近 ...

  4. cs服务器搭建(cobaltstrike)

    linux服务器中安装 1.因为cs这个工具需要用到Java环境,新装的linux系统没有Java环境,所以这里先装一下java环境 yum install -y java-1.8.0-openjdk ...

  5. Git是什么?

    Git是什么? Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控 ...

  6. 在C#中使用二叉树实时计算海量用户积分排名的实现

    从何说起 前些天和朋友讨论一个问题,他们的应用有几十万会员然后对应有积分,现在想做积分排名的需求,问有没有什么好方案.这个问题也算常见,很多地方都能看到,常规做法一般是数据定时跑批把计算结果到中间表然 ...

  7. 洛谷P1776 宝物筛选 题解 多重背包

    题目链接:https://www.luogu.com.cn/problem/P1776 题目大意: 这道题目是一道 多重背包 的模板题. 首先告诉你 n 件物品和背包的容量 V ,然后分别告诉你 n ...

  8. Go网络文件传输

    流程分析 借助TCP完成文件的传输,基本思路如下: 发送方(客户端)向服务端发送文件名,服务端保存该文件名. 接收方(服务端)向客户端返回一个消息ok,确认文件名保存成功. 发送方(客户端)收到消息后 ...

  9. llinux重启、用户切换、注销命令

    一.指令 shutdown命令 shutdown -h now //立即关机 shutdown -h 2 //分钟后关机 shutdown -r now //立即重启 shutdown -r 1 // ...

  10. MacBook Pro 入手一年了,到底香不香?

    最近又有小伙伴问到底值不值得入手一台 MacBook Pro,松哥自己在 2018 年 10 月份的时候入手了一台,到现在为止,也用了一年多了,今天就来和小伙伴们聊一聊使用感受,至于到底值不值,需要大 ...