Mysql 5.7 MHA 高可用方案
MHA,即Master High Availability Manager and Tools for Mysql,该工具仅适用于 mysql replication环境,目的在于维持master主库高可用性MHA(master high availiability)是自动的master故障转移和slave提升的软件包,基于mysql复制(异步和半同步),它包含两部分 MHA Manager 和 MHA Node
下载:
https://github.com/yoshinorim/mha4mysql-manager/releases
https://github.com/yoshinorim/mha4mysql-node/releases
实战演练
环境介绍:
使用三台机器来完成本次MHA搭建
10.106.145.181 master node(主库,并需要在上面安装数据节点)
10.106.145.182 slave1 node(作为第一个从库,并需要在上面安装数据节点)
10.168.145.183 slave2 manager node(作为第二个从库,在其上面即安装管理节点,又安装数据节点)
Vip 10.168.145.184 虚拟ip地址
配置三台机器互信
基于安全密钥的验证方式在本地主机中生成密钥对 并将公钥传送到远程主机中
切换到 root使用的账户上产生密钥对
1. 产生密钥 (分别在所有机器上执行)
ssh-keygen -t rsa
产生文件如下两个
id_rsa id_rsa.pub
2. 把本机的公钥追加到自身的 ~/.ssh/authorized_keys 文件里面
cd ~/.ssh/
-- 该指令 后的ip是本身自己的ip地址(有确定 并 输入 密码的动作)
ssh-copy-id 10.106.145.181
文件变成了 四个
authorized_keys id_rsa id_rsa.pub known_hosts
将产生的 authorized_keys 复制到 第二台机器上去
scp /root/.ssh/authorized_keys 10.106.145.182:/root/.ssh/
3. 登录 到182 机器上继续操作
cd ~/.ssh/
ssh-copy-id 10.106.145.182
scp /root/.ssh/authorized_keys 10.106.145.183:/root/.ssh/
4. 登录 到183 机器上继续操作
cd ~/.ssh/
ssh-copy-id 10.106.145.183
最后将在183 上产生的authorized_keys 复制到每个机器上,这里我们是3台电脑
scp /root/.ssh/authorized_keys [email protected]:/root/.ssh/
scp /root/.ssh/authorized_keys [email protected]:/root/.ssh/
5.三台机器上都正确配置 hosts
10.106.145.181 master01.hadoop
10.106.145.182 slave01.hadoop
10.106.145.183 slave02.hadoop
搭建主从环境
一主两从,使用mysql5.7 基于GTID+row 模式搭建所以mysql上创建主从复制账号
create user repl@'10.106.145.%' identified by 'repl';
grant replication slave on *.* to repl@'10.106.145.%';
flush privileges;
创建管理账号
create user zs@'10.106.145.%' identified by '123456';
grant all privileges on *.* to zs@'10.106.145.%';
flush privileges;
因为我们使用的是GTID是的同步,就不需要添加—master-data参数
主库配置
gtid_mode=on
enforce_gtid_consistency=on
binlog_format=row
server_id 不能和从库一样
从库配置
gtid_mode=on
enforce_gtid_consistency=on
log_slave_updates=1
虽然log_slave_updates在mysql5.7之后可以关闭,使用gtid_executed这张表,但是还是建议在从库中开启(万一需要从 从库继续向下一级从库同步数据)
如果需要将从库作为主库继续向下传递数据我们还需要继续在从库上添加下面两项配置log_bin=on 和 binlog_format=row
server_id 和主库不一样
主库上进行备份指令
mysqldump -S /usr/local/mysql/mysql.sock --single-transaction -uroot -p123456 --all-databases>/home/hadoop/all.sql
1. 将all.sql 传递到其他两个库上并进行还原
Source all.sql
2. 开启同步
CHANGE MASTER TO
MASTER_HOST='10.106.145.181',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
start slave ;
show slave status;
3. 测试gtid主从复制
主库:
use test;
create table a (id int ,primary key (id));
insert into a values(1)
从库:
use test;
select *from a;
安装MHA-node节点
三台机器全部安装node节点
yum install -y epel-release
yum install perl-DBD-MySQL
安装perl- CPAN*软件包
yum -y install perl-CPAN
tar -zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
perl Makefile.PL
make && make install
给mha创建软连接 注意要根据mysql安装真实路径进行设置
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
安装MHA-manager管理节点
在一个从节点安装安装epel源
yum install -y epel-release
加载下面的所需依赖
yum install perl-DBD-MySQL
yum install perl-Params-Validate
yum install perl-Config-Tiny
yum install perl-Log-Dispatch
yum install perl-Parallel-ForkManager
安装管理节点
tar -zxvf mha4mysql-manager-0.58.tar.gz
cd mha4mysql-manager-0.58
perl Makefile.PL
make
make install
给mha创建软连接 (注意要根据mysql安装真实路径进行设置)
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
配置/etc/profile
给PATH添加一个路径 /usr/local/bin
创建MHA家目录
mkdir -p /usr/local/mha
mkdir -p /etc/mha
cd /etc/mha
创建并编辑mha.conf 内容如下
[server default]
#MySQL的用户和密码
user=zs
password=123456
#mha manager 工作目录
manager_workdir=/usr/local/mha
manager_log=/usr/local/mha/manager.log
remote_workdir=/usr/local/mha
ssh_user=root
repl_user=repl
repl_password=repl
ping_interval=1
#master_ip_failover_script=/etc/mha/master_ip_failover
[server1]
hostname=10.106.145.181
ssh_port=22
#mysql的binlog路径 可以从my.conf中找到
master_binlog_dir = /usr/local/mysql/data
candidate_master = 1
port=3306
[server2]
hostname=10.106.145.182
ssh_port=22
#mysql的binlog路径 可以从my.conf中找到
master_binlog_dir = /usr/local/mysql/data
candidate_master=1
port=3306
[server3]
hostname=10.106.145.183
ssh_port=22
#mysql的binlog路径 可以从my.conf中找到
master_binlog_dir = /usr/local/mysql/data
no_master=1
port=3306
利用MHA工具检测
检测ssh
安装需要的包
yum -y install perl-Time-HiRes
执行检测命令(使用开启ssh共享的那个用户)
/usr/local/bin/masterha_check_ssh --conf=/etc/mha/mha.conf
检测主从(至关重要一定要没问题)
/usr/local/bin/masterha_check_repl --conf=/etc/mha/mha.conf
结果如下
如果有类似报错 比如Can't exec "apply_diff_relay_logs": 没有那个文件或目录 at /usr/local/share/perl5/MHA/ManagerUtil.pm line 116.,
这说明路径没有找到该执行文件,我们需要包mha的安装路径配置到/etc/profile 的path路径中,添加/usr/local/bin 到path中,然后
source /etc/profile 即可
启动MHA
登录管理节点上执行MHA启动
nohup masterha_manager --conf=/etc/mha/mha.conf>/tmp/mha_manager.log&1 &
masterha_check_status --conf=/etc/mha/mha.conf
关闭mha
masterha_stop --conf=/etc/mha/mha.conf
模拟故障:
在主库10.106.145.181 上停止mysql服务
systemctl stop mysqld
10.106.145.182 中从库变成主库,而183的主库指向了182,切换完成
这个时候我们在182上执行sql
insert into test.b values(12346) 然后我们到183上查看数据,发现数据已经同步,mha就搭建成功了
閱讀更多 大數據和數據庫學習 的文章