一、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 —————————————————————