一、MySQL配置双主备

双主备,其实就是做两个机器的互相主从,既是Master又是Slave,如下图所示:
在这里插入图片描述
VMware准备两台linux虚拟机

虚拟机名称IP
Master192.168.111.104
Slave192.168.111.105
虚拟IP192.168.111.106

使用docker分别在两台虚拟机上安装MySQL,安装步骤参考 使用docker安装mysql

mysql安装好之后,修改mysql的配置my.cnf
首先修改Master服务器上的my.cn配置
找到docker挂载在磁盘的mysql配置文件my.cnf文件
Master服务器上的my.cnf配置文件,在里面的[mysqld]标签下追加下面的配置内容

log-bin=mysql-bin
binlog_format=mixed
server-id=1
relay-log=relay-bin 
relay-log-index=slave-relay-bin.index
auto_increment_increment=2
auto_increment_offset=1
slave-skip-errors = all

Slave服务器上的my.cnf配置文件,在里面的[mysqld]标签下追加下面的配置内容

log-bin=mysql-bin
binlog_format=mixed
server-id=2
relay-log=relay-bin 
relay-log-index=slave-relay-bin.index
auto_increment_increment=2
auto_increment_offset=2
slave-skip-errors = all

配置项说明

log-bin=mysql-bin      //启用二进制日志功能
binlog_format=mixed    //设置binlog日志格式
server-id=1            //给服务器分配一个ID编号
relay-log=relay-bin      //配置中继日志
relay-log-index=slave-relay-bin.index   //配置中继日志名
auto_increment_increment=2         //设置自增字段每次递增的值
auto_increment_offset=1            //用来设定数据库中自动增长的起点
slave-skip-errors = all               //忽略所有复制产生的错误  

1、修改my.cnf配置之后,启动启动mysql(或者重启mysql)

如果没有启动mysql,执行以下命令

docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.28

如果mysql已经正在运行的, docker重新运行mysql是my.cnf配置生效

docker restart mysql

2、Master配置为主MySQL,Slave为从MySQL

进入docker内部,登录Master的mysql

docker exec -it mysql /bin/bash
#输入账号密码登录
mysql -uroot -p123456

将Master设置成Slave的主服务器,在Master的mysql上执行

#授权root用在192.168.111.105上进行登录
grant replication slave on *.* to 'root'@'192.168.111.105' identified by '123456';
flush  privileges;

查看Master的mysql当前binlog状态信息,如下图

show master status;

在这里插入图片描述

然后登录Slave(IP:192.168.111.105),开启Slave服务器的slave功能

docker exec -it mysql /bin/bash
#输入账号密码登录
mysql -uroot -p123456

执行以下SQL语句

#上色框框的值要对应,binlog状态信息 master_log_file 和 master_log_pos
change  master to master_host='192.168.111.104', master_user='root', master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=605;
start  slave;

查看Slave的mysql同步状态:

show slave status\G;

在这里插入图片描述
主主从同步配置完毕,查看同步状态Slave_IO和Slave_SQL是YES说明主主同步成功。

3、Slave配置为主MySQL,Master为从MySQL

进入docker内部,登录Slave的mysql

docker exec -it mysql /bin/bash
#输入账号密码登录
mysql -uroot -p123456

将Slave设置成Master的主服务器,在Slave的mysql上执行

#授权root用在192.168.111.104上进行登录
grant replication slave on *.* to 'root'@'192.168.111.104' identified by '123456';
flush  privileges;

查看Slave的mysql当前binlog状态信息,如下图

show master status;

在这里插入图片描述
然后登录Master(IP:192.168.111.104),开启Master服务器的slave功能

docker exec -it mysql /bin/bash
#输入账号密码登录
mysql -uroot -p123456

执行以下SQL语句

#上色框框的值要对应,binlog状态信息 master_log_file 和 master_log_pos
change  master to master_host='192.168.111.105', master_user='root', master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=614;
start  slave;

查看Master的mysql同步状态:

show slave status\G;

在这里插入图片描述
可以看到Master中mysql的Master_Host=192.168.111.105, 说明MySQL1的主数据库是105服务器的Slave

二、安装keepalived

1、Master安装keepalived

安装keepalived

yum install –y  kernel-devel openssl-develpopt-devel
yum install -y keepalived

修改配置:

vi /etc/keepalived/keepalived.conf

配置文件内容如下

#01的keepalived.conf配置
! Configuration File for keepalived
       
global_defs {
	notification_email {
	    xXXXX2@qq.com
		#报警邮件接收人的地址
	}
       
	notification_email_from XXX@qq.com
	smtp_server 127.0.0.1 
	smtp_connect_timeout 30

}
       
vrrp_script chk_mysql_port {     
#检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/tmp/mysql.sh"   
    #这里通过脚本监测
    interval 2                   
    #脚本执行间隔,每2s检测一次
    weight -5                    
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    
    #检测1次成功就算成功。但不修改优先级
}
       
vrrp_instance VI_1 {
    state MASTER    
    interface ens33      
    #指定虚拟ip的网卡接口
    mcast_src_ip 192.168.111.104
    #本机IP
    virtual_router_id 51    
    #路由器标识,MASTER和BACKUP必须是一致的
    priority 101            
    #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 123456     
    }
    virtual_ipaddress {    
        192.168.111.106
    }
      
	track_script {               
	   chk_mysql_port             
	}
}

编写kill_keepalived.sh

vim /tmp/mysql.sh

mysql.sh内容如下

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" == 0 ];then
   systemctl stop keepalived
fi

设置权限


chmod 755 /tmp/mysql.sh

重启keepalived

systemctl start keepalived

2、Slave安装keepalived

安装keepalived

yum install –y  kernel-devel openssl-develpopt-devel
yum install -y keepalived

修改配置:

vi /etc/keepalived/keepalived.conf

配置文件内容如下 ,

#02的keepalived.conf配置
! Configuration File for keepalived
       
global_defs {
	notification_email {
	    xxx@qq.com
	#报警邮件接收人的地址
	}
       
	notification_email_from xxxxx@qq.com
	smtp_server 127.0.0.1 
	smtp_connect_timeout 30

}
       
vrrp_script chk_mysql_port {     
#检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/tmp/mysql.sh"   
    #这里通过脚本监测
    interval 2                   
    #脚本执行间隔,每2s检测一次
    weight -5                    
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    
    #检测1次成功就算成功。但不修改优先级
}
       
vrrp_instance VI_1 {
    state BACKUP    
    interface ens33      
    #指定虚拟ip的网卡接口
    mcast_src_ip 192.168.111.105
    #本机IP
    virtual_router_id 51    
    #路由器标识,MASTER和BACKUP必须是一致的
    priority 99            
    #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 123456     
    }
    virtual_ipaddress {    
        192.168.111.106
    }
      
	track_script {               
	   chk_mysql_port             
	}
}

编写kill_keepalived.sh

vi /tmp/mysql.sh

mysql.sh内容如下

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" == 0 ];then
   systemctl stop keepalived
fi

设置权限


chmod 755 /tmp/mysql.sh

重启keepalived

systemctl start keepalived

关闭SELINUX

发现关闭Master之后,虚拟IP 192.168.111.106 没有转移到Slave上
尝试一下关闭SELINUX

vi /etc/selinux/config

# 修改 
SELINUX=disabled

# 重启
reboot
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐