MySQL高可用性是保障MySQL在某台服务器上停止运行,其他机器的MySQL可以接管服务,保证MySQL服务可用。MySQL自身提供了多个服务之间相互备份的功能,但只进行备份的话,还需要一个能够在提供MySQL服务切换的机制。

Keepalived的作用是可以检测某台机器的服务出现故障,从集群中剔除,并将可用的服务作为当前服务,能够实现自动切换。是基于VRRP协议来实现高可用方案,通常还可以配合负载均衡技术(如:nginx、lvs)一起工作来实现集群高可用性。

这里采用了简单的双主热备方式,选取了两台运行MySQL的服务器,分别为ubuntuM1(172.17.2.31)和ubuntuM2(172.17.2.32)。这里以ubuntuM1为主1,即优先级更高。

MySQL

MySQL安装

  1. 通过apt-get install mysql安装MySQL服务。
  2. 配置/etc/mysql/my.cnf文件
    注释下面一行(允许远程访问):

    #bind-address = 127.0.0.1

MySQL双主同步配置

  • ubuntuM1和ubuntuM2的MySQL相互备份配置

    修改/etc/mysql/my.cnf文件,如下:

    1
    2
    3
    4
    5
    6
    server-id = 31 #这里ubuntuM2需设为32
    log-bin=/data/logbin/mysql-bin #日志路径及文件名
    binlog-ignore-db = mysql #不同步的数据库,以下同上
    binlog-ignore-db = performance_sechma
    binlog-ignore-db = information_sechma
    slave-skip-errors = all #忽略同步的错误
ubuntuM1和ubuntuM2均修改完后,重启mysql服务:

1.    停止服务: ``service mysql stop``
2.    启动服务:     ``service mysql start``
  • ubuntuM1和ubuntuM2添加备份用户

    1
    mysql> grant replication slave on *.* to 'db_bk'@'%' identified by 'db_bk';
  • 记录MySQL的master的status

    1
    mysql> show master status;

    分别记录ubuntuM1和ubuntuM2的File属性对应值和Position属性的对应值。这里的信息下面配置master会用到。

  • ubuntuM1和ubuntuM2相互配置master

    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> stop slave;
    mysql> change master to
    -> master_host='172.17.2.31', #这里配置相互的IP地址
    -> master_user='db_bk', #这里是刚才添加的备份用户
    -> master_password='db_bk',
    -> master_log_file='mysql-bin.000008', #需要填写前面记录的master status状态的File属性对应的值,在ubuntuM1上配置时,以ubuntuM2为master,填写的就是ubuntuM2的master status信息
    -> master_log_pos=7645; #同上,对应Position属性的值
    mysql> start slave;
    mysql> show slave status\G; #Slave_IO_Running和Slave——SQL_Running都为YES,表示主从同步正常
  • 测试是否主从备份可用

登录ubuntuM1的MySQL,创建一个测试数据库,登录ubuntuM2的MySQL,如果能查看到对应的数据库,同理,在ubuntuM2创建一个数据库,登录ubuntuM2如果能查看到,则表示主主备份配置成功。

  • 注意事项

需要注意的是,这里的主主互备是根据MySQL的操作日志记录来进行同步的。所以在搭建备份时,如果原来两个数据库中的数据不一致时,应该先进行手工同步,导入对应数据库的数据,再进行主主备份配置。

Keepalived安装

  • 下载并安装

下载安装包

keepalived下载地址,并解压到/opt目录。

安装编译依赖

  • apt-get install libssl-dev
  • apt-get install libpopt-dev
  • apt-get install openssl
  • apt-get install daemon
  • apt-get install make

编译keepalived

1
2
3
./configure --prefix=/usr/local/keepalived
make
make install

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived/
mkdir /etc/sysconfig/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir -p /var/lock/subsys
##########修改 /etc/keepalived/keepalived.conf文件 #####
global_defs {
...
router_id MYSQL_HA #主备相同
...
}
vrrp_instance VI_1 {
state BACKUP #都为backup
interface em1 #对应的网卡名称
virtual_router_id 51 #默认51
priority 100 #优先级,主100,从90
nopreempt #不抢占资源,意思就是它活了之后也不会再把主抢回来
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.17.2.36 #虚拟IP地址,mysql客户端访问的地址
}
}
virtual_server 172.17.2.36 3306 { #ip通虚拟地址,端口号MySQL端口号
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 172.17.2.31 3306 { #本机IP地址
weight 3
notify_down /usr/local/keepalived/mysql.sh
TCP_CHECK {
connect_timeout 3 #连接超时
nb_get_retry 3 #重试次数
connect_port 3306 #mysql端口号
delay_before_retry 3 #重试间隔时间
}
}
}
###########修改后保存
vim /usr/local/keepalived/mysql.sh
##########添加keepalived自动关闭脚本,内容如下
#! /bin/bash
pkill keepalived
#########修改后保存(该脚本能在mysql服务不可用时,停止keepalived,从而不独占虚拟IP地址,保障虚拟地址被其他机器的keepalived抢占)
chmod +x /usr/local/keepalived/mysql.sh #添加执行权限
########修改启动脚本 /etc/init.d/keepalived
./etc/rc/d/init.d/functions #注释这句,新增下行
./lib/lsb/init-functions
daemon keepalived ${KEEPALIVED_OPTIONS}  #注释该行,新增下行
daemon keepalived start
######## 修改后保存
update-rc.d keepalived default #添加为系统服务
/etc/init.d/keepalived start #启动keepalived

测试

  • 查看当前虚拟地址端口:ip addr

该命令能显示当前虚拟地址被哪台服务器抢占,若显示包含了虚拟IP地址,则表示当前该服务器抢占了该虚拟地址,提供MySQL服务。

  • 测试是否成功

关闭当前抢占的服务器的MySQL服务,看另一台服务器的ip addr,如果抢占了虚拟地址,则表示成功,同理,在该机器也进行一次测试。

MySQL常用命令

  • 新建数据库

    1
    create database 数据库名称 default character set utf8 collate utf8_general_ci;
  • 新建用户

    1
    grant all on 数据库名称.* to 用户名@hostName identified by "密码"

    注:hostName可以为指定IP地址,表示只能指定的IP地址访问,如果为’%’表示允许用户任意机器远程访问。

参考文献

  1. MySQL 高可用性之 Keepalived 双主热备
  2. Ubuntu下部署Keepalived
  3. keepalived安装配置