MySQL-MHA搭建

MHA MySQL数据库集群部署方法
在这里插入图片描述
MHA MySQL服务器规划列表
在这里插入图片描述
检查外网yum
因在安装软件过程中需要使用到很多依赖包,因此需要临时放开上网权限,使用公网上的yum源。

#yum list

在这里插入图片描述
若不能显示以上信息,问题排查步骤如下:
一、服务器是否可以上网
二、检查Yum配置文件是否存在(装好系统好yum配置文件默认在以下路径)
在这里插入图片描述
主机IP绑定
1、绑定集群IP(每个主机上都进行)#vim /etc/hosts
在这里插入图片描述
MySQL服务器间免密码登录
配置root ssh免密码登录:
1、在每一台主上输入命令:cd /root/.ssh进入rsa公钥私钥文件存放的目录,删除目录下的id_rsa,id_rsa.pub文件。(注:若/root下没有.ssh目录则手动创建:mkdir /root/.ssh
2、在.ssh目录下输入命令:

ssh-keygen -t rsa

三次回车后,该目录下将会产生id_rsa,id_rsa.pub文件。其他主机也使用 该方式产生密钥文件。
3、登录DBmysql01,输入下面的命令将id_rsa.pub公钥内容拷贝到authorized_keys文件中。

cat id_rsa.pub >> authorized_keys

4、登录其他主机,将其他主机的公钥文件内容都相互拷贝到 authorized_keys文件中,命令如下:
(注:若没有ssh-copy-id命令,可手动将id_rsa.pub内容分别拷进authorized_keys文件中)
(如果不能执行如下命令的话,就需要安装一个依赖包
yum -y install openssh-clients )

ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.28 #登录	DBmysql01,	将公钥拷贝到DBmysql02的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.29 #登录	DBmysql01,	将公钥拷贝到DBmysql03的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.30 #登录	DBmysql01,	将公钥拷贝到DBmysql04的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.27 #登录	DBmysql02,	将公钥拷贝到DBmysql01的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.29 #登录	DBmysql02,	将公钥拷贝到DBmysql03的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.30 #登录	DBmysql02,	将公钥拷贝到DBmysql04的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.27 #登录	DBmysql03,	将公钥拷贝到DBmysql01的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.28 #登录	DBmysql03,	将公钥拷贝到DBmysql02的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.30 #登录	DBmysql03,	将公钥拷贝到DBmysql04的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.27 #登录	DBmysql04,	将公钥拷贝到DBmysql01的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.28 #登录	DBmysql04,	将公钥拷贝到DBmysql02的authorized_keys中
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.17.248.29 #登录	DBmysql04,	将公钥拷贝到DBmysql03的authorized_keys中

5、授权authorized_keys文件,在所有主机上都操作
登录DBmysql01,在.ssh目录下输入命令:

chmod 600 authorized_keys

效果如下:
在这里插入图片描述
至此,免密码登录已经设定完成,注意第一次ssh登录时需要输入密码,再次访问时即可免密码登录。

安装Mysql数据库软件
1、在每台mysql数据库服务器上加入以下系统参数

#vim /etc/security/limits.conf
root hard    nproc 204800
root soft    nproc 204800
root hard    nofile 204800
root soft    nofile 204800
mysql hard    nproc 204800
mysql soft    nproc 204800
mysql hard    nofile 204800
mysql soft    nofile 204800

2、通过YUM安装所有主机需开通外网
mysql软件下载址:https://dev.mysql.com/downloads/repo/yum/

3、配置mysql YUM源,这里的操作系统是CENTOS 7

#vim /etc/yum.repos.d/mysql-5.7.repo

# Enable to use MySQL 5.7
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

在这里插入图片描述
在这里插入图片描述
删除冲突的mariadb冲突的(所有节点上都要删除)
在这里插入图片描述
在这里插入图片描述
安装(在所有主机上都安装)
方法一、联网安装mysql5.7:

#yum install -y mysql-community-server

方法二:RPM包安装,将下载好的rpm包上传到服务器上

#rpm -ivh mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm

在这里插入图片描述

#启动mysql
systemctl start mysqld.service
#查看mysql状态    
systemctl status mysqld.service 
#查看root密码第一次启动mysql数据库的密码 
grep 'temporary password' /var/log/mysqld.log
#登录数据库并修改初始密码
mysql -uroot -p
#修改数据库密码
Mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; 
#强制刷新
Mysql>flush privileges;
#选择数据库
mysql> use mysql;  
Database changed
#将用户名为root的改为admin
mysql> update user set user="admin" where user="root";
mysql> flush privileges;
这样便改了,但是密码并没有变

配置Mysql数据库参数文件my.cnf
my.cnf集群配置及参数优化(DBmysql01、DBmysql02、DBmysql03):

# vim /etc/my.cnf

DBmysql01my.cnf文件:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[client]
default-character-set=utf8
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server = utf8

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

##禁用dns解析主机名
skip-name-resolve

###以下是主从参数配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16

# 服务器的ID,必须唯一
server_id=1
# 复制过滤:不需要备份的数据库(MySQL库一般不同步)
#binlog-ignore-db=mysql
#开启gtid模式
gtid_mode=ON
#强制gtid一直性,用于保证启动gitd后事务的安全
enforce-gtid-consistency=true
# 开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)
log-bin=weixin-mysql-bin
# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=row
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=60
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 
# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 作为从服务器时的中继日志
relay_log=weixin-mysql-relay-bin
# log_slave_updates 表示 slave 将复制事件写进自己的二进制日志
log_slave_updates=1
# 主键自增规则,避免主从同步ID重复的问题
auto_increment_increment=2  # 自增因子(每次加2)
auto_increment_offset=1     # 自增偏移(从1开始),单数

##for slow query log
slow_query_log                      =on                             #    off
slow_query_log_file                 =slow.log                       #    hostname.log
long_query_time                     =1.000000                       #    10.000000

DBmysql02my.cnf文件:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[client]
default-character-set=utf8
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server = utf8

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

##禁用dns解析主机名
skip-name-resolve

###以下是主从参数配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16

# 服务器的ID,必须唯一
server_id=2
# 复制过滤:不需要备份的数据库(MySQL库一般不同步)
#binlog-ignore-db=mysql
#开启gtid模式
gtid_mode=ON
#强制gtid一直性,用于保证启动gitd后事务的安全
enforce-gtid-consistency=true
# 开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)
log-bin=weixin-mysql-bin
# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=row
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=60
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 
# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 作为从服务器时的中继日志
relay_log=weixin-mysql-relay-bin
# log_slave_updates 表示 slave 将复制事件写进自己的二进制日志
log_slave_updates=1
# 主键自增规则,避免主从同步ID重复的问题
auto_increment_increment=2  # 自增因子(每次加2)
auto_increment_offset=1     # 自增偏移(从1开始),单数

##for slow query log
slow_query_log                      =on                             #    off
slow_query_log_file                 =slow.log                       #    hostname.log
long_query_time                     =1.000000                       #    10.000000

DBmysql03my.cnf文件:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[client]
default-character-set=utf8
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server = utf8

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

##禁用dns解析主机名
skip-name-resolve

###以下是主从参数配置
master_info_repository=TABLE
relay_log_info_repository=TABLE
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16

# 服务器的ID,必须唯一
server_id=3
# 复制过滤:不需要备份的数据库(MySQL库一般不同步)
#binlog-ignore-db=mysql
#开启gtid模式
gtid_mode=ON
#强制gtid一直性,用于保证启动gitd后事务的安全
enforce-gtid-consistency=true
# 开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)
log-bin=weixin-mysql-bin
# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=row
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=60
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 
# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 作为从服务器时的中继日志
relay_log=weixin-mysql-relay-bin
# log_slave_updates 表示 slave 将复制事件写进自己的二进制日志
log_slave_updates=1
# 主键自增规则,避免主从同步ID重复的问题
auto_increment_increment=2  # 自增因子(每次加2)
auto_increment_offset=1     # 自增偏移(从1开始),单数

##for slow query log
slow_query_log                      =on                             #    off
slow_query_log_file                 =slow.log                       #    hostname.log
long_query_time                     =1.000000                       #    10.000000

MySQL数据库master节点数据导入
1、导出业务数据:

mysqldump -h 172.16.128.211 -uroot -proot --database depspayhub >/tmp/depspayhub_20190915.sql
mysqldump -h 172.16.128.211 -uroot -proot --database dmps_area >/tmp/dmps_area_20190915.sql
mysqldump -h 172.16.128.211 -uroot -proot --database dmps_single >/tmp/dmps_single_20190915.sql

2、选一台mysql服务器将表结构、初始数据等导入,作为master节点。
数据导入(db3306-20190426.sql为业务系统相关数据库数据):

mysql -uadmin -p </tmp/db3306-20190426.sql 

MySQL主从配置
1、分别在DBmysql01、DBmysql02、DBmysql03创建repl复制账号

(备注10.17.248.%是指允许访问数据库的网段地址)
Mysql>grant replication slave on *.* to repl@'10.17.248.%' identified by '888888';  

mysql8.0版本创建用户有所不同,命令如下:

#CREATE USER 'username'@'host' IDENTIFIED BY 'password';
例:CREATE USER 'repl'@'10.101.19.%' IDENTIFIED BY 'password';

##开启admin用户远程连接登录权限
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.17.248.%' IDENTIFIED BY '123456';

mysql8.0用户有授权有所不同,命令如下:
grant replication slave on *.* to 'admin'@'172.16.16.%';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.17.248.%';

查数据库用户
Mysql> select distinct concat ('user: ''',user,'''@''',host,''';')as qieru from mysql.user;

2、在master上备份数据

#mysqldump -uadmin -p --master-data=2  --single-transaction  --set-gtid-purged=off -A >db3306-`date +%Y%m%d`.sql

2、将备份出的数据分别导到DBmysql02DBmysql03

#mysql -uadmin -p </opt/Mysql/db3306-20190915.sql

3、在slave上分别执行:

mysql> change master to master_host='10.17.248.27',master_user='repl',master_password='888888',master_auto_position=1; 
Query OK, 0 rows affected (0.02 sec)

#从节点启动
mysql> start slave; 
Query OK, 0 rows affected (0.01 sec)

mysql> 

4、查看master、slave
在这里插入图片描述
在这里插入图片描述
报错处理
查看主从节点/etc/my.cof配置文件,检查设置gtid_mode=ON
重新授权GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.17.248.%';并重新指定主节点

change master to master_host='10.17.248.27',master_user='repl',master_password='888888',master_auto_position=1;

在这里插入图片描述
mysql 8.0默认使用caching_sha2_password身份验证机制——从原来的mysql_native_password更改为caching_sha2_password
5.7升级8.0版本的不会改变现有用户的身份验证方法,但新用户会默认使用新的caching_sha2_password客户端不支持新的加密方式。
修改用户的密码和加密方式。在命令行模式下进入mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

在这里插入图片描述
5、至此,Mysql 主从配置完成。

MHA Manager软件安装
1、在DBmysql04上安装epel源、依赖包

#yum install epel-release -y
#yum install -y perl-Config-Tiny perl-Email-Date-Format perl-Log-Dispatch perl-Mail-Sender perl-Mail-Sendmail perl-MIME-Lite perl-MIME-Types perl-Parallel-ForkManager

#安装mha软件

#yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

2、装完如下图:
在这里插入图片描述
Manager工具包主要包括以下几个工具:

masterha_check_ssh              检查MHA的SSH配置状况
masterha_check_repl             检查MySQL复制状况
masterha_manger                 启动MHA
masterha_check_status           检测当前MHA运行状态
masterha_master_monitor         检测master是否宕机
masterha_master_switch          控制故障转移(自动或者手动)
masterha_conf_host              添加或删除配置的server信息

在这里插入图片描述
配置MHA Manager参数
1、配置MHA目录

mkdir /etc/masterha/                ##创建配置文件所在目录
mkdir /var/log/masterha/		    ##创建日志存放路径
mkdir /var/log/masterha/app1/       ##创建日志存放路径

授权文件目录可读写cd /etc/masterha/

chmod 775 /etc/masterha/ /var/log/masterha/ /var/log/masterha/app1/
chmod 775 /var/log/masterha/app1/manager.log

3、配置/etc/masterha/app1.cnf #文件没有需要手动创建
App1.cnf内容如下:

[server default]
manager_workdir=/var/log/masterha/app1.log     #设置manager的工作目录
manager_log=/var/log/masterha/app1/manager.log  #设置manager的日志
master_binlog_dir=/var/lib/mysql  #设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
master_ip_failover_script= /usr/local/bin/master_ip_failover    #设置自动failover时候的切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change  #设置手动切换时候的切换脚本
password=123456    #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
user=root               #设置监控用户root
ping_interval=1         #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
remote_workdir=/tmp     #设置远端mysql在发生切换时binlog的保存位置
repl_password=123456    #设置复制用户的密码
repl_user=repl          #设置复制环境中的复制用户名
#report_script=/usr/local/send_report   #设置发生切换后发送的报警的脚本
#secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02            
shutdown_script=""      #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
ssh_user=root           #设置ssh的登录用户名

[server1]
hostname=10.17.248.27
port=3306

[server2]
hostname=10.17.248.28
port=3306
candidate_master=1   #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
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=10.17.248.29
port=3306

VIP(虚拟IP)配置
配置VIP,将脚本:master_ip_failovermaster_ip_online_change放到到/usr/local/bin下(注意需要要手动创建,具体内容见下文)
在这里插入图片描述
在这里插入图片描述
1)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 = '10.17.248.68/16';
my $key = '1';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0"; #网卡名称
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";  #网卡名称

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";
}

2)master_ip_online_change脚本内容:

#!/usr/bin/env perl
use strict;  
use warnings FATAL =>'all';  

use Getopt::Long;  

my $vip = '10.17.248.68/16';  # Virtual IP  
my $key = "1";  
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";  #网卡名称
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";  #网卡名称
my $exit_code = 0;  

my (  
  $command,              $orig_master_is_new_slave, $orig_master_host,  
  $orig_master_ip,       $orig_master_port,         $orig_master_user,  
  $orig_master_password, $orig_master_ssh_user,     $new_master_host,  
  $new_master_ip,        $new_master_port,          $new_master_user,  
  $new_master_password,  $new_master_ssh_user,  
);  
GetOptions(  
  'command=s'                => \$command,  
  'orig_master_is_new_slave' => \$orig_master_is_new_slave,  
  'orig_master_host=s'       => \$orig_master_host,  
  'orig_master_ip=s'         => \$orig_master_ip,  
  'orig_master_port=i'       => \$orig_master_port,  
  'orig_master_user=s'       => \$orig_master_user,  
  'orig_master_password=s'   => \$orig_master_password,  
  'orig_master_ssh_user=s'   => \$orig_master_ssh_user,  
  'new_master_host=s'        => \$new_master_host,  
  'new_master_ip=s'          => \$new_master_ip,  
  'new_master_port=i'        => \$new_master_port,  
  'new_master_user=s'        => \$new_master_user,  
  'new_master_password=s'    => \$new_master_password,  
  'new_master_ssh_user=s'    => \$new_master_ssh_user,  
);  


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 "\n\n\n***************************************************************\n";  
            print "Disabling the VIP - $vip on old master: $orig_master_host\n";  
            print "***************************************************************\n\n\n\n";  
&stop_vip();  
            $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 "\n\n\n***************************************************************\n";  
            print "Enabling the VIP - $vip on new master: $new_master_host \n";  
            print "***************************************************************\n\n\n\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 $orig_master_ssh_user\@$orig_master_host \" $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 $new_master_ssh_user\@$new_master_host \" $ssh_start_vip \"`;  
}  
# A simple system call that disable the VIP on the old_master  
sub stop_vip() {  
`ssh $orig_master_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";  
}
chmod 775 /usr/local/bin/master_ip_failover
chmod 775 /usr/local/bin/master_ip_online_change

启动MHA Manager服务

1、启动MHA服务

#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 &

使用时注意:
在当shell中提示了nohup成功后,还需要按终端上键盘任意键退回到shell输入命令 窗口,然后通过在shell中输入exit来退出终端;如果在nohup执行成功后直接点关闭 程序按钮关闭终端的话,这时候会断掉该命令所对应的session,导致nohup对应的进程 被通知需要一起shutdown,起不到关掉终端后调用程序继续后台运行的作用。
在这里插入图片描述
2、检查状态:

#masterha_check_status --conf=/etc/masterha/app1.cnf

在这里插入图片描述
3、第一次启动需要检查VIP是否已正常添加,没有则需要手动添加。
1)查看VIP:

#ip add

在这里插入图片描述
2)若第一次启动没有VIP,则在Master主机上手动添加:

#添加
ip addr add 10.17.248.68/16 dev eth0 
#删除  
ip addr del 10.17.248.68/16 dev eth0	  

4、ssh免密码登录检查

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

在这里插入图片描述
5、Mysql主从复制检查

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

在这里插入图片描述
相关服务重启等常见问题请查看日常维护

部署验证
在这里插入图片描述
数据库集群服务重启及维护
数据库正常关闭步骤

1关闭MHA服务
2分别先查看slave 节点所在的服务器
3分别关闭slave节点的mysqld服务
4关闭master节点的mysqld服务

1、先关闭mha服务

  ps aux|grep mha

在这里插入图片描述

 kill -9 进程号

2、分别先查看slave 节点所在的服务器,具体需要登录数据库后通过以下命令查看是否是slave节点

Mysql>show slave status\G;   

在这里插入图片描述
关闭slave节点的mysql服务

systemctl stop mysqld.service 

4、关闭master节点的mysql服务

systemctl stop mysqld.service 

数据库正常启动步骤

1开启master节点的mysqld服务
2开启slave节点的mysqld服务
3查看slave 节 点状态是否正常
4开启MHA服务

1、开启master节点的mysql服务

systemctl start mysqld.service  

2、开启slave节点的mysql服务

systemctl start mysqld.service  

3、检查slave节点是否正常,需要登录数据库
在这里插入图片描述
4、开启MHA服务:

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 &

exit
#注意要执行完以上命令,不要直接通过鼠标点击关闭窗口,要通过exit退出

5、检查VIP是否在Master所在的主机上,若没有需要手动添加

ip add

在这里插入图片描述
MHA Managere服务关闭/开启

1、重新启动MHA服务
1)关闭MHA服务

ps aux|grep mha

在这里插入图片描述

kill -9 进程号

2)开启MHA服务

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 &
ls
exit
注意要执行完以上三步命令,不要直接通过鼠标点击关闭窗口

6、检查集群状态,出现以下信息说明集群正常运行

master_check_status --conf=/etc/masterha/app1.cnf

在这里插入图片描述
故障master节点挂掉后重新加入集群

master节点挂掉后,MHA会自动failover,并选出新的master,并剔除故障的节点。 故障节点修重后重新加入集群的操作步骤如下:
2、故障节点mysqld服务正常启动后,查看是否有slave信息
在这里插入图片描述
3、指定master,并开启slave

Mysql>change master to master_host='10.17.248.28(当前的master)',master_user='repl',master_password='123456',master_auto_position=1; 
Mysql>start slave;

4、检查slave状态是正常从master同步数据
在这里插入图片描述
5、重新配置MHA的配置文件:/etc/masterha/app1.cnf
在这里插入图片描述
重新将故障的节点加入:
在这里插入图片描述
常见问题
问题一:使用yum安装软件时报Cannot find a valid baseurl for repo: base/7/x86_64
解决方法:检查服务器是否可以访问外网

问题二:

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty
当前GTID_EXECUTED参数已经有值,而从集群倒出来的dump文件中包含了	 SET @@GLOBAL.GTID_PURGED的操作

解决方法:

方法一:reset mater这个操作可以将当前库的GTID_EXECUTED值置空
方法二:--set-gtid-purged=off在dump导出时,添加--set-gtid-purged=off参数,避免将gtid信息导出mysqldump -uroot -p --set-gtid-purged=off -d sso>sso1.sql在添加参数前的导出文件

在这里插入图片描述
添加参数之后的文件:
在这里插入图片描述
问题三:MySQL 修改掉原来的root名字,改用新的名字,并改变密码
解决方法:登进去之后切换到user

mysql> use mysql;  选择数据库
Database changed
mysql> update user set user="admin" where user="root";将用户名为root的改为admin
mysql> flush privileges;
这样便改了,但是密码并没有变

关闭重新登进去mysql之后,使用命令:
重新登的时候 MySQL

mysql -uadmin -p
#输密码是原来的密码,登进去之后再改密码
格式:mysql> set password for 用户名@localhost = password('新密码'); 
例子:mysql> set password for hello@localhost = password('hello'); 

问题四:安装MHA软件包报错
在这里插入图片描述
解决方法:安装mysql-community-libs-compat
在这里插入图片描述
问题五:不能admin账号不能远程登录
在这里插入图片描述
解决方法:重新授权

Mysql>grant replication slave on *.* to repl@'10.17.248.%' identified by '888888';  (备注10.17.248.%是指允许访问数据库的网段地址)

mysql8.0版本创建用户有所不同,命令如下:
#CREATE USER 'username'@'host' IDENTIFIED BY 'password';
例:CREATE USER 'repl'@'10.101.19.%' IDENTIFIED BY 'password';

##开启admin用户远程连接登录权限
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.17.248.%' IDENTIFIED BY '123456';

mysql8.0用户有授权有所不同,命令如下:
grant replication slave on *.* to 'admin'@'172.16.16.%';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.17.248.%';

查数据库用户
Mysql> select distinct concat ('user: ''',user,'''@''',host,''';')as qieru from mysql.user;

问题六:主从复制检查故障报错-如图
在这里插入图片描述
解决办法:主从数据库复制验证用户repl重新授权修改密码、或指定加密方式,并重启数据库

ALTER USER 'repl'@'172.16.16.%' IDENTIFIED WITH mysql_native_password BY '密码';

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值