MHA集群概述 、 部署MHA集群
总结前3天搭建的数据存储架构的优缺点:
day01 主从结构存储数据
优点:实现了的数据的自动备份
缺点:主服务器和从服务器 都有单点故障的问题
day02 数据读写分离
优点: 减轻单台服务器的访问压力
同时实现数据的备份
缺点: 读写分离服务器 主数据库 从数据库 都存在单点故障问题
day03 分库分表
解决是的大量并发存储数据的 存储压力问题和 存储空间问题
缺点: 分片存储服务器有单点故障问题
没有数据备份的功能
DAY04 (mysql高可用集群) 解决服务的单点故障问题和 数据的自动备份
一· 相关的概念
高可用集群知识点回顾:
高可用集群 分为 主备2种角色 ,工作过程,主服务器获取vip地址 客户端连接
VIP地址访问服务,当主服务器宕机后 备用的服务器升级为获取vip地址 继续给
客户端提供服务
之前做的是网站服务的高可用集群 使用的是Keepalived软件做集群服务
今天要讲的是 做数据库服务的高可用集群 使用专属的集群软件MHA
MHA软件介绍
MHA(Master High Availability)
由日本DeNA公司youshimaton开发
是一套优秀的实现MySQL高可用的解决方案
数据库的自动故障切换操作能做到在0~30秒之内完成
MHA能确保在故障切换过程中最大限度保证数据的一致性,以达到真正意义上的高可用
软件有2部分组成
1 管理端软件(管理节点) : 安装管理集群主机上的软件
2 数据端软件(数据节点) : 安装在数据库服务器上的软件
MHA集群架构
说明至少3台数据库服务器做集群才能真正实现高可用
角色1 数据库服务器(3台)
准备3台新的数据库服务器
配置IP地址 192.168.4.51/52/53 管理员root 密码123qqq...A
角色2 管理主机(1台)
准备1台新的服务器 IP地址 192.168.4.57
不需要有数据库服务(有的话把数据库服务停止即可)
角色3
客户端(1台) 使用50主机做客户端 有连接命令mysql 即可
集群VIP地址
192.168.4.100
需要软件
把mha-soft-student目录拷贝到 主机 51 52 53 57 的/root 目录下
MHA集群的工作过程:
由Manager定时探测集群中的master节点
当master故障时,Manager自动将拥有最新数据的slave提升为新的master
(如果有多个从的话,剩下的从会自动更新为新主服务器的从主机)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
配置MHA集群,具体步骤如下:
第一步:集群环境准备 (在3台数据库服务器都要做的配置)
1)公共配置(3台数据库服务器都要配置)
#启用binlog日志
#开启半同步复制模式
#禁止删除本机的中继日志文件
#重启数据库服务
#添加从服务器拷贝sql命令时连接使用的用户
#配置数据库器host51
[root@host51 ~]# vim /etc/my.cnf [mysqld] plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 relay_log_purge=0 server_id=51 log_bin=master51 :wq
[root@host51 ~]# mysql -uroot -p123qqq...A
mysql> grant replication slave on *.* to repluser@"%" Identified by "123qqq...A"; mysql> exit;
#配置数据库器host52
[root@host52 ~]# vim /etc/my.cnf
[mysqld] plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 relay_log_purge=0 server_id=52 log_bin=master52 :wq
[root@host52 ~]# mysql -uroot -p123qqq...A
mysql> grant replication slave on *.* to repluser@"%" Identified by "123qqq...A"; mysql> exit;
#配置数据库器host53
[root@host53 ~]# vim /etc/my.cnf
[mysqld] plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 relay_log_purge=0 server_id=53 log_bin=master53 :wq
[root@host53 ~]# mysql -uroot -p123qqq...A
mysql> grant replication slave on *.* to repluser@"%" Identified by "123qqq...A"; mysql> exit;
2)配置ssh免密登录
2.1 所有数据库服务器之间可以彼此免密登录
第1步: 配置host51 免密登录host52和host53
[root@host51 ~]# ssh-keygen #遇到提示就回车 [root@host51 ~]# ssh-copy-id root@192.168.4.52 [root@host51 ~]# ssh-copy-id root@192.168.4.53
第2步: 配置host52 免密登录host51和host53
[root@host52 ~]# ssh-keygen #遇到提示就回车 [root@host52 ~]# ssh-copy-id root@192.168.4.51 [root@host52 ~]# ssh-copy-id root@192.168.4.53
第3步: 配置host53 免密登录host51和host52
[root@host53 ~]# ssh-keygen #遇到提示就回车 [root@host53 ~]# ssh-copy-id root@192.168.4.51 [root@host53 ~]# ssh-copy-id root@192.168.4.52
第4步: 测试免密登录
[root@host51 ~]# ssh 192.168.4.53 [root@host51 ~]# ssh 192.168.4.52 [root@host52 ~]# ssh 192.168.4.53 [root@host52 ~]# ssh 192.168.4.51 [root@host53 ~]# ssh 192.168.4.52 [root@host53 ~]# ssh 192.168.4.51
2.2 管理主机可以免密登录所有数据库服务器(数据库服务器不需要免密登录管理主机)
[root@mgm57 ~]# ssh-keygen [root@mgm57 ~]# ssh-copy-id root@192.168.4.51 [root@mgm57 ~]# ssh-copy-id root@192.168.4.52 [root@mgm57 ~]# ssh-copy-id root@192.168.4.53
[root@mgm57 ~]# ssh 192.168.4.51 [root@mgm57 ~]# ssh 192.168.4.52 [root@mgm57 ~]# ssh 192.168.4.53
3)配置MySQL 一主多从 同步结构
说明: 主机host52 和 host53 分别做host51 的从服务器
#配置主数据库服务器 192.168.4.51
1 启用binlog日志 (公共配置已经配置了)
2 用户授权(公共配置已经配置了)
3 查看日志信息
[root@host51 ~]# mysql -uroot -p123qqq...A -e 'show master status'
mysql: [Warning] Using a password on the command line interface can be insecure. +-----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | master51.000001 | 441 | | | | +-----------------+----------+--------------+------------------+-------------------+ [root@host51 ~]#
#配置从数据库服务器 192.168.4.52
1 指定server_id 并重启数据库服务 (公共配置已经做了)
2 确保数据一致(如果一样就不用做了)
3 指定主服务器信息
[root@host52 ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.51",master_user="repluser", master_password="123qqq...A",master_log_file="master51.000001",master_log_pos=441;
4 启动slave进程
MySQL>start slave;
5 查看状态 (IO线程和 SQL线程都是yes状态)
mysql> show slave status \G Slave_IO_Running: Yes Slave_SQL_Running: Yes
#配置从数据库服务器 192.168.4.53
1 指定server_id 并重启数据库服务(公共配置已经做了)
2 确保数据一致(如果一样就不用做了)
3 指定主服务器信息
[root@host53 ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.51",master_user="repluser", master_password="123qqq...A",master_log_file="master51.000001",master_log_pos=441;
4 启动slave进程
MySQL>start slave;
5 查看状态 (IO线程和 SQL线程都是yes状态)
mysql> show slave status \G Slave_IO_Running: Yes Slave_SQL_Running: Yes
第二步:配置管理主机 192.168.4.5
1) 安装软件
#安装依赖软件
cd mha-soft-student/ yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm yum -y install perl-*.rpm yum -y install perl-ExtUtils-* perl-CPAN*
#安装提供管理命令软件
tar -xf mha4mysql-manager-0.56.tar.gz cd mha4mysql-manager-0.56/ [root@mgm57 mha4mysql-manager-0.56]# perl Makefile.PL *** Module::AutoInstall version 1.03 *** Checking for Perl dependencies... [Core Features] - DBI ...loaded. (1.627) - DBD::mysql ...loaded. (4.023) - Time::HiRes ...loaded. (1.9725) - Config::Tiny ...loaded. (2.14) - Log::Dispatch ...loaded. (2.41) - Parallel::ForkManager ...loaded. (1.18) - MHA::NodeConst ...loaded. (0.56) *** Module::AutoInstall configuration finished. Checking if your kit is complete... Looks good Writing Makefile for mha4mysql::manager Writing MYMETA.yml and MYMETA.json [root@mgm57 mha4mysql-manager-0.56]# make && make install
2) 了解相关管理命令
[root@mgm57 mha4mysql-manager-0.56]# masterha_ #按2次tab键列出所有命令 masterha_check_repl masterha_conf_host masterha_master_switch masterha_check_ssh masterha_manager masterha_secondary_check masterha_check_status masterha_master_monitor masterha_stop [root@mgm57 mha4mysql-manager-0.56]#
3) 创建并编辑管理服务的主配置文件 (!!!重要!!!)
3.1 创建工作目录
[root@mgm57 ~]# mkdir /etc/mha
3.2 拷贝模板文件创建主配置文件
[root@mgm57 mha-soft-student]# cd mha4mysql-manager-0.56 [root@mgm57 mha4mysql-manager-0.56]# cp samples/conf/app1.cnf /etc/mha/
3.3 编辑主配置文件
说明:模版文件是个半成品 需要根据环境准备完善
[root@mgm57 ~]# vim /etc/mha/app1.cnf #(没有第4台数据库服务器所有把[server4]删除) [server default] manager_workdir=/etc/mha manager_log=/etc/mha/manager.log master_ip_failover_script=/etc/mha/master_ip_failover
ssh_user=root ssh_port=22 repl_user=repluser repl_password=123qqq...A user=plj password=123qqq...A
#定义监视的数据库服务器
[server1] hostname=192.168.4.51 port=3306 candidate_master=1
[server2] hostname=192.168.4.52 port=3306 candidate_master=1
[server3] hostname=192.168.4.53 port=3306 candidate_master=1 :wq
4) 创建故障切换脚本
创建脚本并指定vip地址部署在哪块网卡上
[root@mgm57 mha-soft-student]# cp master_ip_failover /etc/mha/ [root@mgm57 mha-soft-student]# chmod +x /etc/mha/master_ip_failover [root@mgm57 mha-soft-student]# vim +35 /etc/mha/master_ip_failover my $vip = '192.168.4.100/24'; # Virtual IP my $key = "1"; my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; :wq
第三步:配置数据库服务器
说明:要保证3台数据库都有ifconfig 命令
]# which ifconfig || yum -y install net-tools /usr/sbin/ifconfig
1)把故障切换脚本里指定的vip地址
配置在当前主从结构种的主数据库服务器Host51 主机上
[root@host51 ~]# ifconfig eth0:1 192.168.4.100/24 [root@host51 ~]# ifconfig eth0:1 eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.4.100 netmask 255.255.255.0 broadcast 192.168.4.255 ether 52:54:00:98:33:28 txqueuelen 1000 (Ethernet)
2)安装软件(3台数据库器软件都要安装)
#先安装依赖
[root@host51 ~]# cd mha-soft-student/ [root@host51 mha-soft-student]# yum -y install perl-*.rpm
#在安装主软件
[root@host51 mha-soft-student]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
3) 添加监控用户
只需在master服务器添加 在slave服务器查看
[root@host51 ~]# mysql -uroot -p123qqq...A mysql> grant all on *.* to plj@"%" identified by "123qqq...A"; mysql> exit;
[root@host52 ~]# mysql -uroot -p123qqq...A -e 'select user from mysql.user where user="plj"' mysql: [Warning] Using a password on the command line interface can be insecure. +------+ | user | +------+ | plj | +------+ [root@host53 ~]# mysql -uroot -p123qqq...A -e 'select user from mysql.user where user="plj"' mysql: [Warning] Using a password on the command line interface can be insecure. +------+ | user | +------+ | plj | +------+ [root@host52 ~]#
第四步:测试配置,在管理主机mgm57 如下测试:
1) 测试ssh免密登录配置
[root@mgm57 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf Sat Nov 20 16:31:08 2021 - [info] All SSH connection tests passed successfully. #成功提示
2)测试主从同步配置
[root@mgm57 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf MySQL Replication Health is OK. #成功提示
排错思路
ssh 测试失败 公共解决办法
第一步 :在 51-53 、57删除错误的密码对和公钥 rm -rf /root/.ssh
第二步:然后把环境准备中的 ssh 免密登录重新配置一遍
配置3台数据库服务器之间密码登录
配置管理主机57 能够免密登录 3台数据库服务器
主从同步配置失败的解决办法
第一步: 在52 和 53本机查看 slave 进程的状态 如果io 和 sql 线程 不同时是yes 需要执行如下操作(2台都执行)
首先执行 stop slave; 停止有错误的 slave 进程
然后重新使用change master to 指定主服务器的信息;
然后执行 start slave;
查看状态 show slave status \G
如果2个从服务器都是 io 和 sql 线程 yes
在 51 主机查看是否有 slave 状态 show slave status \G
然后执行stop slave;
如果以上都没有问题 检查 app1.cnf 编写
第五步: 启动管理服务(192.168.4.57)
说明:2个测试都成功了 管理服务才能启动成功
[root@mgm57 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf \ --ignore_last_failover 2> /dev/null & [root@mgm57 ~]# jobs [1]+ 运行中 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null & [root@mgm57 ~]#
[root@mgm57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf; app1 (pid:1977) is running(0:PING_OK), master:192.168.4.51 [root@mgm57 ~]#
[root@host51 ~]# ifconfig eth0:1 eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.4.100 netmask 255.255.255.0 broadcast 192.168.4.255 ether 52:54:00:98:33:28 txqueuelen 1000 (Ethernet)
测试集群的高可用功能,具体操作如下:
1) 客户端host50 连接VIP地址访问数据库服务
#主数据库服务器host51 添加客户端连接使用的用户 2台从服务器会自动同步用户
mysql> create database db1; mysql> create table db1.a(id int); mysql> grant select ,insert on db1.* to yaya@"%" identified by "123qqq...A";
#客户端使用用户连接服务
[root@host50 ~]# mysql -h192.168.4.100 -uyaya -p123qqq...A
insert into db1.a values (8888); select * from db1.a;
2)停止host51主机的数据库服务
[root@host51 ~]# systemctl stop mysqld
3)客户端host50 依然可以连接VIP地址访问数据库服务
[root@host50 ~]# mysql -h192.168.4.100 -uyaya -p123qqq...A
mysql> insert into db1.a values (9999); Query OK, 1 row affected (0.07 sec)
mysql> select * from db1.a; +------+ | id | +------+ | 8888 | | 9999 | +------+ 2 rows in set (0.00 sec)
4) 在host52 或 host53 主机查看vip地址 (谁有vip 谁就是新的主数据库服务器)
[root@host52 ~]# ifconfig eth0:1 eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.4.100 netmask 255.255.255.0 broadcast 192.168.4.255 ether 52:54:00:c9:96:10 txqueuelen 1000 (Ethernet)
5) 在剩下的另一台数据库服务器查看主服务器IP地址(自动做新主服务器的slave主机)
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'show slave status\G' | grep -i yes mysql: [Warning] Using a password on the command line interface can be insecure. Slave_IO_Running: Yes Slave_SQL_Running: Yes [root@host53 ~]#
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'show slave status\G' | grep -i "master_host" mysql: [Warning] Using a password on the command line interface can be insecure. Master_Host: 192.168.4.52
6) 查看app1.cnf配置文件 (发现没有[server1]的配置了 仅剩 [server2] 和 [server3] )
[root@mgm57 ~]# grep "server1" /etc/mha/app1.cnf [root@mgm57 ~]# [root@mgm57 ~]# grep "server2" /etc/mha/app1.cnf [server2] [root@mgm57 ~]# grep "server3" /etc/mha/app1.cnf [server3] [root@mgm57 ~]#
7) 查看管理服务的状态,并启动管理服务 再次查看状态 (会监视新的主数据库服务器)
[root@mgm57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf; [root@mgm57 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null & [1] 2527
[root@mgm57 ~]# jobs [1]+ 运行中 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null & [root@mgm57 ~]# [root@mgm57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf; app1 (pid:2527) is running(0:PING_OK), master:192.168.4.52 #监视新的主数据库服务器52 [root@mgm57 ~]#
修复宕机的51数据库服务器
第一步:把192.168.4.51 配置为 当前 master服务器 52的slave主机,
具体操作如下:
[root@host51 ~]#systemctl start mysqld [root@host52 ~]# mysqldump -uroot -p123qqq...A --master-data -B db1 > /root/db1.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@host52 ~]# scp /root/db1.sql 192.168.4.51:/root/ db1.sql 100% 2073 210.9KB/s 00:00 [root@host52 ~]#
[root@host51 ~]# mysql -uroot -p123qqq...A < /root/db1.sql [root@host51 ~]# grep master52 /root/db1.sql CHANGE MASTER TO MASTER_LOG_FILE='master52.000001', MASTER_LOG_POS=1676; [root@host51 ~]# [root@host51 ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.52" , master_user="repluser" , master_password="123qqq...A" , master_log_file="master52.000001" , master_log_pos=1676 ; Query OK, 0 rows affected, 2 warnings (0.12 sec) mysql> start slave; Query OK, 0 rows affected (0.02 sec) mysql> show slave status \G Slave_IO_Running: Yes Slave_SQL_Running: Yes mysql> exit;
第二步 :把51主机添加到集群里
具体配置如下:
[root@host57 ~]# jobs [1]+ 运行中 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null & [root@host57 ~]# [root@host57 ~]# vim /etc/mha/app1.cnf #把51主机添加到配置文件里 [server1] hostname=192.168.4.51 port=3306 candidate_master=1 :wq
masterha_secondary_check masterha_stop [root@host57 ~]# masterha_stop --conf=/etc/mha/app1.cnf Stopped app1 successfully. [1]+ 退出 1 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null [root@host57 ~]# [root@host57 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null & [1] 3618 [root@host57 ~]# jobs [1]+ 运行中 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover 2> /dev/null & [root@host57 ~]#
[root@host57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf app1 (pid:3618) is running(0:PING_OK), master:192.168.4.52
over