天天看點

Mysql keepalived 缺陷_MySQL Router單點隐患通過Keepalived實作

一、介紹

有些情況下,可能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 {

[email protected]

}

notification_email_from [email protected]

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 {

[email protected]

}

notification_email_from [email protected]

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

[[email protected] keepalived_monitor]# ip a

1: lo: 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: 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: 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: [email protected]: 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

[[email protected] mysqlrouter]# ip a

1: lo: 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: 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: 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: [email protected]: 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上都部署

[[email protected] 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="[email protected]" #使用者名

mail_pass="xxx" #密碼

sender = '[email protected]' # 郵件發送者

receivers = ['[email protected]', '[email protected]'] # 接收郵件,可設定為你的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的多點傳播端口