文章目录
MHA介绍及环境准备
(PDBMS并行数据库管理系统(Parallel Database Management System)
-
MHA 软件介绍
- MHA(Master High Avilability)
- 实现Mysql高可用的解决方案
- 数据库的自动故障切换操作能做到在0~30秒内完成
- MHA能确保在故障切换过程中最大限度保证数据的一致性, 以达到真正意义上的高可用
-
MHA组成
- MHA Manger(管理节点)
- 管理所有数据库服务器
- 可单独部署在一台独立的机器上
- 也可部署在某台数据库服务器上
- MHA Node(数据节点)
- 存储数据的MySQL服务器
- 运行在每台MySQL服务器上
- 集群: 多台服务器提供相同服务(网络服务, 数据库服务)
集群类型:
LB(负载均衡集群) 集群中所有服务器平均分摊客户端的多次连接访问
HA(高可用集群) 备用的服务器会自动接替故障的主服务器,继续提供服务,
LVS Haproxy Nginx Keepalived
集群拓扑结构
MHA的工作过程
集群环境准备
配置管理主机
优化数据库服务器的配置
测试配置
排错
启动管理服务
测试MHA集群
将故障的服务器再添加到集群中
配置三台数据库服务器,可相互免密登录
[root@host57 mha]# ssh-keygen
[root@host57 mha]# for i in 52 53 51; do ssh-copy-id root@"192.168.4.$i"; done;
[root@host51 opt]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@host51 opt]# for i in 52 53; do ssh-copy-id root@"192.168.4.$i"; done
//其他两台同样, ssh
配置 MySQL一主多从结构
具体步骤如下:
提示 确保3台服务器的数据是一致的 。
配置主数据库服务器 192.168.4.51
启用binlog日志
用户授权
查看日志信息
[root@host51 mha]# vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=master51
:wq
[root@host51 mha]# systemctl restart mysqld
[root@host51 mha]# mysql -uroot -p密码
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 | 441 | | | |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
mysql>
配置从数据库服务器 192.168.4.52
[root@host52 mha]# vim /etc/my.cnf
[mysqld]
server_id=52
:wq
[root@host52 mha]# systemctl restart mysqld
[root@host52 mha]# mysql -uroot -p密码
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;
Query OK, 0 rows affected, 2 warnings (0.04 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
配置从数据库服务器 192.168.4.53
[root@host53 mha]# vim /etc/my.cnf
[mysqld]
server_id=53
:wq
[root@host53 mha]# systemctl restart mysqld
[root@host53 mha]# mysql -uroot -p密码
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;
mysql> start slave;
mysql> show slaver status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
MHA管理主机及数据服库务器配置
192.168.4.57(重点)
具体如下:
1.安装MHA软件
[root@host57 ~]# cd mha
[root@host57 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
]#tar -zxvf mha4mysql-manager-0.56.tar.gz
]#cd mha4mysql-manager-0.56
- 源码编译安装
[root@host57 ~]# ls /var/ftp/pub/mha/
app1.cnf mha4mysql-node-0.56-0.el6.noarch.rpm perl-Mail-Sender-0.8.23-1.el7.noarch.rpm perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
master_ip_failover perl-Config-Tiny-2.14-7.el7.noarch.rpm perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
mha4mysql-manager-0.56 perl-Email-Date-Format-1.002-15.el7.noarch.rpm perl-MIME-Lite-3.030-1.el7.noarch.rpm
mha4mysql-manager-0.56.tar.gz perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm perl-MIME-Types-1.38-2.el7.noarch.rpm
// 先将yum仓库中没有的几个perl依赖软件包先安装
[root@host57 mha]# yum -y install perl-*rpm
// 再根据提示安装, 其他依赖包
[root@host57 mha4mysql-manager-0.56]# perl Makefile.PL
//会提示缺什么软件包, 即如下两个
[root@host57 mha]yum -y install perl-ExtUtils-*
[root@host57 mha]# yum -y install perl-CPAN-*
[root@host57 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@host57 mha4mysql-manager-0.56]# make && make install
2. 创建并编辑管理服务的主配置文件
[root@host57 mha4mysql-manager-0.56]# mkdir /etc/mha
[root@host57 mha4mysql-manager-0.56]# cp samples/conf/app1.cnf /etc/mha/
[root@host57 mha4mysql-manager-0.56]# vim /etc/mha/app1.cnf
[root@host57 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服务用户
ssh_user=root
ssh_port=22
//repluser为数据同步授权用户
repl_user=repluser
repl_password=123qqq...A
//root用户为监控用户, 为获取 51,52,53 的角色
user=root
password=123qqq...A
[server1] //指定第一台数据库服务器
hostname=192.168.4.51 //服务器ip地址
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
~
3. 创建故障切换脚本,并指定vip地址
[root@host57 ~]# cp mha/master_ip_failover /etc/mha/
[root@host57 ~]# 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 ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
:wq
[root@host57 ~]# chmod +x /etc/mha/master_ip_failover
4. 配置vip地址到主数据服务器
配置在当前的主数据库服务器192.168.4.51上
[root@host51 ~]# ifconfig ens33:1 192.168.4.100
[root@host51 ~]# nmcli con show
NAME UUID TYPE DEVICE
ens33 6463e111-b4fd-441d-b61d-0206867af98b ethernet ens33
[root@host51 ~]# ip a s
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:12:a4:46 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.51/24 brd 192.168.4.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.4.100/24 brd 192.168.4.255 scope global secondary ens33:1
valid_lft forever preferred_lft forever
[root@lhost51 ~]# ifconfig ens33:1
ens33: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 00:0c:29:12:a4:46 txqueuelen 1000 (Ethernet)
5. 3台数据库服务器的安装配置mha4mysql-node
- 安装mha4mysql-node
- 添加授权用户 (监控用户root)
1 安装软件(perl依赖包需要安装, 同mha服务器host57)
[root@host51 ~]# cd mha/
[root@host51 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
[root@host52 ~]# cd mha/
[root@host52 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
[root@host53 ~]# cd mha/
[root@host53 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
2 添加授权用户 (监控用户root)
[root@host51 ~]# mysql -uroot -p123qqq...A -e 'grant all on *.* to root@"%" identified by "123qqq...A"'
[root@host52 ~]# mysql -uroot -p123qqq...A -e 'show grants for root@"%"'
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'show grants for root@"%"'
6. 优化数据库服务器的配置
1 修改3台数据库服务器的/etc/my.cnf 文件 ,安装master模块和slave模块 并启用。 和 禁止删除本机的中继日志文件
2 在 52 和 53 主机启用binlog日志
3 在 52 和 53 主机添加从服务器同步数据时的连接用repluser
- 优化51主数据库服务器上配置
[root@host51 mysql]# vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=master51
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
[root@host51 mysql]# systemctl restart mysqld
- 52上配置 主,及同步复制模式
[root@host52 mysql]# vim /etc/my.cnf
[mysqld]
server_id=52
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
log_bin=master52
:wq
[root@host52 mysql]# systemctl restart mysqld
[root@host52 mysql]# mysql -uroot -p123qqq...A -e 'grant replication slave on *.* to repluser@"%" identified by "123qqq...A"'
[root@host52 mysql]# 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
- 53上配置 主 及同步复制模式
[root@host53 mysql]# vim /etc/my.cnf
[mysqld]
server_id=53
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
log_bin=master53
[root@host53 mysql]# systemctl restart mysqld
[root@host53 mysql]# mysql -uroot -p123qqq...A -e 'grant replication slave on *.* to repluser@"%" identified by "123qqq...A"'
[root@host53 mysql]# 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 mysql]#
- 当主服务器宕后 , 可
[root@host51 mha]# mysql -uroot -p密码
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;
mysql> start slave;
mysql> show slaver status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试配置
测试集群环境
- 1. 在管理主机,测试ssh配置
[root@host57 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
Wed Aug 26 01:20:45 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Aug 26 01:20:45 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
......
Wed Aug 26 01:20:49 2020 - [debug] ok.
Wed Aug 26 01:20:49 2020 - [info] All SSH connection tests passed successfully.
- 2. 在管理主机,测试主从同步
[root@host57 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
Wed Aug 26 01:21:20 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
......
Wed Aug 26 01:21:30 2020 - [info] OK.
Wed Aug 26 01:21:30 2020 - [warning] shutdown_script is not defined.
Wed Aug 26 01:21:30 2020 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
-
–remove_dead_master_conf 自动删除宕机的主服务器
-
–ignore_last_failover 任何时候主服务器宕机自动切换备用为主服务器 (默认为只进行一次故障切换)
-
3. 启动管理服务
[root@mgm57 ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf \
--ignore_last_failover //执行启动命令
Wed Aug 26 01:26:31 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Aug 26 01:26:31 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Aug 26 01:26:31 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
- 4. 查看管理服务的运行状态 (再开一个主服务器终端)
Last login: Tue Aug 25 23:30:00 2020 from 192.168.4.1
[root@host57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:5604) is running(0:PING_OK), master:192.168.4.51
- - 在当前服务器host51, 查看vip地址
[root@host51 mha]# ifconfig ens33:1
ens33: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 00:0c:29:12:a4:46 txqueuelen 1000 (Ethernet)
- - 客户端 50主机主机, 连接vip 地址访问数据库服务, 存取数据
- msql -h192.168.4.100 -P3306 -u授权用户名 -p密码
- 在客户端登录vip的3306端口, 进入数据库, 可查看当前在主数据库host51
[root@host50 ~]# mysql -h192.168.4.100 -P 3306 -uroot -p123qqq...A -e "select user();"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------+
| user() |
+-------------------+
| root@192.168.4.50 |
+-------------------+
[root@host50 ~]# mysql -h192.168.4.100 -P 3306 -uroot -p123qqq...A -e "select @@hostname;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| host51 |
+------------+
// 在客户端登录vip的3306端口, 进入数据库, 可查看当前在主数据库host51
- 也可进行以下测试
- 主服务端host51 上添加 数据库 和 授权用户
- 从服务端52,53 会自动同步添加的用户
- 客户端50 主机, 登录并存取数据
排错思路:
查看检查的输出信息
ssh免密登录 没成功
主从结构不正常 (52 和 53 的io 线程 和 sql线程要是是yes状态)
MySQL数据库服务器的优化配置是否配置正确
请认真检查 app1.cnf文件的编写
所有主机防火墙 要关闭。
软件包没有安装完全
测试mha集群高可用功能
- 数据库主服务器故障前, mha监控必须开启,且 加上选项 –conf=/etc/mha/app1.cnf --remove_dead_master_conf
[root@host57 ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
- 1. 当51 主机宕机时 ,客户端依然可以连接地址100访问数据库服务存取数据
host51]# systemctl stop mysqld
host50]# mysql -h192.168.4.100 -uplj -p123qqq...A
- 2. 在2台备用的数据库服务器查看vip地址
- (谁获取到了vip地址,谁就是新的主数据库服务器)
host52]# ip addr show | grep "192.168.4.100"
host53]# ip addr show | grep "192.168.4.100"
- 3. 在53数据库服务器查slave进程进程的状态,会自动到新的主数据库服务器同步数据
]# mysql -uroot -p123qqq...A -e ' show slave status \G' | grep -i "master_host"
]# mysql -uroot -p123qqq...A -e ' show slave status \G' | grep -i yes
- 4. 查看app1.cnf文件 会发现 数据服务器192.168.4.51 的配置自动被删除
host57]# cat /etc/mha/app1.cnf
- 5. 查看管理服务的状态,发现管理服务自动停止了
[root@host57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
- 6. 检查主从同步配置,启动管理服务,使其可以监视新的主数据库服务器
[root@host57 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
[root@host57 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
[root@host57 ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
[root@host57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4719) is running(0:PING_OK), master:192.168.4.52
[root@host57 ~]#
把故障的服务器51,再添加到集群里
- 1. 配置数据库服务器51
启动MySQL服务
[root@host51 ~]# systemctl start mysqld
确保与当前master 服务器数据一致
[root@host52 ~]# mysqldump -uroot -p123qqq...A bbsdb > /root/bbsdb.sql
[root@host52 ~]# scp /root/bbsdb.sql root@192.168.4.51:/opt/
[root@host51 ~]# mysql -uroot -p123qqq...A bbsdb < /opt/bbsdb.sql
查看日志信息
[root@host52 ~]# 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 |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 | 941 | | | |
+-----------------+----------+--------------+------------------+-------------------+
[root@host52 ~]#
指定主服务器信息
[root@host51 ~]# mysql -uroot -p123qqq...A -e ' change master to master_host="192.168.4.52" , master_user="repluser", master_password="123qqq...A",master_log_file="master52.000001",master_log_pos=941'
[root@host51 ~]# mysql -uroot -p123qqq...A -e ' start slave'
[root@host51 ~]# 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@host51 ~]# 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
- 2 配置管理主机57
- 因前面故障删除后, master_ip_failover_script 脚本自动将配置文件删去, 更换vip
把51 主机添加到 app1.cnf文件里
[root@host57 ~]# vi /etc/mha/app1.cnf
[server1]
candidate_master=1
hostname=192.168.4.51
port=3306
:wq
测试ssh连接
[root@host57 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
Wed Aug 26 10:52:42 2020 - [info] All SSH connection tests passed successfully.
测试主从同步
[root@host57 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
停止当前的管理服务
[root@host57 ~]# masterha_stop --conf=/etc/mha/app1.cnf
Stopped app1 successfully.
[root@host57 ~]#
启动管理服务
[root@host57 ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
Wed Aug 26 10:56:06 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Aug 26 10:56:06 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Aug 26 10:56:06 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..