上海网站建设明细表,佛山品牌推广,曲靖网站推广,好多商城app1. MHA集群概述 集群的定义#xff1a;多台服务器一起提供相同的服务#xff0c;如#xff08;web集群#xff09;等。常见集群的分类#xff1a; LB#xff08;负载均衡集群#xff09;#xff1a;服务器共同平均分摊处理客户端的多次连接请求。 HA#xff08;高可用…1. MHA集群概述 集群的定义多台服务器一起提供相同的服务如web集群等。常见集群的分类 LB负载均衡集群服务器共同平均分摊处理客户端的多次连接请求。 HA高可用集群主备模式主宕机后备用服务器自动接替工作。 常见集群服务软件 LBLVS、Nginx、haproxy等。 HAKeepalived、heartbeat、 1.1. 软件介绍
MHAMaster High Availability 由日本DeNA公司youshimaton通过perl脚本语言开发。是一套优秀的实现MySQL高可用的解决方案。数据库的自动故障切换操作能做到在0~30秒之内完成。MHA能确保在故障切换过程中最大限度保证数据的一致性以达到真正意义的高可用。 1.2. MHA组成
MHA Master管理节点 管理所有数据库服务器可以单独部署在一台独立的机器上也可以部署在某台数据库服务器上 MHA Node数据节点 存储数据的MySQL服务器运行在每台MySQL服务器上 1.3. MHA工作过程
MHA集群架构图 MHA 工作过程 由Manager 定时探测集群中的master节点当master故障时Manager自动将拥有最新数据的slave提升为新的master另一台slave主机将自动变为新master的从库所以集群组里面的主机应该是一主多从结构。 1.4. IP规划
IP地址主从同步角色集群角色主机名192.168.2.10客户端无client10192.168.2.20无管理主机mha20192.168.2.30主库当前主库mysql30192.168.2.40从库备用主库mysql40192.168.2.50从库备用主库mysql50192.168.2.100无VIP地址无
2. 部署MHA集群
2.1. 准备集群环境
2.1.1. 安装依赖包
安装系统自带prel包
##需要在mha20、mysql30、mysql40、mysql50安装
[rootmha20 ~]# yum -y install perl-*下载除系统自带外的perl包rpm包搜索
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Email-Date-Format-1.002-15.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-MIME-Lite-3.030-1.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-MIME-Types-1.38-2.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/perl-Config-Tiny-2.14-7.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm[rootmha20 ~]# ls
perl-Config-Tiny-2.14-7.el7.noarch.rpm perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
##在mha20、mysql30、mysql40、mysql50安装
[rootmha20 ~]# yum -y install perl-*.rpm2.1.2. 配置ssh密钥对认证登录
配置管理主机mha20可以ssh免密登录所有数据库服务器
##在mha20上创建秘钥对
[rootmha20 ~]# ssh-keygen ---全部回车即可
##把秘钥对中公钥拷贝给mysql30、mysql40、mysql50
[rootmha20 ~]# ssh-copy-id root192.168.2.30
[rootmha20 ~]# ssh-copy-id root192.168.2.40
[rootmha20 ~]# ssh-copy-id root192.168.2.50
##验证mha20 ssh登录mysql30、mysql40、mysql50是否需要密码不用密码才是对的这里不展示了。配置所有数据库服务器彼此之间可以ssh免密登录
##在mysql30操作如下
[rootmysql30 ~]# ssh-keygen
[rootmysql30 ~]# ssh-copy-id root192.168.2.40
[rootmysql30 ~]# ssh-copy-id root192.168.2.50
##在mysql40操作如下
[rootmysql40 ~]# ssh-keygen
[rootmysql40 ~]# ssh-copy-id root192.168.2.30
[rootmysql40 ~]# ssh-copy-id root192.168.2.50
##在mysql50操作如下
[rootmysql50 ~]# ssh-keygen
[rootmysql50 ~]# ssh-copy-id root192.168.2.30
[rootmysql50 ~]# ssh-copy-id root192.168.2.40
##执行完后验证mysql30、mysql40、mysql50是否可以彼此之间免密登录这里就不展示了。2.1.3. 配置一主多从
需要关闭防火墙和selinux
2.1.3.1. 配置主库(mysql30
##修改配置文件开启binlog日志
[rootmysql30 ~]# vim /etc/my.cnf
[mysqld]
....
log_binmysql30
server_id30
##安装半同步模块
plugin-loadrpl_semi_sync_mastersemisync_master.so;rpl_semi_sync_slavesemisync_slave.so
##启动半同步模块
rpl_semi_sync_master_enabled1
rpl_semi_sync_slave_enabled1
##禁止删除本机中继日志
relay_log_purge0
##重启mysql服务
[rootmysql30 ~]# systemctl restart mysqld
##查看binlog日志文件名称和pos值
mysql show master status;
-----------------------------------------------------------------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
-----------------------------------------------------------------------------
| mysql30.000001 | 154 | | | |
-----------------------------------------------------------------------------
1 row in set (0.00 sec)
##创建授权用户
mysql grant replication slave on *.* to master% identified by 1234;2.1.3.2. 配置从服务器(mysql40)
##修改配置文件
[rootmysql40 ~]# vim /etc/my.cnf
[mysqld]
....
server_id40
log_binmaster40
plugin-loadrpl_semi_sync_mastersemisync_master.so;rpl_semi_sync_slavesemisync_slave.so
rpl_semi_sync_master_enabled1
rpl_semi_sync_slave_enabled1
relay_log_purge0##重启服务
[rootmysql40 ~]# systemctl restart mysqld
##指定主服务器pos的值必须是在主库创建授权用户之前,不然从库无法同步授权用户需要手动创建授权用户。
mysql change master to- master_host192.168.2.30,- master_usermaster,- master_password1234,- master_log_filemysql30.000001,- master_log_pos154;
##启动slave
mysql start slave;
Query OK, 0 rows affected (0.01 sec)
##查看是否配置成功
mysql show slave status\G;
查看Slave_IO_Running和Slave_SQL_Running是yes那就配置成功这里不展示了。2.1.3.3. 配置从服务器(mysql50)
##修改配置文件
[rootmysql50 ~]# vim /etc/my.cnf
[mysqld]
....
server_id50
log_binmaster50
plugin-loadrpl_semi_sync_mastersemisync_master.so;rpl_semi_sync_slavesemisync_slave.so
rpl_semi_sync_master_enabled1
rpl_semi_sync_slave_enabled1
relay_log_purge0##重启服务
[rootmysql50 ~]# systemctl restart mysqld
##指定主服务器
mysql change master to- master_host192.168.2.30,- master_usermaster,- master_password1234,- master_log_filemysql30.000001,- master_log_pos154;
##启动slave
mysql start slave;
Query OK, 0 rows affected (0.01 sec)
##查看是否配置成功
mysql show slave status\G;
查看Slave_IO_Running和Slave_SQL_Running是yes那就配置成功这里不展示了。2.2. 配置管理节点(mha20)
2.2.1. 安装mha软件包
##下载软件包
[rootmha20 ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
[rootmha20 ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
##安装mha4mysql-node
[rootmha20 ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
##源码编译安装mha4mysql-manager
[rootmha20 ~]# tar -xf mha4mysql-manager-0.58.tar.gz -C /usr/local/
[rootmha20 ~]# cd /usr/local/mha4mysql-manager-0.58/
[rootmha20 ~]# perl Makefile.PL --预编译有报错很有可能是依赖包的问题。
[rootmha20 ~]# make;make install
##配置环境变量
[rootmha20 ~]# echo export PATH/usr/local/mha4mysql-manager-0.58/bin:$PATH /etc/profile.d/mha4mysql.sh
[rootmha20 ~]# . /etc/profile.d/mha4mysql.sh
[rootmha20 ~]# echo $PATH2.2.2. 管理集群命令
[rootmha20 ~]# ls /usr/local/mha4mysql-manager-0.58/bin/
masterha_check_repl masterha_check_status masterha_manager masterha_master_switch masterha_stop
masterha_check_ssh masterha_conf_host masterha_master_monitor masterha_secondary_check命令作用masterha_check_ssh检查MHA的SSH配置状态masterha_check_repl检查MySQL复制状态masterha_manager启动MHAmasterha_check_status检测MHA运行状态masterha_stop停止MHAmasterha_master_monitor检测master是否宕机masterha_master_switch控制故障转移自动或者手动masterha_conf_host添加或删除配置的server信息
2.2.3. 修改主配置文件
##创建工作目录
[rootmha20 ~]# mkdir /etc/mha
[rootmha20 ~]# cp -r /usr/local/mha4mysql-manager-0.58/samples/conf/app1.cnf /etc/mha/
## 修改配置文件
[rootmha20 mha]# vim /etc/mha/app1.cnf
修改内容如下
[server default] ---管理服务的默认配置
manager_workdir/etc/mha ---指定工作目录路径
manager_log/etc/mha/manager.log ---指定管理服务运行后日志文件的名称和存放路径
master_ip_failover_script/etc/mha/master_ip_failover ---指定故障切换脚本
ssh_userroot ---指定ssh连接时候的用户名和端口号
ssh_port22repl_usermaster ---指定主库授权的用户名和密码
repl_password1234usermysqldb ---指定监控用户和密码三台mysql需要一样。
password1234ping_interval1 ---ping间隔时长
[server1] ---指定第一台mysql服务器
hostname192.168.2.30 ---指定第一台mysqlIP地址
port3306 ---端口号
candidate_master1 ---指定该数据库服务器参与竞选主库1代表参与。[server2]
hostname192.168.2.40
port3306
candidate_master1[server3]
hostname192.168.2.50
port3306
candidate_master1
2.2.4. 创建故障切换脚本
[rootmha20 mha]# cp -r /usr/local/mha4mysql-manager-0.58/samples/scripts/master_ip_failover /etc/mha/
##给脚本添加执行权限
[rootmha20 mha]# chmod x /etc/mha/master_ip_failover
##下面是完整的脚本文件需要修改VIP地址和网卡名称。
[rootmha20 mha]# vim /etc/mha/master_ip_failover
#!/usr/bin/env perluse strict;
use warnings FATAL all;use Getopt::Long;my ($command, $ssh_user, $orig_master_host, $orig_master_ip,$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);my $vip 192.168.2.100/24; #指定VIP地址
my $key 1;
my $ssh_start_vip /sbin/ifconfig ens33:$key $vip; #这里需要注意的就是网卡名称没人的主机网卡名不一样需要注意。
my $ssh_stop_vip /sbin/ifconfig ens33:$key down;GetOptions(commands \$command,ssh_users \$ssh_user,orig_master_hosts \$orig_master_host,orig_master_ips \$orig_master_ip,orig_master_porti \$orig_master_port,new_master_hosts \$new_master_host,new_master_ips \$new_master_ip,new_master_porti \$new_master_port,
);exit main();sub main {print \n\nIN SCRIPT TEST$ssh_stop_vip$ssh_start_vip\n\n;if ( $command eq stop || $command eq stopssh ) {my $exit_code 1;eval {print Disabling the VIP on old master: $orig_master_host \n;stop_vip();$exit_code 0;};if ($) {warn Got Error: $\n;exit $exit_code;}exit $exit_code;}
elsif ( $command eq start ) {my $exit_code 10;eval {print Enabling the VIP - $vip on the new master - $new_master_host \n;start_vip();$exit_code 0;};if ($) {warn $;exit $exit_code;}exit $exit_code;}elsif ( $command eq status ) {print Checking the Status of the script.. OK \n;exit 0;}else {usage();exit 1;}
}
sub start_vip() {ssh $ssh_user\$new_master_host \ $ssh_start_vip \;
}
sub stop_vip() {return 0 unless ($ssh_user);ssh $ssh_user\$orig_master_host \ $ssh_stop_vip \;
}sub usage {printUsage: master_ip_failover --commandstart|stop|stopssh|status --orig_master_hosthost --orig_master_ipip --orig_master_portport --new_master_hosthost --new_master_ipip --new_master_portport\n;
}
2.2.5. 在主库上创建VIP地址mysql30
[rootmysql30 ~]# ifconfig ens33:1 192.168.2.100
[rootmysql30 ~]# ifconfig ens33:1
ens33:1: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500inet 192.168.2.100 netmask 255.255.255.0 broadcast 192.168.2.255ether 00:0c:29:88:4f:b0 txqueuelen 1000 (Ethernet)2.3. 配置数据库服务器(mysql30-50
2.3.1. 在数据库服务器安装mha4mysql-node软件包
##在mysql30、mysql40、mysql50执行如下命令
[rootmysql30 ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[rootmysql30 ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
2.3.2. 创建监控用户
##监控用户是在管理服务器配置文件上指定的userxxxpasswordxxxx
##在主库上执行从库自然同步过去。
mysql grant all on *.* to mysqldb% identified by 1234;
Query OK, 0 rows affected, 1 warning (0.00 sec)3. 验证配置
3.1. 测试ssh配置
##在mha20服务器上执行测试
[rootmha20 ~]# masterha_check_ssh --conf/etc/mha/app1.cnf
....
All SSH connection tests passed successfully ---最后出现这个就说明配置正确。
3.2. 测试主从配置
[rootmha20 ~]# masterha_check_repl --conf/etc/mha/app1.cnf
...
MySQL Replication Health is OK. ---出现这个说明MySQL复制运行状况正常3.3. 启动管理服务
使用 masterha_manager 命令启动管理服务 —— --remove_dead_master_conf是指当主库宕机的时候会删除宕机主库的配置否则主库宕机后服务就会无法启动–ignore_last_failover是指忽略 xxx.health 文件意思是当主库宕机之后服务会在规定的时间内连接剩下的从服务器来选举出主库。如果启动服务的时候不加这个选项那么超过规定时间还没连接上的时候就不会再去切换主库了加上这个选项后既是在规定时间内没能连接上剩下的从服务器之后也会继续尝试连接知道选举出主库进行切换。 ##启动
[rootmha20 ~]# masterha_manager --conf/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
##后台启动
nohup masterha_manager --conf/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
##查看mha运行状态
[rootmha20 ~]# masterha_check_status --conf/etc/mha/app1.cnf
app1 (pid:39934) is running(0:PING_OK), master:192.168.2.30
##如果想停止服务可以输入下面命令
[rootmha20 ~]# masterha_stop --conf/etc/mha/app1.cnf
4 测试高可用
4.1. 模拟主库服务器故障
模拟故障的方法 停止mysqld服务关机故障切换过程 当管理主机连接不上mysql主服务器时就认为mysql主服务器宕机了然后管理主机的服务自动停掉然后调用故障切换脚本删除管理主机中关于mysql主服务器的内容/etc/mha/app1.cnf然后脚本会在选举出来的主服务器创建VIP地址。 ##在mysql30主服务关闭mysql服务
[rootmysql30 ~]# systemctl stop mysqld.service
##检查管理主机的配置文件是否删除mysql30的信息。
[rootmha20 ~]# grep 192.168.2.30 /etc/mha/app1.cnf --执行这条命令可以看的出来已经没有mysql30的信息了。
##在管理主机上查看日志文件master现在是哪台
[rootmha20 ~]# grep new master /etc/mha/manager.log
Fri Feb 24 14:58:16 2023 - [info] Searching new master from slaves..
192.168.2.40(192.168.2.40:3306) (new master)
Fri Feb 24 14:58:16 2023 - [info] Getting new masters binlog name and position..
Enabling the VIP - 192.168.2.100/24 on the new master - 192.168.2.40
Fri Feb 24 14:58:17 2023 - [info] Resetting slave 192.168.2.50(192.168.2.50:3306) and starting replication from the new master 192.168.2.40(192.168.2.40:3306)..
Fri Feb 24 14:58:18 2023 - [info] Resetting slave info on the new master..
Selected 192.168.2.40(192.168.2.40:3306) as a new master.
##可以看的出来mysql40被选举出来作为master
##在mysql40上查看VIP地址是否在
[rootmysql40 ~]# ifconfig ens33:1
ens33:1: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500inet 192.168.2.100 netmask 255.255.255.0 broadcast 192.168.2.255ether 00:0c:29:83:e3:d4 txqueuelen 1000 (Ethernet)
##查看mysql50的slave状态
[rootmysql50 ~]# mysql -uroot -p1234 -e show slave status \G;|head -13|tail -11
mysql: [Warning] Using a password on the command line interface can be insecure.Master_Host: 192.168.2.40 ---可以看的出来mysql40已经是masterl Master_User: masterMaster_Port: 3306Connect_Retry: 60Master_Log_File: master40.000001Read_Master_Log_Pos: 154Relay_Log_File: mysql50-relay-bin.000002Relay_Log_Pos: 319Relay_Master_Log_File: master40.000001Slave_IO_Running: YesSlave_SQL_Running: Yes
##启动管理主机的mha服务
[rootmha20 ~]# nohup masterha_manager --conf/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
##查看mha状态
[rootmha20 ~]# masterha_check_status --conf/etc/mha/app1.cnf
app1 (pid:57758) is running(0:PING_OK), master:192.168.2.404.2. 修复故障的数据库服务器
4.2.1. 数据服务器的配置
具体操作如下 启动mysql服务与主服务器数据一致指定主服务器信息启动slave进程查看slave状态信息 ## 启动mysql30服务
[rootmysql30 ~]# systemctl start mysqld
##指定主库服务器信息。
mysql change master to- master_host192.168.2.40,- master_usermaster,- master_password1234,- master_log_filemaster40.000001,- master_log_pos154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
##注意这里指定的binlog的文件名称master40.000001的原因是因为mysql40第一次变成master所以他的文件名是从master40.000001开始的。
##然而pos值154的原因是为了mysql30和mysql40数据一致因为假如你查看现在的mysql40的pos值应该会有变化因为mysql30宕机后生产环境下肯定会往里面写入数据但是pos值是从154开始的所以直接指定154才能很快的保证数据一致。
mysql start slave;
##这里就不显示slave的状态了。4.2.2. 配置管理主机
##停止mha服务
[rootmha20 ~]# masterha_stop --conf/etc/mha/app1.cnf
##修改mha主配置文件
[rootmha20 ~]# vim /etc/mha/app1.cnf
....
##添加如下
[server1]
candidate_master1
hostname192.168.2.30
port3306
##启动mha服务
[rootmha20 ~]# nohup masterha_manager --conf/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
##查看mha状态
[rootmha20 ~]# masterha_check_status --conf/etc/mha/app1.cnf
app1 (pid:60567) is running(0:PING_OK), master:192.168.2.40