原创

南宫乘风2021-07-29 11:13:12博主文章分类:MySQL©著作权

 


1、环境要求

MHA实施文档:

MHA实施软件集合:

系统:CentOS Linux release 7.4.1708 (Core)

Myssql:5.7.20

MHA:mha4mysql-manager-0.56-0.el6.noarch

           mha4mysql-node-0.56-0.el6.noarch

主机

IP

端口

主库(db01)

172.17.1.145

3306

从库(db02)

172.17.1.146

3306

虚拟ip(vrrp漂移)

172.17.1.100

2、架构工作原理

主库宕机处理过程

1. 监控节点 (通过配置文件获取所有节点信息)

   系统,网络,SSH连接性

   主从状态,重点是主库

2. 选主

(1) 如果判断从库(position或者GTID),数据有差异,最接近于Master的slave,成为备选主

(2) 如果判断从库(position或者GTID),数据一致,按照配置文件顺序,选主.

(3) 如果设定有权重(candidate_master=1),按照权重强制指定备选主.

    1. 默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效.

    2. 如果check_repl_delay=0的化,即使落后很多日志,也强制选择其为备选主

3. 数据补偿

(1) 当SSH能连接,从库对比主库GTID 或者position号,立即将二进制日志保存至各个从节点并且应用(save_binary_logs )

(2) 当SSH不能连接, 对比从库之间的relaylog的差异(apply_diff_relay_logs)

4. Failover

将备选主进行身份切换,对外提供服务

其余从库和新主库确认新的主从关系

5. 应用透明(VIP)

6. 故障切换通知(send_reprt)

7. 二次数据补偿(binlog_server)

2.1架构介绍:

1主1从,master:db01   slave:db02 ):

MHA 高可用方案软件构成

Manager软件:选择一个从节点安装

Node软件:所有节点都要安装

2.2 MHA软件构成

anager工具包主要包括以下几个工具:

masterha_manger             启动MHA

masterha_check_ssh      检查MHA的SSH配置状况

masterha_check_repl         检查MySQL复制状况

masterha_master_monitor     检测master是否宕机

masterha_check_status       检测当前MHA运行状态

masterha_master_switch  控制故障转移(自动或者手动)

masterha_conf_host      添加或删除配置的server信息

Node工具包主要包括以下几个工具:

这些工具通常由MHA Manager的脚本触发,无需人为操作

save_binary_logs            保存和复制master的二进制日志

apply_diff_relay_logs       识别差异的中继日志事件并将其差异的事件应用于其他的

purge_relay_logs            清除中继日志(不会阻塞SQL线程)

3、Mysql环境搭建

3.1环境准备(主从都需要下面步骤)

创建目录,上传所需要的文件(主从都需要上传)

[root@db01 ~]# mkdir -p /tools/mysql
[root@db01 ~]# cd  /tools/mysql
[root@db01 mysql]# scp * root@172.17.1.146:/tools/mysql/
  • 1.
  • 2.
  • 3.

3.2用户的创建处理原始环境

[root@db01 ~]# rpm -qa |grep mariadb
[root@db01 ~]# yum remove mariadb-libs-5.5.56-2.el7.x86_64 -y
添加mysql用户
 [root@db01 ~]# useradd -s /sbin/nologin mysql
  • 1.
  • 2.
  • 3.
  • 4.

3.3解压文件,更改文件目录

存放mysql程序目录
[root@db01 mysql]# mkdir -p /app
解压
[root@db01 mysql]# tar xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 
移动
[root@db01 mysql]# mv mysql-5.7.20-linux-glibc2.12-x86_64 /app/mysql
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

3.4设置环境变量

vim /etc/profile

export PATH=/app/mysql/bin:$PATH

[root@db01 ~]# source /etc/profile

[root@db01 ~]# mysql -V

mysql  Ver 14.14 Distrib 5.7.20, for linux-glibc2.12 (x86_64) using  EditLine wrapper
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

3.5环境目录规划

创建文件,并授权

[root@db01 mysql]# 
[root@db01 mysql]# mkdir -p /data/{mysql,binlog}
[root@db01 mysql]# mkdir -p /data/mysql/data
[root@db01 mysql]# chown -R mysql.mysql /app/mysql/*
[root@db01 mysql]# chown -R mysql.mysql /data/*
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

错误日志存放

[root@db01 ~]# touch /var/log/mysql.log
[root@db01 ~]# chown mysql.mysql /var/log/mysql.log
[root@db01 ~]# ll /var/log/mysql.log
-rw-r--r-- 1 mysql mysql 0 6月  21 20:38 /var/log/mysql.log
  • 1.
  • 2.
  • 3.
  • 4.

Sock环境配置

[root@db01 data]# touch /tmp/mysql.sock
[root@db01 data]# chown mysql.mysql /tmp/mysql.sock
  • 1.
  • 2.

慢日志(有需要可以加下面参数)

开关:
slow_query_log=1 
文件位置及名字 
slow_query_log_file=/data/mysql/slow.log
设定慢查询时间:
long_query_time=0.1
没走索引的语句也记录:
log_queries_not_using_indexes
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

3.6my.cnf配置文件

主库server_id=145

从库server_id=146

[mysqld]
basedir=/data/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
#错误日志
log_error=/var/log/mysql.log
log_timestamps=system
#server_id
server_id=145
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[mysql]
socket=/tmp/mysql.sock
prompt=db01 [\d]>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

3.7mysql数据库初始化

[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/app/mysql --datadir=/data/mysql/data
  • 1.

3.8启动数据库2种方式

1. sys-v

[root@db01 data]# cp /app/mysql/support-files/mysql.server  /etc/init.d/mysqld 
[root@db01 data]# vim /etc/init.d/mysqld 
[root@db01 data]# grep -Ev "^(#|$)" /etc/init.d/mysqld
 
basedir=/app/mysql
datadir=/data/mysql/data
………………………………………..
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
[root@db02 mysql]# service mysqld restart
[root@db02 mysql]# service mysqld stop
[root@db02 mysql]# service mysqld start
  • 1.
  • 2.
  • 3.
[root@db02 mysql]# /etc/init.d/mysqld restart
[root@db02 mysql]# /etc/init.d/mysqld stop
[root@db02 mysql]# /etc/init.d/mysqld start
  • 1.
  • 2.
  • 3.

2. systemd

注意: sysv方式启动过的话,需要先提前关闭,才能以下方式登录

cat >/etc/systemd/system/mysqld.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
[root@db02 mysql]# systemctl restart mysqld
[root@db02 mysql]# systemctl stop mysqld
[root@db02 mysql]# systemctl start mysqld
  • 1.
  • 2.
  • 3.

3.9修改数据库的密码

注意:5.8以上数据库,需要先创用户,授权

      5.7的数据库,你授权时,就行给你创建用户

(坑:在更改密码时,要注意空格,防止密码里有空格,而自己没注意

use mysql;
本地连接密码
grant all on *.* to root@'localhost' identified by 'xdzh@2020';
同一网段可连接的root权限
grant all on *.* to root@'172.17.1.%' identified by 'xdzh@2020';
刷新权限表
flush privileges;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

本地登录测试

4、mysql主从配置

1、主库创建用户(db01)

账号密码可以自己定义

grant replication slave  on *.* to repl@'172.17.1.%' identified by '123';
flush privileges;
  • 1.
  • 2.

2、从库开启连接(db02)

执行语句,连接主库,同步数据

change master to 
master_host='172.17.1.145',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

开启从库

start slave;
  • 1.

查看用户

5、MHA环境搭建

规划

主机

MHA软件

主库(db01)

Node

从库(db02)

Node,Master

5.1配置关键程序软连接

注意:一定要配置,不然后面数据库切换会出现问题(主从都配置)

ln -s /app/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog
ln -s /app/mysql/bin/mysql          /usr/bin/mysql
  • 1.
  • 2.

5.2配置各个节点互信

配置SSH

db01:
rm -rf /root/.ssh 
ssh-keygen
cd /root/.ssh 
mv id_rsa.pub authorized_keys
scp  -r  /root/.ssh  172.17.1.146:/root
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

各节点验证:

db01:
ssh 172.17.1.145 date
ssh 172.17.1.146 date

db02:
ssh 172.17.1.145 date
ssh 172.17.1.146 date
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

主库

从库

5.3安装MHA软件

mha官网:https://code.google.com/archive/p/mysql-master-ha/

github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

1、所有节点安装Node软件依赖包

yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
  • 1.
  • 2.

2、在db01主库中创建mha需要的用户

账号密码可以自己定义

grant all privileges on *.* to mha@'172.17.1.%' identified by 'mha';
  • 1.

3、Manager软件安装(db02)

注意:这边如果yum安装缺少依赖,换成阿里云的源和epel

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
  • 1.
  • 2.

5.4配置文件准备(db02)

创建配置文件目录
 mkdir -p /etc/mha
创建日志目录
 mkdir -p /var/log/mha/app1
  • 1.
  • 2.
  • 3.
  • 4.

编辑mha配置文件

vim /etc/mha/app1.cnf

[server default]
manager_log=/var/log/mha/app1/manager        
manager_workdir=/var/log/mha/app1            
master_binlog_dir=/data/binlog       
user=mha                                   
password=mha                               
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root                               
[server1]                                   
hostname=172.17.1.145
port=3306                                  
[server2]            
hostname=172.17.1.146
port=3306
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

5.5状态检查

检测repl状态
masterha_check_repl  --conf=/etc/mha/app1.cnf 
检测ssh状态
masterha_check_ssh  --conf=/etc/mha/app1.cnf

检测运行状态
 masterha_check_status --conf=/etc/mha/app1.cnf
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

互信检查

masterha_check_ssh  --conf=/etc/mha/app1.cnf

主从状态检查

masterha_check_repl  --conf=/etc/mha/app1.cnf

5.6开启HMA(db02)

开启

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 &

检测MHA状态

masterha_check_status --conf=/etc/mha/app1.cnf

[root@db02 mysql]# masterha_check_status --conf=/etc/mha/app1.cnf

app1 (pid:17248) is running(0:PING_OK), master:172.17.1.145

[root@db02 mysql]# mysql -umha -pmha -h172.17.1.145 -e "show variables like 'server_id'"

mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id     | 145   |

+---------------+-------+

[root@db02 mysql]# mysql -umha -pmha -h172.17.1.146 -e "show variables like 'server_id'"

mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id     | 146   |

+---------------+-------+

6、MHA 的vip功能

参数

注意:/usr/local/bin/master_ip_failover,必须事先准备好

master_ip_failover_script=/usr/local/bin/master_ip_failover

修改脚本内容

vi  /usr/local/bin/master_ip_failover
my $vip = '172.17.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

更改manager配置文件:

vi /etc/mha/app1.cnf
添加:
master_ip_failover_script=/usr/local/bin/master_ip_failover
注意:
[root@db03 ~]# dos2unix /usr/local/bin/master_ip_failover 
dos2unix: converting file /usr/local/bin/master_ip_failover to Unix format ...
[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

主库上,手工生成第一个vip地址

手工在主库上绑定vip,注意一定要和配置文件中的ethN一致,我的是eth0:1(1是key指定的值)

ifconfig ens33:1 172.17.1.100/24

重启mha

masterha_stop --conf=/etc/mha/app1.cnf

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、 binlog server(db02)

参数:

binlogserver配置:

找一台额外的机器,必须要有5.6以上的版本,支持gtid并开启,我们直接用slave(db02)

vim /etc/mha/app1.cnf

[binlog1]
no_master=1
hostname= 172.17.1.146
master_binlog_dir=/data/mysql/binlog
  • 1.
  • 2.
  • 3.
  • 4.

创建必要目录

mkdir -p /data/mysql/binlog

chown -R mysql.mysql /data/*

修改完成后,将主库binlog拉过来(从000001开始拉,之后的binlog会自动按顺序过来)

拉取主库binlog日志

cd /data/mysql/binlog     -----》必须进入到自己创建好的目录

mysqlbinlog  -R --host=172.17.1.145 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &

注意:

拉取日志的起点,需要按照目前从库的已经获取到的二进制日志点为起点

重启MHA

masterha_stop --conf=/etc/mha/app1.cnf

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、邮件提醒

1. 参数

report_script=/usr/local/bin/send

2. 准备邮件脚本

send_report

(1)准备发邮件的脚本(上传 email_2019-最新.zip中的脚本,到/usr/local/bin/中)

(2)将准备好的脚本添加到mha配置文件中,让其调用

3. 修改manager配置文件,调用邮件脚本

vi /etc/mha/app1.cnf
report_script=/usr/local/bin/send
  • 1.
  • 2.

重启MHA

masterha_stop --conf=/etc/mha/app1.cnf

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 &

9、测试MHA

关闭主库,看警告邮件  

切换完后,HMA会退出,还有binlogserver

 145数据库挂掉后,MHA自动切换IP到146上,无需人为修改。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐