系统 | 主机名 | IP |
---|---|---|
centos7.9 | mha-master | 192.168.200.41、192.168.200.45(vip) |
centos7.9 | mha-slave01 | 192.168.200.42 |
centos7.9 | mha-slave02 | 192.168.200.43 |
centos7.9 | mha-monitor | 192.168.200.40 |
mha-master、mha-slave01、mha-slave02、mha-monitor四台机器之间设置免密互信
mha-master、mha-slave01、mha-slave02安装mysql8
tar zxvf mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar.gz
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
rpm -ivh mysql-community-common-8.0.19-1.el7.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-libs-8.0.19-1.el7.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-client-8.0.19-1.el7.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-server-8.0.19-1.el7.x86_64.rpm --nodeps --force
# yum 安装perl-DBD-MySQL依赖
rpm -ivh mysql-community-libs-compat-8.0.19-1.el7.x86_64.rpm --nodeps --force
mkdir -p /data/mysql/data /data/mysql/mysql-files /data/mysql/mysql-keyring
chown -R mysql:mysql /data/mysql
rm -rf /var/lib/mysql
rm -rf /var/lib/mysql-files
rm -rf /var/lib/mysql-keyring
ln -s /data/mysql/data /var/lib/mysql
ln -s /data/mysql/mysql-files /var/lib/mysql-files
ln -s /data/mysql/mysql-keyring /var/lib/mysql-keyring
修改my.cnf
[mysqld]
port=3308
default-time-zone='+08:00'
server-id=41 # server的唯一标识
log-bin=mysql-bin
binlog_format=row
binlog-ignore-db=mysql #要忽略的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
replicate_ignore_db=mysql
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=sys
log-slave-updates=1 # 允许从服务器将复制时间写入binglog日志
skip-name-resolve # 禁用DNS解析,加快IP方式的连接
auto-increment-increment=1
auto-increment-offset=1
gtid-mode=on # 开启gtid模式
enforce-gtid-consistency=1 # 开启gtid安全限制
report_host=192.168.200.41 # 报告主机监控地址
default-authentication-plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/lib/mysql/mysqld.log
slow_query_log = 1
long_query_time = 2
slow_query_log_file = /var/lib/mysql/mysql-slow.log
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
max_connections = 1024
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 200M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
thread_cache_size = 64
key_buffer_size = 4M
ft_min_word_len = 4
transaction_isolation = REPEATABLE-READ
performance_schema = 0
explicit_defaults_for_timestamp=true
lower_case_table_names=1
skip-external-locking
default-storage-engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 6G
innodb_buffer_pool_chunk_size = 128M
innodb_buffer_pool_instances = 16
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 7200
wait_timeout = 86400
[client]
default-character-set = utf8mb4
[mysql]
socket=/var/lib/mysql/mysql.sock
default-character-set = utf8mb4
mha-master、mha-slave01、mha-slave02启动mysql服务并修改root密码
# 修改mysql的root账号初始权限
alter user 'root'@'localhost' identified with mysql_native_password by "p2+EH+zA|#qOSdn^fNT8";
flush privileges;
mha-master创建MHA账号和主从同步账号repl
# 创建主从同步账号repl,并授权
create user 'repl'@'192.168.200.%' identified with mysql_native_password by 'Test0102@.';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.200.%';
# 创建MHA账号并授权
create user 'mha'@'192.168.200.%' identified with mysql_native_password by 'Test0102@.';
grant all privileges on *.* to 'mha'@'192.168.200.%';
flush privileges;
mha-slave01、mha-slave02从库设置
change master to master_host='192.168.200.41',master_port=3308,master_user='repl',master_password='Test0102@.',master_auto_position=1;
所有节点安装MHA Node
# 依赖安装
yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-CPAN
# 软件下载地址
https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
# 源码编译安装
tar -zxf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58/
perl Makefile.PL
make
sudo make install
# 查看安装成功后的脚本文件
ll /usr/local/bin/
mha-monitor节点安装MHA Manager
# 安装依赖(需要epel的yum源,否则perl-Log-Dispatch,perl-Parallel-ForkManager这2个包安装不了)
yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-CPAN perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
# 软件下载地址
https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
# 源码编译安装
tar -zxf mha4mysql-manager-0.58.tar.gz
cd mha4mysql-manager-0.58/
perl Makefile.PL
make
sudo make install
# 拷贝脚本文件至/usr/local/bin/
cp samples/scripts/master_ip_failover /usr/local/bin/
cp samples/scripts/master_ip_online_change /usr/local/bin/
# 查看安装成功后的脚本文件
ll /usr/local/bin/
# 配置 MHA Manager
mkdir /etc/mha
mkdir /usr/local/mha
mkdir -p /var/log/masterha/app1
cat > /etc/mha/mha.cnf << EOF
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/app1.log
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
ping_interval=1
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.200.42 -s 192.168.200.43
ssh_user=root
user=mha
password=Test0102@.
repl_user=repl
repl_password=Test0102@.
[server1]
hostname=192.168.200.41
port=3308
[server2]
hostname=192.168.200.42
port=3308
candidate_master=1
[server3]
hostname=192.168.200.43
port=3308
EOF
# 修改手动vip切换脚本
cat > /usr/local/bin/master_ip_failover << EOF
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
use MHA::DBHelper;
my (
$command, $ssh_user, $orig_master_host,
$orig_master_ip, $orig_master_port, $new_master_host,
$new_master_ip, $new_master_port, $new_master_user,
$new_master_password
);
##############该部分按实际修改
my $vip = '192.168.200.45/24';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig $ifdev:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig $ifdev:$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,
'new_master_user=s' => \$new_master_user,
'new_master_password=s' => \$new_master_password,
);
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();
# updating global catalog, etc
$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 $@;
# If you want to continue failover, exit 10.
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
# do nothing
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";
}
EOF
# 手动测试切换VIP/usr/local/bin/master_ip_failover
停
/usr/local/bin/master_ip_failover --command=stop --ssh_user=root --orig_master_host=192.168.200.42 --orig_master_ip=192.168.200.42 --orig_master_port=3308 --new_master_host=192.168.200.41 --new_master_ip=192.168.200.41 --new_master_port=3308
启
/usr/local/bin/master_ip_failover --command=start --ssh_user=root --orig_master_host=192.168.200.41 --orig_master_ip=192.168.200.41 --orig_master_port=3308 --new_master_host=192.168.200.42 --new_master_ip=192.168.200.42 --new_master_port=3308
# 自动切换脚本/usr/local/bin/master_ip_online_change
# MHA 检测ssh状态
masterha_check_ssh --conf=/etc/mha/mha.cnf
# MHA 检测mysql集群主从状态
masterha_check_repl --conf=/etc/mha/mha.cnf
# MHA Manager启动
nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &
# MHA Manager关闭
masterha_stop --conf=/etc/mha/mha.cnf