高可用的Mysql双机热备(Mysql_HA)
使用KeepAlived实现高可用的MYSQL_HA集群环境中,MySQL为(Master/Master)主/主同步复制关系,保证MYSQL服务器数据的一致性,用KeepAlived提供虚拟IP,通过KeepAlived来进行故障监控,实现Mysql故障时自动切换。
布署环境拓朴如下:
Mysql VIP :192.168.187.61
Master1:192.168.187.129
Master2:192.168.187.132
OS 环境:Cent OS 6.5
Mysql版本:Mysql5.5.31
一:设置配置文件:
Mysql是通过日志进行同步复制的,先建立日志文件
touch /var/log/mysql/mysql-bin.log //建立日志文件,请设置权限,如777
chown mysql.mysql /var/log/mysql/mysql-bin.log //将日志文件的所属用户和用户组更改成mysql
在两台要进行备份的mysql服务器上的my.cnf文件进行配置如下(将下面的配置分别加入相关服务器的my.cnf,放在配置文件的[mysqld_safe]上面):
Master1(192.168.187.129) |
Master(192.168.187.132) |
#主标服务标识号,必需唯一 server-id = 1 #因为MYSQL是基于二进制的日志来做同步的,每个日志文件大小为 1G log-bin=/var/log/mysql/mysql-bin.log #要同步的库名 binlog-do-db = test #不记录日志的库,即不需要同步的库 binlog-ignore-db=mysql #用从属服务器上的日志功能 log-slave-updates #经过1日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0。 sync_binlog=1 # auto_increment,控制自增列AUTO_INCREMENT的行为 用于MASTER-MASTER之间的复制,防止出现重复值, auto_increment_increment=n有多少台服务器,n就设置为多少, auto_increment_offset=1设置步长,这里设置为1,这样Master的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID auto_increment_offset=1 auto_increment_increment=2 #进行镜像处理的数据库 replicate-do-db = test #不进行镜像处理的数据库 replicate-ignore-db= mysql |
#主标服务标识号,必需唯一 server-id = 2 #因为MYSQL是基于二进制的日志来做同步的,每个日志文件大小为 1G log-bin=/var/log/mysql/mysql-bin.log #要同步的库名 binlog-do-db = test #不记录日志的库,即不需要同步的库 binlog-ignore-db=mysql #用从属服务器上的日志功能 log-slave-updates #经过1日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0。 sync_binlog=1 # auto_increment,控制自增列AUTO_INCREMENT的行为 用于MASTER-MASTER之间的复制,防止出现重复值, auto_increment_increment=n有多少台服务器,n就设置为多少, auto_increment_offset=2设置步长,这里设置为2,这样Master的auto_increment字段产生的数值是:2, 4, 6, 8, …等奇数ID auto_increment_offset=2 auto_increment_increment=2 #进行镜像处理的数据库 replicate-do-db = test #不进行镜像处理的数据库 replicate-ignore-db= mysql
|
二:查看配置情况
按上面的配置将两台服务器配置好以后,重新启动mysql服务,用showmaster status查看一下两台服务器的Master配置情况,可以看出已经配置成功,如下:
NO1:Master1(192.168.187.129)的情况
# mysql –u root –p 1234
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001| 107 | test | mysql |
+------------------+----------+--------------+------------------+
NO2:Master2(192.168.187.132)的情况
# mysql –u root –p 1234
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002| 125 | test | mysql |
+------------------+----------+--------------+------------------+
三:建立权限帐户,实现同步
Master1(192.168.187.129) |
Master2(192.168.187.132) |
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES; #在MYSQL中设置对端Master2的复制账号
mysql> change master to master_host='192.168.187.132', master_user='slave', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=125; mysql> start slave; #启动从服务器复制功能
mysql> show slave status; #检测slave状态,如果Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0就证明已经同步了 |
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES; #在MYSQL中设置对端Master1的复制账号
mysql> change master to master_host='192.168.187.129', master_user='slave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=107; mysql> start slave; #启动从服务器复制功能
mysql> show slave status; #检测slave状态,如果Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0就证明已经同步了
|
四:测试同步效果
在Master1上创建表:
mysql -uroot -p1234;
use test;
CREATE TABLE `card` (
`card_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`card_number` varchar(100) DEFAULT NULL COMMENT '卡号',
PRIMARY KEY (`card_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;
insert into `card`(`card_number`) values ('haha1');
insert into `card`(`card_number`) values ('haha2');
执行完毕后,master2下如果对应的card表已经生成,并且也有相应的数据,证明同步成功,相应在master2上执行任何操作,master1也会相应修改。
五:配置keepalived实现热备
A) 安装keepalived
yum -y install keepalived
B) 修改配置
[[email protected] ~] vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA #标识,双主相同
}
vrrp_instance VI_1 {
state BACKUP #两台都设置BACKUP
interface eth0
virtual_router_id 51 #主备相同
priority 100 #优先级,backup设置90
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
nopreempt #不主动抢占资源,只在master这台优先级高的设置,backup不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.187.61 #指定VIP,两个节点设置必须一样
}
}
virtual_server 192.168.187.61 3306 {
delay_loop 2 #每个2秒检查一次real_server状态
#lb_algo rr #LVS算法,用不到,我们就关闭了
#lb_kind NAT #LVS模式,如果不关闭,备用服务器不能通过VIP连接本机MySQL
persistence_timeout 50 #会话保持时间
protocol TCP #使用的协议是TCP还是UDP
real_server 192.168.187.132 3306 { //这里填写各自的真实内网IP地址
weight 3 #权重
notify_down /usr/local/keepalived/mysql.sh #当mysq服down时,执行此脚本,杀死keepalived实现切换
TCP_CHECK {
connect_timeout 3 #连接超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔时间
}
}
}
C) 配置keepalived脚本
[[email protected] ~] vim /usr/local/keepalived/mysql.sh
#!/bin/bash
pkill keepalived
[[email protected] ~]# chmod +x /usr/local/keepalived/mysql.sh
[[email protected] ~]# /etc/init.d/keepalived start
六:测试高可用性
1、通过Mysql客户端通过VIP连接,看是否连接成功。
2、停止master这台mysql服务,是否能正常切换过去,可通过ip addr命令来查看VIP在哪台服务器上。
3、可通过查看/var/log/messges日志,看出主备切换过程
4、master服务器故障恢复后,是否主动抢占资源,成为活动服务器。