一 MHA简介
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。另外对于想快速搭建的可以参考:MHA快速搭建
我们自己使用其实也可以使用1主1从,但是master主机宕机后无法切换,以及无法补全binlog。master的mysqld进程crash后,还是可以切换成功,以及补全binlog的。
主题: 配置MHA集群
只对Mysql数据库服务有用,做高可用集群
软件部署的要求来决定的,不能少于3台 至少有2个机器做备用的主master服务器
51 为master 52和53 做备用的master
54和55做slave
56做MHA管理服务器
50充当客户端
&&配置主库
&&配置从库
&&配置备用主库 52和53
&&配置纯从库 54和55
&&配置管理服务器56
二 配置51
1 将主从文件删除,成为一台单独的数据库服务器
[root@mysql51 ~]# cd /var/lib/mysql
[root@mysql51 mysql]# rm -rf master51.*
[root@mysql51 mysql]# rm -rf master51-relay-bin.*
[root@mysql51 mysql]# rm -rf relay-log.info
51上关闭 自动删除中继日志文件。
mysql> set global relay_log_purge=off; //如果是写在配置文件里的话:relay_log_purge=0
2 修改配置文件,重启mysqld服务
[root@mysql51 ~]# vim /etc/my.cnf
[mysqld]
#binlog_do_db=db1
#log_slave_updates
log_bin=master51
server_id=51
binlog_format=mixed
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
#max_binlog_size=200m
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
3 授权同步用户
mysql> show grants for relpuser@"%";
+--------------------------------------------------+
| Grants for relpuser@% |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'relpuser'@'%' |
+--------------------------------------------------+
4 查看主服务器状态
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 | 1308 | | | |
+-----------------+----------+--------------+------------------+-------------------+
三 配置52为51的从。配置主库
1 删除各种主库记录文件和binlog日志文件
[root@mysql52 ~]# cd /var/lib/mysql
[root@mysql52 mysql]# rm -rf master52.*
[root@mysql52 mysql]# rm -rf master52-relay-bin.*
[root@mysql52 mysql]# rm -rf relay-log.info
2 修改配置文件,重启mysqld服务
[root@mysql52 ~]# vim /etc/my.cnf
[mysqld]
#binlog_do_db=db1
#log_slave_updates
log_bin=master52
server_id=52
binlog_format=mixed
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
#max_binlog_size=200m
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
3 授权同步用户
mysql> show grants for relpuser@"%";
+--------------------------------------------------+
| Grants for relpuser@% |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'relpuser'@'%' |
+--------------------------------------------------+
4 52作为从库 指定主库51信息
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master51.000001",master_log_pos=154;
5 开启从库
mysql> start slave;
6 查看从库状态
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: master51.000001
Read_Master_Log_Pos: 154
Relay_Log_File: mysql52-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7 查看主库状态
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 | 154 | | | |
+-----------------+----------+--------------+------------------+-------------------+
四 配置53为51的从。配置主库
1 将主从文件删除,成为一台单独的数据库服务器
2 修改配置文件,重启mysqld服务
[mysqld]
#log_slave_updates
log_bin=master53
#replicate-do-db=db1
server_id=53
binlog_format="mixed"
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
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
3 授权同步用户
mysql> show grants for relpuser@"%";
+--------------------------------------------------+
| Grants for relpuser@% |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'relpuser'@'%' |
+--------------------------------------------------+
4 53作为从库 指定主库51信息
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master51.000001",master_log_pos=154;
5 开启从库
mysql> start slave;
6 查看从库状态
mysql> show slave status\G;
7 查看主库状态
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 | 154 | | | |
+-----------------+----------+--------------+------------------+-------------------+
五:配置54,55,56 为51的从库
1 将主从文件删除,成为一台单独的数据库服务器
2 修改配置文件,重启mysqld服务
[mysqld]
#log_bin=master54
server_id=54
#binlog_format=mixed
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
plugin-load="rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-slave-enabled=1
relay_log_purge=0
#skip-grant-table
3 54作为从库 指定主库51信息
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master51.000001",master_log_pos=154;
4 开启从库
mysql> start slave;
5 查看从库状态
mysql> show slave status\G;
6 相同操作重复一遍
六:完成51 52 53 54 55 相互密码连接
完成56 对51 52 53 54 55 无密码连接
七:
在所有主机上51 52 53 54 55 56安装
1 安装yum仓库中所有的perl_开头的软件包
yum -y install perl-*
2 安装51 52 53 54 55 56 yum仓库中没有的perl软件包
yum -y install perl-* //安装8个软件包
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
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-MIME-Types-1.38-2.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
3 在51 52 53 54 55 56上安装
yum -y install perl-DBD-mysql perl-DBI
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
4 在56上安装管理包
tar -zxf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.pl
make
make install
MHA简介:(Master High Availability)
–由日本DeNA 公司youshimaton开发
–是一套优秀的实现MySQL高可用的解决方案
–数据库的自动故障切换能做到0~30秒之间
– MHA能确保在故障切换过程中保证数据的一致性,以达到真正意义上的高可用
MHA 组成
MHA Manager(管理节点)
–可以单独部署在一台独立的机器上,管理其他节点
–也可以部署在一台slave节点上
MHA Node(数据节点)
–运行在每台MySQL服务器上
MHA工作过程
由manager定时探测进群中的master节点
当master故障时,manager自动将拥有最新数据的slave提升为新的master
关键点:
1)从宕机崩溃的master保存二进制日志事件
2)识别含有最新更新的slave
3)应用差异的中继日志(relay log)到其他的slave
4)应用从master保存的二进制日志事件
5)提升一个slave为新的master
6)使其他的slave连接新的master进行复制
八 修改56主机MHA配置文件
[server default]
manager_workdir=/etc/mha //指定管理程序的工作目录
manager_log=/etc/mha/manager.log //指定管理程序的工作目录
master_ip_failover_script=/etc/mha/master_ip_failove
//指定故障切换程序的路径和名称 ××当主库51宕机后,56主机调用此脚本,对VIP浮动地址进行切换:
ssh_user=root
ssh_port=22 //远程的用户名的端口号
repl_user=repluser
repl_password=123456 //指定从库的用户名和密码
user=root
password=123456 //连接三个主库的用户名和密码
[server1]
hostname=192.168.4.51
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
[server4]
hostname=192.168.4.54
port=3306
no_master=1
[server5]
hostname=192.168.4.55
port=3306
no_master=1
为此配置文件添加执行权限
九 在竞选主数据库服务器上添加授权用户
grant all on *.* to root@"%" identified by "123456";
十 56主机安装mariadb用于使用mysql命令
测试利用root用户和密码123456 登录51 52 53 主机的mysql服务
十一 手动将VIP绑定在当前主库192.168.4.51的eth0的接口上(一定要时临时绑定,不然没法切换)
[root@mysql51 opt]# ifconfig eth0:1 192.168.4.100
[root@mysql51 opt]# ifconfig eth0:1
eth0: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 52:54:00:29:2c:1d txqueuelen 1000 (Ethernet)
十二 测试MHA集群
1)检查配置环境,在主机52,53检查是否有同步数据的用户repluser
52 主机
mysql> show grants for repluser@"%";
+--------------------------------------------------+
| Grants for repluser@% |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' |
+--------------------------------------------------+
1 row in set (0.00 sec)
53主机
1)查看授权登录
mysql> show grants for root@"%";
+-------------------------------------------+
| Grants for root@% |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' |
+-------------------------------------------+
1 row in set (0.01 sec)
2)验证ssh 免密登陆数据节点主机
[root@mysql56 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
2.168.4.55:22) to root@192.168.4.54(192.168.4.54:22)..
Mon Nov 26 16:30:58 2018 - [debug] ok.
Mon Nov 26 16:30:59 2018 - [info] All SSH connection tests passed successfully.
3)验证数据节点的主从同步配置(先把自动failover时候的切换脚本注释掉)
[root@mysql56 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
Mon Nov 26 16:43:56 2018 - [info]
192.168.4.51(192.168.4.51:3306) (current master)
+--192.168.4.52(192.168.4.52:3306)
+--192.168.4.53(192.168.4.53:3306)
+--192.168.4.54(192.168.4.54:3306)
+--192.168.4.55(192.168.4.55:3306)
Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.52..
Mon Nov 26 16:43:56 2018 - [info] ok.
Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.53..
Mon Nov 26 16:43:56 2018 - [info] ok.
Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.54..
Mon Nov 26 16:43:56 2018 - [info] ok.
Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.55..
Mon Nov 26 16:43:56 2018 - [info] ok.
Mon Nov 26 16:43:56 2018 - [info] Checking master_ip_failover_script status:
Mon Nov 26 16:43:56 2018 - [info] /etc/mha/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.4.51 --orig_master_ip=192.168.4.51 --orig_master_port=3306
Mon Nov 26 16:43:56 2018 - [info] OK.
Mon Nov 26 16:43:56 2018 - [warning] shutdown_script is not defined.
Mon Nov 26 16:43:56 2018 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
测试通过
十三 启动服务
[root@mysql56 ~]# masterha_manager --conf=/etc/mha/app1.cnf \
--remove_dead_master_conf // 当主库宕机后,移除管理主配置文件上关于主库的配置
--ignore_last_faileover 健康记录文件 :xxxx。health 忽略(在8个小时内连续出现故障,不进行切换)----> 强制要求切换
50客户端验证
[root@mysql50 ~]# mysql -h192.168.4.100 -uyaya200 -p123456
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| mysql51 |
+------------+
2 当51宕掉后。主程序manager服务会自杀,自杀后,会激发切换脚本。脚本会将vip地址进行切换
自动将vip配给192168.4.52
此时,51的信息将会在app1.cnf文件中的信息将被删除
然后主配置文件目录会多chela几个文件
[root@mysql56 ~]# ls /etc/mha/
app1.cnf
app1.failover.complete
manager.log
master_ip_failover
saved_master_binlog_from_192.168.4.51_3306_20181126175251.binlog
如果在启动服务时,不加入这个选项:–ignore_last_faileover 那么在主配置文件中将会出现这个文件xxx.health
51宕机修好后,加入主库的步骤:
1 先启动mysql服务
2 将51设置为52的从库
3 52中多余的数据需要手动添加到51中
4 手动将51的信息加到这个主配置文件app1.cnf中
6 将主配置文件/etc/mha/目录下的多余文件全部删除,保留两个原始文件(app1.cnf,master_ip_failover)