MySQL——MHA集群(笔记需补充)

一、数据库高可用集群

  • 相关概念
  1. 集群:多台服务器提供相同服务
  2. 集群分类:HA高可用集群、LB负载均衡集群
  3. 集群服务软件: LVS 、haproxy 、nginx 、keepalived

1.1、MHA简介

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

1.2、MHA组成

  • MHA Manager (管理节点)
  1. 管理所有数据库服务器
  2. 可以单独部署在一台独立的机器上
  3. 也可以部署在某台数据库服务器上
  • MHA Node (数据节点)
  1. 存储数据的MySQL服务器
  2. 运行在每台MySQL服务器上

1.3、MHA工作过程

  1. Manager定时探测集群中的master节点
  2. 当master故障时,Manager自动将拥有最新数据的slave提升为新的master。
  3. MHA也可以同时管理多个主从复制组。

二、搭建集群环境

2.1、实验拓扑

2.2、环境准备

2.2.1、软件安装

  1. 准备如下软件
[root@manager mha]# ls
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm          
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm 
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
  1. 安装软件(51、52、53、57)
]# yum -y install perl-*.rpm

2.2.2、配置ssh免密登录

  • 配置三台数据库之间免密登录
  1. 数据库1
[root@db1 ~]# ssh-keygen	//创建密钥对
[root@db1 ~]# ls .ssh
id_rsa  id_rsa.pub
[root@db1 ~]# ssh-copy-id root@192.168.4.52
[root@db1 ~]# ssh-copy-id root@192.168.4.53
  1. 数据库2
[root@db2 ~]# ssh-keygen
[root@db2 ~]# ls .ssh
id_rsa  id_rsa.pub
[root@db2 ~]# ssh-copy-id root@192.168.4.51
[root@db2 ~]# ssh-copy-id root@192.168.4.53
  1. 数据库3
[root@db3 ~]# ssh-keygen
[root@db3 ~]# ls .ssh
id_rsa  id_rsa.pub
[root@db3 ~]# ssh-copy-id root@192.168.4.51
[root@db3 ~]# ssh-copy-id root@192.168.4.52
  • 配置管理主机可以免密登录所有数据库服务器
[root@manager ~]# ssh-keygen
[root@manager ~]# ssh-copy-id root@192.168.4.51
[root@manager ~]# ssh-copy-id root@192.168.4.52
[root@manager ~]# ssh-copy-id root@192.168.4.53

2.3、配置MySQL一主多从同步结构

2.3.1、配置主服务器

[root@db1 ~]# vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=master

[root@db1 ~]# systemctl restart mysqld
[root@db1 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| master.000001 |      154 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

2.3.2、配置从服务器

  1. 第一台从服务器
[root@db2 ~]# vim /etc/my.cnf
[mysqld]
server_id=52

[root@db2 ~]# systemctl restart mysqld
[root@db2 ~]# mysql -uroot -p123456
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master.000001",master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.11 sec)

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

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.51
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: db2-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: master.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 第二台从服务器
[root@db3 ~]# vim /etc/my.cnf
[mysqld]
server_id=53

[root@db3 ~]# systemctl restart mysqld
[root@db3 ~]# mysql -uroot -p123456
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master.000001",master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.51
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: db3-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: master.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

三、配置管理节点

3.1、安装MHA相关软件

[root@manager mha]# ls                                
mha4mysql-manager-0.56.tar.gz                   
mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager mha]# yum -y install perl-ExtUtils-*  perl-CPAN*

[root@manager mha]# tar -zxf mha4mysql-manager-0.56.tar.gz
[root@manager mha]# ls mha4mysql-manager-0.56
AUTHORS  COPYING  inc  Makefile.PL  META.yml  rpm      t
bin      debian   lib  MANIFEST     README    samples  test
[root@manager mha]# cd mha4mysql-manager-0.56
[root@manager 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@manager mha4mysql-manager-0.56]# make && make install 

3.2、创建并编辑主配置文件

3.2.1、 创建配置文件

[root@manager mha4mysql-manager-0.56]# ls samples/conf/
app1.cnf  masterha_default.cnf
[root@manager mha4mysql-manager-0.56]# mkdir /etc/mha
[root@manager mha4mysql-manager-0.56]# cp samples/conf/app1.cnf  /etc/mha/

3.2.2、编辑配置文件

]# 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_user=root	//访问ssh服务用户
ssh_port=22		//ssh服务端口

repl_user=repluser	//数据同步授权用户
repl_password=123456	//密码

user=root	//监控用户
password=123456		//密码

[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.3、创建故障切换脚本

链接:脚本文件共享地址
提取码:3mxv

]# vim /etc/mha/master_ip_failover
 35 my $vip = '192.168.4.100/24';  //定义了vip地址
 36 my $key = "1";					//定义了地址编号
 37 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";	//绑定了vip地址
 38 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";	//释放vip地址
  • 赋予脚本可执行权限
]# chmod +x /etc/mha/master_ip_failover

四、配置数据库节点

4.1、给主服务器配置vip地址

[root@db1 ~]# ifconfig ens33:1 192.168.4.100/24
[root@db1 ~]# 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:4c:16:33  txqueuelen 1000  (Ethernet)

4.2、配置数据库服务器

4.2.1、配置数据库服务器1

  1. 加载master和slave角色模块 并启用模块,禁止自动删除中继日志文件
]# 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
  1. 重启数据库服务
[root@db1 ~]# systemctl restart mysqld          
[root@db1 ~]# netstat -utnlp | grep mysql
  1. 安装MHA-node
[root@db1 ~]# cd mha
[root@db1 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
  1. 添加监控用户
mysql> grant all on  *.*  to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)

4.2.2、配置数据库服务器2

  1. 加载master和slave角色模块 并启用模块,禁止自动删除中继日志文件
[root@db2 ~]# 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
  1. 启用binlog日志
[root@db2 ~]# vim /etc/my.cnf
log_bin=master52
  1. 同步连接用户
mysql> grant replication slave on *.*  to  repluser@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.39 sec)
  1. 重启数据库服务
[root@db2 ~]# systemctl restart mysqld          
[root@db2 ~]# netstat -utnlp | grep mysql
  1. 查看slave状态
mysql> show slave status \G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 安装MHA-node
[root@db2 ~]# cd mha
[root@db2 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
  1. 添加监控用户
mysql> grant all on  *.*  to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)

4.2.3、配置数据库服务器3

  1. 加载master和slave角色模块 并启用模块,禁止自动删除中继日志文件
[root@db3 ~]# 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
  1. 启用binlog日志
[root@db3 ~]# vim /etc/my.cnf
log_bin=master53
  1. 同步连接用户
mysql> grant replication slave on *.*  to  repluser@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.39 sec)
  1. 重启数据库服务
[root@db3 ~]# systemctl restart mysqld          
[root@db3 ~]# netstat -utnlp | grep mysql
  1. 查看slave状态
mysql> show slave status \G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 安装MHA-node
[root@db3 ~]# cd mha
[root@db3 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
  1. 添加监控用户
mysql> grant all on  *.*  to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)

五、测试配置

  1. 测试ssh免密登录
[root@manager ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf
			All SSH connection tests passed successfully.
  1. 测试主从同步配置
[root@manager ~]# masterha_check_repl  --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.

六、启动管理服务

  • 启动管理服务会占用一个终端
[root@manager ~]# masterha_manager --remove_dead_master_conf --ignore_last_failover  --conf=/etc/mha/app1.cnf

–remove_dead_master_conf
删除宕机主库的配置

–ignore_last_failover
忽略xxx.health文件

  • 查看服务状态
[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:2964) is running(0:PING_OK), master:192.168.4.51
[root@manager ~]# ls /etc/mha/
app1.cnf  master_ip_failover
启动前的目录
[root@manager ~]# ls /etc/mha/
app1.cnf  app1.master_status.health  manager.log  master_ip_failover
启动后的目录

manager.log
日志文件

七、测试集群配置

7.1、客户端访问集群存取数据

  1. 在主数据服务器授权连接用户
mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)

mysql> create table mydb1.t1(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> grant select , insert on mydb1.* to abcd@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.00 sec)
  1. 从服务器上检查同步情况
mysql> show grants for abcd;
  1. 客户端连接VIP访问数据库
[root@client ~]# mysql -h192.168.4.100 -uabcd -p123456
  1. 插入数据
mysql> insert into mydb1.t1 values(123);
Query OK, 1 row affected (0.02 sec)

mysql> insert into mydb1.t1 values(456);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mydb1.t1 values(789);
Query OK, 1 row affected (0.00 sec)

mysql> select * from mydb1.t1;
+------+
| id   |
+------+
|  123 |
|  456 |
|  789 |
+------+
3 rows in set (0.00 sec)

7.2、测试集群高可用

  1. 停止主数据库服务
[root@db1 ~]# systemctl stop mysqld

停止主库服务后,管理主机会重新选举主服务器,VIP会切换到从服务器上。
配置文件中也会把server1的部分删除
2. 重新使用客户端登录

[root@client ~]# mysql -h192.168.4.100 -uabcd -p123456

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| db2        |
+------------+
1 row in set (0.00 sec)

主服务器由数据库2继承
3. 插入数据

mysql> insert into mydb1.t1 values(1234);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mydb1.t1 values(5678);
Query OK, 1 row affected (0.00 sec)
  1. 数据库3上查看数据同步情况和slave状态
mysql> select * from mydb1.t1;
+------+
| id   |
+------+
|  123 |
|  456 |
|  789 |
| 1234 |
| 5678 |
+------+
5 rows in set (0.00 sec)
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.52
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 查看集群状态
[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
  1. 重新开启MHA服务
[root@manager ~]# masterha_manager --remove_dead_master_conf --ignore_last_failover  --conf=/etc/mha/app1.cnf
[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4219) is running(0:PING_OK), master:192.168.4.52

7.3、恢复故障主机

7.3.1、配置数据库1

  1. 同步数据
    在以数据库2为主服务器的基础上,备份数据,将数据库2的数据全部导出到数据库1,并进行恢复。
[root@db2 ~]# mysqldump -uroot -p123456 --master-data mydb1 > /root/mydb1.sql

[root@db2 ~]# scp /root/mydb1.sql  root@192.168.4.51:/root/

[root@db1 ~]# systemctl start mysqld

[root@db1 ~]# mysql -uroot -p123456 mydb1 < /root/mydb1.sql
  1. 在数据库1上指定数据库2为主服务器。
查看数据库2的binlog日志
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 |      934 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> change master to master_host="192.168.4.52" , master_user="repluser",master_password="123456" ,master_log_file="master52.000001" , master_log_pos=934;
  1. 启动slave进程
mysql> start slave;

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.52
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master52.000001
          Read_Master_Log_Pos: 934
               Relay_Log_File: db1-relay-bin.000002
                Relay_Log_Pos: 319
        Relay_Master_Log_File: master52.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

7.3.2、配置管理主机

  1. 重新添加配置文件
[root@manager ~]# vim /etc/mha/app1.cnf
[server1]
hostname=192.168.4.51
port=3306
candidate_master=1

  1. 测试集群环境
[root@manager ~]# masterha_check_repl --conf=/etc/mha/app1.cnf 
MySQL Replication Health is OK.
  1. 重新启动
[root@manager ~]# masterha_stop --conf=/etc/mha/app1.cnf

[root@manager ~]# masterha_manager --remove_dead_master_conf --ignore_last_failover  --conf=/etc/mha/app1.cnf
Mon Mar 30 08:23:42 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Mar 30 08:23:42 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Mon Mar 30 08:23:42 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章