mysql主从复制和MHA

一 主从复制介绍

1.1 介绍

Mysql主从又叫Replication、AB复制。
简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,实现数据实时同步
mysql主从是基于binlog进行更新和同步的。

主从复制线程:

主节点:
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其 发送binary log events

从节点:
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中 SQL Thread:从中继日志中读取日志事件,在本地完成重放

跟复制功能相关的文件:

master.info:用于保存slave连接至master时的相关信息,例如账号、密码、 服务器地址等

relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地 replay log日志的对应关系

1.2 特点

主从复制特点: 异步复制 主从数据不一致比较常见

复制架构:
Master/Slave, Master/Master, 环状复制
一主多从
从服务器还可以再有从服务器
一从多主:适用于多个不同数据库

复制需要考虑二进制日志事件记录格式
STATEMENT(5.0之前)
ROW(5.1之后,推荐) MIXED

1.3主从复制原理

mysql主从复制和MHA_第1张图片

如上图所示,
主从过程大概有3个步骤
主将更改操作记录到binlog里
从将主的binlog事件(sql语句) 同步本机上并记录在relaylog里
从根据relaylog里面的sql语句按顺序执行

二 mysql主从配置

在两台台系统通过yum安装mysql(不再进行安装过程)

2.1 修改/etc/my.cnf配置文件

2.1.2 主mysql

vi /etc/my.cnf
开启

log_bin 启用二进制日志
server_id #为当前节点设置一个全局惟一的ID号
log-basename=master 可选项,设置datadir中日志名称,确保不依赖主机名
binlog_format #格式也有三种:STATEMENT,ROW,MIXED

2.1.3 从mysql

Vim /etc/my.cnf
server_id=# 为当前节点设置一个全局惟的ID号
read_only=ON 设置数据库只读
relay_log=relay-log # relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index #默认值 hostname -relay-bin.index

注意:
主mysql和从mysql的server-id=1 后面的数字一定要不一样,要不是失败的。

2.2 主服务器和从服务器mysql数据复制命令操作

2.2.1 主服务器授权:

#给予repluser权限,服务器上面都输入
mysql>grant replication slave,replication client on *.* to 'repluser'@'10.10.10.2' identified by '123456';
#在主master上 登陆mysql
 输入: 
 show master status; 查看 pos值和log_file

2.2.2从服务器:

mysql>grant replication slave,replication client on *.* to 'repluser'@'10.10.10.1' identified by '123456';

mysql> change master to master_host='10.10.10.1',master_user='repluser',master_password='123456',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=107;
#master_log_file和masterr_log_pos,在主服务器上进行查看

mysql>start slave;
2.2.3主从配置半同步

主服务器安装半同步:mysql>install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
mysql>set global rpl_semi_sync_master_enabled=1;

从服务器安装半同步:mysql>install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
mysql>set global rpl_semi_sync_slave_enabled=1;

只要看到Slave_IO_Running Slave_SQL_Running都为yes就可以了。
之后再从mysql管理服务查看:如下图

mysql主从复制和MHA_第2张图片

三 mysql主从复制其他事项

3.1 如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点

**

通过备份恢复数据至从服务器 
复制起始位置为备份时,二进制日志文件及其POS
如果要启用级联复制,需要在从服务器启用以下配置    
[mysqld]  
 log_bin  
 log_slave_updates

3.2 复制架构中应该注意的问题:

1、限制从服务器为只读 
在从服务器上设置read_only=ON  注意:此限制对拥有SUPER权限的用户均无效 阻止所有用户, 
包括主服务器复制的更新         
 mysql> FLUSH TABLES WITH READ LOCK; 

2、RESET SLAVE :从服务器清除master.info ,relay-log.info, relay log ,开始新的relay log  
     RESET SLAVE  ALL:清除所有从服务器上设置的主服务器同步信息,如 PORT, HOST, USER和 PASSWORD    注意:以上都需要先STOP SLAVE 

3、sql_slave_skip_counter = N  从服务器忽略几个主服务器的复制事件, global变量 

4、如何保证主从复制的事务安全  
参看https://mariadb.com/kb/en/library/server-system-variables/ 
在master节点启用参数:  
sync_binlog=1 每次写后立即同步二进制日志到磁盘,性能差      
 如果用到的为InnoDB存储引擎:       
innodb_flush_log_at_trx_commit=1  每次事务提交立即同步日志写磁盘       
innodb_support_xa=ON   默认值,分布式事务MariaDB10.3.0废除  sync_master_info=#   
 #次事件后master.info同步到磁盘 

3.3 在slave节点启用服务器选项:

skip-slave-start=ON  不自动启动slave
 在slave节点启用参数:    
 sync_relay_log=#    #次写后同步relay log到磁盘       
 sync_relay_log_info=# #次事务后同步relay-log.info到磁盘 

四 MHA

4.1 介绍

数据的重要性对于人们来说重要程度不说自明,在信息时代,数据有着比人们更大的力量,
数据库的价值可见一斑,数据库的存在为人们提供了更快的查询,
MHA是由日本Mysql专家用Perl写的一套Mysql故障切换方案以保障数据库的高可用性,它的功能是能在0-30s之内实现主Mysql故障转移(failover),
MHA故障转移可以很好的帮我们解决从库数据的一致性问题,同时最大化挽回故障发生后的数据。
MHA里有两个角色一个是node节点 一个是manager节点,
要实现这个MHA,必须最少要三台数据库服务器,一主多备,即一台充当master,一台充当master的备份机,另外一台是从属机。
需要说明的是一旦主服务器宕机,备份机即开始充当master提供服务,主服务器上线也不会再成为master了,因为如果这样数据库的一致性就被改变了。

MHA集群架构
mysql主从复制和MHA_第3张图片

4.2 MHA工作原理

1 从宕机崩溃的master保存二进制日志事件(binlog events)
2 识别含有最新更新的slave
3 应用差异的中继日志(relay log)到其他的slave
4 应用从master保存的二进制日志事件(binlog events)
5 提升一个slave为新的master
6 使其他的slave连接新的master进行复制

4.3 MHA软件由两部分组成,Manager工具包和Node工具包

Manager工具包主要包括以下几个工具: 
masterha_check_ssh         检查MHA的SSH配置状况 
masterha_check_repl        检查MySQL复制状况 
masterha_manger            启动MHA 
masterha_check_status      检测当前MHA运行状态
masterha_master_monitor  检测master是否宕机 
masterha_master_switch    故障转移(自动或手动) 
masterha_conf_host        添加或删除配置的server信息 

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主 要包括以下几个工具: 
save_binary_logs       保存和复制master的二进制日志 
apply_diff_relay_logs    识别差异的中继日志事件并将其差异的事件应用 于其他的slave 
filter_mysqlbinlog     去除不必要的ROLLBACK事件(MHA已不再使 用此工具)
purge_relay_logs    清除中继日志(不会阻塞SQL线程) 
注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA 的同时建议配置成MySQL 5.5的半同步复制 
 

4.4 自定义扩展:

secondary_check_script: 通过多条网络路由检测master的可用性
 master_ip_ailover_script: 更新Application使用的masterip
  shutdown_script:  强制关闭master节点
   report_script:  发送报告 
   init_conf_load_script: 加载初始配置参数 
   master_ip_online_change_script:更新master节点ip地址 
   配置文件:   
   global配置,为各application提供默认配置      
   application配置:为每个主从复制集群 

五 MHA配置

赋权操作是权限是只有replication,MHA会在配置文件里要求能远程登录到数据库,所以要进行必要的赋权。

5.1 软件安装

安装mha_manager
yum –y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
安装依赖包
rpm -ivh http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.52-0.noarch.rpm

5.2grant 账号权限配置

在主从服务器mysql上:分别添加两个账户mhauser :
Mysql> grant all on . to ‘mhauser’@‘10.10.10.1’ identified by ‘123456’;
Mysql> grant all on . to ‘mhauser’@‘10.10.10.2’ identified by ‘123456’;

5.3 创建mha目录和配置文件

创建目录:
mkdir /data/masterha/app1 -p
#添加配置文件
vim /etc/masterha/app1.cnf

[server default]
user=mhauser
password=123456
manager_workdir=/data/masterha/app1
manager_log=/data/masterha/manager.log
remote_workdir=/data/masterha/app1
ssh_user=root
ssh_port=22 #如果SSH端口更改,记得更改此处
repl_user=repluser
repl_password=123456
ping_interval=1
[server1]
hostname=10.10.10.1
master_binlog_dir=/mydata/data
[server2]
hostname=10.10.10.2
candidate_master=1
master_binlog_dir=/mydata/data

备注:
需要指出的是第二行第三行中之前提到的user和password是mysql中赋权的用户

5.4 使用mha命令进行检测

5.4.1 检查SSH公钥免密码登录 从服务器检测就可以
masterha_check_ssh --conf=/etc/masterha/app1.cnf

mysql主从复制和MHA_第4张图片
可以看到最后检测成功

5.4.2 命令检查MySQL复制

masterha_check_repl --conf=/etc/masterha/app1.cnf
可以看出 最后检测都成功(虽然有些警告信息,不用去管它)。
mysql主从复制和MHA_第5张图片
…等
mysql主从复制和MHA_第6张图片
显示是正常的,说明检测成功

5.4.3 制作mha启动脚本以及权限设置 在从服务器

mha.sh 的脚本进行进行启动
vim /etc/init.d/mha.sh

#!/bin/sh  
#add for chkconfig  
#chkconfig: 2345 70 30  
#description: the description of the shell   #关于脚本的简短描述  
#processname: rsync_shsihitongbu  
nohup masterha_manager --conf=/etc/masterha/app1.cnf &

#进行设置主要是为了重启之后自动启用》

cd /etc/init.d
#设置文件权限

# chmod 755 mha.sh 
# chkconfig --add mha.sh 
# chkconfig mha.sh on
5.4.4 开启MHA进程

nohup masterha_manager --conf=/etc/masterha/app1.cnf &

之后通过 命令检测:
masterha_check_status --conf=/etc/masterha/app1.cnf
在这里插入图片描述
可以看到检测主mysql是正常的
mha安装完成

你可能感兴趣的:(Linux运维)