美文网首页Mysql
MHA、部署 MHA 集群

MHA、部署 MHA 集群

作者: 秋天丢了李姑娘 | 来源:发表于2021-08-16 19:38 被阅读0次

MHA

概述

MHA简介

  • 由日本DeNA公司youshimaton开发
  • 是一套优秀的实现MySQL高可用的解决方案
  • 数据库的自动故障切换操作能做到在0~30秒之内完成
  • MHA能确保在故障切换过程中最大限度保证数据的一致性,以达到真正意义上的高可用

MHA组成

  • MHA Manager(管理节点)

    • 管理所有数据库服务器
    • 可以单独部署在一台独立的机器上
    • 也可以部署在某台数据库服务器上
  • MHA Node(数据节点)

    • 存储数据的MySQL服务器
    • 运行在每台MySQL服务器上

MHA工作过程

  • 由Manager定时探测集群中的master节点
  • 当master故障时,Manager自动将拥有最新数据的slave提升为新的master

部署MHA集群

graph LR
c(client:192.168.1.10)-->m(master:192.168.1.11)
m-->s1(slave1:192.168.1.12)
m-->s2(slave2:192.168.1.13)
mon(monitor:192.168.1.15)-->m
mon-->s1
mon-->s2

数据库服务器基础配置

  • 配置服务器192.168.1.11
[root@mysql1 ~]# vim /etc/my.cnf
[mysqld]
server_id = 11
log-bin = master11
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  # 禁止slave_sql线程执行完relay log后将其删除。
... ...

[root@mysql1 ~]# systemctl start mysqld
[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> grant replication slave on *.* to repluser@'%' Identified by 'NSD2021@tedu.cn';
  • 配置服务器192.168.1.12
[root@mysql2 ~]# vim /etc/my.cnf
[mysqld]
server_id=12
log_bin=master12
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@mysql2 ~]# systemctl start mysqld
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> grant replication slave on *.* to repluser@'%' Identified by 'NSD2021@tedu.cn';
  • 配置服务器192.168.1.13
[root@mysql3 ~]# vim /etc/my.cnf
[mysqld]
server_id=13
log_bin=master13
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@mysql3 ~]# systemctl start mysqld
[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> grant replication slave on *.* to repluser@'%' Identified by 'NSD2021@tedu.cn';

配置ssh免密登录

  • 配置服务器192.168.1.11
[root@mysql1 ~]# ssh-keygen
[root@mysql1 ~]# for i in 12 13
> do
> ssh-copy-id root@192.168.1.$i
> done
  • 配置服务器192.168.1.12
[root@mysql2 ~]# ssh-keygen
[root@mysql2 ~]# for i in 11 13; do ssh-copy-id root@192.168.1.$i; done
  • 配置服务器192.168.1.13
[root@mysql3 ~]# ssh-keygen
[root@mysql3 ~]# for i in 11 12; do ssh-copy-id root@192.168.1.$i; done

配置管理服务器

  • 实现免密连接三台数据库服务器
[root@mha1 ~]# ssh-keygen
[root@mha1 ~]# for i in 11 12 13; do ssh-copy-id root@192.168.1.$i; done

安装MHA

  • 配置yum源
[root@zzgrhel8 mha-soft-student]# cp *.rpm /var/www/html/mysql/
[root@zzgrhel8 mha-soft-student]# cd /var/www/html/mysql/
[root@zzgrhel8 mysql]# createrepo -v .
  • 在三台数据库服务器和管理节点上安装perl软件包
# mha node节点
[root@mysql{1,2,3} ~]# yum clean all
[root@mysql{1,2,3} ~]# yum install -y gcc pcre-devel pkgconfig autoconf automake perl-ExtUtils-MakeMaker perl-CPAN perl-DBI perl-DBD-MySQL

# mha 管理节点
[root@mha1 ~]# yum clean all
[root@mha1 ~]# yum install -y perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-ExtUtils-MakeMaker perl-CPAN

配置一主多从结构

配置主服务器192.168.1.11

[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master11.000002 |      701 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.18 sec)

配置主服务器192.168.1.12

[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> change master to
    -> master_host="192.168.1.11",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master11.000002",
    -> master_log_pos=701;

mysql> start slave;

mysql> show slave status\G
... ...
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
... ...

配置主服务器192.168.1.13

[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> change master to
    -> master_host="192.168.1.11",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master11.000002",
    -> master_log_pos=701;

mysql> start slave;

mysql> show slave status\G
... ...
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
... ...

配置MHA管理节点

  • 安装软件
[root@mha1 ~]# yum clean all
[root@mha1 ~]# yum install -y mha4mysql-node

# 拷贝mha服务端到管理节点
[root@zzgrhel8 mha]# scp mha4mysql-manager-0.56.tar.gz 192.168.1.15:/root

[root@mha1 ~]# tar xf mha4mysql-manager-0.56.tar.gz 
[root@mha1 ~]# cd mha4mysql-manager-0.56
[root@mha1 mha4mysql-manager-0.56]# perl Makefile.PL
[root@mha1 mha4mysql-manager-0.56]# make
[root@mha1 mha4mysql-manager-0.56]# make install
  • 修改主配置文件
[root@mha1 ~]# mkdir /etc/mha
# 拷贝配置文件到mha服务器,并修改
[root@zzgrhel8 mha]# scp app1.cnf 192.168.1.15:/etc/mha/
[root@mha1 ~]# vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/manager.log   # 日志文件
manager_workdir=/etc/mha           # 工作目录
master_ip_failover_script=/etc/mha/master_ip_failover  # 故障切换脚本

repl_user=repluser                 # 主服务器数据同步授权用户
repl_password=NSD2021@tedu.cn           # 密码

ssh_port=22                                      # ssh服务端口
ssh_user=root                                    # 访问ssh服务用户

user=mhamon                                     # 监控用户
password=NSD2021@tedu.cn                    # 密码

[server1]                                   # 第1台数据库服务器配置
candidate_master=1
hostname=192.168.1.11
port=3306

[server2]                                   # 第2台数据库服务器配置
candidate_master=1
hostname=192.168.1.12
port=3306

[server3]                                   # 第3台数据库服务器配置
candidate_master=1
hostname=192.168.1.13
port=3306
  • 创建故障切换脚本
# 拷贝故障切换脚本文件到mha服务器,并修改
[root@zzgrhel8 mha]# scp master_ip_failover 192.168.1.15:/etc/mha/
[root@mha1 ~]# vim +35 /etc/mha/master_ip_failover
... ...
my $vip = '192.168.1.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";
... ...
[root@mha1 ~]# chmod +x /etc/mha/master_ip_failover 
  • 在当前主服务器部署vip地址
[root@mysql1 ~]# ifconfig eth0:1 192.168.1.100/24 up
[root@mysql1 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:22:3a:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.11/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.100/24 brd 192.168.1.255 scope global secondary eth0:1
       valid_lft forever preferred_lft forever
    inet6 fe80::96a0:26f0:cac4:f130/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

配置数据节点

  • 在所有数据库服务器上,安装mha-node软件包
[root@mysql{1,2,3} ~]# yum clean all
[root@mysql{1,2,3} ~]# yum install -y mha4mysql-node-0.56-0.el6
  • 在所有数据服务器上添加监控用户
[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> grant all on *.* to mhamon@"%" identified by "NSD2021@tedu.cn";
mysql> show grants for mhamon;
+---------------------------------------------+
| Grants for mhamon@%                         |
+---------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'mhamon'@'%' |
+---------------------------------------------+
1 row in set (0.00 sec)

// 在从服务器上查看同步过来的监控用户
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> show grants for mhamon;
+---------------------------------------------+
| Grants for mhamon@%                         |
+---------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'mhamon'@'%' |
+---------------------------------------------+
1 row in set (0.00 sec)

[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> show grants for mhamon;
+---------------------------------------------+
| Grants for mhamon@%                         |
+---------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'mhamon'@'%' |
+---------------------------------------------+
1 row in set (0.00 sec)

测试配置

测试集群环境

  • 在管理主机,测试ssh配置
[root@mha1 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
... ...
Thu Apr 15 20:15:39 2021 - [info] All SSH connection tests passed successfully.
  • 在管理主机,测试主从同步
[root@mha1 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
... ...
MySQL Replication Health is OK.
  • 启动管理服务
[root@mha1 ~]# masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover

# 打开新终端查看服务状态
[root@mha1 ~]# masterha_check_status  --conf=/etc/mha/app1.cnf
app1 (pid:7199) is running(0:PING_OK), master:192.168.1.11

# 查看工作目录文件列表
[root@mha1 ~]# ls /etc/mha
app1.cnf  app1.master_status.health  master_ip_failover

访问集群

  • 在主服务器 添加访问数据的连接用户
[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> create database db1 default charset utf8mb4;
Query OK, 1 row affected (0.02 sec)

mysql> grant select,insert on db1.* to dbuser1@"%" identified by 'NSD2021@tedu.cn';
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> create table db1.students(id int primary key auto_increment, name varchar(20));
Query OK, 0 rows affected (0.74 sec)
  • 客户端192.168.1.10连接vip192.168.1.100地址访问集群
[root@node10 ~]# mysql -h192.168.1.100 -udbuser1 -pNSD2021@tedu.cn
mysql> insert into db1.students values(1, 'tom');
Query OK, 1 row affected (0.04 sec)

mysql> select * from db1.students;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
+----+------+
1 row in set (0.00 sec)
  • 在两台从服务器查看数据
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> select * from db1.students;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
+----+------+
1 row in set (0.00 sec)

[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> select * from db1.students;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
+----+------+
1 row in set (0.00 sec)

测试高可用

  • 停止主服务器192.168.1.11的mysql服务
[root@mysql1 ~]# systemctl stop mysqld
  • 查看管理服务 ,输出的监控信息
# 此时启动管理服务的监控主机终端已经退出
[root@mha1 ~]# masterha_check_status  --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
  • 客户端依然连接vip192.168.1.100地址,可以访问到数据。如果稍有卡顿,请耐心等待
[root@node10 ~]# mysql -h192.168.1.100 -udbuser1 -pNSD2021@tedu.cn
mysql> select * from db1.students;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
+----+------+
1 row in set (0.00 sec)
  • 在工作的两台主机192.168.1.12和192.168.1.13上查看VIP地址。VIP地址将会转移到某一台主机上。
[root@mysql2 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:cf:98:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.12/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.100/24 brd 192.168.1.255 scope global secondary eth0:1
       valid_lft forever preferred_lft forever
    inet6 fe80::88e7:d3e5:dc70:7b30/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
  • 在新的主服务器上更新数据
[root@mysql2 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> insert into db1.students values(2, 'jerry');
Query OK, 1 row affected (0.08 sec)

// 在从服务器上查看数据是否同步
[root@mysql3 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> select * from db1.students;
+----+-------+
| id | name  |
+----+-------+
|  1 | tom   |
|  2 | jerry |
+----+-------+
2 rows in set (0.00 sec)

修复故障服务器

  • 启动出现故障服务器的mysqld服务
[root@mysql1 ~]# systemctl start mysqld
  • 同步现有数据到修复的服务器
[root@mysql2 ~]# mysqldump -uroot -pNSD2021@tedu.cn --master-data db1 > db1.sql
[root@mysql2 ~]# scp db1.sql 192.168.1.11:/root/

[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn db1 < db1.sql
  • 配置修复的服务器为当前主服务器的从服务器
[root@mysql1 ~]# grep master12 db1.sql
CHANGE MASTER TO MASTER_LOG_FILE='master12.000002', MASTER_LOG_POS=964;

[root@mysql1 ~]# mysql -uroot -pNSD2021@tedu.cn
mysql> change master to
    -> master_host="192.168.1.12",
    -> master_user="repluser",
    -> master_password="NSD2021@tedu.cn",
    -> master_log_file="master12.000002",
    -> master_log_pos=964;
Query OK, 0 rows affected, 2 warnings (0.42 sec)

mysql> start slave;
Query OK, 0 rows affected (0.03 sec)

mysql> show slave status\G
... ...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
... ...
  • 配置管理服务器,将修复的服务器添加到服务器声明中
[root@mha1 ~]# vim /etc/mha/app1.cnf   # 尾部追加以下内容
... ...
[server1]
candidate_master=1
hostname=192.168.1.11
port=3306

# 测试集群环境
[root@mha1 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
... ...
Thu Apr 15 20:52:53 2021 - [info] All SSH connection tests passed successfully.

# 测试主从同步
[root@mha1 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
... ...
MySQL Replication Health is OK.
  • 重启管理服务
[root@mha1 ~]# masterha_stop  --conf=/etc/mha/app1.cnf
[root@mha1 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover &

[root@mha1 ~]# masterha_check_status  --conf=/etc/mha/app1.cnf
app1 (pid:7856) is running(0:PING_OK), master:192.168.1.12

相关文章

  • 13 MySQL MHA集群

    MySQL MHA 集群 [toc] MHA 简介 MHA ( Master High Availability ...

  • MHA、部署 MHA 集群

    MHA 概述 MHA简介 由日本DeNA公司youshimaton开发 是一套优秀的实现MySQL高可用的解决方案...

  • MySQL MHA

    MySQL-day16 MHA切换优先级 在数据量相同的情况下,MHA会往哪里切换? MHA启动命令 MHA集群恢...

  • mysql(十四)

    MHA切换优先级 在数据量相同的情况下,MHA会往哪里切换? MHA启动命令 MHA集群恢复 1.修复宕机的主库,...

  • Mysql8 MHA高可用搭建之MHA安装配置及测试

    三、mysql8基于MHA的高可用集群0、配置ssh密钥登入各服务器互信:1、安装MHA软件2、安装mha监控ma...

  • MySQL基于MHA高可用部署篇(Binlog模式)

    一、部署MHA前提要求(必须满足) 1.1 SSH公钥认证 基本上MHA manager,MNA node,以及二...

  • Zabbix集群升级

    一、###Zabbix集群构建: Mysql的MHA架构清单: 主机名IP主/从MHA高可用软件读写分离软件db0...

  • MySQL集群

    MyAQL常用的集群: mysql cluster,nbd,MHA,Mariadb Galera cluster,...

  • MySQL MHA搭建

    MySQL MHA 架构介绍:MHA由两部分组成MHA Manager(管理节点)和MHA Node(数据节点),...

  • 2018-06-07

    ---title:mha相关部署及配置---[toc]## 基础信息192.168.200.78192.168.2...

网友评论

    本文标题:MHA、部署 MHA 集群

    本文链接:https://www.haomeiwen.com/subject/yhrvbltx.html