一,MHA介绍:
1,简介:MHA是一套解决MySQL高可用的架构,当数据库故障时,它能够在0~30s之内完成故障自动切换,保证数据库服务正常运行;在故障自动切换的过程中它能够最大限度的保障数据的一致性,这样真正意义上达到高可用.
2,组成:
MHA Manager(管理节点):管理所有数据库服务器,可以单独部署在一台服务器上,也可部署在某一台数据库服务器上
MHA Node(数据节点):存储数据的MySQL服务器,运行在每台MySQL服务器上
二,MHA搭建:
1,环境准备:
(1),MHA软件包,MySQL软件包准备
(2),各数据库服务器上配置ssh密钥对无密码登录认证
(3),在数据库服务器上配置一主多从同步结构
2,步骤:
(1),配置ssh免密登录,需在每台服务器上依次配置一遍
]# ssh-keygen //创建秘钥对
]# ssh-copy-id [email protected].X.X //传递公钥给xx主机
(2),配置MySQL一主多从结构
1),配置主库服务器
~]# vim /etc/my.cnf
[mysqld]
log-bin=master51 //日志名
server_id=51 //指定server_id
:wq
]# systemctl restart mysqld
]# mysql -uroot -p123qqq…A //登录数据库
mysql> grant replication slave on *.* to repluser@"%" identified by “123qqq…A"; //添加从服务器同步数据连接用户
mysql> show master status; //查看日志信息
2)配置从服务器
]# vim /etc/my.cnf
[mysqld]
server_id=52 //指定server_id
:wq //保存并退出
[root@host52 ~]# systemctl restart mysqld //重启数据库服务
[root@host52 ~]# mysql -uroot –p123qqq…A //数据库管理员登录
mysql> change master to //指定主服务器信息
master_host="192.168.4.51", //IP地址
master_user="repluser", //授权用户
master_password="123qqq...A", //授权用户密码
master_log_file="master51.000001", //binlog日志
master_log_pos=441; //偏移量
mysql> start slave; //启动slave进程
mysql> exit ; //断开连接
[root@host52 ~]# mysql -uroot –p123qqq…A –e “show slave status\G” | grep 192.168.4.51
Master_Host: 192.168.4.51 //主服务器Ip地址
[root@host52 ~]# mysql -uroot –p123qqq…A –e “show slave status\G” | grep –i yes
Slave_IO_Running: Yes //I0线程正常
Slave_SQL_Running: Yes //SQL线程正常
(3),部署MHA集群
1),安装MHA软件
]# yum -y install perl-DBD-mysql perl-DBI perl-ExtUtils-* perl-CPAN*
]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
]# tar -zxvf mha4mysql-manager-0.56.tar.gz //解压mha-manager软件包
]# cd mha4mysql-manager-0.56/ //进入源码目录
]# perl Makefile.PL //配置
]# make //编译
]# make install //源码安装
2),编辑主配置文件
]# mkdir /etc/mha //创建工作目录
]# cp mha4mysql-manager-0.56/sample/conf/app1.cnf /etc/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_user=root //访问ssh服务用户
ssh_port=22 //ssh服务端口
repl_user=repluser //主服务器数据同步授权用户
repl_password=123qqq…A //密码
user=root //监控用户
password=123qqq…A //密码
[server1] //指定第1台数据库服务器
hostname=192.168.4.51 //服务器ip地址
port=3306 //服务端口
candidate_master=1 //竞选主服务器
[server2] //指定第2台数据库服务器
hostname=数据库服务器的IP
port=3306
candidate_master=1
#有几台数据库服务器就要制定几台,不能多指定,也不能少指定
:wq
3)创建故障切换脚本
]# cp mha-soft-student/master_ip_failover /etc/mha/
]# vim /etc/mha/master_ip_failover
my $vip = '192.168.4.100/24'; # Virtual IP //定义VIP地址
my $key = "1"; //定义变量$key
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; //部署vip地址命令
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; //释放vip地址命令
:wq
]# chmod +x /etc/mha/master_ip_failover //给脚本加执行权限
(4),在主数据库服务器上配置vip地址
]# ifconfig eth0:1 //部署之前查看
eth0:1: flags=4163 mtu 1500
ether 52:54:00:d8:10:d7 txqueuelen 1000 (Ethernet)
]# ifconfig eth0:1 192.168.4.100 //部署vip地址
]# ifconfig eth0:1 //部署后查看
(5),配置节点数据库(MHA Node)
1),首先部署环境时,就可以安装好perl-*依赖包,如已安装好了依赖包就可直接在所有数据库服务器上,安装mha-node软件包
cd /root/mha-soft-student/
]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
2),在所有数据服务器上添加监控用户,可以只在主数据库上执行授权命令,其它从数据库会自动同步授权
]# mysql –uroot –p密码
mysql> grant all on *.* to root@"%" identified by "123qqq...A";
mysql> exit;
3),在从数据库服务器上添加,数据同步连接用户
]# mysql –uroot –p密码
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
mysql> exit;ces
(7),修改数据库服务运行参数(启用半同步复制模式)
在这里不管是主数据库服务器,还是从数据库服务器都需将下面的模块写入配置文件
]# 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 //启用master模块
rpl_semi_sync_slave_enabled=1 //启用slave模块
relay_log_purge=0 //禁止自动删除中继日志文件
:wq
]# systemctl restart mysqld //重启服务
三,测试配置
1)在管理主机,测试ssh配置
]# masterha_check_ssh --conf=/etc/mha/app1.cnf //执行测试命令
Thu Jun 20 15:33:51 2019 - [info] All SSH connection tests passed successfully.//测试成功提示
2)在管理主机,测试主从同步
]# masterha_check_repl --conf=/etc/mha/app1.cnf //执行测试命令
MySQL Replication Health is OK.//测试成功提示信息
3)启动管理服务
]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover //执行启动命令
Thu Jun 20 17:05:58 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jun 20 17:05:58 2019 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Thu Jun 20 17:05:58 2019 - [info] Reading server configuration from /etc/mha/app1.cnf..
4)查看服务状态
]# masterha_check_status --conf=/etc/mha/app1.cnf//执行命令
app1 (pid:15806) is running(0:PING_OK), master:192.168.4.51 //服务运行,监视主服务器192.168.4.51
]# ls /etc/mha/ //查看工作目录文件列表
app1.cnf app1.master_status.health manager.log master_ip_failover
四,访问集群
1),在主数据库服务器上添加访问数据的连接用户,创建一个库,一个表授权给指定用户
]# mysql -uroot -p123qqq...A
mysql> create database db9;
Query OK, 1 row affected (0.05 sec)
mysql> create table db9.a (id int);
Query OK, 0 rows affected (0.63 sec)
mysql> grant select,insert on db9.* to yaya55@"%" identified by "123qqq...A";
Query OK, 0 rows affected, 1 warning (0.08 sec)
mysql>exit
1),用一台与vip地址相同网段的,安装MySQL软件的终端,对vip地址进行连接访问数据库
]# mysql -h192.168.4.100 -uyaya55 -p123qqq...A
mysql> select * from db9.a;
mysql> insert into db9.a values(100);
mysql> select * from db9.a;
五,测试高可用
1)停止主服务器的mysql服务
]# systemctl stop mysqld
2)查看管理服务 ,输出的监控信息
]#masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING). //监控到主服务器宕机 管理服务自动停止
3)客户端依然连接vip地址,可以访问到数据
]# ping -c 2 192.168.4.100 //能够ping通vip地址
]# mysql -h192.168.4.100 -uyaya55 -p123qqq...A //连接vip地址
mysql> insert into db9.a values(200); //插入记录
mysql> select * from db9.a;//查询记录
4)查看vip地址
可在没有坏的数据库服务器上查看当前哪台服务器被选为主数据库服务器
~]# ifconfig eth0:1
六,修复故障服务器
(1),可查看故障数据库服务器是否启动,先将服务启动
]# systemctl start mysqld
(2),将当前主数据库的库全备份,数据复制到坏的数据库服务器,进行数据恢复,与当前主数据库服务器进行主从同步配置
]# mysqldump -uroot -p123qqq...A --master-data db9 > db9.sql //在主数据库服务器做完全备份
mysqldump: [Warning] Using a password on the command line interface can be insecure.
]# scp db9.sql [email protected]:/root/ //拷贝备份文件给当前坏的主机
db9.sql 100% 1918 3.1MB/s 00:00
]# mysql -uroot -p123qqq...A db9 < /root/db9.sql //主机使用备份文件恢复数据
mysql: [Warning] Using a password on the command line interface can be insecure.
(3),重新配置主从结构.将现在坏的数据库服务器指定到主数据库服务器,也就是将坏的恢复之后变为现在主数据库的从
]#grep master52 /root/db9.sql //查看日志名及偏移量
CHANGE MASTER TO MASTER_LOG_FILE='master52.000001', MASTER_LOG_POS=895;
[root@host51 ~]# mysql -uroot -p123qqq...A
mysql>change master to
master_host="192.168.4.52",
master_user="repluser",
master_password="123qqq...A",
master_log_file="master52.000001", //填写查看出的日志名
master_log_pos=895; //查看出的偏移量
Query OK, 0 rows affected, 2 warnings (0.14 sec)
//以上配置好之后,启动slave进程
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
Mysql> exit ;
//启动之后,查看服务状态信息
]# mysql -uroot -p123qqq...A -e "show slave status\G" |grep 192.168.4.52
mysql: [Warning] Using a password on the command line interface can be insecure.
Master_Host: 192.168.4.52 //主服务器ip地址
[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 //IO线程状态正常
Slave_SQL_Running: Yes //SQL线程状态正常
(4),配置管理服务器(MHA Manager),修改配置文件,添加数据库服务器
]# vim /etc/mha/app1.cnf
[server1 ]
hostname=192.168.4.51
port=3306
candidate_master=1
:wq
(5),在管理服务器上重新测试
//测试集群环境
]# masterha_check_ssh --conf=/etc/mha/app1.cnf //测试SSH
.....
MySQL Replication Health is OK. //成功
]# masterha_check_repl --conf=/etc/mha/app1.cnf //测试主从同步
........
MySQL Replication Health is OK. //成功
//重启管理服务
masterha_stop --conf=/etc/mha/app1.cnf //停止管理服务
Stopped app1 successfully.
]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover //启动管理服务
// 查看状态
]#masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:15806) is running(0:PING_OK), master:192.168.4.52 //服务运行,监视服务器52