> Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
通过查看slave的运行状态可以发现,一切运行正常,这里需要重点关注的是Slave_IO_Running和Slave_SQL_Running,这两个就是在Slave节点上运行的主从复制线程,正常情况下这两个值都应该为Yes。另外,还需要注意的是Slave_IO_State、Master_Host、Master_Log_File、Read_Master_Log_Pos、Relay_Log_File、Relay_Log_Pos和Relay_Master_Log_File几个选项,可以查看出MySQL复制的运行原理及执行规律。最后还有一个Replicate_Wild_Ignore_Table选项,这个是之前在my.cnf中添加过的,通过此选项的输出值可以知道过滤了哪些数据库。
到这里,从DB1到DB2的MySQL主从复制已经完成。接下来开始配置从DB2到DB1的MySQL主从复制,这个配置过程与上面的过程完全一样,首先在DB2的MySQL库中创建复制用户,操作如下:
mysql>grant replication slave on *.* to 'repl_user'@'10.0.0.35'> mysql>show master status;
然后在DB1的MySQL库中将DB2设为自己的主服务器,操作如下:
mysql>change master to master_host='10.0.0.36',master_user='repl_user',master_password='repl_passwd',master_log_file='mysql-bin.000001',master_log_pos=266;
最后,就可以在DB1上启动slave服务了,可以执行如下SQL命令:
mysql>start slave;
查看DB1上slave的运行状态,Slave_IO_Running和Slave_SQL_Running都是Yes状态,表明DB1上复制服务运行正常。至此,MySQL双主模式的主从复制配置完毕。
6.配置Keepakived实现MySQL双主高可用
在进行高可用配置之前,首先需要在DB1和DB2服务器上安装Keepalived软件。我这里是直接yum安装,关于keepalived的安装这里不再说明,直接进入Keepalived的配置过程。下面是DB1服务器上/etc/keepalived/keepalived.conf文件的内容。
[root@db1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_mysqld {
script "/etc/keepalived/mysqlcheck/slave.sh" #检测MySQL复制状态的脚本
interval 2
weight 21
}
vrrp_instance HA_1 {
state BACKUP #在DB1和DB2上均配置为BACKUP
interface eth0
virtual_router_id 80
priority 100
advert_int 2
nopreempt #不抢占模式,只在优先级高的机器上设置即可,优先级低的机器可不设置
authentication {
auth_type PASS
auth_pass aaaavvv
}
track_script {
check_mysqld
}
virtual_ipaddress {
10.0.0.40/24 dev eth0 #MySQL的对外服务Ip,即VIP
}
}
其中,/etc/keepalived/mysqlcheck/slave.sh文件的内容为:
[root@db1 mysqlcheck]# cat slave.sh
#!/bin/bash
#Date: 2017-07-16
#Mail: 1135757611@qq.com
#Function: 监控mysql主从同步
#
. /etc/init.d/functions
Slave_IO=`/usr/bin/mysql -uroot -e "show slave status\G;" | grep -i " Slave_IO_R"|awk -F ": " '{print $2}'`
Slave_SQL=`/usr/bin/mysql -uroot -e "show slave status\G;" | grep -i "Slave_SQL_R"|awk -F ": " '{print $2}'`
if [[ $Slave_IO = 'Yes' && $Slave_SQL = 'Yes' ]]
then
action "Slave is Running" /bin/true
MYSQL_SLAVE_STATUS=0
else
action "Slave is not Running" /bin/false
MYSQL_SLAVE_STATUS=1
fi
exit $MYSQL_SLAVE_STATUS
使用前要保证此脚本有执行权限。
接着将Keepalived.conf文件中priority值修改为90。由于配置的是不抢占模式,因此,还需要去掉nopreempt选项。
在完成所有配置后,分别在DB1和DB2上启动Keepalived服务,在正常情况下VIP地址应该运行在DB1服务器上。
7.测试MySQL主从同步功能
为了验证MySQL的复制功能,可以编写一个简单的程序进行测试,也可以通过远程客户端登录进行测试。这里通过一个MySQL客户端,然后利用MySQL的VIP地址登录,看能否登录,并在登录后进行读、写操作,看看DB1和DB2之间能否实现数据同步。由于采用远程登录测试,因此DB1和DB2两台MySQL服务器都要事先做好授权,允许从远程登录。
1.在远程客户端通过VIP登录测试
首先通过远程MySQL客户端命令行登录VIP为“10.0.0.40”的数据库,操作如下:
[root@zabbix ~]# mysql -u test -h 10.0.0.40 -pyan123
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection> Server version: 5.1.73-log Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like "%hostname%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | db1 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "%server_id%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.01 sec)
从SQL输出结果看,可以通过VIP登录,并且登录了DB1服务器。
2.数据复制功能测试
接着上面的SQL操作过程,通过远程的MySQL客户端连接VIP,进行读、写操作测试,操作过程如下:
mysql> create database bbs;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bbs |
| blog |
| mysql |
| test |
| wordpress |
+--------------------+
6 rows in set (0.00 sec)
mysql> use bbs;
Database changed
mysql> create table user (id int,email varchar(80),password varchar(40) not null);
Query OK, 0 rows affected (0.20 sec)
mysql> show tables;
+---------------+
| Tables_in_bbs |
+---------------+
| user |
+---------------+
1 row in set (0.01 sec)
mysql> insert into user (id,email,password) values(1,"bbs@163.com","aa1234");
Query OK, 1 row affected (0.00 sec)
这个过程创建了一个数据库bbs,然后在bbs库中创建了一张表user。为了验证数据是否复制到DB2主机上,登录DB2主机的MySQL命令行,查询过程如下:
[root@db2 ~]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bbs |
| blog |
| mysql |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)
mysql> use bbs;
Database changed
mysql> show tables;
+---------------+
| Tables_in_bbs |
+---------------+
| user |
+---------------+
1 row in set (0.00 sec)
mysql> select * from user;
+------+-------------+----------+
|> +------+-------------+----------+
| 1 | bbs@163.com | aa1234 |
+------+-------------+----------+
1 row in set (0.00 sec)
从SQL输出结果看,刚才创建的库和表都已经同步到了DB2服务器上。其实也可以直接登录DB2服务器,然后执行数据库的读、写操作,看数据能否迅速同步到DB1的MySQL数据库中。
8.测试Keepalived实现MySQL故障转移
为了测试Keepalived实现的故障转移功能,需要模拟一些故障,比如,可以通过断开DB1主机的网络、关闭DB1主机、关闭DB1上MySQL服务等各种操作实现。这里在DB1服务器上关闭MySQL的日志接收功能,以此来模拟DB1上MySQL的故障。由于在DB1和DB2服务器上都添加了监控MySQL运行状态的脚本slave.sh,因此当关闭DB1的MySQL日志接收功能后,Keepalived会立刻检测到,接着执行切换操作。
1.停止DB1服务器的日志接收功能
首先在远程MySQL客户端以VIP地址登录MySQL系统,不用退出这个连接,然后在DB1服务器的MySQL命令行执行如下操作:
[root@db1 ~]# mysql
mysql> stop slave;
2.在远程客户端测试
继续在刚才打开的远程MySQL连接中执行命令,操作如下:
mysql> select * from user;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select * from user;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection> Current database: bbs
+------+-------------+----------+
|> +------+-------------+----------+
| 1 | bbs@163.com | aa1234 |
+------+-------------+----------+
1 row in set (0.24 sec)
mysql> show variables like "%hostname%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | db2 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "%server_id%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.00 sec)
从这个操作过程可以看出,在Keepalived切换后,之前的session连接失效,所以第一查询命令失败。然后重新执行查询命令,MySQL会执行重新连接,随后输出了查询结果,从后面两个SQL的查询结果可知,MySQL服务已经从DB1服务器切换到DB2服务器。Keepalived的切换过程非常迅速,整个过程大概持续1~3s,重新切换到新的服务器后,之前所有的MySQL连接失效,重新连接可以恢复正常。
接着,重新打开DB1上MySQL的日志接收功能,可以发现Keepalived将不再执行切换操作,因为上面将Keepalived配置为不抢占模式,此时,MySQL服务将一直在DB2服务器上运行,直到DB2主机或服务出现故障才再次进行切换操作。这样做的原因是在数据库环境下,每次切换的代价很大,因而关闭了Keepalived的主动抢占模式。