linux复盘:keepalived+mysql双主构建高可用数据库

关于MySQL-HA,目前有多种解决方案,好比heartbeat、drbd、mmm、共享存储,可是它们各有优缺点。heartbeat、drbd配置较为复杂,须要本身写脚本才能实现MySQL自动切换,对于不会脚本语言的人来讲,这无疑是一种脑裂问题;对于mmm,生产环境中不多有人用,且mmm管理端须要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端作HA,这样无疑又增长了硬件开支;对于共享存储,MySQL数据仍是放在本地较为安全,存储设备毕竟存在单点隐患。mysql

使用MySQL双master+keepalived是一种很是好的解决方案,在MySQL-HA环境 中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性,而后用keepalived实现虚拟IP,经过keepalived自带的服务监 控功能来实现MySQL故障时自动切换。linux

机器ip及版本:

MySQL-VIP	    192.168.230.200
MySQL-master1	192.168.230.130
MySQL-master2	192.168.230.152

OS版本:CentOS 7.3    
MySQL版本:5.6    
Keepalived版本:1.2.7

 第一步关闭防火墙:nginx

selinux永久关闭 vi /etc/selinux/config selinux修改此处为disabled,reboot重启生效

关闭firewalld:
systemctl disable firewalled 先暂停,不让开机启动

systemctl stop firewalld 关闭服务

关闭iptables:
systemctl disable iptables

systemctl stop iptables

第二步mysql双主配置:算法

两台MySQL均如要开启binlog日志功能,开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项 两台MySQL的server-ID不能同样,默认状况下两台MySQL的serverID都是1,需将其中一台修改成2便可sql

Master1配置:

vim /etc/my.cnf

[mysqld]
datadir = /data/mysql
socket = /tmp/mysql.sock
server_id = 1                 #指定server-id,必须保证主从服务器的server-id不一样
auto_increment_increment = 2  #设置主键单次增量
auto_increment_offset = 1     #设置单次增量中主键的偏移量
log-bin = mysql-bin           #建立主从须要开启log-bin日志文件
log-slave-updates             #把更新的日志写到二进制文件(binlog)中
master2配置:

vim /etc/my.cnf

[mysqld]
datadir = /data/mysql
socket = /tmp/mysql.sock
server_id = 2                 #指定server-id,必须保证主从服务器的server-id不一样
auto_increment_increment = 2  #设置主键单次增量
auto_increment_offset = 2     #设置单次增量中主键的偏移量
log-bin = mysql-bin           #建立主从须要开启log-bin日志文件
log-slave-updates             #把更新的日志写到二进制文件(binlog)中

重要参数:vim

log-slave-updates = true #将复制事件写入binlog,一台服务器作主库又作从库此选项必需要开启安全

重启两台server的mysql服务:bash

/etc/init.d/mysqld restart

 将192.168.230.130设为192.168.230.152的主服务器:服务器

mysql -uroot

mysql> grant replication slave on *.* to 'repl'@'192.168.230.152' identified by 'zhangduanya';

mysql> flush privileges;

将192.168.230.152设为192.168.230.130的主服务器:socket

mysql -uroot

mysql> grant replication slave on *.* to 'repl'@'192.168.230.130' identified by 'zhangduanya';

mysql> flush privileges;

在Mysql-Master1上操做:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      421 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> change master to master_host='192.168.230.152',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000002',master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql>  show slave status\G
yes
yes

在Mysql-Master2上操做:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> change master to master_host='192.168.230.130',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000003',master_log_poos=421;
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql>  show slave status\G
yes
yes

##注意若是开始就启动了start slave,在操做同步的时候须要先中止它,stop slave

以上把双主作完了下来搞keepalived:

192.168.230.130服务器上keepalived安装及配置 安装keepalived

固然安装推荐源码包安装,或者懒了就yum直接安装

yum install -y keepalived

或者

yum install -y pcre-devel openssl-devel popt-devel   #安装依赖包

cd /usr/local/src

wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz

tar -zxvf keepalived-1.2.7.tar.gz

cd ./keepalived-1.2.7

./configure --prefix=/usr/local/keepalived

make  &&  make install

echo $?

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

chmod +x /etc/init.d/keepalived  

chkconfig --add keepalived  

chkconfig keepalived on  

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

mkdir /etc/keepalived/

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

而后配置130的keepalived:

vi /etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf
#写入如下内容
! Configuration File forkeepalived
global_defs {
notification_email {
test@sina.com
 }
notification_email_from  admin@admin.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA      #标识,双主相同
 }
vrrp_instance VI_1 {
 state BACKUP           #两台都设置BACKUP
 interface ens33
 virtual_router_id 51       #主备相同
 priority 100   #优先级,另外一台改成90    
 advert_int 1    
 nopreempt  #不抢占,只在优先级高的机器上设置便可,优先级低的机器不设置    
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.230.200
 }
}

virtual_server 192.168.230.200 3306 {    
     delay_loop 2   #每一个2秒检查一次real_server状态    
     lb_algo wrr   #LVS算法    
     lb_kind DR    #LVS模式    
     persistence_timeout 60   #会话保持时间    
     protocol TCP    
     real_server 192.168.230.130 3306 {    
         weight 3    
         notify_down /usr/local/keepalived/mysql.sh  #检测到服务down后执行的脚本    
         TCP_CHECK {    
             connect_timeout 10    #链接超时时间    
             nb_get_retry 3       #重连次数  
             delay_before_retry 3   #重连间隔时间    
             connect_port 3306   #健康检查端口  
         }  
     }    
}

编写检测服务down后所要执行的脚本(添加/usr/local/keepalived/mysql.sh)

vim  /usr/local/keepalived/mysql.sh

#!/bin/bash
pkill keepalived
sleep  10
/etc/init.d/keepalived start  >/dev/null

----------
# chmod +x /usr/local/keepalived/mysql.sh

注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server 的服务状态,当发现real_server服务故障时,便触发此脚本;咱们能够看到,脚本就一个命令,经过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,咱们不用担忧两个MySQL会同时提供数据更新操做, 由于每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP。

启动keepalived

/etc/init.d/keepalived start

192.168.230.152上keepalived安装及配置 安装keepalived,安装方法参照192.168.230.130的安装方法 配置keepalived 这台配置和上面基本同样,但有三个地方不一样:优先级为90、无抢占设置、real_server为本机IP

vi /etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf
#写入如下内容
! Configuration File forkeepalived
global_defs {
notification_email {
test@sina.com
 }
notification_email_from  admin@admin.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA      #标识,双主相同
 }
vrrp_instance VI_1 {
 state BACKUP           #两台都设置BACKUP
 interface ens33
 virtual_router_id 51       #主备相同
 priority 90   #优先级,此处应改成90    
 advert_int 1    
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.230.200
 }
}

virtual_server 192.168.230.200 3306 {    
     delay_loop 2   #每一个2秒检查一次real_server状态    
     lb_algo wrr   #LVS算法    
     lb_kind DR    #LVS模式    
     persistence_timeout 60   #会话保持时间    
     protocol TCP    
     real_server 192.168.230.152 3306 {    
         weight 3    
         notify_down /usr/local/keepalived/mysql.sh  #检测到服务down后执行的脚本    
         TCP_CHECK {    
             connect_timeout 10    #链接超时时间    
             nb_get_retry 3       #重连次数  
             delay_before_retry 3   #重连间隔时间    
             connect_port 3306   #健康检查端口  
         }  
     }    
}

编写检测服务down后所要执行的脚本(添加/usr/local/keepalived/mysql.sh) 

而后仍是杀掉mysql的脚本:

vim  /usr/local/keepalived/mysql.sh

#!/bin/bash
pkill keepalived
sleep  10
/etc/init.d/keepalived start  >/dev/null

----------
# chmod +x /usr/local/keepalived/mysql.sh

启动keepalived

/etc/init.d/keepalived start

 好了配置完了,测试

若是服务器宕机,Keepalived服务确定回中止工做,因此在此经过开/关Keepalived来模拟宕机状态:

宕机前:

查看master服务器IP状态:
ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8a:1b:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.230.130/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.230.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::65d2:adc:20d3:8c74/64 scope link 
       valid_lft forever preferred_lft forever

查看backup服务器IP状态:  
ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:af:b7:9f brd ff:ff:ff:ff:ff:ff
    inet 192.168.230.152/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::76c1:b882:4f26:608c/64 scope link 
       valid_lft forever preferred_lft forever

说明: 此时VIP在master服务器上,说明有master对外提供服务。
vip也绑定在master这台机器上

master服务器宕机后:

此时vip到了152机器上,此时有backup服务器接管master服务器对外提供服务。

恢复master服务器Keepalived服务,此时VIP并无回到master服务器上,缘由是master在进行Keepalived的时候加入了参数nopreemt。

注意:缘由是nopreemt不抢占,只在优先级高的机器上设置便可,优先级低的机器不设置 ,我们给130这个优先级高的设置不抢占资源,因此vip停留在152上提供服务

相关文章
相关标签/搜索