mysql集群技术
一、Mysql 在服务器中的部署方法
mysql5.7的版本是比较多的
官网:http://www.mysql.com
1.1、在Linux下部署mysql
安装:rhel7.9(两个)
mysql-node1:172.25.254.10
mysql-node2:172.25.254.20
1.1.1、安装依赖性
[root@mysql-node1 ~]# dnf install cmake gcc-c++ openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64
1.1.2、下载并解压源码包
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz[root@mysql-node1 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz
可以通过这个链接下载,或者直接Windows上下载后上传
[root@mysql-node1 ~]# tar zxf mysql-boost-5.7.44.tar.gz
[root@mysql-node1 ~]# cd /root/mysql-5.7.44
1.1.3、源码编译安装mysql
[root@mysql-node1 mysql-5.7.44]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/
[root@mysql-node1 mysql-5.7.44]# make -j2 #-j2 表示有几个 核心就跑几个进程(这个肯会久一点)
[root@mysql-node1 mysql-5.7.44# make install
注:当cmake出错后如果想重新检测,删除 mysql-5.7.44 中 CMakeCache.txt即可
1.1.4、部署mysql
两个都需要做这些配置
1、创建用户,建立用户目录,给权限
[root@mysql ~]# useradd -s /sbin/nologin -M mysql
[root@mysql ~]# mkdir -p /data/mysql
[root@mysql ~]# chown mysql.mysql /data/mysql/2、生成配置文件
[root@mysql local]# vim /etc/my.cnf[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
3、配置环境变量
[root@mysql local]# vim ~/.bash_profile
[root@mysql local]# source ~/.bash_profile4、生成启动脚本
[root@mysql ~]# cd /usr/local/mysql/support-files/
[root@mysql support-files]# ls
magic mysqld_multi.server mysql-log-rotate mysql.server
[root@mysql support-files]# cp mysql.server /etc/init.d/mysqld5、数据库的数据初始化
[root@mysql local]# mysqld --user=mysql --initialize
这个生成的文件一定记住里面的初始密码。
6、启动
[root@mysql support-files]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql.timingzpy.org.err'.
. SUCCESS!开机自启
[root@mysql support-files]# yum install chkconfig -y
[root@mysql support-files]# chkconfig mysqld on7、用初始密码登录,看看密码是否复制正确
[root@mysql ~]# mysql -uroot -pwy23>#hE=?.X现在进来必须改一次密码
也就是做一次mysql的安全初始化
[root@mysql ~]# mysql_secure_installation这个里面的选择可以根据自己的需求去选择
这样就算配置完成了。
测试:
二、mysql的组从复制
我这里用172.25.254.10的服务器做主,172.25.254.20的做从
2.1、配置master
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10 #编写ID来区分这两个MySQLlog-bin=mysql-bin #开启二进制日志
[root@mysql-node1 ~]# /etc/init.d/mysqld restart #重启,使文件生效
这个二进制日志会生成在 /data/mysql/里面
这个日志的作用是记录我们的动作,然后将这个动作复制给20 ,然后就在20 也可以看见了
[root@mysql-node1 ~]# mysql -uroot -p123456 -e "select @@server_id" #查看id
进入MySQL,配置用户权限
[root@mysql-node1 ~]# mysql -p123456
#生成专门用来做复制的用 户,此用户是用于slave端做认证用
mysql> create user 're'@'%' identified by 'zpy';
#对这个用户进行授权
mysql> grant replication slave on *.* to re@'%';
#查看master的状态mysql> show master status;
2.2、配置slave
[root@mysql-node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20#因为不需要将动作复制给别人,所以可以不开日志功能
[root@mysql-node2 ~]# /etc/init.d/mysqld restart
进入mysql,同步10的数据
[root@mysql-node2 ~]# mysql -p123456
mysql> change master to master_host='172.25.254.10',master_user='re',master_password='zpy',master_log_file='mysql-bin.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
开启主从复制
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
查看
测试:
在mysql-node1上:
mysql> create database zpy;
mysql> create table zpy.userlist (
-> username varchar(20) not null,
-> password varchar(20) not null
-> );mysql> insert into zpy.userlist values ('zpy','123');
在mysql-node2上可以直接查看到和mysql-node1上一样的数据
但在node2上添加数据,node1上看不到。会造成数据不一致。所以20上不能写入数据。
node2上:
node1上:
2.3、当有数据时添加slave2
可以直接从前面的服务器中将安装好的MySQL发送过来就可以了
[root@mysql-node2 local]# rsync -al -r mysql/ root@172.25.254.30:/usr/local/mysql/
root@172.25.254.30's password:
后再做上面的配置[root@mysql-node3 local]# useradd -s /sbin/nologin -M mysql
[root@mysql-node3 local]# mkdir /data/mysql -p
[root@mysql-node3 local]# chown mysql.mysql -R /data/mysql
[root@mysql-node3 local]# cd /usr/local/mysql/support-files/
[root@mysql-node3 support-files]# cp mysql.server /etc/init.d/mysqld
[root@mysql-node3 support-files]# vim /etc/my.cnf[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
[root@mysql-node3 support-files]# vim ~/.bash_profile
[root@mysql-node3 support-files]# source ~/.bash_profile
[root@mysql-node3 ~]# mysqld --user=mysql --initialize[root@mysql-node3 ~]# /etc/init.d/mysqld start
[root@mysql-node3 ~]# yum install chkconfig -y
[root@mysql-node3 ~]# chkconfig mysqld on[root@mysql-node3 ~]# mysql -uroot -p
[root@mysql-node3 ~]# mysql_secure_installation
[root@mysql-node3 ~]# mysql -uroot -p123456
#从master节点备份数据
[root@mysql-node1 ~]# mysqldump -uroot -p123456 zpy > zpy.sql
[root@mysql-node1 ~]# rsync -al zpy.sql root@172.25.254.30:/mnt/
#利用master节点中备份出来的zpy.sql在slave2中拉平数据
[root@mysql-node3 mnt]# mysql -uroot -p123456 zpy < zpy.sql
[root@mysql-node3 mnt]# mysql -uroot -p123456mysql> change master to master_host='172.25.254.10',master_user='re',master_password='zpy',master_log_file='mysql-bin.000005',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
开启
mysql> start slave;
mysql> show slave status\G;
测试:
2.4、延迟复制
在node3上做:
联机设置延迟复制时,需要先停止
sql_thread
线程mysql> stop slave sql_thread;
mysql> change master to master_delay=60;
mysql> start slave sql_thread;
mysql> show slave status;
对比:
测试:
如果node1误删了数据
node3任然是之前的数据,60s后才同步
2.5、慢查询日志
在node1上做,其他slave上也就都有了
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-binslow_query_log=on #慢查询
但是这个需要重启生效,但数据库不能重启。
如果想要立即生效就需要
mysql> set global slow_query_log=ON;
查询时间超过10S就算慢查询mysql> show variables like "long%";
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)慢查询日志开启
mysql> SHOW VARIABLES like "slow%";
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/mysql/mysql-node1-slow.log |
+---------------------+----------------------------------+
3 rows in set (0.00 sec)
测试慢查询
mysql> select sleep (10);
+------------+
| sleep (10) |
+------------+
| 0 |
+------------+
1 row in set (10.00 sec)
慢查询日志
2.6、mysql的并行复制
比如腾讯充q币,结果一查没有到账的话是不行的,所以需要做并行复制。
因为node3上做了延迟复制,所以我现在在node2上做
[root@mysql-node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
super_read_only=on
gtid_mode=ON
enforce-gtid-consistency=ON
slave-parallel-type=LOGICAL_CLOCK #基于组提交
slave-parallel-workers=6 #开启线程数量
master_info_repository=TABLE #master信息在表中记录,默认记录
relay_log_info_repository=TABLE #回放日志信息在表中记录,默认记录
relay_log_recovery=ON #日志回放恢复功能开启[root@mysql-node2 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!
此时sql线程转化为协调线程,6个worker负责处理sql协调线程发送过来的处理请求
2.7、原理刨析
三个线程 实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于3 个线程来操作, 一个主库线程,两个从库线程。
- 二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候, 主库可以 将二进制日志发送给从库,当主库读取事件(Event)的时候,会在 Binlog 上加锁,读取完成之 后,再将锁释放掉。
- 从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库 的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。
- 从库 SQL 线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同 步。
复制三步骤 步骤
- Master将写操作记录到二进制日志(binlog)。
- Slave将Master的binary log events拷贝到它的中继日志(relay log);
- Slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化 的,而且重启后从接入点开始复制。
2.8、架构缺陷
- 主从架构采用的是异步机制
- master发日志和存入磁盘是分开的动作。
- master更新完成后直接发送二进制日志到slave,但是slaves是否真正保存了数据master端不会检测,也就是slave有没有收到,master是不关心的。
所以可能
当master端到slave端的网络出现问题时或者master端直接挂掉,二进制日志可能根本没有到达slave master出现问题slave端接管master,这个过程中数据就丢失了
三、半同步模式
3.1、半同步模式原理
- 用户线程写入完成后master中的dump会把日志推送到slave端
- slave中的io线程接收后保存到relaylog中继日志
- 保存完成后slave向master端返回ack
- 在未接受到slave的ack时master端时不做提交的,一直处于等待当收到ack后提交到存储引擎
- 在5.6版本中用到的时after_commit模式,after_commit模式时先提交在等待ack返回后输出ok
3.2、gtid模式
当激活GITD之后 当master出现问题后,slave2和master的数据最接近,会被作为新的master slave1指向新的master,但是他不会去检测新的master的pos id,只需要继续读取自己gtid_next即可
[root@mysql-node1 ~]# mysqlbinlog -vv /data/mysql/mysql-bin.000006
设置gtid
#在master端和slave端开启gtid模式
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
gtid_mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
[root@mysql-node1 ~]# /etc/init.d/mysqld restart
node2/node3:[root@mysql-node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
gtid_mode=ON
enforce-gtid-consistency=ON
[root@mysql-node2 ~]# /etc/init.d/mysqld restart
#停止slave端(node2,node3)mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
#开启slave端的gtid(node2,node3)
mysql> change master to master_host='172.25.254.10',master_user='re',master_password='zpy',master_auto_position=1;
mysql> start slave;
3.3、启用半同步模式
在master端配置启用半同步模式
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
gtid_mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
rpl_semi_sync_master_enabled=1 #开启半同步功能
[root@mysql-node1 ~]# mysql -p123456#安装半同步插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';#查看插件情况
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
#打开半同步功能
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;#查看半同步功能状态
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
mysql> show plugins
在slave端开启半同步功能(node2,node3)
[root@mysql-node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1 #开启半同步功能
[root@mysql-node2 ~]# mysql -p123456#安装半同步插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#打开半同步功能
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;#重启io线程,半同步才能生效
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;#查看半同步功能状态
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
测试:
在master端写入数据
模拟故障:
#在slave端(node2,node3)
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)#在master端插入数据
#10秒超时
四、mysql高可用之组复制 (MGR)
4.1组复制流程
4.2 组复制单主和多主模式
4.3.实现mysql组复制
在做一下操作之前,首先做好域名解析
需要配置的虚拟机都要做全部的域名解析,每个虚拟的域名对应好,不然最后会报错。
如果域名错误,最后面select出来,状态不对,为RECOVERING。不可写入,也读取不到。需要将域名改对再重新初始化。
1、编辑主配置文件:
node1,2,3:
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10 #在node1上写10,node2上写20,node3上写30
gtid_mode=ON
enforce-gtid-consistency=ON
log_bin=binlog
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.10:33061" #这条同上,其他一样
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=1
2、初始化
[root@mysql-node2 ~]# /etc/init.d/mysqld stop
[root@mysql-node2 ~]# rm -rf /data/mysql/*
[root@mysql-node2 ~]# mysqld --user=mysql --initialize
[root@mysql-node2 ~]# /etc/init.d/mysqld start再用初始化密码登录
[root@mysql-node2 ~]# mysql -uroot -p')ihlpkjQ+1VQ'改密码
mysql> alter user root@localhost identified by 'zpy';
就完成了
3、配置sql
进入MySQL
node1上:
mysql> alter user root@localhost identified by 'zpy';
mysql> SET SQL_LOG_BIN=0;
mysql> create user repl@'%' identified by 'zpy';
mysql> grant replication slave on *.* to repl@'%';
mysql> flush privileges;
mysql> set sql_log_bin=1;
mysql> change master to master_user='repl',master_password='zpy'for channel 'gr oup_relication_recovery';
mysql> set global group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> set global group_replication_bootstrap_group=OFF;
node2,node3上mysql> alter user root@localhost identified by 'zpy';
mysql> SET SQL_LOG_BIN=0;
mysql> create user repl@'%' identified by 'zpy';
mysql> grant replication slave on *.* to repl@'%';
mysql> set sql_log_bin=1;
mysql> change master to master_user='repl',master_password='zpy'for channel 'gr oup_relication_recovery';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------------------+---------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------------+---------+--------------+
| group_replication_applier | 6d0214fa-62eb-11ef-8c74-000c2988e711 | mysql-node2.timingzpy.org | 306 | ONLINE |
| group_replication_applier | 7588c1a4-62ec-11ef-9da5-000c290fa332 | mysql-node3.timingzpy.org | 306 | ONLINE |
| group_replication_applier | d63c4d01-62ea-11ef-97ec-000c2960190a | mysql-node1.timingzpy.org | 306 | ONLINE |
+---------------------------+--------------------------------------+---------------------------+---------+--------------+
3 rows in set (0.01 sec)
测试:
在每个节点都可以完成读写
五 mysql-router(mysql路由)
在node1上安装软件
我是直接上传然后安装的
[root@mysql-node1 ~]# ls
anaconda-ks.cfg Music Pictures
Desktop mysql-5.7.44 Public
Documents mysql-boost-5.7.44.tar.gz Templates
Downloads mysql-router-community-8.4.0-1.el7.x86_64.rpm Videos
initial-setup-ks.cfg passwd zpy.sql
[root@mysql-node1 ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm
查看文件
[root@mysql-node1 ~]# rpm -ql mysql-router-community
配置mysql-router
添加
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306
routing_strategy = round-robin
测试:
在node2,node3上创建远程连接用户
mysql> create user repl@'%' identified by 'zpy';
mysql> grant all on repl.* to repl@'%';
在node1上远程连接
[root@mysql-node1 ~]# mysql -urepl -pzpy -h 172.25.254.10 -P 7001
进入查看id,后退出,再进入再查看id,就不一样了。就是实现了负载均衡,轮训调度
六、mysql高可用之MHA
6.1、MHA概述
6.2、MHA部署实施
6.2.1、搭建主从架构
#在master节点中
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
log_slave_updates=ON
enforce-gtid-consistency=ON后初始化
进入MySQL
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'zpy';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
#在slave1和slave2中
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
log_slave_updates=ON
enforce-gtid-consistency=ON后初始化
进入MySQL
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
mysql> start slave;
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
6.2.2、安装MHA所需要的软件
#在MHA中
[root@mysql-mha ~]# unzip MHA-7.zip
[root@mysql-mha MHA-7]# yum install *.rpm -y
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.10:/mnt
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.20:/mnt
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.30:/mnt
#在sql-node中
[root@mysql-node10 ~]# yum install /mnt/mha4mysql-node-0.58- 0.el7.centos.noarch.rpm -y
[root@mysql-node20 ~]# yum install /mnt/mha4mysql-node-0.58- 0.el7.centos.noarch.rpm -y
[root@mysql-node30 ~]# yum install /mnt/mha4mysql-node-0.58- 0.el7.centos.noarch.rpm -y
6.2.3、在软件中包含的工具包介绍
1.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信息
2.Node工具包 (通常由masterHA主机直接调用,无需人为执行)
- save_binary_logs #保存和复制master的二进制日志
- apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的slave
- filter_mysqlbinlog #去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
- purge_relay_logs #清除中继日志(不会阻塞SQL线程)
6.2.4、配置MHA 的管理环境
1、生成配置目录和配置文件
因为我们当前只有一套主从,所以我们只需要写一个配置文件即可
rpm包中没有为我们准备配置文件的模板
可以解压源码包后在samples中找到配置文件的模板文件
#生成配置文件
[root@mysql-mha ~]# mkdir /etc/masterha
[root@mysql-mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
[root@mysql-mha MHA-7]# cd mha4mysql-manager-0.58/samples/conf/
[root@mysql-mha conf]# cat masterha_default.cnf app1.cnf > /etc/masterha/app1.cnf
#编辑配置文件
[root@mysql-mha ~]# vim /etc/masterha/app1.cnf
[server default]
user=root #mysql管理员用户,因为需要做自动化配置
password=zpy #mysql密码
ssh_user=root #ssh远程登陆用户
repl_user=repl #mysql主从复制中负责认证的用户
repl_password=zpy #mysql主从复制中负责认证的用户密码
master_binlog_dir= /data/mysql #二进制日志目录
remote_workdir=/tmp #远程工作目录#此参数使为了提供冗余检测,方式是mha主机网络自身的问题无法连接数据库节点,应为集群之外的主机
secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.11
ping_interval=3 #每隔3秒检测一次#发生故障后调用的脚本,用来迁移vip
# master_ip_failover_script= /script/masterha/master_ip_failover#电源管理脚本
# shutdown_script= /script/masterha/power_manager#当发生故障后用此脚本发邮件或者告警通知
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
[server default]
manager_workdir=/etc/masterha #mha工作目录
manager_log=/etc/masterha/manager.log #mha日志[server1]
hostname=172.25.254.10
candidate_master=1 #可能作为master的主机
check_repl_delay=0 #通过设置check_repl_delay=0#MHA触发切换在选择一个新的master的时候将会忽略复制延时
#这个参数对于设置了candidate_master=1的主机非常有用
#因为这个候选主在切换的过程中一定是新的master
[server2]
hostname=172.25.254.20
candidate_master=1 #可能作为master的主机
check_repl_delay=0[server3]
hostname=172.25.254.30
no_master=1 #不会作为master的主机
2、检测配置:
#检测网络及ssh免密
[root@mysql-mha ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
#检测数据主从复制情况
#在数据节点master端
mysql> GRANT ALL ON *.* TO root@'%' identified by 'zpy'; #允许root远程登陆
#执行检测
[root@mysql-mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
6.2.5、MHA的故障切换
MHA的故障切换过程,共包括以下的步骤:
- 配置文件检查阶段,这个阶段会检查整个集群配置文件配置
- 宕机的master处理,这个阶段包括虚拟ip摘除操作,主机关机操作
- 复制dead master和最新slave相差的relay log,并保存到MHA Manger具体的目录下
- 识别含有最新更新的slave
- 应用从master保存的二进制日志事件(binlog events)
- 提升一个slave为新的master进行复制 7.使其他的slave连接新的master进行复制
6.2.5.1、手动切换
1、master未出现故障手动切换
#在master数据节点还在正常工作情况下
[root@mysql-mha ~]# masterha_master_switch \
--conf=/etc/masterha/app1.cnf \ #指定配置文件
--master_state=alive \ #指定master节点状态
--new_master_host=172.25.254.20 \ #指定新master节点
--new_master_port=3306 \ #执行新master节点端口
--orig_master_is_new_slave \ #原始master会变成新的slave
--running_updates_limit=10000 #切换的超时时间
检测:
切换后需在前master里重新加入主从
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='repl',MASTER_PASSWORD='zpy', MAS TER_AUTO_POSITION=1;
mysql> start slave;
2、master故障手动切换
#模拟master故障
[root@mysql-node2 ~]# /etc/init.d/mysqld stop
#在MHA-master中做故障切换
[root@mysql-mha masterha]# masterha_master_switch --master_state=dead -- conf=/etc/masterha/app1.cnf --dead_master_host=172.25.254.20-- dead_master_port=3306 --new_master_host=172.25.254.10 --new_master_port=3306 -- ignore_last_failover
检测:
恢复故障mysql节点
[root@mysql-node2 ~]# mysql -p
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='zpy', MASTER_AUTO_POSITION=1;
mysql> start slave;
6.2.5.2、自动切换
#删掉切换锁文件
[root@mysql-mha masterha]# rm -fr app1.failover.complete
#监控程序通过指定配置文件监控master状态,当master出问题后自动切换并退出避免重复做故障切换
[root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf
检测:
#模拟master故障
[root@mysql-node1 ~]# /etc/init.d/mysqld stop
这时候那个监测自己就停止了。
就切换成功了
恢复故障节点
[root@mysql-node1 ~]# mysql -p
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='repl', MASTER_PASSWORD='zpy', MASTER_AUTO_POSITION=1;
mysql> start slave;