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
DBmysql01
的my.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
DBmysql02
的my.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
DBmysql03
的my.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、将备份出的数据分别导到DBmysql02
、DBmysql03
中
#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_failover
、master_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 '密码';