MHA0.57 管理 Mysql 5.7.22集群 配置

 

一、MHA架构简易架构图


二、环境介绍:
2.1、

2.2、IP 规划


软件下载地址:(MHA软件,提供两种格式,tar包和rpm包,只需要安装一种。)
http://www.xchinagroup.top/softdown//centos7/03_mysql/mysql-5.7.22.tar.gz
http://www.xchinagroup.top/softdown//centos7/03_mysql/boost_1_59_0.tar.gz
http://www.xchinagroup.top/softdown//centos7/03_mysql/mha4mysql-manager-0.57.tar.gz
http://www.xchinagroup.top/softdown//centos7/03_mysql/mha4mysql-node-0.57.tar.gz
http://www.xchinagroup.top/softdown//centos7/03_mysql/mha4mysql-manager-0.57-0.el7.noarch.rpm
http://www.xchinagroup.top/softdown//centos7/03_mysql/mha4mysql-node-0.57-0.el7.noarch.rpm
三、基础配置(三台服务器上都要操作)
关闭防火墙、selinux 安装依赖包 ,卸载mariadb 相关组件。
sed –i “s# SELINUX=enforcing#SELINUX=disabled#g” /etc/selinx/config
systemctl stop firewalld
systemctl disable firewalld
yum -y install cmake bison git ncurses-devel libaio gcc gcc-c++ lrzsz vim
yum remove mariadb* -y
四、安装mysql5.7.22 (三台服务器上都要操作)
4.1、创建mysql 用户,以及安装的目录,授权mysql 帐户拥有读写权限。
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
mkdir -p /usr/local/mysql
mkdir -p /data/mysql
mkdir /usr/local/mysql/logs && touch /usr/local/mysql/logs/mysqld.log
chown -R mysql.mysql /usr/local/mysql && chmod -R 777 /usr/local/mysql
chown -R mysql.mysql /data/mysql && chmod -R 777 /data/mysql
4.2、上传mysql-5.7.22.tar.gz boost_1_59_0.tar.gz 源码包到/opt ,解压并执行编译安装。
cd /opt
tar zxvf boost_1_59_0.tar.gz -C /usr/local/
tar zxvf mysql-5.7.22.tar.gz
cd mysql-5.7.22
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DWITH_BOOST=/usr/local/boost_1_59_0 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS:STRING=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DMYSQL_USER=mysql
make
make install
4.3、修改配置文件
vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
log-error = /usr/local/mysql/logs/mysqld.log
pid-file = /usr/local/mysql/mysqld.pid
default-storage-engine=MyISAM
user = mysql
symbolic-links=0
#skip-grant-tables
[mysqld_safe]
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
4.4、初始化数据库:
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
4.5、配置启动脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
4.6、配置环境变量
echo 'export PATH="/usr/local/mysql/bin:$PATH" ' >> /etc/profile && source /etc/profile
4.7查找 Mysql root 的随机 初始密码
MySQL从5.7开始不支持安装后使用空密码进行登录,因此在这里需要先查询程序生成的临时密码:
cat /usr/local/mysql/logs/mysqld.log | grep password


4.8、添加mysqld 服务,启动数据库。
chkconfig --add /etc/init.d/mysqld
chkconfig mysqld on
systemctl start mysqld
4.9、用找到的数据库初始密码,登录数据库,并修改root@localhost 的密码。
你设置的新密码,要求密码包含大小写字母、数字及标点符号,长度应该在6位以上。
mysql -uroot -h127.0.0.1 -p :B<hEi2Q#N)L 或者 mysql –uroot –p 直接回车,输入密码。

五、基于 GTID 主从配置
5.1、在master1 上操作,修改配置文件
vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
server-id=10
log-bin=mysql-bin
log_slave_updates = on
relay_log_purge = 0
skip-name-resolve
gtid_mode = on
enforce_gtid_consistency = on
master_info_repository = TABLE
relay_log_info_repository = TABLE
sync_master_info = 1
slave_parallel_workers = 2
binlog_checksum = CRC32
master_verify_checksum = 1
slave_sql_verify_checksum = 1
binlog_rows_query_log_events =1
report_port = 3306
report_host = 192.168.189.210
slave_skip_errors = all
replicate_ignore_db = mysql
replicate_ignore_db = sys
replicate_ignore_db = information_schema
replicate_ignore_db = performance_schema
default-storage-engine=MyISAM
#skip-grant-tables
[mysqld_safe]
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
其他两个节点 slave1 slave2 /etc/my.cnf 和 master1 的 my.cnf 内容大致相同,唯一不同的就是
server-id 和 report_host(自己的IP)
 
 
重启 三个 节点的mysqld
systemctl restart mysqld
5.2、在主节点(master1)上面创建同步的用户和密码


5.3、在从节点上,配置主从同步。
slave1 189.212 slave2 189.213 上面也做同样的操作。
change master to master_host='192.168.189.210',master_user='repl',master_password='Dfsc123!@#',master_auto_position=1;
start slave;

5.4、验证主从同步是否成功,在master1 上面创建数据库,查看slave1 2 是否同步过去。
 



六、各个节点免密钥登录配置
6.1、master1 189.210

6.2、salve1 189.212

6.3、slave2 189.213

6.4、SSH免密钥测试
七、安装MHA [本次实验是在slave2 189.213 上面安装,也可以在别的服务器上安装.]
7.1、上传mha-0.57 到各个节点 安装依赖包(三个节点上都要安装依赖包)
yum install perl-DBD-MySQL perl-CPAN perl-devel -y


任意上传一种格式的包进行安装。上传到 /opt/
mha4mysql-node-0.57-0.el7.noarch.rpm 需要上传到三个节点上
mha4mysql-manager-0.57-0.el7.noarch.rpm  只上传到 slave02 192.168.189.213 上面
7.2、安装mha4mysql-node-0.57-0.el7.noarch.rpm 在三个节点上
安装依赖包,三个节点上都需要安装。
yum install epel-release -y
yum install perl-DBD-MySQL perl-CPAN perl-devel -y
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
cd /opt
rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
7.3、在master1 上面创建mha 的管理帐号


7.4、创建mysqlbinlog mysql 的软链接,三个节点上都要操作。
如果你安装mysql的时候,添加了环境变量,可以不用做软链接。
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
7.5、部署管理节点
最好是装在 从库上面,或者重新找一台服务器来安装。
本实例,安装在第 2 台从库上面。slave2 189.213
进入到MHA包的解压目录:
rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm

管理节点也要安装 mha4mysql-node-0.57-0.el7.noarch.rpm 包。
7.6、创建目录,用于存放mha配置文件和mha 日志。 slave2 189.213上操作
mkdir -p /etc/mha
mkdir -p /var/log/mha/app1
7.7、编辑配置文件 管理节点(slave2 189.213),/etc/mha/app1.cnf
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/mysql
user=mha
password=mha.com123
ping_interval=2
repl_user=repl
repl_password=Dfsc123!@#
ssh_user=root
[server1]
hostname=192.168.189.210
port=3306
[server2]
hostname=192.168.189.212
port=3306
[server3]
hostname=192.168.189.213
port=3306
7.8、检测各节点同步问题以及SSH登录问题。在管理节点(slave2)上操作
7.8.1、检测ssh
masterha_check_ssh --conf=/etc/mha/app1.cnf

7.8.2、检测各节点同步问题,也是在 slave2(MHA管理节点上操作)。
masterha_check_repl --conf=/etc/mha/app1.cnf

只有当以上两项检查,全部通过,才能启动mha 。
启动mha 服务:在管理节点(slave2)上操作。
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

7.9、测试主从库切换是否正常。
7.9.1、关掉 master1 主库 mysql服务
systemctl stop mysqld

7.9.2、在管理节点(slave2)上面打开日志
tail -fn 200 /var/log/mha/app1/manager

7.9.3、查看管理节点上的mha 配置文件,发现里面了server1 没有了。

*******
mha的切换是按照,slave 的最新日志为主来切换,也就是说,如果主挂掉了,这时看 slave谁的bin-log日志最新,谁就是主,
如果 每个slave的日志 都一样,则按照/etc/mha/app1.cnf 配置文件里面写的 server 的顺序来切换。
7.9.4、查看slave2 189.213 上面的主库


7.9.5、启动master1 上面的mysql ,重新添加189.212为主库,配置主从同步。
在salve2 管理节点 grep -i "change master to " /var/log/mha/app1/manager




7.10、测试往现在的主库(slave1 189.212)里面写数据,写一段时间,停掉slave2 189.213上面的slave
再过一段时间,停掉主库189.212的mysql ,查看主从切换是否根据日志最新记录来切换。当slav2上面的slave 开启,数据能否同步到最新状态。
7.10.1、在189.213上面修改mha配置文件,添加先前剔除的 server1模块

启动mha
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
7.10.2、主库189.212 创建数据库,以及表。
create database ab;
use ab;
create table student ( Sno int(10) not null comment '学号', Sname varchar(16) not null comment '姓名', Ssex char(2) not null comment '性别', Sage tinyint(2) not null default '0' comment '学生年龄', Sdept varchar(16) default null comment '学生所在系别', primary key (Sno) ) ENGINE=InnoDb AUTO_INCREMENT =1 dEFAULT cHARSET=utf8;


7.10.3、在slave2 189.212 创建脚本,循环写入数据。
vim ab_in.sh
#!/bin/bash
MysqlLogin="mysql -uroot -pDfsc123!@#"
i=1
while true
do
${MysqlLogin} -e "insert into ab.student values ("$i",'oldboy"$i"','m','21','computer"$i"'); "
((i++))
sleep 2;
done
chmod +x ./ab_in.sh


slave2 189.213 查看数据



停止189.213 上面的slave

查看master1 上面的数据




这时,停掉 slave1 189.212 主库上面的mysql服务和脚本。




在189.213 slave2上面查看mha 日志


启动 slave2 189.213 上面的 slave ,查看数据能否同步过来。





在189.213 slave2上面修改mha配置文件,添加先前剔除的 server2模块

在189.212 slave 1 上面配置好主从



189.213 slave2上面启动mha
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
八、配置VIP
8.1、修改配置mha文件 管理节点slave2 189.213 上面操作。
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
user=mha
password=mha.com123
ping_interval=2
repl_password=Dfsc123!@#
repl_user=repl
ssh_user=root
[server1]
hostname=192.168.189.210
port=3306
[server2]
hostname=192.168.189.212
port=3306
[server3]
hostname=192.168.189.213
port=3306
8.2、从mha源码包里面拷贝脚本到/usr/local/bin
这几个脚本文件在 mha4mysql-manager-0.57.tar.gz 包里面。


修改脚本文件:
vim /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.189.214/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
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" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
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";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"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";
}
8.3、在现在的主库189.210上配置 VIP ,第一次需要手动配置。

在189.213 管理节点上启动mha
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

8.4、测试VIP能否根据,主库在那里,就飘移到那里。
停止主库上的 mysql 服务,现在的主库是189.210
systemctl stop mysqld


在管理节点(slave2 189.213)上,查看mha 日志。


在 slave1 189.212 上,查看 VIP 是否在这上面。


8.5、恢复master1 上面的 mysql 以及 mha 配置文件




启动mha 服务
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

九、配置 binlog-server (避免主库突然down机,数据来不及同步,造成数据丢失。)
9.1、修改 管理节点 slave2 189.213 上的 mha 配置文件。
vim /etc/mha/app1.cnf


mkdir /binlog_bak
9.2、从主库上拉取 binlog 日志,到 /binlog_bak
第一次日志必须要手动从主库上拉取。
这里我们有配置VIP ,主库在那个节点上,VIP就在那个节点上,所以只需要在VIP上面拉取日志。
注意:一定要先进到,mha配置文件里面设置的 日志目录。如果在其他目录,拉取日志就存放在其他目录。这时启动 mha 会报错。
cd /binlog_bak
mysqlbinlog -R --host=192.168.189.214 --user=repl --password='Dfsc123!@#' --raw --stop-never mysql-bin.000001 &




9.3、验证日志是否从库拉取。
登录主库(189.212),刷新日志


查看主库日志:


再查看 binlog-server (189.213) /binlog_bak 下面的日志

————————————— End —————————————————————