赞
踩
接下来部署 MHA,具体的搭建环境如下(所有操作系统均为 CentOS7.6):
VIP:192.168.1.66
IP 地址 主机名 角色 软件
192.168.1.62 xuegod62.cn manager mha4mysql-mana mha4mysql-node
192.168.1.63 xuegod63.cn master mha4mysql-node
192.168.1.64 xuegod64.cn slave1,Candidate master mha4mysql-node
192.168.1.65 xuegod65.cn slave2 mha4mysql-node
其中 master 对外提供写服务,备选 Candidate master(实际为 slave1)提供读服务,slave2 也提供读服务,一旦 master 宕机,将会把备选 master 提升为新的 master,slave2 指向新的 master
注:xuegod62 作为管理节点可以配置给的低一些,其他节点配置能够运行 mysql 即可。拓扑图如下:
配置所有主机相互 SSH 登录无密码验证(使用 key 登录,工作中常用)。但是有一点需要注意:不能禁止 password 登陆,否则会出现错误
[root@xuegod63 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): #回车 Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): #回车 Enter same passphrase again: #回车 Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:sBMnO2ri/4gq+JnAXXCEx4WqDeBPnatKkwXrZ/uWMjM root@xuegod63 The key's randomart image is: +---[RSA 2048]----+ | o.o. | |. ..+ | |o. .+.= . | | ooooo B | | .*. .* S | |o.+o.o o | |o*.++ . | |+o+E.+ | |o+BoXo. | +----[SHA256]-----+ [root@xuegod63 ~]# ssh-copy-id 192.168.1.62 [root@xuegod63 ~]# ssh-copy-id 192.168.1.63 [root@xuegod63 ~]# ssh-copy-id 192.168.1.64 [root@xuegod63 ~]# ssh-copy-id 192.168.1.65 其他主机重复上面操作。 [root@xuegod62 ~]# ssh-keygen -t rsa [root@xuegod62 ~]# ssh-copy-id 192.168.1.62 [root@xuegod62 ~]# ssh-copy-id 192.168.1.63 [root@xuegod62 ~]# ssh-copy-id 192.168.1.64 [root@xuegod62 ~]# ssh-copy-id 192.168.1.65 [root@xuegod64 ~]# ssh-keygen -t rsa [root@xuegod63 ~]# ssh-copy-id 192.168.1.64 [root@xuegod64 ~]# ssh-copy-id 192.168.1.63 [root@xuegod64 ~]# ssh-copy-id 192.168.1.62 [root@xuegod64 ~]# ssh-copy-id 192.168.1.65 [root@xuegod65 ~]# ssh-keygen -t rsa [root@xuegod63 ~]# ssh-copy-id 192.168.1.65 [root@xuegod65 ~]# ssh-copy-id 192.168.1.63 [root@xuegod65 ~]# ssh-copy-id 192.168.1.62 [root@xuegod65 ~]# ssh-copy-id 192.168.1.64
所有节点安装 mha-node 工具包
配好网络源,安装 epel 源,以 xuegod62 为例,所有节点上,都执行以下操作:
[root@xuegod62 ~]# yum install -y wget
[root@xuegod62 ~]# wget -O /etc/yum.repos.d/epel.repo
http://mirrors.aliyun.com/repo/epel-7.repo
注:可以在 xshell 的这里执行,这样就可以在所有终端上执行这个命令了。
[root@xuegod62 ~]# yum clean all
[root@xuegod62 ~]# yum makecache
1.使用 yum 安装全部依赖,以 xuegod62 为例,所有节点上,都执行以下操作:
[root@xuegod62 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny
perl-LogDispatch perl-Parallel-ForkManager libappstream-glib deltarpm patchutils
2. 上传 mha4mysql-node-0.57-0.el7.noarch.rpm 程序包到所有节点上。先上传到 xuegod63 上,然后复制到其他结点:
[root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.62:/root/ [root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.64:/root/ [root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.65:/root/ 注意:所有的节点都需要安装 mha4mysql-node 程序包,以 xuegod62 为例,所有节点上,都执行以下操作: [root@xuegod62 ~]# rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm 安装完成后会在/usr/bin/目录下生成以下脚本文件: [root@xuegod62 ~]# cd /usr/bin/ [root@xuegod62 bin]# ll app* filter* purge* save* -rwxr-xr-x. 1 root root 70176 6 月 10 2014 applydeltarpm -rwxr-xr-x 1 root root 16381 5 月 31 2015 apply_diff_relay_logs -rwxr-xr-x. 1 root root 27752 8 月 7 2017 appstream-compose -rwxr-xr-x. 1 root root 102272 8 月 7 2017 appstream-util -rwxr-xr-x. 1 root root 46256 6 月 10 2014 filterdiff -rwxr-xr-x 1 root root 4807 5 月 31 2015 filter_mysqlbinlog -rwxr-xr-x 1 root root 8261 5 月 31 2015 purge_relay_logs -rwxr-xr-x 1 root root 7525 5 月 31 2015 save_binary_logss
仅在 xuegod62(管理节点)安装MHA Manager 中主要包括了几个管理员的命令行工具,例如 master_manger,master_master_switch 等。
MHA Manger 也依赖于 perl 模块,具体如下:
[root@xuegod62 bin]# cd [root@xuegod62 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-LogDispatch perl-Parallel-ForkManager perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtilsMakeMaker perl-CPAN 安装 mha4mysql-manager [root@xuegod62 ~]# rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm 安装完成后会在/usr/bin 目录下面生成以下脚本文件 [root@xuegod62 ~]# ll /usr/bin/mast* -rwxr-xr-x 1 root root 1995 5 月 31 2015 /usr/bin/masterha_check_repl -rwxr-xr-x 1 root root 1779 5 月 31 2015 /usr/bin/masterha_check_ssh -rwxr-xr-x 1 root root 1865 5 月 31 2015 /usr/bin/masterha_check_status -rwxr-xr-x 1 root root 3201 5 月 31 2015 /usr/bin/masterha_conf_host -rwxr-xr-x 1 root root 2517 5 月 31 2015 /usr/bin/masterha_manager -rwxr-xr-x 1 root root 2165 5 月 31 2015 /usr/bin/masterha_master_monitor -rwxr-xr-x 1 root root 2373 5 月 31 2015 /usr/bin/masterha_master_switch -rwxr-xr-x 1 root root 5171 5 月 31 2015 /usr/bin/masterha_secondary_check -rwxr-xr-x 1 root root 1739 5 月 31 2015 /usr/bin/masterha_stop
资料领取添加小姐姐微信即可
注意:主库 binlog-do-db 和 从库 replicate- do-db 设置必须相同,MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移。
xuegod63 master
xuegod64 slave1,备用 master
xuegod65 slave2
在 xuegod63 配置主数据库服务器
上传 mysql-5.7.tar.gz 到 xuegod63 主机上,并解压:
注:mysql-5.7.tar.gz 中包括了安装 mysql5.7 主要的软件包。 这样部署起来更方便
[root@xuegod63 ~]# scp mysql-5.7.tar.gz 192.168.1.64:/root/
[root@xuegod63 ~]# scp mysql-5.7.tar.gz 192.168.1.65:/root/
安装 mysql
注:所有 mysql 节点全部安装,由于临时密码不同,此处省略 64、65 节点安装初始化过程
[root@xuegod63 ~]# tar xvf mysql-5.7.tar.gz [root@xuegod63 ~]# yum -y install ./mysql*.rpm [root@xuegod63 ~]# systemctl start mysqld #启动 MySQL 会生成临时密码。 xuegod63 在 MySQL 的配置文件/etc/my.cnf 中关闭密码强度审计插件,并重启 MySQl 服务。 [root@xuegod63 ~]# vim /etc/my.cnf #修改 MySQL 的配置文件,在[myqld]标签 处末行添加以下项: validate-password=OFF #不使用密码强度审计插件 [root@xuegod63 ~]# systemctl restart mysqld #重启 MySQL 服务 [root@xuegod63 ~]# grep 'password' /var/log/mysqld.log #获取临时密码。 2018-08-01T09:59:33.918961Z 1 [Note] A temporary password is generated for root@localhost: buL.UJp!T2Od #临时密码 [root@xuegod63 ~]# mysql -u root -p'buL.UJp!T2Od' #使用临时密码登录 MySQl,注意临时密码要引号 mysql> set password for root@localhost = password('123456'); #修改 root 用户密 码为 123456 mysql> flush privileges; xuegod64 同上 xuegod65 同上
xuegod63 创建要同步的数据库
[root@xuegod63 ~]# mysql -u root -p123456 mysql> create database HA; mysql> use HA; mysql> create table test(id int,name varchar(20)); mysql> insert into test values (1,"mk"); mysql> exit 将 xuegod63 配置为 mysql 主节点 [root@xuegod63 ~]# vim /etc/my.cnf #在文件最后,插入以下内容 log-bin=mysql-bin-master #启用二进制日志 server-id=1 #本机数据库 ID 标示 binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名 binlog-ignore-db=mysql #不可以被从服务器复制的库 重启 MySQL: [root@xuegod63 ~]# systemctl restart mysqld && systemctl enable mysqld 授权: [root@xuegod63 ~]# mysql -u root -p123456 mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456'; mysql> flush privileges; 查看状态信息: mysql> show master status; mysql> exit 将 HA 数据库上传到从节点 [root@xuegod63 ~]# mysqldump -u root -p123456 -B HA >HA.sql [root@xuegod63 ~]# scp HA.sql root@192.168.1.64:/root [root@xuegod63 ~]# scp HA.sql root@192.168.1.65:/root 配置 xuegod64 为 mysql 从节点: 导入数据库 [root@xuegod64 ~]# mysql -u root -p123456 <HA.sql 配置 my.cnf: [root@xuegod64 ~]# vim /etc/my.cnf #在文件的最后插入以下内容 log-bin=mysql-slave1 #启用二进制日志 server-id=2 #本机数据库 ID 标示 binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名 binlog-ignore-db=mysql #不可以被从服务器复制的库 log_slave_updates=1 #只有开启 log_slave_updates,从库 binlog 才会记录主库同步的 操作日志 重启 MySQL 并授权: [root@xuegod64 ~]# systemctl restart mysqld [root@xuegod64 ~]# mysql -u root -p123456 mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' identified by '123456'; mysql> flush privileges;
建立主从关系
mysql> change master to
master_host='192.168.1.63',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\G
mysql> exit 配置 xuegod65 导入数据库 [root@xuegod65 ~]# mysql -u root -p123456 <HA.sql 配置 my.cnf: [root@xuegod65 ~]# vim /etc/my.cnf #在文件的最后插入以下内容 #启用二进制日志 #本机数据库 ID 标示 log-bin=mysql-slave2 server-id=3 binlog-do-db=HA binlog-ignore-db=mysql log_slave_updates=1 #可以被从服务器复制的库。二进制需要同步的数据库名 #不可以被从服务器复制的库 #只有开启 log_slave_updates,从库 binlog 才会记录主库同步的 操作日志 [root@xuegod65 ~]# systemctl restart mysqld #重启 MySQL [root@xuegod65 ~]# mysql -u root -p123456 mysql> grant replication slave on *.* to 'repl'@'192.168.1%' identified by '123456'; mysql> flush privileges; 建立主从关系 mysql> change master to master_host='192.168.1.63',master_user='repl',master_password='123456'; mysql> start slave; mysql> show slave status\G
mysql> exit 测试 mysql 主从数据同步: 在 xuegod63 mysql 主上插入数据: mysql> use HA; mysql> mysql> insert into test insert into test values(2,"man"); values(3,"root"); 在 xuegod65 上查看数据: mysql> use HA; mysql> select * from test; +------+------+ #可以看到数据,说明,数据同步成功 | id | name | +------+------+ | | 1 | mk | 1 | root | +------+------+
两台 slave 服务器设置 read_only(从库对外提供读服务,只是没有写进配置文件,当集群发生切换时新的 master 节点会取消只读状态)
[root@xuegod64 ~]# mysql -u root -p123456 -e 'set global read_only=1'
[root@xuegod65 ~]# mysql -u root -p123456 -e 'set global read_only=1'
注:set global read_only=1 作用是:进行主备切换的时候,一般都会先对主库进行只读操作(on),然后主备同步完成后,再把备库置为可读写(off)。这样可以避免切换的过程中双写引起脏数据。
在所有数据库结点上创建 mha 管理用户
远程登录用户必须拥有 localhost 权限才可以登录,必须先授权 localhost 再授权 192.168.1.%
[root@xuegod63 ~]# mysql -uroot -p123456
mysql> grant all privileges on *.* to 'mha'@'localhost' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit
[root@xuegod64 ~]# 同上
[root@xuegod65 ~]# 同上
注:该管理用户是为了管理 MHA 集群,比如:master 节点故障后,MHA 管理软件通过管理用户在 slave2 节点执行 sql
语句将 master 设置为 xuegod64。 到这里整个集群环境已经搭建完毕,剩下的就是配置 MHA 软件了。
[root@xuegod62 ~]# mkdir -p /etc/masterha [root@xuegod62 ~]# mkdir -p /var/log/masterha/app1 [root@xuegod62 ~]# cd /etc/masterha/ [root@xuegod62 masterha]# rz #上传 app1.cnf 到/etc/masterha/目录下 注:app1.cnf 配置文件从这里可以下载:https://github.com/yoshinorim/mha4mysqlmanager/wiki/Configuration [root@xuegod62 ~]# vim /etc/masterha/app1.cnf 修改 app1.cnf 配置文件,修改后的文件内容如下 注:配置文件中的注释需要去掉,我这里是为了解释清楚,课程资料中附配置文件可直接使用。 [server default] manager_workdir=/var/log/masterha/app1 #设置 manager 的工作目录 manager_log=/var/log/masterha/app1/manager.log #设置 manager 的日志 master_binlog_dir=/var/lib/mysql #指定 mysql 保存 binlog 的位 置,以便 MHA 可以找到 master 的日志,我这里的也就是 mysql 的数据目录 master_ip_failover_script=/usr/local/bin/master_ip_failover #设置自动 failover 时候的 切换脚本,这个脚本如果没有,就不需要写入此项,否则会报错。 password=123456 #设置 MySQL 中 mha 用户的密码,这个密码是前文中创建监控用 户的那个密码 user=mha #设置管理用户 mha ping_interval=1 #设置监控主库,发送 ping 包的时间间隔,默认是 3 秒,尝试三次没有 回应的时候自动进行 failover remote_workdir=/tmp #设置远端 MySQL 在发生切换时,binlog 的保存位置 repl_password=123456 #设置复制用户的密码 repl_user=repl #设置复制环境中的复制用户名 #report_script=/usr/local/send_report #设置发生切换后发送的报警的脚本,没有配置则注释 shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放 在发生脑裂,这里没有使用) ssh_user=root #设置 SSH 的登录用户名 [server1] hostname=192.168.1.63 port=3306 [server2] hostname=192.168.1.64 port=3306 candidate_master=1 #设置为候选 master,如果设置该参数以后,发生主从切换以后将会将此 从库提升为主库,即使这个主库不是集群中事件最新的 slave candidate 侯选人 check_repl_delay=0 #默认情况下,如果一个 slave 落后 master 100M 的 relay logs 的话, MHA 将不会选择该 slave 作为一个新的 master,因为对于这个 slave 的恢复需要花费很长时间,通过 设置 check_repl_delay=0,MHA 触发切换在选择一个新的 master 的时候将会忽略复制延时,这个参 数对于设置了 candidate_master=1 的主机非常有用,因为这个候选主在切换的过程中一定是新的 master [server3] hostname=192.168.1.65 port=3306 上传 master_ip_failover perl 脚本文件到 xuegod62 主机上/usr/local/bin/目录下,MHA 主 程序负责对数据转移和故障切换功能,该脚本负责对 VIP 进行切换 [root@xuegod62 ~]# mv master_ip_failover /usr/local/bin/ [root@xuegod62 ~]# chmod +x /usr/local/bin/master_ip_failover 如果你的网卡名称不是 ens33 请修改脚本文件中的网卡名称 14 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; # Network name 15 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
[root@xuegod64 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'
[root@xuegod65 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'
注意:
MHA 在发生切换的过程中,从库的恢复过程中依赖于 relay log 的相关信息,所以这里要将 relay log 的自动清除设置为 OFF,采用手动清除 relay log 的方式。 在默认情况下,从服务器上的中继日志会在 SQL 线程执行完毕后被自动删除。 但是在 MHA 环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能
[root@xuegod62~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
可以看见各个节点 SSH 验证都是 OK 的。
[root@ xuegod62 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
MySQL Replication Health is OK. 显示 Ok ,正常!
[root@ xuegod62 ~]# 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 &
[1] 30867
启动参数介绍:
--remove_dead_master_conf #该参数代表当发生主从切换后,老的主库的 IP 将会从配置文
件中移除。
--manger_log #日志存放位置
--ignore_last_failover #我需要忽略上次故障转移。默认情况,如果先前的故障转移失
败,则 MHA 不会启动故障转移,因为该问题可能再次发生。
[root@ xuegod62 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:10890) is running(0:PING_OK), master:192.168.1.63
可以看见已经在监控了,而且 master 的主机为 192.168.1.63 。
注意:如果正常,会显示"PING_OK",否则会显示"NOT_RUNNING",这代表 MHA 监控没有开启
[root@xuegod62 ~]# tail -n20 /var/log/masterha/app1/manager.log
。。。
。。。
Fri Nov 9 15:53:51 2018 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't
respond..
其中"Ping(SELECT) succeeded, waiting until MySQL doesn't respond.."说明整个系统已经开
始监控了。
[root@xuegod62~]# masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
[1]+ 退出 1 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
实战场景:当主节点 xuegod63 上的 mysql 服务关闭后,MHA 可以自动将 xuegod64 备用从节点,转为主节点。MHA 调用 master_ip_failover 把 keepalive 上的 VIP 地址配置到 xuegod64 上。
[root@xuegod62 ~]# 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 &
[1] 30867
此时主库的 vip 已经出现 1.66
#打开新窗口观察日志
[root@xuegod62 ~]# tail -f /var/log/masterha/app1/manager.log
#模拟主库挂掉
[root@xuegod63 ~]# systemctl stop mysqld
在 xuegod62 上看日志是否切换 master 成功
。。。
192.168.1.64(192.168.1.64:3306): Resetting slave info succeeded.
Master failover to 192.168.1.64(192.168.1.64:3306) completed successfully.
我们从日志上可以看到故障切换成功,恭喜你新的 master 是 xuegod64.
并且 vip 会漂移到新主库
新的主库插入记录,从库查看
实战场景:当 xuegod63 的 mysql 服务修复好并启动后,手动将 xuegod63 加入到现在的 mysql主从集群中。
重新启动故障主机。
[root@xuegod63 ~]# systemctl start mysqld
修改节点为只读状态并关闭 relay log 日志自动删除功能
[root@xuegod63 ~]# mysql -uroot -p123456 -e 'set global read_only=1'
[root@xuegod63 ~]# mysql -uroot -p123456 -e ' set global relay_log_purge=0'
将 xuegod63 主机以 slave 的身份加入到 myslq 主从集群
[root@xuegod63 ~]# mysql -uroot -p123456
mysql>change master to
master_host='192.168.1.64',master_user='repl',master_password='123456';
mysql> flush privileges;
mysql> start slave;
mysql> show slave status\G #已经加入 mysql 主从集群
查看刚才插入的记录,是可以看到的
mysql> exit
MHA 进行故障转移之后会将配置文件中的故障节点直接删除,我们需要将 xuegod63 的配置文件重新添加到集群配置文件中。
[root@xuegod62 ~]# vim /etc/masterha/app1.cnf 改: 15 [server2] 16 candidate_master=1 #删除这行内容,因为现在它是主 17 check_repl_delay=0 #删除这行内容 18 hostname=192.168.1.64 19 port=3306 为: [server2] hostname=192.168.1.64 port=3306 在文件最后,插入以下内容: [server1] candidate_master=1 check_repl_delay=0 hostname=192.168.1.63 port=3306 重新检测集群可用性 [root@xuegod63 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf 。。。 MySQL Replication Health is OK. masterha_manager 切换主库后会停掉,需要手动启动
再次开启动 masterha_manager,监控 mysql 主从集群:
[root@xuegod62 ~]# 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 & #开启监控
#再模拟新主库挂掉
[root@xuegod64 ~]# systemctl stop mysqld
在 xuegod62 上看日志是否切换 master 成功 #又换回 63 主机
并且 vip 也漂移回来
登陆从服务器 xuegod65 查看 show slave status\G 是否成功切换
[root@xuegod65 ~]# mysql -u root -p123456
mysql> show slave status\G
小结:
目前高可用方案可以一定程度上实现数据库的高可用,还有其他方案 heartbeat+drbd,Cluster、MGR 等。这些高可用软件各有优劣。在进行高可用方案选择时,主要是看业务还有对数据一致性方面的要求
想要获取原笔记和视频+学习资料
添加我们的小姐姐即可
可不能撩我们的小姐姐哦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。