本文先配置了一个双master环境,互为主从,然后通过Keepalive配置了一个虚拟IP,客户端通过虚拟IP连接master1,当master1宕机,自动切换到master2。一次只能连接其中一个master进行读写,所以是active-passive模式。
两台机器事先都已经装好了mysql单实例。
二者的端口号需要保持一致,否则在最后用vip连接的时候,不能使用相同端口号连接。
修改master1:
在[mysqld]下面添加:
server-id = 1
relay-log=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin
relay-log-index=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin.index
auto-increment-offset = 1
auto-increment-increment = 2
log-slave-updates=true
修改master2:
在[mysqld]下面添加:
server-id = 3
relay-log =/data/server/mysql/binlog/single-relay-bin
relay-log-index=/data/server/mysql/binlog/single-relay-bin.index
auto-increment-offset = 2
auto-increment-increment = 2
log-slave-updates=true
添加auto-increment-offset那两项,是为了避免在MySQL INSERT时主键冲突。
修改完后记得重启mysql
分别在两台mysql上执行
GRANT REPLICATION SLAVE ON *.* TO 'RepUser'@'%'identified by 'beijing';
两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可。否则,需要先备份主库,在备库进行恢复,从而保持数据一致,然后再指向master。
Master1:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 302| | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
Master2:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#Master1指向Master2
CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.21',MASTER_PASSWORD='beijing',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;
CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.22',MASTER_PASSWORD='beijing', MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=302;
start slave ;
确保show slave status
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试两边是否同步,略。
分别在master1,master2上安装keepalive
yum install -ypopt-devel cd /usr/local/src wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz tar zxvf keepalived-1.2.2.tar.gz cd keepalived-1.2.2 ./configure --prefix=/ make make install
vi/root/check_mysql.sh
内容如下
MYSQL=/usr/local/mysql/bin/mysql MYSQL_HOST=localhost MYSQL_USER=root MYSQL_PASSWORD=system@123 $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1 #$mysqlclient --host=$host --port=$port --user=$user --password=$password -e "show databases;" > /dev/null 2>&1 if [ $? == 0 ] then echo " $host mysql login successfully " exit 0 else #echo " $host mysql login faild" /etc/init.d/keepalived stop exit 2 fi
vi/etc/keepalived/keepalived.conf
master1配置内容:
#ConfigurationFile for keepalived global_defs { notification_email { ######定义接受邮件的邮箱 [email protected] } notification_email_from [email protected] ######定义发送邮件的邮箱 smtp_server mail.tuge.com smtp_connect_timeout 10 } vrrp_script check_mysql { ######定义监控mysql的脚本 script "/root/check_mysql.sh" interval 2 ######监控时间间隔 weight 2 ######负载参数 } vrrp_instance vrrptest { ######定义vrrptest实例 state BACKUP ######服务器状态 interfaceeth0 ######使用的接口 virtual_router_id 51 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换 priority 150 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER advert_int 1 ######服务器之间的存活检查时间 authentication { auth_type PASS ######认证类型 auth_pass ufsoft ######认证密码,一组lvs 服务器的认证密码必须一致 } track_script { ######执行监控mysql进程的脚本 check_mysql } virtual_ipaddress { ######虚拟IP地址 192.168.1.60 } }
这里state不配置MASTER,且优先级一样,是期望在MASTER1宕机后再恢复时,不主动将MASTER状态抢过来,避免MySQL服务的波动。
由于不存在使用lvs进行负载均衡,不需要配置虚拟服务器virtual server,下同。
slave配置内容(只是将state改为BACKUP即可):
global_defs { notification_email { ######定义接受邮件的邮箱 [email protected] } notification_email_from [email protected] ######定义发送邮件的邮箱 smtp_server mail.tuge.com smtp_connect_timeout 10 } vrrp_script check_mysql { ######定义监控mysql进程的脚本 script "/etc/keepalived/check_mysql.sh" interval 2 ######监控时间间隔 weight 2 ######负载参数 } vrrp_instance vrrptest { ######定义vrrptest实例 state BACKUP ######服务器状态(主为MASTER,从为BACKUP) interface eth0 ######使用的接口 virtual_router_id 51 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换 priority 150 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER advert_int 1 ######服务器之间的存活检查时间 authentication { auth_type PASS ######认证类型 auth_pass ufsoft ######认证密码,一组lvs 服务器的认证密码必须一致 } track_script { ######执行监控NGINX进程的脚本 check_mysql } virtual_ipaddress { ######虚拟IP地址 192.168.1.60 } }
#注意,在两台机器上都要修改。
添加:
-A INPUT -d 192.168.1.60/32 -j ACCEPT
-A INPUT -d224.0.0.18 -j ACCEPT #添加VRRP通讯支持
service iptables restart
在master1、master2上分别启动:
service keepalived start
分别执行ip addr命令,可以在其中一台机器上看到虚拟IP.如:
[root@slave1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UP qlen 1000
link/ether 08:00:27:04:05:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.60/32 scope global eth0
inet6 fe80::a00:27ff:fe04:516/64 scope link tentativedadfailed
valid_lft forever preferred_lft forever
说明虚拟vip连在了master1这台机器上。
如果自动只连接到了master2,关闭master2的keepalived,再启动,自动就连接到master1了。
现在都可以ping通虚拟ip了。
停止master1服务器keepalived,检查VIP是否切换到master2服务器(用ip addr命令验证即可);
在master1,master2创建允许远程访问的用户:
grant select,update,delete,insert on *.* to 'dandan' identified by 'dandan';
用一台同网段的机器访问通过vip访问数据库:
mysql -u dandan-pdandan -h 192.168.1.60 --port 3307
停止master1服务器的mysql,VIP切换到了master2服务器。
在master2上查看:
mysql> showprocesslist; +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+ | 3 | root | localhost | dba | Query | 0 | init | show processlist | | 14 | systemuser | | NULL |Connect | 247 | Reconnecting after afailed master event read | NULL | | 15 | systemuser | | NULL |Connect | 207 | Slave has read all relaylog; waiting for the slave I/O thread to update it | NULL | | 90 |dandan | 192.168.1.60:39995 |dba | Sleep | 8| | NULL | +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+