目录
四台服务器关闭防火墙防护,连接所有会话101、102、103、104
在 manager 节点上复制相关的脚本到/usr/local/bin目录
完整替换master_ip_failover文件的内容,IP部分更换为自己的IP地址
测试ssh无密码认证,如果正常最后输出successfully就是运行成功
测试mysql主从连接情况,最后出现MySQL Replication Health is ok 字样说明正常
首次配置MHA的VIP地址需要手动配置(在mysql上)102主机
查看MHA状态,可以看到当前的master是Mysql1节点
观察MHA日志,如果自动切换成功,最后输出successfully字样
MHA高可用配置及故障切换
MHA定义
HMA(MasterHigh Availablity)是一套优秀的Mysql高可用环境下的故障切换和主从复制的软件
解决MySLQ单点的问题
MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。
故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA是建在主从复制的基础上的;0-30秒自动完成故障切换是MHA的特性
MAH的组成
- MHA Manager(管理节点)
- NHA Node(数据节点)
MHA特点
- 自动故障奇幻过程种,MHA试图从宕机的主服务器上保存二进制日志,最大程度保证数据不丢失
- 使用半同步复制,可以大大降低数据丢失的风险
- 目前MHA支持一主多从架构,最少三台服务,即一主两从
MHA工作原理
从宕机崩溃的master 保存二进制日志事件(binlog events);
识别含有最新的更新 slave 日志(可以理解为主从复制数据最新的从服务器)
应用差异的中继日志(relay log)到其他的slave(将数据信息最全最新的从服务器的中继日志给其他的从服务器)
应用从master保存的二进制日志事件
提升一个 salve 为新的master
使其他的slave连接行的master 进行复制。
实验:搭建MySQL MHA
目的:解决故障切换、尽可能的保存数据,以及所有节点日志的一致性
实验思路:搭建MHA机构---->数据库安装---->一主两从---->MHA搭建
故障模拟:主服务器失效---->主服务器的备胎服务器成为主服务器---->原故障
配置四台虚拟机
服务器 | 操作系统 | 主机名/IP 地址 | 角色 |
服务器 | CentOS7.9 | 192.168.10.101 | 管理节点,安装 manager 组件 |
服务器 | CentOS7.9 | 192.168.10.102 | Master 节点,安装 node 组件 |
服务器 | CentOS7.9 | 192.168.10.103 | Slave 节点,安装 node 组件 |
服务器 | CentOS7.9 | 192.168.10.104 | Slave 节点,安装 node 组件 |
案例拓扑图
案例实施
四台服务器关闭防火墙防护,连接所有会话101、102、103、104
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
设置host文件
修改每个节点的hosts文件
[root@localhost ~]# vim /etc/hosts
192.168.10.101 MHA-manager
192.168.10.102 Mysql1
192.168.10.103 Mysql2
192.168.10.104 Mysql3
安装MySQL数据库 连接会话102、103、104
[root@localhost ~]# yum -y install mariadb-server mysql
关闭掉101的同步
设置主库配置
[root@localhost ~]# vim /etc/my.cnf
server-id=102
log-bin=master-bin
binlog-format=MIXED
relay-log-purge=0
log-slave-updates=true
当relay-log-purge=1时,旧relay logs会在SQL线程执行完毕后被自动删除;当relay-log-purge=0时,旧的 relaylog则会被保留
从服务器配置
server-id=103
log-bin=master-bin
binlog-format=MIXED
relay-log-purge=0
log-slave-updates=true
server-id=104
log-bin=master-bin
binlog-format=MIXED
relay-log-purge=0
log-slave-updates=true
relay-log-purge=0 不自动删除中继日志,以便宕机后恢复数据
log-slave-updates=true Slave可以是其他Slave的Master,从而扩散Master的更新
启动
[root@localhost ~]# systemctl start mariadb
修改登录密码
[root@localhost ~]# mysqladmin -uroot password 'pwd123';
在所有Mylsq节点上配置授权 在102上授权
[root@localhost ~]# mysql -uroot -ppwd123
MariaDB [(none)]> grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123456';
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager';
#创建以恶搞用户名为mha,密码为manager的用户允许该用户从以 192.168.10. 开头的IP地址段连接到MariaDB数据库,并且拥有对所有数据库和表的所有操作权限。
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'mysql1' identified by 'manager';
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'mysql2' identified by 'manager';
MariaDB [(none)]> grant all privileges on *.* to 'mha'@'mysql3' identified by 'manager';
用主机名去进行连接
MariaDB [(none)]> flush privileges;
取消用户同步,单独针对一个节点去做操作
在mysql上查看mastar信息
MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 | 1346 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
同步103、104会话
在mysql2和mysql3设置slave配置主从环境
MariaDB [(none)]> change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=1346;
#
master_host='192.168.10.102'
: 这是主服务器(master)的IP地址或主机名,从服务器将连接到该地址获取主服务器的更新数据。
master_user='myslave'
: 这是连接到主服务器所使用的用户名。在这个例子中,从服务器将使用用户名 myslave 来连接到主服务器。
master_password='123456'
: 这是连接到主服务器所使用的密码。在这个例子中,密码是 123456。
master_log_file='master-bin.000003'
: 这是主服务器上当前的二进制日志文件名,从服务器将从这个日志文件开始读取日志信息。
master_log_pos=1346
: 这是主服务器上二进制日志文件的位置(偏移量),从服务器将从这个位置开始读取日志信息。
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G
安装MHA软件
所有服务器上安装MHA依赖环境
同时托入四个主机,连接101、102、103、104会话
但我们这里用ftp的基础源去安装(快一点)
ftp的基础源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo ftp://192.168.2.149/repo/CentOS-Base.repo
curl -o /etc/yum.repos.d/epel.repo ftp://192.168.2.149/repo/epel.repo
yum clean all
阿里的基础源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
设置阿里的yum基础源都安装MHA依赖的环境
yum install -y perl-DBD-MySQLperl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilderperl-ExtUtils-MakeMaker perl-CPAN
> perl-DBD-MySQL //perl针对于mysql数据库
> perl-Config-Tiny //从配置文件中提拿其中的值
> perl-Log-Dispatch //log-日志
> perl-Parallel-ForkManager //多线程管理
> perl-ExtUtils-CBuilder //扩展工具
> perl-ExtUtils-MakeMaker
> perl-CPAN //cpan perl中的数据库
在所有节点安装node组件
[root@localhost ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@localhost ~]# cd mha4mysql-node-0.57
[root@localhost mha4mysql-node-0.57]# perl Makefile.PL
[root@localhost mha4mysql-node-0.57]# make && make install
node工具(这些工具通常由MHAManager的脚本触发,无需人为操作)
- save_binary_logs:保存和复制 master 的二进制日志。
- apply_diff_relay_logs:识别差异的中继日志事件并将其差异的事件应用于其他的 slave。
- filter_mysqlbinlog:去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)。
- purge_relay_logs:清除中继日志(不会阻塞 SQL 线程)。
在 MHA-manager上安装manager组件
不用同步只在manager上
[root@localhost ~]# tar zxvf mha4mysql-manager-0.57.tar.gz
[root@localhost ~]# cd mha4mysql-manager-0.57
[root@localhost mha4mysql-manager-0.57]# perl Makefile.PL
[root@localhost mha4mysql-manager-0.57]# make && make install
manager工具
- masterha_check_ssh:检查 MHA 的 SSH 配置状况。
- masterha_check_repl:检查 MySQL 复制状况。第12 页 共 31 页
- masterha_manger:启动 MHA
- masterha_check_status:检测当前 MHA 运行状态。
- masterha_master_monitor:检测 master 是否宕机。
- masterha_master_switch:控制故障转移(自动或者手动)。
- masterha_conf_host:添加或删除配置的 server 信息。
配置无密码认证
实现无密码认证方式,一种是账号密码,一种是密钥对
生成密钥对,取消同步功能
在 manager 上配置到所有节点的无密码认证
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.102
ssh-copy-id192.168.10.103
ssh-copy-id192.168.10.104
yes
密码就是你root用户的密码(aptech)
在 Mysql1 上配置到数据库节点的无密码认证
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.103
ssh-copy-id192.168.10.104
在 Mysql2 上配置到数据库节点的无密码认证
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.102
ssh-copy-id192.168.10.104
在 Mysql3 上配置到数据库节点的无密码认证
[root@localhost ~]# ssh-keygen -t rsa
ssh-copy-id192.168.10.102
ssh-copy-id192.168.10.103
配置MHA
在 manager 节点上复制相关的脚本到/usr/local/bin目录
cd/mha4mysql-manager-0.57/samples
[root@localhost samples]# cd scripts/
[root@localhost scripts]# ls
master_ip_failover master_ip_online_change power_manager send_report
[root@localhost scripts]# cp * /usr/local/bin/
[root@localhost scripts]# cd /usr/local/bin/
脚本具体作用
- master_ip_failover:自动切换时 VIP 管理的脚本
- master_ip_online_change:在线切换时 vip 的管理
- power_manager:故障发生后关闭主机的脚本
- send_report:因故障切换后发送报警的脚本
完整替换master_ip_failover文件的内容,IP部分更换为自己的IP地址
复制master_ip_failover脚本到/usr/local/bin目录,这里使用脚本管理VIP
[root@localhost bin]# rm -rf master_ip_failover #删除该文件
[root@localhost bin]# chmod +x master_ip_failover 给该文件添加执行权
[root@localhost bin]# cd
[root@localhost ~]# cd /etc/
[root@localhost etc]# mkdir masterha
[root@localhost ~]# cd mha4mysql-manager-0.57
[root@localhost mha4mysql-manager-0.57]# cd samples/
[root@localhost samples]# ls
conf scripts
[root@localhost samples]# cd conf/
[root@localhost conf]# ls
app1.cnf masterha_default.cnf
[root@localhost conf]# cp app1.cnf /etc/masterha/
[root@localhost conf]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/usr/local/mysql/data
#master_binlog_dir=/var/lib/mysql
master_ip_failover_script= /usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=mha
password=manager
ping_interval=1
remote_workdir=/tmp
repl_user=myslave
repl_password=123456
secondary_check_script= /usr/local/bin/masterha_secondary_check -s192.168.10.103 -s 192.168.10.104
shutdown_script=""
ssh_user=root
[server1]
hostname=192.168.10.102
port=3306
[server2]
hostname=192.168.10.103
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.10.104
port=3306
[root@localhost conf]# mkdir -p /var/log/masterha/app1 #创建这个目录
[root@localhost conf]# vim /etc/masterha/app1.cnf
注释master_binlog_dir=/usr/local/mysql/data
使用master_binlog_dir=/var/lib/mysql确认路径位置
测试ssh无密码认证,如果正常最后输出successfully就是运行成功
[root@localhost ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
测试mysql主从连接情况,最后出现MySQL Replication Health is ok 字样说明正常
[root@localhost ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf
MySQL Replication Health is OK.
首次配置MHA的VIP地址需要手动配置(在mysql上)102主机
[root@localhost ~]# ifconfig ens33:1 192.168.10.200
ifconfig #查看和配置网络接口
启动HMA(在mha-manager主机上)101主机
[root@localhost ~]# mkdir -p /var/log/masterha/app1
[root@localhost ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover </dev/null>/var/log/masterha/app1/manager.log 2>&1 &
[1] 14002
查看MHA状态,可以看到当前的master是Mysql1节点
[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
查看MHA日志
[root@localhost ~]# cat /var/log/masterha/app1/manager.log
模拟master故障
用客户端链接群集 105主机
yum -y install mysql
[root@localhost ~]# mysql -umha -pmanager -h 192.168.10.200
关闭当前的master 102
[root@localhost ~]# systemctl stop mariadb
观察MHA日志,如果自动切换成功,最后输出successfully字样
[root@localhost ~]# tailf /var/log/masterha/app1/manager.log
在mysql2上查看状态
mysql> show masterstatus;
标签:log,MHA,故障,manager,master,切换,root,localhost
From: https://blog.csdn.net/m0_70627741/article/details/140876709