keepalived实现mysql高可用
环境
设备 | ip地址 |
---|---|
centos7/master | 192.168.89.129 |
centos7/slave | 192.168.89.130 |
两端都安装mysql
[root@localhost ~]# yum install -y vim wget
[root@localhost ~]# wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
[root@localhost ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
[root@localhost ~]# ls -1 /etc/yum.repos.d/mysql-community*
[root@localhost ~]# yum install -y mysql-server mysql
1.在MASTER端配置mysql
[root@localhost ~]# service mysqld start
[root@localhost ~]# vim /etc/my.cnf 加入以下内容
[mysqld] 在mysqld区域内加入
server-id = 1
log-bin = mysql-bin
binlog-ignore-db = mysql,information_schema
auto-increment-increment = 2
auto-increment-offset = 1
slave-skip-errors = all
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysqladmin -u root password wscl1996.
2.在slave端配置mysql
[root@localhost ~]# service mysqld start
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id = 2
log-bin = mysql-bin
binlog-ignore-db = mysql,information_schema
auto-increment-increment = 2
auto-increment-offset = 2
slave-skip-errors = all
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysqladmin -u root password wscl1996.
3.查看Master和Slave上的log bin日志和pos值位置
3.1master端
[root@localhost ~]# mysql -uroot -pwscl1996.
mysql> grant all on *.* to 'root'@'%' identified by 'wscl1996.' with grant option; 权限传递
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000001 | 485 | | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
mysql> change master to
-> master_host='192.168.89.130',
-> master_user='root',
-> master_password='wscl1996.',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=703; 这里的file值要和上面的一致,同理pos也是
Query OK, 0 rows affected, 2 warnings (0.11 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.89.130
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 703
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes 这两项为ok即为完成
3.2slave端
[root@localhost ~]# mysql -uroot -pwscl1996.
mysql> grant all on *.* to 'root'@'%' identified by 'wscl1996.' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000001 | 703 | | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
mysql> change master to master_host='192.168.89.129',master_user='root',master_password='wscl1996.',master_log_file='mysql-bin.000003',master_log_pos=457;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> change master to
-> master_host='192.168.89.129',
-> master_user='root',
-> master_password='wscl1996.',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=485;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.89.129
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 485
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.3测试主主同步
3.3.1 主服务器
mysql> create database kong;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| kong |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
3.3.2 SLAVE服务器
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| kong |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
完成mysql的主主同步
4.配置keepalived
两端都安装keeplived
[root@localhost ~]# yum install keepalived -y
4.1修改master端的keeplived配置文件
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state LVS_DEVEL
interface ens33
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.89.150
}
}
track_script {
nginx_check
}
virtual_server 192.168.89.150 3306 { 3306位mysql的端口号
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.89.129 3306 {
weight 1
notify_down /etc/keepalived/shutdown.sh
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4.2修改slave端的keeplived配置文件
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.89.150
}
}
virtual_server 192.168.89.150 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.89.130 3306 {
weight 1
notify_down /etc/keepalived/shutdown.sh
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4.3编写故障脚本
[root@localhost ~]# vim /etc/keepalived/check_m.sh
#!/bin/bash
mysql_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bmysql\b'|wc -l)
if [ $mysql_status -lt 1 ];then
systemctl stop keepalived
fi
[root@localhost ~]# vim /etc/keepalived/notify.sh
#!/bin/bash
VIP=$2
sendmail (){
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to master"
echo $content | mail -s "$subject" [email protected]
}
case "$1" in
master)
mysql_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bmysql\b'|wc -l)
if [ $mysql_status -lt 1 ];then
systemctl start mysql
fi
sendmail
;;
backup)
mysql_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bmysql\b'|wc -l)
if [ $mysql_status -gt 0 ];then
systemctl stop mysql
fi
;;
*)
echo "Usage:$0 master|backup VIP"
;;
esac
[root@localhost ~]# chmod +x /etc/keepalived/notify.sh /etc/keepalived/check_m.sh
5.测试
5.1MASTER端查看虚拟ip是否存在
[root@localhost ~]# service keepalived start
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:47:80:d4 brd ff:ff:ff:ff:ff:ff
inet 192.168.89.129/24 brd 192.168.89.255 scope global noprefixroute dynamic ens33
valid_lft 1054sec preferred_lft 1054sec
inet 192.168.89.150/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::87d5:9fca:fb19:7de0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
5.2停止Master上的Keepalived,查看虚拟ip是否漂移到了Slave上
MASTER端
[root@localhost ~]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:47:80:d4 brd ff:ff:ff:ff:ff:ff
inet 192.168.89.129/24 brd 192.168.89.255 scope global noprefixroute dynamic ens33
valid_lft 1727sec preferred_lft 1727sec
inet6 fe80::87d5:9fca:fb19:7de0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
SLAVE端
[root@localhost ~]# service keepalived start
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e1:46:7d brd ff:ff:ff:ff:ff:ff
inet 192.168.89.130/24 brd 192.168.89.255 scope global noprefixroute dynamic ens33
valid_lft 1468sec preferred_lft 1468sec
inet 192.168.89.150/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::ed9:2153:d66f:1db9/64 scope link noprefixroute
valid_lft forever preferred_lft forever
5.3停止master的mysql
[root@localhost ~]# systemctl stop mysql
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:47:80:d4 brd ff:ff:ff:ff:ff:ff
inet 192.168.89.129/24 brd 192.168.89.255 scope global noprefixroute dynamic ens33
valid_lft 1622sec preferred_lft 1622sec
inet6 fe80::87d5:9fca:fb19:7de0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
slave端
[root@localhost keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e1:46:7d brd ff:ff:ff:ff:ff:ff
inet 192.168.89.130/24 brd 192.168.89.255 scope global noprefixroute dynamic ens33
valid_lft 1335sec preferred_lft 1335sec
inet 192.168.89.150/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::ed9:2153:d66f:1db9/64 scope link noprefixroute
valid_lft forever preferred_lft forever