一.MHA特性
1.主服务器的自动监控和故障转移
MHA监控复制架构的主服务器,一旦检测到主服务器故障,就会自动进行故障转移。即使有 些从服务器没有收到最新的relay log,MHA自动从最新的从服务器上识别差异的relay log并把这些日志应用到其他从服务器上,因此所有的从服务器保持一致性了。MHA通常在几秒内完成故障转移,9-12秒可以检测出主服务器故 障,7-10秒内关闭故障的主服务器以避免脑裂,几秒中内应用差异的relay log到新的主服务器上,整个过程可以在10-30s内完成。还可以设置优先级指定其中的一台slave作为master的候选人。由于MHA在 slaves之间修复一致性,因此可以将任何slave变成新的master,而不会发生一致性的问题,从而导致复制失败。
目前MHA主要支持一主多从的架构, 要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器, 一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。
2.交互式主服务器故障转移
可以只使用MHA的故障转移,而不用于监控主服务器,当主服务器故障时,人工调用MHA来进行故障故障。
3.非交互式的主故障转移
不监控主服务器,但自动实现故障转移。这种特征适用于已经使用其他软件来监控主服务器状态,比如heartbeat来检测主服务器故障和虚拟IP地址接管,可以使用MHA来实现故障转移和slave服务器晋级为master服务器。
4.在线切换主服务器
?在许多情况下,需要将现有的主服务器迁移到另外一台服务器上。比如主服务器硬件故障,RAID控制卡需要重建,将主服务器移到性能更好的服务器上等等。
维护主服务器引起性能下降,导致停机时间至少无法写入数据。另外,阻塞或杀掉当前运行的会话会导致主主之间数据不一致的问题发生。MHA提供快速切换和优
雅的阻塞写入,这个切换过程只需要0.5-2s的时间,这段时间内数据是无法写入的。在很多情况下,0.5-2s的阻塞写入是可以接受的。因此切换主服务 器不需要计划分配维护时间窗口(呵呵,不需要你在夜黑风高时通宵达旦完成切换主服务器的任务)。
实验环境
manager:192.168.70.130
slave1:192.168.70.131
slave2:192.168.70.132
master:192.168.70.133
vip:192.168.70.100
实验步骤
A. 三节点配置epel的yum源.
rpm -ivh
B. 建立主从复制关系
略
C. ssh-keygen实现三台机器之间相互免密钥登录
在所有机器执行以下动作
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.70.131
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.70.132
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.70.133
D. manager安装
yum install perl-DBD-MySQL
yum install perl-Config-Tiny
yum install perl-Log-Dispatch
yum install perl-Parallel-ForkManager
yum install -y rrdtool perl-rrdtool rrdtool-devel perl-Params-Validate
rpm -ivh
rpm -ivh
其它node节点上安装
yum install perl-DBD-MySQL
rpm -ivh
E. 在manager上管理MHA配置文件
mkdir -p /etc/masterha/app1.cnf
将下面的内容写进/etc/masterha/app1.cnf
[server default]
user=root
password=123456
manager_workdir=/var/log/masterha/app1/
manager_log=/var/log/masterha/app1/manager.log
repl_user=repl
repl_password=123456
ping_interval=1
#shutdown_script=""
#master_ip_online_change_script=""
#report_script=""
[server1]
hostname=192.168.70.133
port=3306
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server2]
hostname=192.168.70.131
port=3306
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server3]
hostname=192.168.70.132
port=3306
no_master=1
注释:
candidate_master=1 表示该主机优先可被选为new master,当多个[serverX]等设置此参数时,优先级由[serverX]配置的顺序决定
secondary_check_script mha强烈建议有两个或多个网络线路检查MySQL主服务器的可用性。默认情况下,只有单一的路线 MHA Manager检查:从Manager to Master,但这是不可取的。MHA实际上可以有两个或两个以上的检查路线通过调用外部脚本定义二次检查脚本参数
master_ip_failover_script 在MySQL从服务器提升为新的主服务器时,调用此脚本,因此可以将vip信息写到此配置文件
master_ip_online_change_script 使用masterha_master_switch命令手动切换MySQL主服务器时后会调用此脚本,参数和master_ip_failover_script 类似,脚本可以互用 shutdown_script 此脚本(默认samples内的脚本)利用服务器的远程控制IDRAC等,使用ipmitool强制去关机,以避免fence设备重启主服务器,造成脑列现象
report_script 当新主服务器切换完成以后通过此脚本发送邮件报告,可参考使用
F. masterha_check_ssh验证ssh信任登录是否成功,masterha_check_repl验证mysql复制是否成功
验证SSH信任:masterha_check_ssh --conf=/etc/masterha/app1.cnf
报错:
Can't locate MHA/SSHCheck.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/masterha_check_ssh line 25.
BEGIN failed--compilation aborted at /usr/bin/masterha_check_ssh line 25.
解决方案:
ln -s /usr/lib/perl5/vendor_perl/MHA /usr/lib64/perl5/vendor_perl/
验证复制:
masterha_check_repl --conf=/etc/masterha/app1.cnf
[error][/usr/lib64/perl5/vendor_perl/MHA/ServerManager.pm, ln255] Got MySQL error when connecting 192.168.70.131(192.168.70.131:3306)
:1130:Host 'manager' is not allowed to connect to this MySQL server, but this is not mysql crash. Check MySQL server settings.
做相应的授权处理。MHA会在配置文件里要求能远程登录到数据库,所以要进行必要的赋权,其它机器报错按下面处理
在192.168.70.131上
grant all on *.* to 'root'@'192.168.70.%' identified by '123456';
flush privileges;
继续检查:
[error][/usr/lib64/perl5/vendor_perl/MHA/Server.pm, ln381] 192.168.70.131(192.168.70.131:3306):
User repl does not exist or does not have REPLICATION SLAVE privilege! Other slaves can not start replication from this host.
解决方案
由于配置文件设置了131这台机器的优先级选为new master,所以也要赋于复制权限。
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.70.%' IDENTIFIED by '123456';
继续检查:
Fri Mar 13 16:48:35 2015 - [error][/usr/lib64/perl5/vendor_perl/MHA/ManagerUtil.pm, ln122] Got error when getting node version. Error:
Fri Mar 13 16:48:35 2015 - [error][/usr/lib64/perl5/vendor_perl/MHA/ManagerUtil.pm, ln123]
Can't locate MHA/BinlogManager.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/apply_diff_relay_logs line 24.
BEGIN failed--compilation aborted at /usr/bin/apply_diff_relay_logs line 24.
Fri Mar 13 16:48:35 2015 - [error][/usr/lib64/perl5/vendor_perl/MHA/MasterMonitor.pm, ln131] Failed to get MHA node version on the current master even though current master is reachable via SSH!
Fri Mar 13 16:48:35 2015 - [error][/usr/lib64/perl5/vendor_perl/MHA/MasterMonitor.pm, ln383] Error happend on checking configurations. at /usr/bin/masterha_check_repl line 48
Fri Mar 13 16:48:35 2015 - [error][/usr/lib64/perl5/vendor_perl/MHA/MasterMonitor.pm, ln478] Error happened on monitoring servers.
Fri Mar 13 16:48:35 2015 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
解决方案:
在其它slave 上ln -s /usr/lib/perl5/vendor_perl/MHA /usr/lib64/perl5/vendor_perl/
继续检查:
Fri Mar 13 17:02:18 2015 - [info] Connecting to root@192.168.70.131(192.168.70.131:22)..
mysqlbinlog: unknown variable 'default-character-set=utf8'
产生这个问题的原因是因为我在my.cnf中的client选项组中添加了:
default-character-set=utf8
注释掉就可以了。
G. 启动MHA manager,并监控日志文件
nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log 2>&1 &
tail -f /var/log/masterha/app1/manager.log
发生主备切换后,manager服务会自动停掉,且在/var/log/masterha/app1/下面生成
app1.failover.complete,若再次发生切换需要删除app1.failover.complete文件
rm -rf /var/log/masterha/app1/app1.failover.complete
H. 测试master的mysql宕掉后,是否会自动切换正常
略
I . 配置VIP,切换后从自动接管主服务,并对客户端透明
安装keepalived
wget
yum -y install gcc gcc-c++ gcc-g77 ncurses-devel bison libaio-devel cmake libnl* libpopt* popt-static openssl-devel
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
chmod a+x /etc/init.d/keepalived
chkconfig keepalived on
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
192.168.70.133配置:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #指定133节点为主节点 备用节点上设置为BACKUP即可
interface eth1
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP
priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.70.100/24
}
}
slave1备机配置:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.70.100/24
}
}
配置完后启动:
/etc/init.d/keepalived start
ip a 就可以看到虚拟IP了
相关测试略
阅读(5534) | 评论(0) | 转发(0) |