MHA集群介绍
1.简介【 MHA ( Master High Availability )】
– 是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。
– 目前在 MySQL 高可用方面是一个相对成熟的解决方案。
– 在 MySQL 故障切换过程中, MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作
– 并且在进行故障切换的过程中, MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
2.MHA组成
MHA Manager (管理节点)
– 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。
MHA Node (数据节点)
– 运行在每台 MySQL 服务器上
3.MHA 工作过程
工作过程:MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master ,然后将所有其他的 slave重新指向新的 master 。整个故障转移过程对应用程序完全透明。
从宕机崩溃的 master 保存二进制日志事件( binlog events)
识别含有最新更新的 slave
应用差异的中继日志( relay log )到其他的 slave
应用从 master 保存的二进制日志事件( binlog events )
提升一个 slave 为新的 master
使其他的 slave 连接新的 master 进行复制;
4.拓扑结构
5.IP规划
###########################################
###########################################
一、准备集群环境
(1)准备6台虚拟机,IP规划如下: #192.168.4.60(主节点) 主机名:master60
#192.168.4.61(主备) 主机名:master61
#192.168.4.62(主备) 主机名:master62
#192.168.4.63(从) 主机名:slave63
#192.168.4.64(从) 主机名:slave64
#192.168.4.65(manager管理服务器) 主机名:mha65
#VIP地址:192.168.4.100
(2)在所有主机上安装Perl依赖包(60-65)
#yum -y install mha-soft-student/perl-*.rpm
(3)在所有数据库服务器上安装mha-node包(60-64)
#yum -y install perl-DBD-mysql perl-DBI
#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
(4)在管理主机上安装mha_node和mha-manager包(仅仅65操作)
[root@mha65 mha-soft-student]#yum -y install perl-DBD-mysql perl-DBI
[root@mha65 mha-soft-student]#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
[root@mha65 mha-soft-student]# yum -y install perl-ExtUtils-* perl-CPAN-*
[root@mha65 mha-soft-student]# tar -xf mha4mysql-manager-0.56.tar.gz
[root@mha65 mha-soft-student]# cd mha4mysql-manager-0.56/
[root@mgm56 mha4mysql-manager-0.56]#perl Makefile.PL
Checking if your kit is complete... Looks good(看到次字样的成功)
[root@mgm56 mha4mysql-manager-0.56]#make && make install
二、配置ssh密钥对认证登录
(1)所有节点之间可以互相以ssh密钥对认证登录(60-64之间)
#ssh-keygen
#ssh-copy-id
[root@master60 ~]#ssh-keygen
[root@master60 ~]# for i in 61 62 63 64
> do
> ssh-copy-id 192.168.4.$i
> done
#############################
[root@master61 ~]#ssh-keygen
[root@master61 ~]# for i in 60 62 63 64
> do
> ssh-copy-id 192.168.4.$i
> done
###########################
[root@master62 ~]#ssh-keygen
[root@master62 ~]# for i in 60 61 63 64
> do
>ssh-copy-id 192.168.4.$i
> done
> ############################
[root@slave63 ~]#ssh-keygen
[root@slave63 ~]# for i in 60 61 62 64
> do
> ssh-copy-id 192.168.4.$i
> done
#############################
[root@slave64 ~]#ssh-keygen
[root@slave64 ~]# for i in 60 61 62 63
> do
> ssh-copy-id 192.168.4.$i
> done
###################################
[root@mha65 ~]# ssh-keygen
> [root@mha65 ~]# for i in 60 61 62 63 64
> do
> ssh-copy-id 192.168.4.$i
>done
三、 部署集群环境
#配置主节点master60
#配置主备节点master61/master62 *
#配置从节点slave63/slave64 *
#配置管理节点mha65
#################################
#60主库 开半同步复制
#61从库(备用主库) 开半同步复制
#62从库(备用主库) 开半同步复制
#63从库 不做备用主库所以不用开半同步复制
#64从库 不做备用主库所以不用开半同步复制
(1)配置mha集群环境,安装数据库(60-64)
[root@room9pc01 software]# for i in 60 61 62 63 64
>do
>scp -r mysql/ 192.168.4.$i:/root/
>done
############在这里以60为例进行操作,其他(61/62/63/64)主机与60的操作一样
[root@master60 mysql]#tar -xf mysql-5.7.17.tar #解包
[root@master60 mysql]#yum -y install perl-JSON #安装Perl语言解释器
[root@master60 mysql]#yum -y install mysql-community-*.rpm #安装MySQL社区开源版
[root@master60 mysql]# rpm -qa | grep -i mysql
mysql-community-server-5.7.17-1.el7.x86_64
mysql-community-test-5.7.17-1.el7.x86_64
perl-DBD-MySQL-4.023-6.el7.x86_64
mysql-community-common-5.7.17-1.el7.x86_64
mysql-community-client-5.7.17-1.el7.x86_64
mysql-community-devel-5.7.17-1.el7.x86_64
mysql-community-embedded-devel-5.7.17-1.el7.x86_64
mysql-community-libs-compat-5.7.17-1.el7.x86_64
mysql-community-minimal-debuginfo-5.7.17-1.el7.x86_64
mha4mysql-node-0.56-0.el6.noarch
mysql-community-libs-5.7.17-1.el7.x86_64
mysql-community-embedded-5.7.17-1.el7.x86_64
mysql-community-embedded-compat-5.7.17-1.el7.x86_64
###########启动服务并检查端口
[root@master60 mysql]# systemctl restart mysqld
[root@master60 mysql]# netstat -ntulp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 1060/mysqld
###########登录服务器修改密码
[root@master60 ~]# cat /var/log/mysqld.log | grep -i password
2019-05-31T00:34:24.806847Z 1 [Note] A temporary password is generated for root@localhost: ZW6:#s?lMFyj
[root@master60 ~]# mysql -u root -p "ZW6:#s?lMFyj"
mysql> alter user root@"localhost" identified by "123qqq...A";(命令行临时修改密码策略)
mysql> set global validate_password_length=6;#密码长度
mysql> set global validate_password_policy=0;#密码级别低
mysql> update mysql.user set authentication_string=password("123456") where user="root" and host="localhost"; #修改root用户登录密码为123456
mysql> flush privileges;#刷新
(配置文件永久修改)
vim /etc/my.cnf
[mysqld]
validate_password_length=6
validate_password_policy=0
###########################################################
(2)master60数据库服务器配置文件
#############开启binlog
[root@master60] #vim /etc/my.cnf
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"#加载同步模式插件
rpl-semi-sync-master-enabled = 1 #master开启半同步插件
rpl-semi-sync-slave-enabled = 1 #slave开启半同步插件
server_id=51 #指定server_id
log-bin=master51 #开启binlog日志
binlog-format="mixed" #binlog日志格式
[root@master60 ~]#systemctl restart mysqld后登陆服务器
mysql> set global relay_log_purge=off;#不自动删除本机的中继日志文件
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";#添加主从同步复制用户
####################master61(主备)配置
[root@master61 ~]# vim /etc/my.cnf
[mysqld]
validate_password_length=6
validate_password_policy=0
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
server_id=61
log-bin=maste61
binlog-format="mixed"
[root@master61]#systemctl restart mysqld后登陆服务器
mysql> set global relay_log_purge=off;
mysql> change master to master_host="192.168.4.60", -
> master_user="repluser",
> master_password="123456",
> master_log_file="maste60.000001",
> master_log_pos=154;
> mysql> start slave;
> mysql> show slave status\G;
####################master62(主备配置)
[root@master61 ~]# vim /etc/my.cnf
[mysqld]
validate_password_length=6
validate_password_policy=0
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
server_id=62
log-bin=maste62
binlog-format="mixed"
[root@master62]#systemctl restart mysqld后登陆服务器
mysql> set global relay_log_purge=off;
mysql> change master to master_host="192.168.4.60",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="maste60.000001",
-> master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
###################slave63从配置
[root@slave63]#vim /etc/my.cnf
server_id=63
mysql> change master to
-> master_host="192.168.4.60",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="maste60.000001",
-> master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
###################slave64从配置
[root@slave63]#vim /etc/my.cnf
server_id=63
mysql> change master to
-> master_host="192.168.4.60",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="maste60.000001",
-> master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
(3)配置管理主机mha65
# cp bin/* /usr/local/bin/
#mkdir /etc/mha_manager //创建工作目录
# cp samples/conf/app1.cnf /etc/mha_manager //建立样板文件
vim /etc/mha_manager/app1.cnf
manager_workdir=/etc/mha_manager manager_log=/etc/mha_manager/manager.log #管理服务启动之后的日志文件 master_ip_failover_script=/usr/local/bin/master_ip_failover #管理服务主机发现故障时调用的脚本
ssh_user=root #所有主机之间互相ssh时登录的用户名
ssh_port=22 # ssh时的端口号
repl_user=repluser #主从同步的授权用户
repl_password=123456
user=root #65去监视60/61/62/63/64主机时,连接数据库的用户
password=123456
[server1]
hostname=192.168.4.60
port=3306
[server2]
hostname=192.168.4.61
port=3306
candidate_master=1 #设置为候选master
[server3]
hostname=192.168.4.62
port=3306
candidate_master=1 #设置为候选master
[server4]
hostname=192.168.4.63
no_master=1 #不竞选master
[server5]
hostname=192.168.4.64
no_master=1 #不竞选master
cp samples/scripts/master_ip_failover usr/local/bin/ //创建故障切换的脚本
##############################
四 测试MHA集群
#查看MHA集群状态
#试节点之间的SSH登录
#测试集群VIP的故障切换功能
######验证配置
(1)在主机61/62上检查是否有同步数据的用户repluser
61:grant replication on *.* to repluser@"%" identified by "123456";
62:grant replication on *.* to repluser@"%" identified by "123456";
(2)在60主机上做root的授权,其他的会同步(如果不做,在验证数据节点的主从同步配置时会处错误)
(3)验证数据节点的主从同步配置
[root@mha65 bin]# masterha_check_ssh -conf=/etc/mha_manager/app1.cnf
[info] All SSH connection tests passed successfully.(出现这个表示成功)
(4)验证数据节点的主从同步配置 (先把自动failover时候的切换脚本注释掉)
[root@mha65 bin]#masterha_check_repl --conf=/etc/mha_manager/app1.cnf
MySQL Replication Health is OK.(出现这个表示成功)
(5)启动管理服务MHA_Manager
masterha_manager --conf=/etc/mha_manager/app1.cnf --remove_dead_master_conf --ignore_last_failover
Fri May 31 15:06:18 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri May 31 15:06:18 2019 - [info] Reading application default configuration from /etc/mha_manager/app1.cnf..
Fri May 31 15:06:18 2019 - [info] Reading server configuration from /etc/mha_manager/app1.cnf..
(6)另开一个终端,查看服务的运行状态
[root@mha65 bin]# masterha_check_status --conf=/etc/mha_manager/app1.cnf
app1 (pid:4061) is running(0:PING_OK), master:192.168.4.60
(7)停止服务
[root@mha65 bin]# masterha_stop --conf=/etc/mha_manager/app1.cnf
Stopped app1 successfully.
########测试故障转移
(1)在主库60上面配置VIP地址(首先要在主机(主)上添加一个VIP,然后当主的服务出现异常的时候,自动利用脚本把有故障的主的VIPdown掉,然后把VIP的权限给另外一个)
[root@master60 ~]# ifconfig eth0:1 192.168.4.100/24
(2)在配置文件里面把自动failover时候的切换脚本去掉注释
(3)修改 master_ip_failover 脚本,设置如下内容:
34 my $vip = '192.168.4.100/24';
35 my $key = "1";
36 my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
37 my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
(4)启动服务
masterha_manager --conf=/etc/mha_manager/app1.cnf
######模拟故障测试
(1)停掉60的数据库服务,
[root@mha65 bin]# masterha_manager --conf=/etc/mha_manager/app1.cnf --remove_dead_master_conf --ignore_last_failover
Fri May 31 15:21:45 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri May 31 15:21:45 2019 - [info] Reading application default configuration from /etc/mha_manager/app1.cnf..
Fri May 31 15:21:45 2019 - [info] Reading server configuration from /etc/mha_manager/app1.cnf.. Creating /var/tmp if not exists.. ok. Checking output directory is accessible or not.. ok. Binlog found at /var/lib/mysql, up to maste60.000001
Fri May 31 15:22:13 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri May 31 15:22:13 2019 - [info] Reading application default configuration from /etc/mha_manager/app1.cnf..
Fri May 31 15:22:13 2019 - [info] Reading server configuration from /etc/mha_manager/app1.cnf..
(2)检测发现VIP地址已经转移到了其他两台主备中的一台上,检查主库信息与从库信息,运行成功。
```
有些地方还是不成熟,正在努力改进中ing.....