MySQL集群MHA配置

MHA介绍及环境准备

(PDBMS并行数据库管理系统(Parallel Database Management System)

  1. MHA 软件介绍

    • MHA(Master High Avilability)
    • 实现Mysql高可用的解决方案
    • 数据库的自动故障切换操作能做到在0~30秒内完成
    • MHA能确保在故障切换过程中最大限度保证数据的一致性, 以达到真正意义上的高可用
  2. MHA组成

  • MHA Manger(管理节点)
    • 管理所有数据库服务器
    • 可单独部署在一台独立的机器上
    • 也可部署在某台数据库服务器上
  • MHA Node(数据节点)
    • 存储数据的MySQL服务器
    • 运行在每台MySQL服务器上
  1. 集群: 多台服务器提供相同服务(网络服务, 数据库服务)

集群类型:

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

  1. 安装mha4mysql-node
  2. 添加授权用户 (监控用户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
  • 也可进行以下测试
  1. 主服务端host51 上添加 数据库 和 授权用户
  2. 从服务端52,53 会自动同步添加的用户
  3. 客户端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..
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值