mysql MHA
主从复制架构演变介绍
基本架构
(1)一主一从
(2)一主多从
(3)多级主从
(4)双主
(5)循环复制
高级应用架构演变
高性能架构
读写分离架构(读性能较高)
代码级别
MySQL proxy (Atlas,mysql router,proxySQL(percona),maxscale)、
amoeba(taobao)
xx-dbproxy等。
分布式架构(读写性能都提高):
分库分表——cobar--->TDDL(头都大了),DRDS
Mycat--->DBLE自主研发等。
NewSQL-->TiDB
高可用架构
(1)单活:MMM架构——mysql-mmm(google)
(2)单活:MHA架构——mysql-master-ha(日本DeNa),T-MHA
(3)多活:MGR ——5.7 新特性 MySQL Group replication(5.7.17) --->Innodb Cluster
(4)多活:MariaDB Galera Cluster架构,(PXC)Percona XtraDB Cluster、MySQL Cluster(Oracle rac)架构
架构工作原理
主库宕机处理过程
1. 监控节点 (通过配置文件获取所有节点信息)
系统,网络,SSH连接性
主从状态,重点是主库
2. 选主
(1) 如果判断从库(position或者GTID),数据有差异,最接近于Master的slave,成为备选主
(2) 如果判断从库(position或者GTID),数据一致,按照配置文件顺序,选主.
(3) 如果设定有权重(candidate_master=1),按照权重强制指定备选主.
1. 默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效.
2. 如果check_repl_delay=0的化,即使落后很多日志,也强制选择其为备选主
3. 数据补偿
(1) 当SSH能连接,从库对比主库GTID 或者position号,立即将二进制日志保存至各个从节点并且应用(save_binary_logs )
(2) 当SSH不能连接, 对比从库之间的relaylog的差异(apply_diff_relay_logs)
4. Failover
将备选主进行身份切换,对外提供服务
其余从库和新主库确认新的主从关系
5. 应用透明(VIP)
6. 故障切换通知(send_reprt)
7. 二次数据补偿(binlog_server)
8. 自愈自治(待开发...)
架构介绍
1主2从,master:db01 slave:db02 db03 ):
MHA 高可用方案软件构成
Manager软件:选择一个从节点安装
Node软件:所有节点都要安装
MHA软件构成
Manager工具包主要包括以下几个工具:
masterha_manger 启动MHA
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_master_monitor 检测master是否宕机
masterha_check_status 检测当前MHA运行状态
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
Node工具包主要包括以下几个工具:
这些工具通常由MHA Manager的脚本触发,无需人为操作
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
MHA环境搭建
规划
主库: 129 node
从库:
128 node
130 node manager
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
准备环境(1主2从GTID)
#创建数据目录和binlog
mkdir /data/mysql/mysql_data -p
mkdir /data/mysql/log_bin
chown -R mysql:mysql /data/mysql/
useradd -s /sbin/nologin mysql
cat >> /etc/profile <<eof #环境变量
export PATH=/opt/mysql_cluster/mysql/bin:$PATH
eof
source /etc/profile
#配置文件
主库db01:
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/opt/mysql_cluster/mysql
datadir=/data/mysql/mysql_data
socket=/tmp/mysql.sock
server_id=129
port=3306
secure-file-priv=/tmp
autocommit=0
log_error=/opt/mysql_cluster/mysql/logs/db01.err
log_bin=/data/mysql/log_bin/log_bin
gtid-mode=on
enforce-gtid-consistency=true
binlog_format=row
log-slave-updates=1
[mysql]
socket=/tmp/mysql.sock
prompt=db01 [\\d]>
EOF
slave1(db02):
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/opt/mysql_cluster/mysql
datadir=/data/mysql/mysql_data
socket=/tmp/mysql.sock
server_id=128
port=3306
secure-file-priv=/tmp
autocommit=0
log_error=/opt/mysql_cluster/mysql/logs/db02.err
log_bin=/data/mysql/log_bin/log_bin
gtid-mode=on
enforce-gtid-consistency=true
binlog_format=row
log-slave-updates=1
[mysql]
socket=/tmp/mysql.sock
prompt=db02 [\\d]>
EOF
slave2(db03):
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/opt/mysql_cluster/mysql
datadir=/data/mysql/mysql_data
socket=/tmp/mysql.sock
server_id=130
port=3306
secure-file-priv=/tmp
autocommit=0
log_error=/opt/mysql_cluster/mysql/logs/db03.err
log_bin=/data/mysql/log_bin/log_bin
gtid-mode=on
enforce-gtid-consistency=true
binlog_format=row
log-slave-updates=1
[mysql]
socket=/tmp/mysql.sock
prompt=db03 [\\d]>
EOF
#初始化数据
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql_cluster/mysql --datadir=/data/mysql/mysql_data
systemctl