MHA高可用数据库集群
目录
环境配置: 所有操作系统均为centos 7.x 64bit
1、关闭防火墙:(所有服务器)
2.配置所有主机名映射(所有服务器)
3、同步时区
4.安装MHA node及相关perl依赖包(所有服务器)
5.安装MHA Node(所有服务器)
6.管理节点huyang5安装MHA Manger(1)(管理服务器)
7.配置SSH密钥对验证(所有服务器)
8.安装mysql(所有服务器)
编辑
搭建主从复制环境
主库设置:(huyang1)
步骤一:修改配置文件/etc/my.cnf
步骤二:重启服务后进入数据库
步骤三:授权复制权限
步骤四:查看主状态
步骤五:创建监控用户
从库一设置:(huyang4)备用主库
步骤一:修改配置文件/etc/my.cnf
步骤二:重启服务后进入数据库
步骤三:授权复制权限
步骤四:连接主库
步骤五:创建监控用户
从库二设置:(huyang2)
步骤一:修改配置文件/etc/my.cnf
步骤二:重启服务后进入数据库
步骤三:授权复制权限
步骤四:连接主库
步骤五:创建监控用户
从库三设置:(huyang3)
步骤一:修改配置文件/etc/my.cnf
编辑
步骤二:重启服务后进入数据库
步骤三:授权复制权限
步骤四:连接主库
步骤五:创建监控用户
配置MHA环境:(huyang5)
步骤一:建立工作目录及并设置配置文件
步骤二:配置故障转移脚本并赋权
部署完成,检查结果:(huyang5操作)
检查MHA ssh通信状态
检查整个集群的状态
检查manager状态
验证MHA高可用当主库服务器因为某种原因宕机之后的变化:
步骤一:检查当前的端口(主库huyang1)
编辑
步骤二:停止主库服务,查看变化
验证当主库服务器宕机恢复之后的变化:
步骤一:检查当前的端口(主库huyang1)
步骤二:开启主库服务,查看变化
步骤三:将huyang1连接至huyang4
步骤四:添加进huyang5的监听文件并开启监控
步骤五:关闭现有主库huyang4,查看变化
总 结:
环境配置: 所有操作系统均为centos 7.x 64bit
至少五台主机,一主三从一Manger
三从主指定为主的备胎,当主坏掉,他顶上,但默认情况还是从的角色
例:
IP地址 | 主机名 | 任 务 |
192.168.59.137 | huyang1 | 主 库 |
192.168.59.138 | huyang2 | 从库1 |
192.168.59.140 | huyang3 | 从库2 |
192.168.59.142 | huyang4 | 从库3(备用主库) |
192.168.59.144 | huyang5 | 管理节点 |
192.168.59.146 | huyang6 | VIP |
1、关闭防火墙:(所有服务器)
systemctl stop firewalld
iptables -F setenforce 0
2.配置所有主机名映射(所有服务器)
cat << END >> /etc/hosts
192.168.59.137 huyang1
192.168.59.138 huyang2
192.168.59.140 huyang3
192.168.59.142 huyang4
192.168.59.144 huyang5
END
映射完之后需要用ip地址的可以用主机名
3、同步时区
[huyang1]yum -y install ntp
systemctl start ntpd
[huyang2/3/4/5/6]ntpdate huyang1
4.安装MHA node及相关perl依赖包(所有服务器)
wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
下载阿里源
yum -y install epel-release 下载epel源
yum install -y perl-DBD-MySQL.x86_64
perl-DBI.x86_64 perl-CPAN perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
5.安装MHA Node(所有服务器)
rz 上传文件包(mha4mysql-node-0.56.tar.gz)
tar xf mha4mysql-node-0.56.tar.gz 解压
cd mha4mysql-node-0.56/ 切换目录
perl Makefile.PL 用perl
语言编译文件,生成Makefile文件
make && make install 编译安装
查看结果:MHA Node安装完后会在 /usr/local/bin生成以下脚本 ls -l /usr/local/bin/ 有4个
6.管理节点huyang5安装MHA Manger(1)(管理服务器)
安装MHA Manger之前也需要安装MHA Node
安装MHA Manger依赖的perl模块
yum install -y perl perl-Log-Dispatch
perl-Parallel-ForkManager perl-DBD-MySQL perl-DBI perl-Time-HiRes 依赖
rz 上传依赖包
perl-Config-Tiny-2.14-7.el7.noarch.rpm
用perl软件配置Manger
rpm -ivh
perl-Config-Tiny-2.14-7.el7.noarch.rpm
安装MHA Manger软件包
rz 上传管理节点安装包
tar xf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56/
perl Makefile.PL
make && make install
安装完成后会有以下脚本文件
查看结果:MHA Manger e安装完后会在/usr/local/bin/
生成以下脚本 ls -l /usr/local/bin/ 有13个
7.配置SSH密钥对验证(所有服务器)
manger生成传给其他服务器,并验证,其他服务器直接互相传密钥,无需验证
服务器之间需要实现密钥对验证
【huyang1/2/3/4/5】ssh-keygen -t rsa
【huyang1/2/3/4/5】
ssh-copy-id -i .ssh/id_rsa.pub root@huyang1
cat /root/.ssh/authorized_keys
scp .ssh/authorized_keys root@huyang2:.ssh/
scp .ssh/authorized_keys root@huyang3:.ssh/
scp .ssh/authorized_keys root@huyang4:.ssh/
scp .ssh/authorized_keys root@huyang5:.ssh/
Manger生成密钥对传给其他数据库连接每个主机测试
ssh 加主机名
[huyang5]ssh huyang1
[huyang5]ssh huyang2
[huyang5]ssh huyang3
[huyang5]ssh huyang4
[huyang5]ssh huyang5
因为第一次连接的时候需要输入yes影响后期故障切换时,对于每个主机的SSH控制;
数据库之间生成密钥对,保证一个数据库有其他三个数据库的密钥,无需连接测试.
8.安装mysql(所有服务器)
数据库服务器上的操作
yum -y install mariadb mariadb-server mariadb-devel
systemctl start mariadb
mysqladmin -u root password 123456
设置数据库初始密码
搭建主从复制环境
主库设置:(huyang1)
步骤一:修改配置文件/etc/my.cnf
[mysqld]
server-id = 1
log-bin=master-bin
log-slave-updates=true
relay_log_purge=0
步骤二:重启服务后进入数据库
systemctl restart mariadb
mysql -uroot -p123456
步骤三:授权复制权限
grant replication slave on *.* to
'repl'@'192.168.59.%' identified by '123456';
flush privileges; 刷新权限
步骤四:查看主状态
show master status;
步骤五:创建监控用户
为监控节点服务较高的权限
grant all privileges on *.* to
'root'@'192.168.59.%' identified by '123456';
flush privileges;
为自己的主机名授权
grant all privileges on *.* to 'root'@'huyang1'
identified by '123456';
从库一设置:(huyang4)备用主库
步骤一:修改配置文件/etc/my.cnf
[mysqld]
server-id = 2
log-bin=master-bin
log-slave-updates=true
relay_log_purge=0
步骤二:重启服务后进入数据库
systemctl restart mariadb
mysql -uroot -p123456
步骤三:授权复制权限
grant replication slave on *.* to
'repl'@'192.168.59.%' identified by '123456';
flush privileges; 刷新权限
步骤四:连接主库
stop slave;
change master to
master_host='192.168.59.137',master_user='repl',master_password='123456',master_log_file='master-bin.000003',master_log_pos=245;
start slave;
show slave status\G;
步骤五:创建监控用户
为监控节点服务较高的权限
grant all privileges on *.* to
'root'@'192.168.59.%' identified by '123456';
flush privileges;
为自己的主机名授权
grant all privileges on *.* to 'root'@'huyang4'
identified by '123456';
从库二设置:(huyang2)
步骤一:修改配置文件/etc/my.cnf
[mysqld]
server-id = 3
log-bin=master-bin
log-slave-updates=true
relay_log_purge=0
步骤二:重启服务后进入数据库
systemctl restart mariadb
mysql -uroot -p123456
步骤三:授权复制权限
grant replication slave on *.* to
'repl'@'192.168.59.%' identified by '123456';
flush privileges; 刷新权限
步骤四:连接主库
stop slave;
change master to
master_host='192.168.59.137',master_user='repl',master_password='123456',master_log_file='master-bin.000003',master_log_pos=245;
start slave;
show slave status\G;
步骤五:创建监控用户
为监控节点服务较高的权限
grant all privileges on *.* to
'root'@'192.168.59.%' identified by '123456';
flush privileges;
为自己的主机名授权
grant all privileges on *.* to 'root'@'huyang2'
identified by '123456';
从库三设置:(huyang3)
步骤一:修改配置文件/etc/my.cnf
[mysqld]
server-id = 4
log-bin=master-bin
log-slave-updates=true
relay_log_purge=0
步骤二:重启服务后进入数据库
systemctl restart mariadb
mysql -uroot -p123456
步骤三:授权复制权限
grant replication slave on *.* to
'repl'@'192.168.59.%' identified by '123456';
flush privileges; 刷新权限
步骤四:连接主库
stop slave;
change master to
master_host='192.168.59.137',master_user='repl',master_password='123456',master_log_file='master-bin.000003',master_log_pos=245;
start slave;
show slave status\G;
步骤五:创建监控用户
为监控节点服务较高的权限
grant all privileges on *.* to
'root'@'192.168.59.%' identified by '123456';
flush privileges;
为自己的主机名授权
grant all privileges on *.* to 'root'@'huyang3'
identified by '123456';
配置MHA环境:(huyang5)
步骤一:建立工作目录及并设置配置文件
mkdir /etc/masterha创建配置目录复制模板文件
cp mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/masterha 软件包解压后的目录里面有样例配置文件
vim /etc/masterha/app1.cnf 修改配置文件
[server default]
#设置manager的工作日志
manager_workdir=/var/log/masterha/app1
#设置manager的日志,这两条都是默认存在的
manager_log=/var/log/masterha/app1/manager.log
#设置master默认保存binlog的位置,以便MHA可以找到master日志
master_binlog_dir=/var/lib/mysql
#设置自动failover时候的切换脚本
master_ip_failover_script= /usr/local/bin/master_ip_failover
#设置mysql中root用户的密码
password=123456
user=root
#ping包的时间间隔
ping_interval=1
#设置远端mysql在发生切换时保存binlog的具体位置
remote_workdir=/tmp
#设置复制用户的密码和用户名
repl_password=123456
repl_user=repl
[server1]
hostname=huyang1
port=3306
[server2]
hostname=huyang4
candidate_master=1
port=3306
check_repl_delay=0
[server3]
hostname=huyang2
port=3306
[server4]
hostname=huyang3
port=3306
步骤二:配置故障转移脚本并赋权
vim /usr/local/bin/master_ip_failover修改配置文件
chmod +x /usr/local/bin/master_ip_failover
赋予执行权限
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port,
);
my $vip = '192.168.59.146';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
$ssh_user = "root";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
my $exit_code = 1;
#eval {
# print "Disabling the VIP on old master: $orig_master_host \n";
# &stop_vip();
# $exit_code = 0;
#};
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
#my $ping=`ping -c 1 10.0.0.13 | grep "packet loss" | awk -F',' '{print $3}' | awk '{print $1}'`;
#if ( $ping le "90.0%"&& $ping gt "0.0%" ){
#$exit_code = 0;
#}
#else {
&stop_vip();
# updating global catalog, etc
$exit_code = 0;
#}
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc) here.
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
`ssh $ssh_user\@$orig_master_ip \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --
new_master_host=host --new_master_ip=ip --new_master_port=port\n"; }
部署完成,检查结果:(huyang5操作)
检查MHA ssh通信状态
masterha_check_ssh --conf=/etc/masterha/app1.cnf
返回 successfully表示没有问题
检查整个集群的状态
masterha_check_repl --conf=/etc/masterha/app1.cnf
返回ok表示没有问题
检查manager状态
masterha_check_status--conf=/etc/masterha/app1.cnf
如果正常会显示"PING_OK"
NOT_RUNNING",代表MHA监控没有开启
开启监控再查看为开启状态
开启manager监控
nohup masterha_manager
--conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover<
/dev/null >/var/log/masterha/app1/manager.log 2>&1 &
--remove_dead_master_conf
当发生主从切换后,老的主库的ip将会从配置文件中移除
--manger_log 日志存放位置
--ignore_last_failover 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover
关闭监控
masterha_stop --conf=/etc/masterha/app1.cnf
验证MHA高可用当主库服务器因为某种原因宕机之后的变化:
步骤一:检查当前的端口(主库huyang1)
【huyang1】ip a|grep ens33
可以发现有两个,一个是主库的ip,另一个是vip的端口
步骤二:停止主库服务,查看变化
【huyang1】systemctl stop mariadb
【huyang2】show slave status\G;
【huyang3】show slave status\G;
【huyang4】show slave status\G;
【huyang4】ip a|grep ens33;
【huyang4】show master status;(成为主服务器)
【huyang5】
masterha_check_repl --conf=/etc/masterha/app1.cnf
【huyang5】 vim /etc/master/app1.cong
可以发现监听的文件内已经不再监听huyang1
验证当主库服务器宕机恢复之后的变化:
步骤一:检查当前的端口(主库huyang1)
【huyang1】ip a|grep ens33
可以发现只有一个端口了
步骤二:开启主库服务,查看变化
【huyang1】systemctl start mariadb
【huyang2/3】show slave status\G;
没有发生变化
【huyang4】show master status;(依旧是主服务器)
【huyang5】 vim /etc/master/app1.cong
可以发现监听的文件内依旧没有huyang1
步骤三:将huyang1连接至huyang4
change master to
master_host='192.168.59.142',master_user='repl',master_password='123456',master_log_file='master-bin.000005',master_log_pos=245;
步骤四:添加进huyang5的监听文件并开启监控
【huyang5】vim /etc/master/app1.conf
步骤五:关闭现有主库huyang4,查看变化
【huyang4】systemctl stop mariadb
【huyang4】ip a |grep ens33
【huyang1】ip a |grep ens33
【huyang1】show slave status;
【huyang1】show master status;变成主库
【huyang2/3】show slave status\G;
此时huyang2/3又变成了huyang1的从库
【huyang5】 vim /etc/master/app1.cong
可以发现监听的文件内已经不再监听huyang4
总 结:
1、MHA高可用集群,在主机宕机之后,复制组里会有一台变成主库,若指定了备用库,则备用库成为新的主库,原主库的从库成为新主库的从库;
2、指定备用库之后,主库宕机恢复之后,将成为独立的服务器,不会成为主库,宕机之后复制组的状态不会改变,若有需要,则需手动指定成为新主库的从库;在指定宕机恢复主库为备用库主库的从库之后,备用库主库宕机,宕机恢复主库成为新的主库,来回切换;
3、管理库的监听需要手动的进行切换,监听的主库宕机之后,将会删除其信息,恢复之后,需手动添加进监听文件。