MySQL高可用集群搭建(一主一从)

IP规划

IP地址

主从同步角色

集群角色

主机名

11.146.212.41

主库

当前主库

master

 

管理主机

mha

11.146.212.42

从库

备用主库

worker

11.146.212.23

VIP地址

要将稳定运行的服务器设置为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,映射文件已经设置过,此处不再赘述。

(2)进入rsa公钥私钥的存放目录

cd /root/.ssh/

#如果是新装的服务器,需要自己先手动创建该目录:mkdir -p /root/.ssh/

(3)删除目录下的id_rsa,id_rsa.pub文件

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

(4)授权authorized_keys文件:

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

rpm -e 卸载已安装的rpm包

rpm -e --nodeps 不管依赖,强行卸载

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 文件中,覆盖原有内容。

此时还没有mysql.sh这个文件

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

(此时还没有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)

#master上插入数据,检查worker是否数据同步

主库

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)

下面文件中的网卡是指定VIP绑定的网卡

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高可用集群(一主一从)的搭建,一路以来我们一起解决了很多问题,放松一下吧!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值