mysql
1、安装
# mysql 5.7
- name: 准备mysql安装包
copy:
src: /mysqlsql-{{ MYSQL_VERSION }}.tar.gz
dest: /usr/local/mysql-{{ MYSQL_VERSION }}.tar.gz
- name: 解压mysql安装包
shell: tar -xf /usr/local/mysql-{{ MYSQL_VERSION }}.tar.gz -C /usr/local
- name: 更改目录文件名称为mysql
shell: mv /usr/local/mysql-{{ MYSQL_VERSION }}-* /usr/local/mysql
- name: 更改mysql目录权限
shell: chown -R root:root /usr/local/mysql
- name: 创建mysql用户组
group: name=mysql
- name: 创建mysql用户
user: name=mysql group=mysql shell=/sbin/nologin
- name: 添加PATH环境变量
shell: echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh && . /etc/profile.d/mysql.sh
- name: 准备配置文件
template:
src: my.cnf.j2
dest: /etc/my.cnf
- name: 创建mysql数据目录
file: path={{ DATA_DIR }} state=directory owner=mysql group=mysql mode=0755
- name: 创建数据库文件
shell: /usr/local/mysql/bin/mysqld --initialize-insecure-insecure --user=mysql --basedir=/usr/local/mysql --datadir={{ DATA_DIR }}
- name: 复制mysqld
shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- name: 启动mysql服务
shell: chkconfig --add mysqld && service mysqld start
2、多实例
# 创建多实例
mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid} && chown -R mysql.mysql /mysql
# 初始化
mysqld --initialize-insecure --user=mysql --datadir=/mysql/3308/data && mysqld --initialize-insecure --user=mysql --datadir=/mysql/3307/data && mysqld --initialize-insecure --user=mysql --datadir=/mysql/3306/data
# 配置实例配置文件
tee /mysql/3306/etc/my.cnf << EOF
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid
EOF
sed 's/3306/3307/' /mysql/3306/etc/my.cnf > /mysql/3307/etc/my.cnf && sed 's/3306/3308/' /mysql/3306/etc/my.cnf > /mysql/3308/etc/my.cnf
# 准备启动脚本
tee /mysql/3307/bin/mysqld << eof
#!/bin/bash
port=3307
mysql_user="root"
mysql_pwd="123456"
cmd_path="/usr/bin"
mysql_basedir="/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}
function_restart_mysql()
{
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
eof
3、备份和恢复
3.1 备份分类
# 完全备份
备份整个数据库集合
# 部分备份
备份部分库和表
# 增量备份
以前一天为基准,只备份比前一天增加的数据,一般第一天的数据要求全备
# 差异备份
第一天全备,以后只备份比第一天增加的数据
# 冷备
停止读写及服务进行备份
# 温备
可读不可写,进行备份
# 热备
正常提供服务进行备份
# 物理备份
使用复制手段,将数据整个复制走
# 逻辑备份
从数据库中到处数据另存
3.2 备份要点
# 数据
# 二进制日志,innodb事务日志
# 用户账号,权限,程序代码(函数,存储过程,触发器,事件调度器)
# 服务器的配置文件
# 备份完成后要做还原演练,保证数据的可恢复性
# 备份要规范化,整理成文档
3.3 备份工具
# 物理备份
cp,tar
# 逻辑备份
mysqldump
3.4 备份步骤
# 物理备份
找到mysql配置文件,备份配置文件
查看配置文件,mysql数据存放位置,将其使用tar打包
使用rsync或scp将文件复制到其余节点或存储在u盘
# 恢复
恢复配置文件和数据文件
注意权限问题
# 逻辑备份
mysqldump
选项
-A 全备,备份所有的数据库
-B db_name 备份部分数据库
-E 备份事件调度器
-R 备份存储过程和函数
--triggers 备份触发器 --skip-triggers 不备份触发器
--default-character-set=utf8 指定字符集
--master-data[=n]
-F 备份钱滚动日志,锁定表完成后,生成新的二进制日志
-x 配合-F在全部备份时只刷新一次日志
-d 只备份表结构,不备份表中的数据
-t 只备份数据不备份表结构
-f 忽略sql错误强制备份
--hex-blob 使用十六进制转储二进制
-q 不缓存查询,只备份,可以加快速度
innodb选项
--single-transaction
# innodb建议备份策略
mysqldump -uroot -p -A -F -E -R --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob >${BACKUP}/fullbak_${BACKUP_TIME}.sql
备份前滚动日志,备份完成后生成新日志,备份全部表格,备份时间调度器,备份存储过程和函数,备份触发器,指定字符集,以十六进制转储
# myisam建议备份策略
mysqldump -uroot -p -A -F -E -R -x --master-data=1 --flush-privilegestriggers--default-character-set=utf8 --hex-blob >${BACKUP}/fullbak_${BACKUP_TIME}.sql
4、sql语句
4.1 字符集和排序规则
# 查看支持的字符集和排序规则
SHOW CHARACTER SET;
SHOW COLLATION;
# 查看当前使用的字符集和排序规则
show variables like 'character%';
show variables like 'collation%';
# 设置默认字符集
vim /etc/my.cnf
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
4.2 数据类型
4.2.1 整数型
分为1,2,3,4,8字节,一字节等于8个二进制位,能表示2^8位数字,此数据可以通过修饰符改变为正整数,默认是带-号的基于0的对称数字
tinyint(m) smallint(m) mediumint(m) int(m) bigint(m) m表示查询时显示的宽度,不影响数据存储
4.2.2 bool
非真即假
与tinyint(1)为同义词 0被视为真,非0被视为假
4.2.3 浮点数
# float
float(m,d) 单精度浮点型 8位精度(4字节)
# double
double(m,d) 双精度浮点型16位精度(8字节)
m总个数,d小数位, 注意: 小数点不占用总个数,若数据超出限制将会被四舍五入
4.2.4 定点数
decimal(m,d)
最多 m 位数字,其中 d 个小数,小数点不算在长度内
每4个字节存储9个数字,小数点占1字节
一般用来针对小数进行精确计算时使用此数据
4.2.4 字符串
# 固定长度
char(n) 最长255字符,2^8 注意与字节的区别,字符为表示单位,字节为存储单位
若存储字符小于定义长度,那么固定占用空间,并将其后面补位空格,此类型数据后面不能有空格
# 可变长度
varchar(n) 最长65535字符 2^16
占用空间不固定,为字符占用+1字节,
检索速度char 大于 varchar
4.2.5 时间
data 日期 2021-12-23
time 时间 16:33:30
datetime 2021-12-23 16:22:45
YEAR(2), YEAR(4) 年份
4.2.6 枚举
从指定的选项中选出一个
ENUM('M','F')
4.2.7 修饰符
# 修饰符用来对定义的数据进行额外属性的添加
# 适用于所有数据的修饰符
null 空
not null 非空
default 默认值
primary key 主键
unique key 唯一键
CHARACTER SET name 指定一个字符集
timestamp 自动存储记录修改时间适用于时间数据
# 适用于数值类的修饰符
AUTO_INCREMENT[=n] 自动递增,适用于key,基于整数 可以定义初始与步进n为初始值。默认步进为1,默认初始值为1
show variables like 'incre%';
UNSIGNED 移除符号,将数字范围从 -1--1 变为 0-2
4.3 数据库管理
# 创建数据库
useg: create database if not exists k8s character set 'utf8mb4' collate 'utf8mb4_general_ci';
目录关系: 数据库db一般存在于数据目录下,以目录形式存在
ll /data/mysql/k8s
# 修改数据库
alter database k8s character set utf8;
# 查看数据库创建信息
show create database k8s;
# 删除数据库
drop database if exists k8s;
# 变量管理
查看: show variables like 'auto_%';
更改: set @@name=value;
4.4 表管理
# 创建表
1、直接创建
create table tb_name (字段1 类型 修饰符,字段2 类型 修饰符) ENGINE [=] engine_name [AUTO_INCREMENT=n] [default charset utf8];
2、通过查询创建
create table k8s_select select * from k8s_table;
3、创建和其他表一样的表结构
create table k8s_copy like k8s_table;
# 查看表
1、查看某数据库中的某张表
show tables from db_name;
2、查看表的创建命令
show create table tb_name;
3、查看标的状态
show table status like 'k8s_copy';
4、 查看表的结构
desc tb_name;
# 修改表
1、修改表
alter table tb_name subcommand
subcommand:
add col1 data_type [FIRST|AFTER col_name] # 添加一列,指定列的名称,数据类型,指定在首位或者在哪个字段之后
drop col_name # 删除某列
change # 改变字段名称同时也可改变类型
modify # 改变字段的属性,比如int改为txet
rename tb_name # 改变表名称
# 删除表
drop table tb_name;
4.5 数据管理
# 插入数据
insert tb_name[(字段1,字段2)] valu(字段1值,字段2值) # 若不指定字段默认valu需要输入所有字段的值
# 更新数据
更新数据必须指定条件限制,否则默认更改全部的列,可以在配置文件配置,若无限制条件那么无法进行更新
[mysql]
safe-updates
update tb_name set 字段=value [where 条件]
# 删除数据
删除数据需要指定条件否则默认清空全表
delete from tb_name where 条件
TRUNCATE TABLE k8s_tb; 情况表但保留表结构
# 查询数据
别名 字段1 as f 将字段名称使用f来命名
where子句
算数表达式 + - * / %
比较表达式 > < >= <= = <=>(相等或都为空)
between a and b 在两者之间
in(条件1,条件2) | not in 判断是否在容器内
is null|not null 判断是否为空
distinct 去除重复行,相当于python中的集合
select distinct gender from students ;
模糊查询 %表示任意字符,_表示单个字符
逻辑表达式 and or not
正则表达式 REGEXP rlike
group by 分组 如果指定了分组,那么select后面只能跟分组的列和对齐聚合运算的结果
后面跟两个条件,会将两个条件分别组合
聚合运算
count()统计总数
sum()计算总和
max()最大值
min()最小值
avg()平均数
having 对聚合运算后的结果进行过滤
order by 排序
asc 升序,默认为升序
desc 降序
limit[[1],3] 限制结果输出数 1表示从第一行开始默认从0开始,3表示三行
# 多表查询
子查询 基于某sql语句的查询结果进行再查询,可用于单表或多表
1、用来进行比较运算的子查询,语义较为接近自然理解 比如
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM teachers);
查询出学生年龄比教师平均年龄大的学生
2、用于判断查询结果是否在一系列条件中,做容器in的判断 比如
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
查询学生年龄满足和教师年龄一样的学生
3、判断是否存在某条件
select * from students s where EXISTS (select * from teachers t where s.teacherid=t.tid);
将外查询结果逐条带入内查询中,exists 返回布尔值,若为真,外查询返回结果
select * from students as s where s.teacherid in (select tid from teachers);
查询学生表中教师id和老师表中教师tid相等的学生的信息
4、 SELECT s.ClassID,s.aage FROM (SELECT ClassID,avg(Age) AS aage FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
显示课程学生表中所有课程的学生的平均年龄大于30的学生
联合查询
union
将多个具有相同字段的表进行纵向合并,统一去重显示
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;
内连接
inner join 一般用 on 指定两个表中相同字段
取两个表中的交集,将两个表中指定具有相同字段的其余字段拼接成为新的表
select * from students as s inner join teachers as t on s.teacherid=t.tid;
外连接
left join
将两表以指定相同字段的key相交,取出存在于主表但去除两表相交和存在于右表的部分
完全外连接
full out join
将两个表指定相同的key字段相交去重
5、 视图
# view
保存真正的表的查询结果的虚拟表格
# 创建
create view view_name as select ...
# 查看
show tables;
show create table tb_name;
# 删除
drop view view_name;
6、 函数
7、 存储过程
8、 事件
9、 触发器
10、 用户管理
# 账号格式
用户名@网段
[email protected]
[email protected].%.% %表示通配符
user2@'192.168.1.%'
mage@'10.0.0.0/255.255.0.0' 可以使用子网掩码形式来放行网段
# 创建用户
create user quanheng@'172.31.3.1' IDENTIFIED BY '123456';
创建一个用户名为quanheng密码为123456 且可以从172.31.3.1这台主机连接过来的账号
# 查询
select host,user from mysql.user \G;
# 修改用户名
rename user quanheng@'ip' to guquanheng@'ip';
# 删除用户
drop user quanheng@'ip';
# 密码修改
SET PASSWORD FOR 'user'@'host' = PASSWORD('password'); 8.0以下
set password for root@'localhost'='123456'; 8.0
ALTER USER test@'%' IDENTIFIED BY 'centos';
11、 权限管理
# 授权
GRANT
GRANT 权限类别 on 针对哪个类型的比如,数据库,表等 to user
GRANT ALL ON wordpress.* TO wordpress@'10.0.0.%' ; 针对wordpress下的所有表授予所有权限给wordpress用户
FLUSH PRIVILEGES;
# 取消权限
revoke
revoke ALL ON wordpress.* from wordpress@'10.0.0.%';
FLUSH PRIVILEGES;
# 查看用户权限
SHOW GRANTS FOR 'user'@'host';
12、 集群
12.1 主从复制
# 原理
利用二进制日志与中继日志,将主节点数据通过二进制日志传输到从节点,从节点利用二进制日志写入中继日志,转化为sql语句导入
# 步骤
主节点
1、开启二进制日志
vi /etc/my.cnf
[mysqld]
log_bin
2、设置一个唯一的id
[mysqld]
server-id=1
log-basename=master # datadir中日志名称,可选
3、查看二进制日志位开始复制
SHOW MASTER STATUS; # 用在启动复制线程时
4、创建拥有复制权限的账号
create user slave@'172.31.3.%' identified by '123456'; # 创建
grant replication slave on *.* to slave@'172.31.3.%'; # 授权
从节点
1、启动中继日志
[mysqld]
server_id=2 为当前节点设置一个全局惟的ID号
log-bin
read_only=ON #设置数据库只读,针对supper user无效
relay_log=relay-log #relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index #默认值hostname-relay-bin.index
2、使用复制权限账号连接至主服务器,启动复制线程
CHANGE MASTER TO MASTER_HOST='172.31.3.99',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-master-bin.000001',MASTER_LOG_POS=154;
START SLAVE ;
SHOW SLAVE STATUS;
12.2 级联复制
从节点再有从节点,步骤与主从类似,级联的slave配置如下
[mysqld]
server-id=18
log-bin
read-only
log_slave_updates
slave同步将master改为级联slave其余不变
12.3 主主复制
互为主从,数据互相复制,步骤与主从类似,注意点,需要将自动增长的id段隔开,有几个节点就将增长设为几
auto_increment_offset=2
auto_increment_increment=2
12.4 复制相关问题
12.4.1 监控
SHOW MASTER STATUS
SHOW BINARY LOGS
SHOW BINLOG EVENTS
SHOW SLAVE STATUS
SHOW PROCESSLIST
12.4.2 复制错误
SET GLOBAL sql_slave_skip_counter = N 设定跳过错误
[mysqld]
slave_skip_errors=1007|ALL 跳过所有错误
12.4.3 master宕机
master宕机后提升slave为新的master
查看从节点中继日志,确定哪一个节点拥有最新数据
cat /data/mysql/relay-log.info
将此节点设置为master节点
关闭read-only
[mysqld]
server-id=18
read-only=OFF
log-bin=/data/mysql/logbin/mysql-bin
清除旧的复制信息
set global read_only=off;
stop slave;
restart slave all;
做完备
mysqldump -A --single-transaction --master-data=1 -F > backup.sql
将挂掉的master二进制日志未同步的日志导出,恢复到新的master
其他节点重新从新master同步
stop slave;
reset slave all;
set sql_log_bin=off;
CHANGE MASTER TO MASTER_HOST='172.31.3.99',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-master-bin.000001',MASTER_LOG_POS=154;
set sql_log_bin=on;
START SLAVE ;
12.4.4 数据不一致
12.4.4.1 备库重搭
# 主库
mysqldump --set-gtid-purged=OFF --single-transaction --master-data=1 --all-databases > dump.sql
scp dump.sql 从库ip:/tmp/
show master status;
File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-master-bin.000006 | 790 | | | |
+-------------------------+----------+--------------+------------------+-------------------+
记录file 和 pos
# 从库
STOP SLAVE;
reset slave all;
set sql_log_bin=off;
source /tmp/dump.sql
head -30 /tmp/dump.sql |grep ^CH # 记录MASTER_LOG_FILE MASTER_LOG_POS
CHANGE MASTER TO MASTER_HOST='172.31.3.99',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-master-bin.000006',MASTER_LOG_POS=790;
set sql_log_bin=on;
START SLAVE ;
12.4.4.2 手动同步
1、停止从库
stop slave;
2、主库备份缺失的表
mysqldump -uroot -p123456 -q --single-transaction --master-data=2 testdb A B C >/backup/A_B_C.sql
3、 查看备份文件,找出binlog和pos点
例
MASTERLOGFILE='mysql-bin.02', MASTERLOGPOS=111;
4、把备份的.sql文件拷贝到Slave机器上,并做指向新位置
start slave until MASTERLOGFILE='mysql-bin.02',MASTERLOGPOS=111;
5、重新导入sql
mysql -uroot -p123456 testdb
set sql_log_bin=0;
source /backup/A_B_C.sql
set sql_log_bin=1;
6、重新开启同步进程
start slave;
13、 读写分离
13.1 利用proxysql实现读写分离
# 安装
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
yum -y install proxysql
# 启动
service proxysql start
# 登录数据库,添加mysql节点
mysql -uadmin -padmin -P6032 -h127.0.0.1
select * from sqlite_master where name='mysql_servers'\G;
select * from mysql_servers;
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.31.3.100',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.31.3.99',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.31.3.102',3306);
load mysql servers to runtime;
save mysql servers to disk;
# 登录master 创建监控用用户
grant replication client on *.* to monitor@'172.31.3.%' identified by '123456';
FLUSH PRIVILEGES;
# 登录proxy节点验证账户权限
mysql -umonitor -p123456 -P3306 -h172.31.3.99
# 添加监控后端节点的用户,连接每个节点的read_only值来自动调整主从节点是属于读组还是写组
set mysql-monitor_username='monitor';
set mysql-monitor_password='123456';
load mysql variables to runtime;
save mysql variables to disk;
# 查看监控
select * from mysql_server_connect_log;
select * from mysql_server_ping_log;
# 设置分组信息
需要修改的是main库中的mysql_replication_hostgroups表
该表有3个字段:
writer_hostgroup,reader_hostgroup,comment,
指定写组的id为10,读组的id为20,test为表名称
insert into mysql_replication_hostgroups values(10,20,"test");
load mysql servers to runtime;
save mysql servers to disk;
# 配置完成后Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组
select hostgroup_id,hostname,port,status,weight from mysql_servers;
# 登录主节点,创建用于访问数据库的sql用户
grant all on *.* to sqluser@'172.31.3.%' identified by '123456';
FLUSH PRIVILEGES;
# 登录ProxySQL 将用户sqluser添加到mysql_users表中
default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库
insert into mysql_users(username,password,default_hostgroup) values('sqluser','123456',10);
load mysql users to runtime;
save mysql users to disk;
# 测试读写
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select @@server_id'
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'create database testdb'
mysql -usqluser -p123456 testdb -P6033 -h127.0.0.1 -e 'create table t(id int)'
# 读写正常后配置路由进行读写分离
与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing
插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句SELECT...FORUPDATE它会申请写锁,应路由到10的写组
insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
load mysql query rules to runtime;
save mysql users to disk;
# 测试读
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select @@server_id'
# 测试写
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'start transaction;select @@server_id;commit;select @@server_id'
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'insert testdb.t values (1)'
mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select id from testdb.t'
# 查询操作的路由信息
SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;
mysql> SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;
+----+----------+------------+----------------------------------+
| hg | sum_time | count_star | digest_text |
+----+----------+------------+----------------------------------+
| 10 | 48638 | 1 | select * from hellodb.students |
| 10 | 17336 | 1 | create table t(id int) |
| 10 | 5697 | 1 | show databases |
| 10 | 5321 | 1 | insert testdb.t values (?) |
| 20 | 4392 | 2 | select @@server_id |
| 10 | 4140 | 2 | select @@server_id |
| 10 | 3344 | 1 | create database testdb |
| 20 | 1545 | 1 | select id from testdb.t |
| 10 | 793 | 1 | start transaction |
| 10 | 570 | 1 | commit |
| 10 | 0 | 8 | select @@version_comment limit ? |
| 10 | 0 | 1 | select @@version_comment limit ? |
+----+----------+------------+----------------------------------+
12 rows in set (0.00 sec)
mysql>
14、 高可用-MHA
14.1 工作原理
1. MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件(binlog events)
2. 识别含有最新更新的slave
3. 应用差异的中继日志(relay log)到其他的slave
4. 应用从master保存的二进制日志事件(binlog events)
5. 提升一个slave为新的master
6. 使其他的slave连接新的master进行复制