IP规划
管理主机 | mha | ||
要将稳定运行的服务器设置为manager节点,也就是管理主机,否则后续会出现mha由于服务器不稳定而频繁自动关闭的现象。(本次设置41要比42稳定,但是最后设置成42为管理节点,就频频因为卡顿而自动关闭mha)
系统配置
修改映射文件
如果有VIP的话,可以将VIP也写入文件(本次配置VIP为11.146.212.43 VIP)
vi /etc/hosts
#进入文件
11.146.212.41 master
11.146.212.42 worker
修改主服务器 从服务器节点的主机名
hostnamectl set-hostname master
su
hostnamectl set-hostname worker
su
关闭防火墙
systemctl stop firewalld #停止firewall
systemctl disable firewalld #禁止firewall开机启动
禁掉Selinux
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。
setenforce 0
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
修改limits.conf 文件
linux资源限制配置文件是/etc/security/limits.conf;限制用户进程的数量对于linux系统的稳定性非常重要。 limits.conf文件限制着用户可以使用的最大文件数,最大线程,最大内存等资源使用量。
(之前我都没设置过,本次是在查一些资料时候发现的,就设置了一下,但是没什么感觉)
vi /etc/security/limits.conf
#进入文件
mysql soft nproc 65535
mysql hard nproc 65535
mysql soft nofile 65535
mysql hard nofile 65535
配置SSH免密登录
集群环境ssh免密码登录设置_mq集群内部内服务器需要实现ssh免密认证码-CSDN博客
1.准备工作
本次使用xftp连接到Linux服务器,将需要配置免密登录的服务器同时打开,以便同时发送命令。
2.生产密钥文件
(1)编辑每台服务器上的hosts文件:vi /etc/hosts,映射文件已经设置过,此处不再赘述。
cd /root/.ssh/
#如果是新装的服务器,需要自己先手动创建该目录:mkdir -p /root/.ssh/
rm -rf id_rsa
rm -rf id_rsa.pub
#删除前确认是否有被其他服务器使用
(4)在每台服务器上都生成新的公钥私钥文件,输入命令后需要连续输入三次回车
此时要注意!配置免密的时候,大概率是需要互相通信主机的主机密码,这个主机密码我认为是xftp连接主机时候的密码(公司服务器需要找网络人员要主机密码),注意不是MySQL或者堡垒机的密码
ssh-keygen -t rsa
(5)拷贝id_rsa.pub文件内容到authorized_keys文件中
cat id_rsa.pub >> authorized_keys
#新服务器需要自己手动创建authorized_keys:touch authorized_keys
3.配置集群免密
每台服务器公钥私钥生产完成后,就需要将各自的密钥拷贝到其他服务器上,以11.146.212.41主机为例子:
(1)登录11.146.212.41服务器,进入公钥私钥存放的路径
cd /root/.ssh/
(2)拷贝其他公钥文件(id_rsa.pub)内容至其他服务器上:
ssh-copy-id -i 11.146.212.42 #拷贝公钥到11.146.212.42的authorized_keys中
ssh-copy-id -i others #拷贝公钥到others的authorized_keys中
#如果配置了hosts,也可以直接将IP替换成hostname。
#比如ssh-copy-id -i 11.146.212.42 命令替换成 ssh-copy-id -i worker
(3)同理在其他几台服务器上也进行相同的操作,将本机的公钥拷贝至其他服务器上的authorized_keys文件中,最终authorized_keys文件内容如下:
[root@master.ssh]# more authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAp7jp4a1/deK4B/eZW8kdiCQvzpKe4Id0uP0DdONFW85r
20rpH4ZpNSB7JNYFiqjMUPQ/2EWLXh7xoa9UntKsMVVcZr3BTiXRZ0Gx7IDacwz8Cq0qYrwUCMTKt7QF
xK5RwXyuZqDFjc2yC3/ZoqeyeLERFTll3ZLGeFsXhJjlkPTvtnvx0zX6lacPZL4VguoM5YHw3KaJg8bd
qehJzbQoPS8sm00ES4iygbR+Ixz1cnGTrtNU1S3lh4/y0PC6spMs9Z2Mf097FTLQJXJDiGqU9Tq3MHvl
srZFx92H4yeiJuYWJaZImuiq/feRIo30Dig6obEfuAn13vevdXozcXNlYQ== root@worker
chmod 600 /root/.ssh/authorized_keys
#效果如下,此时已经完成集群内免密的设置。
[root@hadoop01 .ssh]# ls -al
total 28
drwx------. 2 root root 4096 Oct 24 12:27 .
dr-xr-x---. 22 root root 4096 Oct 24 19:20 ..
-rw-------. 1 root root 1975 Oct 24 12:27 authorized_keys
-rw-------. 1 root root 1675 Oct 24 12:23 id_rsa
-rw-r--r--. 1 root root 395 Oct 24 12:23 id_rsa.pub
-rw-r--r--. 1 root root 2020 Oct 24 12:10 known_hosts
MySQL安装
准备内容
创建mysql用户
MySQL需要对某些文件拥有权限,才能自行建库,存放文件等的,所以要给其一个用户,并设置权限,深入的问题可以上网自行搜索
useradd mysql
passwd mysql #密码自行配置,这里用的密码是mysqlcode
创建安装目录
这个安装目录可以自己设置,但是要记住,后续的文件配置需要这个目录
mkdir -p /data/{log,data,tmp,binlog,relaylog}
卸载系统自带的mariadb
mariadb 是Linux 系统自带的数据库,可能会与MySQL 数据库的某些配置起冲突,在这里,我们需要先将其卸载。
rpm -qa|grep mariadb #查看mariadb版本
rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps
实施安装
解压安装文件
tar -xzvf /root/mysql-5.7.32-el7-x86_64.tar.gz -C /
mv /mysql-5.7.32-el7-x86_64 /mysql
chown -R mysql:mysql /mysql /data
#递归改变文件用户所有权(这样好像是给MySQL用户全委托,以便MySQL在创建或者删除文件时候有权限有目录)
配置mysql环境变量
echo >这个符号表示将命令的输出重定向到一个文件中。如果文件不存在,它会被创建;如果文件已经存在,它的内容会被覆盖。例如,echo “hello” > file.txt 会将字符串 “hello” 写入到 file.txt 文件中,覆盖原有内容。
cp /mysql/support-files/mysql.server /etc/init.d/mysqld
lfconfig
echo "PATH=$PATH:/mysql/bin" > /etc/profile.d/mysql.sh #为了添加路径在任何地方都可以启动MySQL
source /etc/profile.d/mysql.sh
#设置的环境变量,并没有真正生效,只是使用source 命令让临时运行,只能在当前终端生效,重新开启一个终端后,该环境变量失效,重启即可
chkconfig mysqld on
#chkConfig的用法, mysqld开机自启动
配置my.cnf
vi /etc/my.cnf
#(master-1和slave-2只有server_id不同,这个我查是只作为一个标志,区分服务器,没有实际意义)
[client]
socket=/mysql/mysql.sock
[mysqld]
port=3306
user=mysql
basedir=/mysql #mysql路径
socket=/mysql/mysql.sock
#加载半同步复制主备插件
plugin-load-add=semisync_master.so
plugin-load-add=semisync_slave.so
symbolic-links=0
log-error=/data/log/mysqld.log
slow_query_log_file=/data/log/slow.log
slow_query_log=1
long_query_time=0.3
#server_id三台分别是1,2,3
server_id=1
#开启gtid模式
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=1
binlog_checksum=NONE
log_slave_updates=ON
log_bin=/data/binlog/binlog
relay_log=/data/relaylog/relaylog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
datadir=/data/data
slave_parallel_type=LOGICAL_CLOCK
slave_preserve_commit_order=1
slave_parallel_workers =4
innodb_file_per_table
sync_binlog = 1
binlog-group-commit-sync-delay=20
binlog_group_commit_sync_no_delay_count=5
innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = ON
innodb_io_capacity = 5000
innodb_io_capacity_max=15000
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 200
innodb_spin_wait_delay = 6
innodb_status_file = 1
innodb_purge_threads=4
innodb_undo_log_truncate=1
innodb_max_undo_log_size=4G
innodb_use_native_aio = 1
innodb_autoinc_lock_mode = 2
log_slow_admin_statements=1
expire_logs_days=7
character-set-server=utf8mb4
collation-server= utf8mb4_bin
skip-name-resolve
lower_case_table_names
skip-external-locking
max_allowed_packet = 1024M
table_open_cache = 4000
table_open_cache_instances=16
max_connections = 4000
query_cache_size = 0
query_cache_type = 0
tmp_table_size = 1024M
max_heap_table_size = 1024M
innodb_log_files_in_group = 3
innodb_log_file_size = 1024M
innodb_flush_method= O_DIRECT
log_timestamps=SYSTEM
#三个节点auto_increment_offset的值可以跟server_id相同
auto_increment_offset=1
auto_increment_increment=6
explicit_defaults_for_timestamp
log_bin_trust_function_creators = 1
transaction-isolation = READ-COMMITTED
innodb_buffer_pool_instances=8
innodb_write_io_threads=4
innodb_read_io_threads=4
#生产环境增加
innodb_buffer_pool_size=2G
innodb_flush_log_at_trx_commit=1
#设置从节点应用relaylog后产生binlog
log_slave_updates=1
#设置不自动删除relaylog
#relay_log_purge=0
#设置增强半同步复制参数
rpl_semi_sync_master_wait_point= AFTER_SYNC
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
此处为大家附上这两个文件的区别,用于理解区分
初始化mysql
/mysql/bin/mysqld --user=mysql --basedir=/mysql --datadir=/data/data --initialize
主从节点都启动mysql服务
启动前先创建mysql日志文件
su - mysql
#`su`命令(代表"switchuser")是用于切换用户的命令。 它允许当前登录的用户切换到另一个用户账户,并在该账户下执行命令。
touch /data/log/mysqld.log
#touch用来创建新的空文件
exit
systemctl start mysqld
#确保启动没报错,ps -ef|grep mysql 可以看到进程
修改root密码
注意!此处强烈搭建小白将几台集群服务器的账号、密码设置为一样的,因为后续安装mha的时候会检查主机间的复制情况,这时会有三个用户需要填写到配置文件,此时搞不清哪个是哪个就会一直报错!所以设置为一致的,都一样也就间接避免了这个问题(大佬随意)
如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现。0不复制,1复制。
USE语句可以通知MySQL把<数据库名>所指示的数据库作为当前数据库,只有使用USE语句来指定某个数据库作为当前数据库之后,才能对该数据库及其存储的数据对象执行操作。use命令可以让我们来使用数据库,其格式为:use <数据库名>。
#(主从节点均需执行,注意root密码)
root初始密码查找: grep password /data/log/mysqld.log
mysql -uroot -p初始密码
mysql>SET SQL_LOG_BIN=0;
set password='master_41'; #worker_42worker_42
FLUSH PRIVILEGES;
use mysql;
update user set host = '%' where user = 'R00T_12344';
flush privileges;
SET SQL_LOG_BIN=1;
#select user,host from mysql.user 可以查看当前已开放
#如查询后root没有开放权限,尝试使用
GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'R00T_12344' WITH GRANT OPTION;
flush privileges;
MySQL的一些命令
systemctl status mysqld //查看MySQL运行状态
systemctl start mysqld //启动MySQL服务
systemctl restart mysqld //重启MySQL服务
主从配置
配置复制通道
2个从节点配置复制通道(worker2/worker3),本次搭建只有一个从节点worker
mysql>change master to master_host='master',master_port=3306,master_user='root',master_password='master_41',MASTER_AUTO_POSITION=1;
#配置前看好配置信息!新手后续更改比较费劲,会了就不费劲了
#因为开启了gtid,可以设置MASTER_AUTO_POSITION=1使主从复制自动按照gtid的位置复制
#此处的root用户可以改成自己的MySQL用户
#启动slave
mysql>START SLAVE;
#查看从库的状态
mysql>SHOW SLAVE STATUS\G;
#确保 :
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes
从库
stop slave;
reset slave;
change master to MASTER_AUTO_POSITION=0;
flush privileges;
主库
flush logs;
show master status; #要重新查看内容更改
从库
exit
systemctl restart mysqld
stop slave;
reset slave;
change master to
master_host="11.146.212.41",
master_user="root",
master_password="master_41",
master_log_file="binlog.000014",
master_log_pos=230;
#看主库新的内容后更改file
change master to MASTER_AUTO_POSITION=1;
start slave;
show slave status \G
Slave_IO_Running:connecting问题
此时若是
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
1.很有可能是因为3306端口未开放,因为之前已经配置过了防火墙,此时开启3306端口
开放端口,远程登录已经配置好了,可以Navicat 上试一下(已开通服务器到云桌面的网络权限),如果报错则查看端口,首先,退出sql 操作界面:
查看防火墙情况,正常来说是开启,但我们一开始就关闭了,此时应该是关闭状态:
systemctl status firewalld
配置端口对外开放,需要开启防火墙,
systemctl start firewalld
firewall-cmd --list-ports //查看开放的端口号,本次操作只有10050/tcp 端口开放
firewall-cmd --zone=public --add-port=3306/tcp --permanent
//开放3306端口
重新载入配置,使其生效:
firewall-cmd --reload
firewall-cmd --list-ports
此时再次在Navicat 进行连接,可以连接到数据库。
2.如果是开启端口和关闭防火墙都不成功的话,那可能是节点的账号权限不够,给节点授权之后即可(记得刷新,刷新后返回命令行模式进行重启MySQL服务)
GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'worker_42' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'master_41' WITH GRANT OPTION;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON * . * TO 'repluser'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
出现这个问题也需要重新授权
Slave_SQL_Running: No问题
此时若是
Slave_IO_Running: Yes
Slave_SQL_Running: No
出现如图所示的这种问题,其实错误原因有很多。这里遇到的问题是主从复制异常。主从复制异常的问题应该一般不会出现在刚搭建的集群上,因为该集群还未进行比较频繁的主从复制情况(个人判断,因为这个问题是我在高可用集群搭建完成后进行故障模拟时,反复关闭开启集群才遇到的)。
如果此时未开启GTID的集群则用以下命令:
set global sql_slave_skip_counter=1;
本次搭建使用GTID,所以用以上命令会报错
ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction
这时可以通过查看当前worker节点的情况,查看报错的GTID点,跳过即可,如果有多个则重复执行,正如上面图片中框出的则是报错的点,将框中信息填入下面的命令后执行即可:
stop slave ;
set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298637'; #如有多个报错点,则重复执行该命令
begin; #如有多个报错点,则重复执行该命令
commit; #如有多个报错点,则重复执行该命令
set @@session.gtid_next=automatic;
start slave;
从节点开启super_read_only (slave只读)
set global super_read_only=1;
测试是否设置同步成功(可选)
上面完成设置同步,下面进行测试,新手上面安装没问题就先往后走,要不会卡住,不过确实建议试试。
主节点创建test库(master)
主库
mysql>
show databases;
create database test;
use test;
create table test (id int primary key);
insert into test values(1);
select * from test;
主库
DROP DATABASE [ IF EXISTS ] <数据库名>;
测试主从切换
主节点从master节点切换成worker节点
#从节点worker:(新主节点)
mysql>
stop slave;
set global read_only=0; #关闭只读,可以读写
#原主节点master:
mysql>
set global super_read_only=1;
stop slave;
reset slave;
change master to master_host='worker',master_port=3306,master_user='root',master_password='worker_42',master_log_file="binlog.000005",master_log_pos=230;
change master to MASTER_AUTO_POSITION=1;
start slave;
show slave status \G
主节点从worker节点切换成master节点
#从节点master:(新主节点)
mysql>
stop slave;
set global read_only=0;
#原主节点worker:
mysql>
set global super_read_only=1;
stop slave;
reset slave;
change master to master_host='master',master_port=3306,master_user='root',master_password='master_41',master_log_file="binlog.000009",master_log_pos=2091;
change master to MASTER_AUTO_POSITION=1;
start slave;
show slave status \G
MHA安装及配置
安装Node软件以及依赖包(master,worker)
tar zxf mha-node-dep.tar.gz #node依赖
rpm -ivh node/*
安装Manager软件(worker)
#管理节点安装Manager软件
#需要安装依赖
tar zxf mha-manager-dep.tar.gz #manager依赖
rpm -ivh manager/*
验证manager版本(worker)
masterha_manager -v #注意此时就会报错,大概是安装依赖有问题什么的
此时报错证明没有安装好mha的manager,证明node也没有安装好,所以要先把需要的依赖先安装好
#打开外网权限
41和42都开了外网的权限
#先备份,后删除,再下载阿里云文件,清除缓存
rm -f /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
rpm -ivh epel-release-latest-7.noarch.rpm
yum install perl-DBD-MySQL
yum install perl-Config-Tiny
yum install perl-Log-Dispatch
yum install perl-Parallel-ForkManager
用which is masterha_check_ssh,来看masterha_check_ssh命令的路径
配置ssh免密(master,worker)
建立配置文件目录(worker)
mkdir -p /etc/mha/{conf,log,scripts}
创建配置文件(worker)
vi /etc/mha/conf/mha.cnf
#注意修改里面的ip,路径,用户,密码等(password与repl_password均为mysql密码)
#进入
[server default]
manager_log=/etc/mha/log/manager.log
manager_workdir=/etc/mha/log
master_binlog_dir=/data/binlog
#failover和switchover脚本
master_ip_failover_script=/etc/mha/scripts/master_ip_failover
master_ip_online_change_script=/etc/mha/scripts/master_ip_online_change
user=root
password=worker_42
#配置检查主节点的次数
ping_interval=3
repl_password=123456
repl_user=repluser
ssh_user=root
ssh_port=22
# masters
[server1]
hostname=11.146.212.41
port=3306
#cadidate_master为1表示优先考虑此节点转为主节点
candidate_master=1
master_binlog_dir=/data/binlog
remote_workdir=/etc/mha/log
[server2]
hostname=11.146.212.42
port=3306
candidate_master=1
check_repl_delay=0
master_binlog_dir=/data/binlog
remote_workdir=/etc/mha/log
注意:
配置中引用的脚本在附件里面,需要修改脚本master_ip_failover/master_ip_online_change中的my $vip和my $ifdev,代表vip和网卡名称,并上传到db3目录/etc/mha/scripts/
脚本添加执行权限(worker)
#将脚本文件移到./etc/mha/scripts/中
chmod +x /etc/mha/scripts/*
脚本中记着修改vip地址以及用户密码,均为后续需要登录的数据库密码,方便切换主从。
ssh免密检查(worker)
masterha_check_ssh --conf=/etc/mha/conf/mha.cnf
#输出如下
. . .
[info] All SSH connection tests passed successfully.
各节点复制情况检查(worker)
masterha_check_repl --conf=/etc/mha/conf/mha.cnf
#Result:Checking the Status of the script.. OK
# MySQL Replication Health is OK.
#not ok的话是出了一些问题
ln -s /usr/share/perl5/vendor_perl/MHA /usr/lib64/perl5/vendor_perl/
问题汇总
1.以下问题需要重新创建一个用户(在主/从节点都设置,名字、密码一致比较好理解),然后再mha.cnf文件修改user的值和响应的密码即可
[root@worker usr]# masterha_check_repl --conf=/etc/mha/conf/mha.cnf
Wed Apr 17 14:49:10 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Apr 17 14:49:10 2024 - [info] Reading application default configuration from /etc/mha/conf/mha.cnf..
Wed Apr 17 14:49:10 2024 - [info] Reading server configuration from /etc/mha/conf/mha.cnf..
Wed Apr 17 14:49:10 2024 - [info] MHA::MasterMonitor version 0.58.
Wed Apr 17 14:49:10 2024 - [error][/usr/share/perl5/vendor_perl/MHA/Server.pm, ln180] Got MySQL error when connecting 11.146.212.42(11.146.212.42:3306) :1045:Access denied for user 'root'@'11.146.212.42' (using password: YES), but this is not a MySQL crash. Check MySQL server settings.
Wed Apr 17 14:49:10 2024 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301] at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 297.
Wed Apr 17 14:49:10 2024 - [error][/usr/share/perl5/vendor_perl/MHA/Server.pm, ln180] Got MySQL error when connecting 11.146.212.41(11.146.212.41:3306) :1045:Access denied for user 'root'@'11.146.212.42' (using password: YES), but this is not a MySQL crash. Check MySQL server settings.
Wed Apr 17 14:49:10 2024 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301] at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 297.
Wed Apr 17 14:49:11 2024 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln309] Got fatal error, stopping operations
Wed Apr 17 14:49:11 2024 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. at /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm line 329.
Wed Apr 17 14:49:11 2024 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Apr 17 14:49:11 2024 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
2.下面的情况重新设置如下即可
[root@worker ~]# masterha_check_repl --conf=/etc/mha/conf/mha.cnf
Fri Apr 19 08:48:39 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Apr 19 08:48:39 2024 - [info] Reading application default configuration from /etc/mha/conf/mha.cnf..
Fri Apr 19 08:48:39 2024 - [info] Reading server configuration from /etc/mha/conf/mha.cnf..
Fri Apr 19 08:48:39 2024 - [info] MHA::MasterMonitor version 0.58.
Fri Apr 19 08:48:40 2024 - [error][/usr/lib64/perl5/vendor_perl/MHA/Server.pm, ln265] Checking slave status failed on 11.146.212.41(11.146.212.41:3306). err=Got error when executing SHOW SLAVE STATUS. Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation
Fri Apr 19 08:48:40 2024 - [error][/usr/lib64/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. at /usr/lib64/perl5/vendor_perl/MHA/ServerManager.pm line 315.
Fri Apr 19 08:48:40 2024 - [error][/usr/lib64/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Fri Apr 19 08:48:40 2024 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)
mysql>
检查manager的状态(worker)
masterha_check_status --conf=/etc/mha/conf/mha.cnf
# mha is stopped(2:NOT_RUNNING).
此处还未启动,停止状态为正常结果。
Master 节点上手动开启虚拟IP(worker)
# 虚拟ip与之前在脚本中配置的保持一直,选用未占用的地址
# 用于切换主从时ip指向最新的主库
/sbin/ip addr add 11.146.212.43/24 dev ens160 label ens160:1(添加)
/sbin/ip addr del 11.146.212.43/24 dev ens160 label ens160:1(删除)(需要时再用,后续故障模拟时候会用到)
# 可参考/etc/mha/scripts/master_ip_failover 中的命令,虚拟ip详细地址参选主机同网段空心地址,ens从ifconfig配置中查看本机网卡再填入
启动manager(worker)
nohup masterha_manager --conf=/etc/mha/conf/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/log/manager.log 2>&1 &
--remove_dead_master_conf 删除宕机主机配置
--ignore_last_failover 任何时间出现错误都会进行切换
# 检查日志
tail -f /etc/mha/log/manager.log
...
Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
...
检查日志这时候可能会比较卡,可能是我服务器本身就比较卡,而且会报错VIP的问题
USE of uninitialized value $ssh_user in concatenation (.) or string at /etc/mha/scripts/master_ip_failover ;ine 77.
Failed to deactivate master IP eith return code 1:0
GOT ERROE: at /usr/bin/masterha_manager line 65.
got error so couldn't continue failover from here
这时检查复制状态,如果显示IO:NO,重启MySQL,再设置read_only为1
再次检查manager状态(worker)
masterha_check_status --conf=/etc/mha/conf/mha.cnf
#mha (pid:20102) is running(0:PING_OK), master:192.168.253.100
停止当前的mha(worker)
masterha_stop --conf=/etc/mha/conf/mha.cnf
VIP专题
VIP的配置
在进行MHA文件配置的时候,scripts文件夹下面的两个文件都需要配置VIP的信息,VIP是由自己设置的虚拟IP,可以根据自己集群的ip来设计,比如我这里是11.146.212.41、11.146.212.42,所以VIP就定为11.146.212.43,而且要确保43不与其他ip冲突,是一个无人使用的状态。VIP使用的网卡是配置VIP的主机网卡。而且在云桌面或者其他平台连接VIP时,要确保该平台到VIP的网络是通的。
VIP连接无法写入
当连接VIP进行写入的操作时,因为配置不当可能会报错,具体可查看:The MySQL server is running with the –read-only option so it cannot execute this statement_the mysql server is running with the --read-only o-CSDN博客
ERROR:The MySQL server is running with the –read-only option so it cannot execute this statement
这样一般有两种情况,我目前也只碰到这两种情况:
1.连到从库了,主库设置了只读,所以无法读写。大概率是像我一开始那样,设置manager节点在从库42上,所以VIP的配置也在从库42上面,之后再将41作为manager节点后,没有删除从库42上面的网卡等信息,导致连接VIP连接从库无法写入。
2.主库不小心之下也设置了只读。这种情况就比较少了,设置可写入即可。
附件
链接: https://pan.baidu.com/s/1AU-gQ9lLeOxMXKexEqK4lQ
提取码: 6k3x
至此,恭喜你已经完成MySQL高可用集群(一主一从)的搭建,一路以来我们一起解决了很多问题,放松一下吧!