MySQL LVS+Keepalived+MHA 高可用群集 应用部署操作手册

系列文章目录

MySQL LVS+Keepalived+MHA 高可用群集 应用部署操作手册

第1章 MHA 架构介绍

MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,
它由日本人 youshimaton 开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提
升的高可用软件。在 MySQL 故障切换过程中,MHA 能做到 0~30 秒之内自动完成数据库的故障
切换操作,并且在进行故障切换的过程中,MHA 能最大程度上保证数据库的一致性,以达到
真正意义上的高可用。
MHA 由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。MHA Manager
可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。
当 Master 出现故障是,它可以自动将最新数据的 Slave 提升为新的 Master,然后将所有其他
的 Slave 重新指向新的 Master。整个故障转移过程对应用程序是完全透明的。

1.1 存在隐患

在 MHA 自动故障切换的过程中,MHA 试图从宕掉的主服务器上保存二进制日志,最大程度
保证数据的不丢失,但这并不总是可行的。
例如,如果主服务器硬件故障或无法通过 SSH 访问,MHA 没有办法保存二进制日志,只能
进行故障转移而丢失了最新数据。
拓:MySQL 服务挂了,但是可以从服务器拷贝二进制。但如果硬件宕机或者 SSH 不能连接,
不能获取到最新的 binlog 日志,如果复制出现延迟,会丢失数据。
使用 MySQL5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以和半同步复制结
合起来。如果只有一个 Slave 已经收到了最新的二进制日志,MHA 可以将最新的二进制日志
应用于其他所有 Slave 服务器上,保持数据一致性。
最新版 0.56 版本,增加了支持 GTID 的功能,建议在 MySQL5.6 及之后版本使用。MySQL5.5
建议使用管理节点版本 0.55,数据节点 0.54。
1.2 适用场景
目前 MHA 主要支持一主多从的架构,要搭建 MHA,要求一个复制集群必须最少有 3 台数据
库服务器,一主二从,即一台充当 Master,一台充当备用 Master,另一台充当从库。出于成
本考虑,淘宝在此基础上进行了改造,目前淘宝开发的 TMHA 已经支持一主一从。
1.3 MHA 工作原理
在这里插入图片描述

1.从宕机崩溃的 Master 保存二进制日志事件(binlog event);
2.识别含有最新更新的 Slave;
3.应用差异的中继日志(relay log)到其他 Slave;
4.应用从 Master 保存的二进制日志事件;
5.提升一个 Slave 为新的 Master;
6.使其他的 Slave 连接新的 Master 进行复制;

1.4 MHA 的组成

MHA 软件由两部分组成,Manager 工具包和 Node 工具包,具体如下。
1.Manager 工具包情况如下:
masterha_check_ssh:检查 MHA 的 SSH 配置情况。
masterha_check_repl:检查 MySQL 复制状况。
masterha_manager:启动 MHA。
masterha_check_status:检测当前 MHA 运行状态。
masterha_master_monitor:检测 Master 是否宕机。
masterha_master_switch:控制故障转移(自动或手动)。
masterha_conf_host:添加或删除配置的 server 信息。

2.Node 工具包(通常由 MHA Manager 的脚本触发,无需人工操作)情况如下:
save_binary_logs:保存和复制 Master 的 binlog 日志。
apply_diff_relay_logs:识别差异的中级日志时间并将其应用到其他 Slave。
filter_mysqlbinlog:去除不必要的 ROOLBACK 事件(已经废弃)
purge_relay_logs:清除中继日志(不阻塞 SQL 线程)
重:为了尽可能的减少因为主库硬件损坏宕机造成的数据丢失,因此在配置 MHA 的同时建议
必须配置 MySQL5.5 半同步复制。
拓展思想:为了保证数据一致性,MySQL 复制中,常常会在 Master 上使用 sync_binlog 参数
保证 binlog 持久化,保证数据一致性。但这种方式对磁盘 I/O 会造成 10~20%的影响。但是
还有另外一个思路,就是使用 MySQL 半同步复制来保证数据一致性,MySQL 半同步复制是在
从服务器的内存中处理数据并进行发聩,虽然也会造成性能影响,但是相对于对 Master 造成
的磁盘 I/O 的影响来说,反而是个更好的方法。据《高性能 MySQL》 第三版中 10.9 的测试,
写入远程的内存(一台从库的反馈)比写入本地的磁盘(写入并刷新)要更快。使用半同步
复制相比主在主库上进行强持久化的性能有两倍的改善。

第2章 搭建环境情况

2.1 基础环境情况一
操作系统:Centos 6.5 64 位;
SSH:使用默认端口;
用户:root
写 VIP:192.168.1.20
读 VIP:192.168.1.21

2.2 基础环境情况二
在这里插入图片描述在这里插入图片描述
2.4.2 实现原理
1.读操作
1) LVS 实现读操作的负载均衡;
2) Keepalived 在上层管理 LVS,并对两台从库进行健康检测(通过定义 Check 脚本);
3) 一台从库出现故障后,Keepalived 将其剔除出负载均衡集群;
2.写操作
1) 在 Master 上绑定写 VIP(MHA 启动后会通过脚本进行操作);
2) MHA 监控 Master 状态,当 Master 出现故障后(宕机、复制暂停)时;
3) 通过 Failover 脚本,卸载 Master 上的 WVIP;
4) 通过 Failover 在 CMaster 上绑定 WVIP,提升其为主库;
5) 同步并应用差异日志,并将从库指向新主库;
问题:当 MHA 把 Master 切换到了 CMaster 上后,LVS 如何处理分发在 CMaster 上的读操作?
解释:由于 Keepalived 会通过脚本定期监控 CMaster 的状态,包括同步、SQL 线程、I/O 线
程,所以当 CMaster 升级为主库后,这些状态都将消失,Keepalived 将自动将 CMaster 剔除
出负载均衡集群。

第3章 安装部署 MySQL 并配置复制

3.1 搭建主从复制环境
1.mysqldump 出主库数据,增加 master-data=2;
2.导入从库;

3.change master to
master_host='192.168.1.200',master_user='repl',master_password='replpassword'
,master_port=3306,master_log_file='mysql-bin.00000x',master_log_pos=xxx;
4.start slave;

5.配置从服务器只读;

第4章 安装部署 MHA

在所有的 MySQL 服务器上安装;在 MHA 的管理节点安装 Node 节点。
4.1.1 配置 YUM 源,依赖关系很难搞。

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

4.1.2 MySQL 服务器上安装 perl 模块(DBD::mysql)
1.方法一 使用 YUM 安装(推荐)

yum install -y perl-DBD-MySQL.x86_64 perl-DBI.x86_64

2.方法二 使用 cpanm 安装(Centos 5.5 下不太好用)

编写脚本 DBD_install.sh
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin/
chmod 755 /usr/bin/cpanm
cat >/root/list<<EOF
install DBD::mysql
EOF
for package in `cat /root/list`
do
 cpanm $package
done

二次安装时出现了 Config::mysql 和 Log::Dispatch 安装不上的情况,由于是恢复快照,
怀疑可能是时间的问题,二次安装后,手动 cpanm install Config::Tiny 安装成功。

4.1.3 在所有节点上安装 MHA Node:

tar xf mha4mysql-node-0.53.tar.gz 
cd mha4mysql-node 
perl Makefile.PL 
make && make install

4.2 安装 MHA Manger
MHA Manager 中主要几个管理员的命令行工具,也是依赖一些 Perl 模块的。
1.方法一 使用 YUM 安装(推荐)

yum install -y perl-Config-Tiny.noarch perl-Log-Dispatch.noarch perl-Parallel-ForkManager.noarch 
perl-DBD-MySQL perl-DBI

2.方法二 使用 cpanm 安装。注意:时间必须整正确

编写脚本 DBD_install.sh
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin/
chmod 755 /usr/bin/cpanm
cat >/root/list<<EOF
install DBD::mysql
install Config::Tiny
install Log::Dispatch
install Parallel::ForkManager
install Time::HiRes
EOF
for package in `cat /root/list`
do
 cpanm $package
done

4.2.2 在所有节点上安装 MHA Node:

tar xf mha4mysql-node-0.53.tar.gz 
cd mha4mysql-node 
perl Makefile.PL 
make && make install

4.2.3 安装 MHA Manager

tar zxf mha4mysql-manager-0.53.tar.gz
cd mha4mysql-manager-0.53
perl Makefile.PL
make
make install

安装过程中出现很多情况,比如在 Centos5 中,不适合 cpanm 的方法,使用 yum 是个好主意,
而且安装 MHA 之前必须要 MySQL

Cannot find the file 'mysql_config'! Your execution PATH doesn't seem
not contain the path to mysql_config. Resorting to guessed values!
Can't exec "mysql_config": No such file or directory at Makefile.PL line 473.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Can't exec "mysql_config": No such file or directory at Makefile.PL line 473.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Can't exec "mysql_config": No such file or directory at Makefile.PL line 473.
10 

Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located

4.3 配置 SSH 登录无密码验证
在 Manager 上配置到所有的 Node 节点的无密码验证

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.200"
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.201"
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.202"

在 Master 上配置到所有的 Node 节点的无密码验证

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.201"
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.202"

在 Candicate Master 上配置到所有的 Node 节点的无密码验证

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.200"
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.202"

在 Slave 上配置到所有的 Node 节点的无密码验证

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.200"
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.1.201" 

配置主机名

cat >>/etc/hosts<< EOF
192.168.1.200 ip200
192.168.1.201 ip201
192.168.1.202 ip202
192.168.1.203 ip203
EOF

在 Master 上建立监控账户

grant all on *.* to 'root' @'192.168.1.%' identified by 'rootpassword';

否则,在 MHA 检查复制时,会报如下错误

[root@MHA mha]# masterha_check_repl --conf=/etc/mha/app1.cnf
Tue Dec 23 16:21:52 2014 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Dec 23 16:21:52 2014 - [info] Reading application default configurations from /etc/mha/app1.cnf..
Tue Dec 23 16:21:52 2014 - [info] Reading server configurations from /etc/mha/app1.cnf..
Tue Dec 23 16:21:52 2014 - [info] MHA::MasterMonitor version 0.55.
Tue Dec 23 16:21:52 2014 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln255] Got MySQL error when 
connecting 192.168.1.202(192.168.1.202:3306) :1045:Access denied for user 'root'@'192.168.1.203' (using 
password: YES), but this is not mysql crash. Check MySQL server settings.
at /usr/local/share/perl5/MHA/ServerManager.pm line 251
Tue Dec 23 16:21:52 2014 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln255] Got MySQL error when 
connecting 192.168.1.200(192.168.1.200:3306) :1045:Access denied for user 'root'@'192.168.1.203' (using 
password: YES), but this is not mysql crash. Check MySQL server settings.
at /usr/local/share/perl5/MHA/ServerManager.pm line 251
Tue Dec 23 16:21:52 2014 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln255] Got MySQL error when 
connecting 192.168.1.201(192.168.1.201:3306) :1045:Access denied for user 'root'@'192.168.1.203' (using 
password: YES), but this is not mysql crash. Check MySQL server settings.
at /usr/local/share/perl5/MHA/ServerManager.pm line 251
Tue Dec 23 16:21:52 2014 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln263] Got fatal error, stopping 
operations
Tue Dec 23 16:21:52 2014 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln386] Error happend on checking 
configurations. at /usr/local/share/perl5/MHA/MasterMonitor.pm line 300
Tue Dec 23 16:21:52 2014 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln482] Error happened on 
monitoring servers.
Tue Dec 23 16:21:52 2014 - [info] Got exit code 1 (Not master dead).

4.4 配置 MHA(由于前期端口问题,将端口修改为默认)
4.4.1 在 Manager 上创建配置文件

mkdir -p /etc/masterha
vim /etc/masterha/app1.cnf

注意:由于脚本中并没有/opt/master_ip_failover 脚本,启动时会报错,请到 mha4mysqlmanager-0.5X/samples/scripts 下拷贝对应脚本到指定位置。

[server default]
manager_log=/etc/mha/app1/app1.log
manager_workdir=/etc/mha/app1/
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/etc/mha/master_ip_failover
ping_interval=1
remote_workdir=/tmp
secondary_check_script=/usr/local/bin/masterha_secondary_check -s ip201 -s ip200 --user=root 
--master_host=ip200 --master_ip=192.168.1.200 --master_port=3306
ssh_user=root
user=root
password=rootpassword
repl_password=replpassword
repl_user=repl
[server1]
hostname=192.168.1.200
port
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT-民工21110

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值