欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DBA08 - MHA集群概述、部署MHA集群 测试配置

程序员文章站 2024-03-21 09:03:22
...

一、MHA集群概述

1.1 MHA介绍

1.1.1 MHA 简介

• MHA ( Master High Availability )
– 是一套优秀的作为 MySQL 高可用性环境下故障切换和
主从提升的高可用软件。
– 目前在 MySQL 高可用方面是一个相对成熟的解决方案。
– 在 MySQL 故障切换过程中, MHA 能做到在 0~30 秒
之内自动完成数据库的故障切换操作
– 并且在进行故障切换的过程中, MHA 能在最大程度上
保证数据的一致性,以达到真正意义上的高可用。

1.1.2 MHA组成

  • MHA Manager (管理节点)

– 可以单独部署在一*立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。

  • MHA Node (数据节点)

– 运行在每台 MySQL 服务器上。

1.2 MHA工作过程

1.2.1 MHA 集群架构

DBA08 - MHA集群概述、部署MHA集群 测试配置

1.2.2 MHA 工作过程

• MHA Manager 会定时探测集群中的 master 节点,
当 master 出现故障时,它可以自动将最新数据的 sl
ave 提升为新的 master ,然后将所有其他的 slave
重新指向新的 master 。整个故障转移过程对应用程
序完全透明。
– ( 1 )从宕机崩溃的 master 保存二进制日志事件( binlog events)
– ( 2 )识别含有最新更新的 slave
– ( 3 )应用差异的中继日志( relay log )到其他的 slave
– ( 4 )应用从 master 保存的二进制日志事件( binlog events )
– ( 5 )提升一个 slave 为新的 master ;
– ( 6 )使其他的 slave 连接新的 master 进行复制;

二、部署mysql高可用集群

2.1 集群概述

部署MySQL集群 (MHA +  mysql一主多从)
集群:使用多台服务器提供相同的服务
集群类型:LB(负载均衡集群)     HA(高可用集群) HPC(高计算集群)

2.2 集群拓扑结构

2.2.1 拓扑图

  • 采用五个MHA数据节点,一个MHA管理节点

DBA08 - MHA集群概述、部署MHA集群 测试配置
 

2.2.2 IP规划

                      角色           IP 地址        主机名   
Master 数据库服务器 192.168.4.51 master51
备用 1 master 数据库服务器 192.168.4.52 master52
备用 2 master 数据库服务器 192.168.4.53 master53
第 1 台 slave 服务器 192.168.4.54 slave54
第 2 台 slave 服务器 192.168.4.55 slave55
Mha_manager 服务器 192.168.4.56 mgm56
VIP 地址 192.168.4.100  

51-55  是数据库服务器  (只保留初始的4个库)   56 管理主机(不需要运行数据库服务)
把软件包拷贝到所有的主机里 51-56  
]# scp -r mha-soft 192.168.4.5X:/root/

3.2 准备集群环境

3.2.1  配置主从同步

51 主库             开半同步复制
52 从库(备用主库)  开半同步复制
53 从库(备用主库)  开半同步复制
54 从库 不做备用主库所以不用开半同步复制 
55 从库 不做备用主库所以不用开半同步复制
1.master51配置
host51 ] # vim  /etc/my.cnf

  1. [mysqld]
  2. plugin-load = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so”
  3. rpl-semi-sync-master-enabled = 1
  4. rpl-semi-sync-slave-enabled = 1
  5. server_id=51
  6. log-bin=master51
  7. binlog-format=“mixed”

[aaa@qq.com ~]# systemctl  restart mysqld

[aaa@qq.com ~]# ls /var/lib/mysql/master51.*   //host51的mysql目录下有做为主库的两个文件
/var/lib/mysql/master51.000001  /var/lib/mysql/master51.index

[aaa@qq.com ~]# mysql -uroot -p123456
mysql> grant  replication slave  on  *.*  to aaa@qq.com”%”  identified by “123456”;

在52 , 53 机器上也要授权repluser用户,使其他从库能来同步数据
Query OK, 0 rows affected, 1 warning (10.04 sec)

mysql> set global relay_log_purge=off;    //不让中继日志删除,默认情况下SQL线程执行完一条中继日志就会删除中继日志信息
Query OK, 0 rows affected (0.15 sec)

    或:在配置文件中的永久配置:  relay_log_purge=0

mysql> show master status;
+—————–+———-+————–+——————+——————-+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+—————–+———-+————–+——————+——————-+
| master51.000001 |      441 |              |                  |                   |
+—————–+———-+————–+——————+——————-+
mysql> quit;

2.备用主库master52的配置
]# vim /etc/my.cnf

  1. [mysqld]
  2. plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
  3. rpl-semi-sync-master-enabled = 1
  4. rpl-semi-sync-slave-enabled = 1
  5. server_id=52
  6. log-bin=master52
  7. binlog-format="mixed"

]# systemctl restart mysqld
[aaa@qq.com ~]# ls /var/lib/mysql/master52.*
/var/lib/mysql/master52.000001  /var/lib/mysql/master52.index

[aaa@qq.com ~]# mysql  -uroot  -p123456

mysql> set global relay_log_purge=off; 
Query OK, 0 rows affected (0.13 sec)

mysql> change master to 
    -> master_host=”192.168.4.51”,
    -> master_user=”repluser”,
    -> master_password=”123456”,
    -> 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.01 sec)

[aaa@qq.com ~]# mysql -uroot -p123456 -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


3.备用主库master53的配置
]#  vim /etc/my.cnf

  1. [mysqld]
  2. plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
  3. rpl-semi-sync-master-enabled = 1
  4. rpl-semi-sync-slave-enabled = 1
  5. server_id=53
  6. log-bin=master53
  7. binlog-format="mixed"

[aaa@qq.com ~]# systemctl  restart mysqld
[aaa@qq.com ~]# ls /var/lib/mysql/master53.*
/var/lib/mysql/master53.000001  /var/lib/mysql/master53.index
[aaa@qq.com ~]# 

[aaa@qq.com ~]# mysql -uroot -p123456
mysql> set global relay_log_purge=off;
Query OK, 0 rows affected (0.14 sec)

mysql> change master to master_host=”192.168.4.51”,master_user=”repluser”,master_password=”123456”,
    -> master_log_file=”master51.000001”,master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.05 sec)

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

[aaa@qq.com ~]# mysql -uroot -p123456 -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


4.配置从服务器54

[aaa@qq.com ~]# vim /etc/my.cnf

  1. [mysqld]
  2. server_id=54

[aaa@qq.com ~]# systemctl  restart mysqld
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> change master to master_host=”192.168.4.51”,master_user=”repluser”,master_password=”123456”,
    -> master_log_file=”master51.000001”,master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.09 sec)

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

mysql> quit;
Bye
[aaa@qq.com ~]# mysql -uroot -p123456 -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

5.配置从服务器55
[aaa@qq.com ~]# vim /etc/my.cnf
 

  1. [mysqld]
  2. server_id=55

[aaa@qq.com ~]# systemctl  restart mysqld
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> change master to master_host=”192.168.4.51”,master_user=”repluser”,master_password=”123456”,
    -> master_log_file=”master51.000001”,master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.09 sec)

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

mysql> quit;
Bye
[aaa@qq.com ~]# mysql -uroot -p123456 -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

3.2.2 在客户端测试主从同步配置

1.在主库51上添加访问数据的授权用户
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> grant all on  gamedb.* to aaa@qq.com”%” identified by “123456”;

2.在客户端主机连接主库51 建库表记录
mysql> create database gamedb;
Query OK, 1 row affected (0.01 sec)

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

mysql> insert into gamedb.t1 values(999);
Query OK, 1 row affected (0.15 sec)

mysql> insert into gamedb.t1 values(999);
Query OK, 1 row affected (0.05 sec)

mysql> select  * from gamedb.t1;
+——+
| id   |
+——+
|  999 |
|  999 |
+——+
2 rows in set (0.00 sec)

mysql> 

3.在客户端使用授权用户连接从库52-55,也能看到同样的库表及记录

[aaa@qq.com ~]# mysql -h从库IP地址 -uadmin -p123456
mysql> select  * from gamedb.t1;
+——+
| id   |
+——+
|  999 |
|  999 |
+——+
 

3.2.3 配置ssh秘钥对认证登陆

1.所有数据库服务器(51-55)之间可以root无密码ssh登陆
[aaa@qq.com ~]# ssh-******
  336  ssh-copy-id  aaa@qq.com
  337  ssh-copy-id  aaa@qq.com
  338  ssh-copy-id  aaa@qq.com
  339  ssh-copy-id  aaa@qq.com

[aaa@qq.com ~]# ssh-******
  159  ssh-copy-id  aaa@qq.com
  160  ssh-copy-id  aaa@qq.com
  161  ssh-copy-id  aaa@qq.com
  162  ssh-copy-id  aaa@qq.com

[aaa@qq.com ~]# ssh-******
   61  ssh-copy-id aaa@qq.com
   62  ssh-copy-id aaa@qq.com
   63  ssh-copy-id aaa@qq.com
   64  ssh-copy-id aaa@qq.com
[aaa@qq.com ~]# ssh-******
   61  ssh-copy-id  aaa@qq.com
   62  ssh-copy-id  aaa@qq.com
   63  ssh-copy-id  aaa@qq.com
   64  ssh-copy-id  aaa@qq.com
[aaa@qq.com ~]# ssh-******
  178  ssh-copy-id  aaa@qq.com
  179  ssh-copy-id  aaa@qq.com
  180  ssh-copy-id  aaa@qq.com
  181  ssh-copy-id  aaa@qq.com

2.管理主机56 可以无密码ssh登陆所有数据库服务器
[aaa@qq.com ~]# ssh-keygenssh-****** 
   88  ssh-copy-id  aaa@qq.com
   89  ssh-copy-id  aaa@qq.com
   90  ssh-copy-id  aaa@qq.com
   91  ssh-copy-id  aaa@qq.com
   92  ssh-copy-id  aaa@qq.com

3.2.4 所有主机上都要安装软件依赖的perl软件包

host51~56 ]#cd  mha-soft

host51~56  ]# ls  perl-*.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm          
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm       
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm  
perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm  
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm       
perl-MIME-Lite-3.030-1.el7.noarch.rpm

51~56 share]# yum -y  install  perl-*.rpm

3.3 配置高可用集群

3.3.1 配置数据节点服务器

1.安装mha_node软件
51~55]#yum -y  install perl-DBD-mysql
]#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm     //安装数据节点的软件

3.3.2 配置管理主机

1.安装软件包:mha_node   和  mha_manager56

]# yum -y  install perl-DBD-mysql
]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm    //安装数据节点的软件
]#yum -y install perl-ExtUtils-*    
]#yum -y install  perl-CPAN-*
]#tar -zxvf mha4mysql-manager-0.56.tar.gz
]#cd mha4mysql-manager-0.56
]#perl Makefile.PL 
]#make
]#make install
2.创建管理命令

把命令拷贝的$PATH路径下

[aaa@qq.com ~ ] # cd  /root/mha-soft-student/mha4mysql-manager-0.56/
[aaa@qq.com mha4mysql-manager-0.56]# cp -r bin /root/
[aaa@qq.com mha4mysql-manager-0.56]# ls /root/bin/

3.编写主配置文件 app1.cnf

mkdir  /etc/mha_manager

[aaa@qq.com_56 mha_manager]# cp /root/mha-soft-student/mha4mysql-manager-0.56/samples/conf/app1.cnf ./

vim /etc/mha_manager/app1.cnf

4.根据配置文件的设置
4.1 在数据库服务器上创建监控用户[监控数据库是否存活]

51~55 mysql>grant all  on *.* to   aaa@qq.com’%’  identified  by   “123qqq…A”; 
select  user,host from  mysql.user  where  user=”root”;

56]# mysql  -h192.168.4.51  -uroot  -p123qqq…A
4.2 在本机创建故障切换脚本, 并修改脚本 指定vip 部署的网络接口名

]#cd  mha-soft-student
]# cp master_ip_failover /etc/mha_manager/master_ip_failover

编辑脚本(部分)
]# chmod +x /etc/mha_manager/master_ip_failover
vim /etc/mha_manager/master_ip_failover
my vip = ‘192.168.4.100/24’;  # Virtual IP  mykey = “1”;
my sshstartvip="/sbin/ifconfigeth0:key vip;myssh_stop_vip = "/sbin/ifconfig eth0:$key down”;

5.测试主配置文件 app1.cnf
测试ssh服务  masterha_check_ssh    –conf=/etc/mha_manager/app1.cnf
测试主从同步 masterha_check_repl   –conf=/etc/mha_manager/app1.cnf

6.手动把规定的vip地址部署在当主库 51 上

方式一:

]# cp ifcfg-eth0 ifcfg-eth0:1      网卡文件模板:ifcfg-eth0

DEVICE=eth0:1

IPADDR=192.168.4.100

]# systemctl restart network

方式二:

] ifconfig eth0:1 192.168.4.100/24      
]#/sbin/ifconfig  eth0:1
]#/sbin/ifconfig  eth0

7.启动管理服务 并查看状态

tty1 56]# masterha_manager –conf=/etc/mha_manager/app1.cnf    –remove_dead_master_conf   –ignore_last_failover

tty1 56]# masterha_check_status  –conf=–conf=/etc/mha_manager/app1.cnf

三、测试集群

3.1 访问集群存储数据

50]#  mysql  -h vip地址    -uuser8   -p123qqq…A
MySQL>  select  @@hostname;

3.2  测试高可用

把当前主库51 的数据库服务停止,但客户端访问数据库连接不会断,查看主机名显示的是52主机的主机名;在52本机查看VIP地址也能够查看到。主库51的配置在管理主机56的app1.cnf文件里查看不到了。

所有从库服务器都会把 主库的Ip地址自动指向192.168.4.52

四、把主机添加到集群里

51]# 启动数据库服务,并指定当前主库信息

56]# 在主配置文件app1.cnf里添加 主51的信息 ,并启动管理服务
把坏掉的主机51 添加到集群里。

51:把自己配置为当前主库的从库
]# systemctl  start  mysqld
mysql>change master to master_host=”192.168.4.52”, master_user=”repluser”, master_password=”123qqq…A”, master_log_file=”master52.000002”, master_log_pos=955;
mysql> start slave;

56: 把主机51的信息添加到主配置文件app1.cnf ,并启动管理服务

]# vim /etc/mha_manager/app1.cnf
[server1]
candidate_master=1
hostname=192.168.4.51

tty1 ]#masterha_manager –conf=/etc/mha_manager/app1.cnf    
–remove_dead_master_conf   –ignore_last_failover

tty2  56]# masterha_check_status –conf=/etc/mha_manager/app1.cnf