keepalived实现mysql高可用

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

猜你喜欢

转载自blog.csdn.net/Empty_city_dreams/article/details/83621968