MySQL远程双活是将MySQL分布在不同机房,采用MySQL replication实现数据从主服务器同步至备服务器,在主备机器出现故障的情况下,能够做到自动化切换,实现主备双台故障自动容灾。
MySQL远程双活实现主备双台故障自动容灾,首先要在两台节点之间搭建MySQL复制体系,这里以MySQL 5.6版本为例,两台MySQL实例分别命名为M0和M1,完成如下配置:
1.配置主备之间的安全认证:
GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%' IDENTIFIED BY 'password';
2.设置主服务器的server_id做标识:
[mysqld]
server_id=1
3.在M0上执行:
M0> FLUSH TABLES WITH READ LOCK;
M0> SHOW MASTER STATUS;
4.在M1上执行:
M1> CHANGE MASTER TO MASTER_HOST='M0的IP', MASTER_USER='rpl_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='M0的主日志文件名',MASTER_LOG_POS=M0的主日志文件位置;
M1> START SLAVE;
M1> UNLOCK TABLES; //释放主服务器上表锁
完成以上步骤后,MySQL复制就搭建成功,此时M1实例已经成为从服务器了,可以实现数据复制从M0同步至M1。
但仅搭建MySQL复制,还无法实现MySQL远程双活以及故障自动容灾,需要结合阿里云数据库实例跨地域双活特性进行配置,来实现主备双台故障自动容灾。
首先要配置主机自动存活检测,这里使用负载均衡的方式,两台MySQL实例分别部署在负载均衡这端,定时检测MySQL运行中状态,一旦有实例存在故障,负载均衡模块会将流量切换至正常的实例。
其次,还要设置三台机器之间的心跳检测,这里采用keepalived来做检测,配置keepalived主备三台机器之间的故障检测,一旦主服务器发生故障,会自动触发MySQL从服务器进行主备切换。
最后,使用Python语言编写一个容灾脚本:
#!/usr/bin/env python
# coding=utf-8
import os
import socket
# 读取ha信息
vm_ip=''
HA_VIP=''
def get_vmip():
global vm_ip
temp = os.popen("ip addr show dev eth0 | grep inet | awk -F/ '{print $1}' | awk '{print $2}'").readlines()
if temp:
vm_ip=temp[0].strip()
else:
mail_err("Error!Get vm_ip failed!\n")
def get_havip():
global HA_VIP
cmd_str="cat /etc/keepalived/keepalived.conf |grep 'virtual_ipaddress' |awk -F' ' '{print $2}'"
temp = os.popen(cmd_str).readlines()
if temp:
HA_VIP=temp[0].strip()
else:
mail_err("Error!Get ha_vip failed!\n")
get_vmip()
get_havip()
# 激活IP
if vm_ip == HA_VIP:
os.system("ifconfig eth0:0 %s netmask255.255.255.0 up" % HA_VIP)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
result=s.connect_ex((HA_VIP,3306)) #注意:端口号三种写法都可以,如果只写数字,那么就认为是10进制
if result == 0:
os.system("/usr/local/mysql/bin/mysqladmin -uroot -pstart-slave #导入MySQL实际路径")
else:
print('连接失败!')
以上就是MySQL远端双活的基本配置,结合阿里云的跨地域双活,实现MySQL远端双活实现主备双机故障自动容灾,实现MySQL主备高可用。MySQL远程双活能够大大提高MySQL服务器和应用的可用性,极大降低故障率,同时也能更加可靠地保证数据安全。