How-to setup MySQL HA by using keepalived

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了How-to setup MySQL HA by using keepalived相关的知识,希望对你有一定的参考价值。

With mysql replication and keepalived, we can setup a quite robust high available MySQL environment in a few steps:

Environment:
Host1: db01.wordpress.com
Host2: db02.wordpress.com
DBVIP: mysql.wordpress.com 10.0.0.1

1. Setup MySQL Master-Master replication
Ref: Setup MySQL replication

2. Install keepalived at both hosts


--using apt-get, for Ubuntu
apt-get install keepalived
 
--using yum, for Redhat
yum install keepalive

3. Config keepalived

1) Add keepalived config file /etc/keepalived/keepalived.conf
Config file for host db01:

! Configuration File for keepalived
global_defs {
      notification_email {
        [email protected]
      }
      notification_email_from [email protected]
      smtp_server mx.wordpress.com
      smtp_connect_timeout 30
      router_id mysql-ha
      }
 
vrrp_script check_mysql {
   script "/mysql/keepalived_check.sh db02.wordpress.com"
   interval 2
   weight 2
}
 
vrrp_instance VI_1 {
      state BACKUP
      interface eth1
      virtual_router_id 51
      priority 100
      advert_int 1
      nopreempt  # only needed on higher priority node
      authentication {
      auth_type PASS
      auth_pass 1111
      }
 
      track_script {
        check_mysql
      }
      virtual_ipaddress {
        10.0.0.1/24 dev eth1 label eth1:1
      }
      notify_master /mysql/keepalived_master.sh
      notify_backup /mysql/keepalived_backup.sh
}


Config file of host db02:

Copy the config file in db01, and change this line:From   script "/mysql/keepalived_check.sh db02.wordpress.com"to   script "/mysql/keepalived_check.sh db01.wordpress.com"

2) Add scripts to both nodes
/mysql/keepalived_check.sh : monitor MySQL (for the host/network down, keepalived has internal mechanism to monitor them)


#!/bin/bash
# monitor mysql status
# if this node mysql is dead and its slave delay less than 120 seconds, then stop its keepalived. The other node will bind the IP.
 
export MYSQL_HOME=/mysql
export PATH=$MYSQL_HOME/bin:$PATH
 
mysql="$MYSQL_HOME/bin/mysql"
delay_file="$MYSQL_HOME/slave_delay_second.log"
slave_host=$1
 
$mysql -u root --connect_timeout=3 --execute="select version();"
 
if [ $? -ne 0 ]; then
 delayseconds=`cat $delay_file`
 if [ $delayseconds -le 120 ]; then
   /etc/init.d/keepalived stop
 fi
 exit 1 #bad
fi
 
# Get slave delay time and save it
$mysql -urepluser -prepluser -h$slave_host --connect_timeout=3 -e"select version();"
if [ $? -eq 0 ]; then
  delayseconds=`$mysql -urepluser -prepluser -h$slave_host --connect_timeout=3 -e"show slave status\G"|grep Seconds_Behind_Master|awk ‘{print \$2}‘`
  if [[ "$delayseconds" =~ ^[0-9]+$ ]] ; then
     echo "$delayseconds" > $delay_file
  else
     echo "9999" > $delay_file
  fi
fi
exit 0 #good

/mysql/keepalived_master.sh : it will be called when the node becomes master


#!/bin/bash
 
my_host=`hostname`
current_date=`/bin/date +"%b %d %H:%M:%S"`
From="$my_host"
[email protected]
 
Subject="$my_host is MASTER"
Msgboday="$current_date : mysql.wordpress.com is online at $my_host"
echo "$Msgboday" | /usr/bin/mailx  -s "$Subject" "$mail_list"

/mysql/keepalived_backup.sh : it will be called when the node becomes slave


#!/bin/bash
 
my_host=`hostname`
current_date=`/bin/date +"%b %d %H:%M:%S"`
From="$my_host"
[email protected]
 
Subject="$my_host is BACKUP"
Msgboday="$current_date : mysql.wordpress.com is offline at $my_host"
echo "$Msgboday" | /usr/bin/mailx  -s "$Subject" "$mail_list"

4. Start keepalived at both nodes

1
2
3
4
5
service keepalived start
or
/etc/init.d/keepalived start
 
Check its log file at /var/log/messages

5. Test it
Scenarios:
A. Stop MySQL at the master node
B. Shutdown master node network
C. Shutdown master node OS
D. Split-brain (the nodes cannot connect to each other) – In my test, keepalived didn’t do anything in this situation.

Check result:
1) Check emails
2) Check IP using ifconfig at both nodes
2) Connect to DB without stop:

1
2
3
4
5
6
while true loop
do
date
mysql -urepluser -prepluser -hmysql.wordpress.com -e"select @@hostname;"
sleep 1
done;

In my test, the db cannot be connected for just 2 seconds.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Mon Oct 29 22:30:51 GMT+7 2012
+---------------+
| @@hostname    |
+---------------+
| db01          |
+---------------+
Mon Oct 29 22:30:52 GMT+7 2012
ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘mysql.wordpress.com‘ (111)
Mon Oct 29 22:30:53 GMT+7 2012
ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘mysql.wordpress.com‘ (111)
Mon Oct 29 22:30:54 GMT+7 2012
+---------------+
| @@hostname    |
+---------------+
| db02          |
+---------------+


本文出自 “运维小当家” 博客,请务必保留此出处http://solin.blog.51cto.com/11319413/1951808

以上是关于How-to setup MySQL HA by using keepalived的主要内容,如果未能解决你的问题,请参考以下文章

how-to create a high-availability mysql setup with corosync pacemaker and drbd on ubuntu

How-to setup Kubernetes to manage Docker Cluster on ubuntu

namenode ha by zookeeper

Set up debian based maas ha env on xenial by hand (by quqi99)

Set up debian based maas ha env on xenial by hand (by quqi99)

Set up debian based maas ha env on xenial by hand (by quqi99)