当前位置:   article > 正文

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

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)

  1. vi /etc/hosts
  2. #进入文件
  3. 11.146.212.41 master
  4. 11.146.212.42 worker

修改主服务器  从服务器节点的主机名

  1. hostnamectl set-hostname master
  2. su
  3. hostnamectl set-hostname worker
  4. su

关闭防火墙

  1. systemctl stop firewalld              #停止firewall
  2. systemctl disable firewalld           #禁止firewall开机启动

禁掉Selinux

安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。

  1. setenforce 0
  2. sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

修改limits.conf 文件

linux资源限制配置文件是/etc/security/limits.conf;限制用户进程的数量对于linux系统的稳定性非常重要。 limits.conf文件限制着用户可以使用的最大文件数,最大线程,最大内存等资源使用量。

(之前我都没设置过,本次是在查一些资料时候发现的,就设置了一下,但是没什么感觉)

  1. vi /etc/security/limits.conf
  2. #进入文件
  3. mysql        soft  nproc      65535
  4. mysql        hard  nproc      65535
  5. mysql        soft  nofile     65535
  6. mysql        hard  nofile     65535

配置SSH免密登录

具体可参照这篇博文:

集群环境ssh免密码登录设置_mq集群内部内服务器需要实现ssh免密认证码-CSDN博客

1.准备工作

本次使用xftp连接到Linux服务器,将需要配置免密登录的服务器同时打开,以便同时发送命令。

2.生产密钥文件

(1)编辑每台服务器上的hosts文件:vi /etc/hosts,映射文件已经设置过,此处不再赘述。

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

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

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

  1. rm -rf id_rsa
  2. rm -rf id_rsa.pub
  3. #删除前确认是否有被其他服务器使用

(4)在每台服务器上都生成新的公钥私钥文件,输入命令后需要连续输入三次回车

此时要注意!配置免密的时候,大概率是需要互相通信主机的主机密码,这个主机密码我认为是xftp连接主机时候的密码(公司服务器需要找网络人员要主机密码),注意不是MySQL或者堡垒机的密码

ssh-keygen -t rsa

(5)拷贝id_rsa.pub文件内容到authorized_keys文件中

  1. cat id_rsa.pub >> authorized_keys
  2. #新服务器需要自己手动创建authorized_keys:touch authorized_keys

3.配置集群免密

每台服务器公钥私钥生产完成后,就需要将各自的密钥拷贝到其他服务器上,以11.146.212.41主机为例子:

(1)登录11.146.212.41服务器,进入公钥私钥存放的路径

cd /root/.ssh/

(2)拷贝其他公钥文件(id_rsa.pub)内容至其他服务器上:

  1. ssh-copy-id -i 11.146.212.42   #拷贝公钥到11.146.212.42的authorized_keys中
  2. ssh-copy-id -i others    #拷贝公钥到others的authorized_keys中
  3. #如果配置了hosts,也可以直接将IP替换成hostname。
  4. #比如ssh-copy-id -i 11.146.212.42 命令替换成 ssh-copy-id -i worker

(3)同理在其他几台服务器上也进行相同的操作,将本机的公钥拷贝至其他服务器上的authorized_keys文件中,最终authorized_keys文件内容如下:

  1. [root@master.ssh]# more authorized_keys
  2. ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAp7jp4a1/deK4B/eZW8kdiCQvzpKe4Id0uP0DdONFW85r
  3. 20rpH4ZpNSB7JNYFiqjMUPQ/2EWLXh7xoa9UntKsMVVcZr3BTiXRZ0Gx7IDacwz8Cq0qYrwUCMTKt7QF
  4. xK5RwXyuZqDFjc2yC3/ZoqeyeLERFTll3ZLGeFsXhJjlkPTvtnvx0zX6lacPZL4VguoM5YHw3KaJg8bd
  5. qehJzbQoPS8sm00ES4iygbR+Ixz1cnGTrtNU1S3lh4/y0PC6spMs9Z2Mf097FTLQJXJDiGqU9Tq3MHvl
  6. srZFx92H4yeiJuYWJaZImuiq/feRIo30Dig6obEfuAn13vevdXozcXNlYQ== root@worker

(4)授权authorized_keys文件:

  1. chmod 600 /root/.ssh/authorized_keys
  2. #效果如下,此时已经完成集群内免密的设置。
  3. [root@hadoop01 .ssh]# ls -al
  4. total 28
  5. drwx------. 2 root root 4096 Oct 24 12:27 .
  6. dr-xr-x---. 22 root root 4096 Oct 24 19:20 ..
  7. -rw-------. 1 root root 1975 Oct 24 12:27 authorized_keys
  8. -rw-------. 1 root root 1675 Oct 24 12:23 id_rsa
  9. -rw-r--r--. 1 root root 395 Oct 24 12:23 id_rsa.pub
  10. -rw-r--r--. 1 root root 2020 Oct 24 12:10 known_hosts

MySQL安装

准备内容

创建mysql用户

MySQL需要对某些文件拥有权限,才能自行建库,存放文件等的,所以要给其一个用户,并设置权限,深入的问题可以上网自行搜索

  1. useradd mysql
  2. passwd mysql #密码自行配置,这里用的密码是mysqlcode

创建安装目录

这个安装目录可以自己设置,但是要记住,后续的文件配置需要这个目录

mkdir -p  /data/{log,data,tmp,binlog,relaylog}

卸载系统自带的mariadb

rpm -e 卸载已安装的rpm包

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

mariadb 是Linux 系统自带的数据库,可能会与MySQL 数据库的某些配置起冲突,在这里,我们需要先将其卸载。

  1. rpm -qa|grep mariadb #查看mariadb版本
  2. rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps

实施安装

解压安装文件

  1. tar -xzvf /root/mysql-5.7.32-el7-x86_64.tar.gz -C /
  2. mv /mysql-5.7.32-el7-x86_64 /mysql
  3. chown -R mysql:mysql /mysql /data     
  4. #递归改变文件用户所有权(这样好像是给MySQL用户全委托,以便MySQL在创建或者删除文件时候有权限有目录)

配置mysql环境变量

echo >这个符号表示将命令的输出重定向到一个文件中。如果文件不存在,它会被创建;如果文件已经存在,它的内容会被覆盖。例如,echo “hello” > file.txt 会将字符串 “hello” 写入到 file.txt 文件中,覆盖原有内容。

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

  1. cp /mysql/support-files/mysql.server /etc/init.d/mysqld
  2. lfconfig
  3. echo "PATH=$PATH:/mysql/bin" > /etc/profile.d/mysql.sh #为了添加路径在任何地方都可以启动MySQL
  4. source /etc/profile.d/mysql.sh
  5. #设置的环境变量,并没有真正生效,只是使用source 命令让临时运行,只能在当前终端生效,重新开启一个终端后,该环境变量失效,重启即可
  6. chkconfig mysqld on
  7. #chkConfig的用法, mysqld开机自启动

配置my.cnf

(此时还没有my.cnf这个文件)

  1. vi /etc/my.cnf
  2. #(master-1和slave-2只有server_id不同,这个我查是只作为一个标志,区分服务器,没有实际意义)
  1. [client]
  2. socket=/mysql/mysql.sock
  3. [mysqld]
  4. port=3306
  5. user=mysql
  6. basedir=/mysql #mysql路径
  7. socket=/mysql/mysql.sock
  8. #加载半同步复制主备插件
  9. plugin-load-add=semisync_master.so
  10. plugin-load-add=semisync_slave.so
  11. symbolic-links=0
  12. log-error=/data/log/mysqld.log
  13. slow_query_log_file=/data/log/slow.log
  14. slow_query_log=1
  15. long_query_time=0.3
  16. #server_id三台分别是1,2,3
  17. server_id=1
  18. #开启gtid模式
  19. gtid_mode=ON
  20. enforce_gtid_consistency=ON
  21. master_info_repository=TABLE
  22. relay_log_info_repository=TABLE
  23. relay_log_recovery=1
  24. binlog_checksum=NONE
  25. log_slave_updates=ON
  26. log_bin=/data/binlog/binlog
  27. relay_log=/data/relaylog/relaylog
  28. binlog_format=ROW
  29. transaction_write_set_extraction=XXHASH64
  30. datadir=/data/data
  31. slave_parallel_type=LOGICAL_CLOCK
  32. slave_preserve_commit_order=1
  33. slave_parallel_workers =4  
  34. innodb_file_per_table
  35. sync_binlog = 1
  36. binlog-group-commit-sync-delay=20  
  37. binlog_group_commit_sync_no_delay_count=5  
  38. innodb_lock_wait_timeout = 50
  39. innodb_rollback_on_timeout = ON
  40. innodb_io_capacity = 5000  
  41. innodb_io_capacity_max=15000
  42. innodb_thread_concurrency = 0
  43. innodb_sync_spin_loops = 200
  44. innodb_spin_wait_delay = 6
  45. innodb_status_file = 1
  46. innodb_purge_threads=4
  47. innodb_undo_log_truncate=1  
  48. innodb_max_undo_log_size=4G
  49. innodb_use_native_aio = 1
  50. innodb_autoinc_lock_mode = 2
  51. log_slow_admin_statements=1
  52. expire_logs_days=7  
  53. character-set-server=utf8mb4
  54. collation-server= utf8mb4_bin
  55. skip-name-resolve
  56. lower_case_table_names
  57. skip-external-locking
  58. max_allowed_packet = 1024M
  59. table_open_cache = 4000
  60. table_open_cache_instances=16
  61. max_connections = 4000
  62. query_cache_size = 0
  63. query_cache_type = 0
  64. tmp_table_size = 1024M
  65. max_heap_table_size = 1024M
  66. innodb_log_files_in_group = 3
  67. innodb_log_file_size = 1024M
  68. innodb_flush_method= O_DIRECT
  69. log_timestamps=SYSTEM
  70. #三个节点auto_increment_offset的值可以跟server_id相同
  71. auto_increment_offset=1
  72. auto_increment_increment=6  
  73. explicit_defaults_for_timestamp
  74. log_bin_trust_function_creators = 1
  75. transaction-isolation = READ-COMMITTED
  76. innodb_buffer_pool_instances=8
  77. innodb_write_io_threads=4  
  78. innodb_read_io_threads=4
  79. #生产环境增加
  80. innodb_buffer_pool_size=2G  
  81. innodb_flush_log_at_trx_commit=1
  82. #设置从节点应用relaylog后产生binlog
  83. log_slave_updates=1
  84. #设置不自动删除relaylog
  85. #relay_log_purge=0
  86. #设置增强半同步复制参数
  87. rpl_semi_sync_master_wait_point= AFTER_SYNC
  88. rpl_semi_sync_master_enabled=1
  89. rpl_semi_sync_master_timeout=1000
  90. rpl_semi_sync_slave_enabled=1
  91. 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服务

  1. 启动前先创建mysql日志文件
  2. su - mysql
  3. #`su`命令(代表"switchuser")是用于切换用户的命令。 它允许当前登录的用户切换到另一个用户账户,并在该账户下执行命令。
  4. touch /data/log/mysqld.log
  5. #touch用来创建新的空文件
  6. exit
  7. systemctl start mysqld
  8. #确保启动没报错,ps -ef|grep mysql 可以看到进程

修改root密码

注意!此处强烈搭建小白将几台集群服务器的账号、密码设置为一样的,因为后续安装mha的时候会检查主机间的复制情况,这时会有三个用户需要填写到配置文件,此时搞不清哪个是哪个就会一直报错!所以设置为一致的,都一样也就间接避免了这个问题(大佬随意)

如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现。0不复制,1复制。

USE语句可以通知MySQL把<数据库名>所指示的数据库作为当前数据库,只有使用USE语句来指定某个数据库作为当前数据库之后,才能对该数据库及其存储的数据对象执行操作use命令可以让我们来使用数据库,其格式为:use <数据库名>。

  1. #(主从节点均需执行,注意root密码)
  2. root初始密码查找: grep password  /data/log/mysqld.log
  3. mysql -uroot -p初始密码
  4. mysql>SET SQL_LOG_BIN=0;
  5. set password='master_41';   #worker_42worker_42
  6. FLUSH PRIVILEGES;
  7. use mysql;
  8. update user set host = '%' where user = 'R00T_12344';
  9. flush privileges;
  10. SET SQL_LOG_BIN=1;

  1. #select user,host from mysql.user 可以查看当前已开放
  2. #如查询后root没有开放权限,尝试使用  
  3. GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'R00T_12344' WITH GRANT OPTION;
  4. flush privileges;

MySQL的一些命令
  1. systemctl status mysqld  //查看MySQL运行状态
  2. systemctl start mysqld //启动MySQL服务
  3. systemctl restart mysqld //重启MySQL服务

主从配置

配置复制通道

2个从节点配置复制通道(worker2/worker3),本次搭建只有一个从节点worker

  1. mysql>change master to master_host='master',master_port=3306,master_user='root',master_password='master_41',MASTER_AUTO_POSITION=1;
  2. #配置前看好配置信息!新手后续更改比较费劲,会了就不费劲了
  3. #因为开启了gtid,可以设置MASTER_AUTO_POSITION=1使主从复制自动按照gtid的位置复制
  4. #此处的root用户可以改成自己的MySQL用户

从节点启动复制进程并检查复制状态

  1. #启动slave
  2. mysql>START SLAVE;
  3. #查看从库的状态
  4. mysql>SHOW SLAVE STATUS\G;
  5. #确保 :
  6. #Slave_IO_Running: Yes
  7. #Slave_SQL_Running: Yes

如需重新更改同步配置,如下:

  1. 从库
  2. stop slave;
  3. reset slave;
  4. change master to MASTER_AUTO_POSITION=0;
  5. flush privileges;
  6. 主库
  7. flush logs;
  8. show master status; #要重新查看内容更改
  9. 从库
  10. exit
  11. systemctl restart mysqld
  12. stop slave;
  13. reset slave;
  14. change master to
  15. master_host="11.146.212.41",
  16. master_user="root",
  17. master_password="master_41",
  18. master_log_file="binlog.000014",
  19. master_log_pos=230;
  20. #看主库新的内容后更改file
  21. change master to MASTER_AUTO_POSITION=1;
  22. start slave;
  23. show slave status \G

Slave_IO_Running:connecting问题

此时若是

Slave_IO_Running: Connecting

Slave_SQL_Running: Yes

1.很有可能是因为3306端口未开放,因为之前已经配置过了防火墙,此时开启3306端口

开放端口,远程登录已经配置好了,可以Navicat 上试一下(已开通服务器到云桌面的网络权限),如果报错则查看端口,首先,退出sql 操作界面:

查看防火墙情况,正常来说是开启,但我们一开始就关闭了,此时应该是关闭状态:

systemctl status firewalld

配置端口对外开放,需要开启防火墙,

  1. systemctl start firewalld
  2. firewall-cmd --list-ports //查看开放的端口号,本次操作只有10050/tcp 端口开放
  3. firewall-cmd --zone=public --add-port=3306/tcp --permanent
  4. //开放3306端口

重新载入配置,使其生效:

  1. firewall-cmd --reload
  2. firewall-cmd --list-ports

此时再次在Navicat 进行连接,可以连接到数据库。

2.如果是开启端口和关闭防火墙都不成功的话,那可能是节点的账号权限不够,给节点授权之后即可(记得刷新,刷新后返回命令行模式进行重启MySQL服务)
  1. GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'worker_42' WITH GRANT OPTION;
  2. GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' IDENTIFIED BY 'master_41' WITH GRANT OPTION;
  3. FLUSH PRIVILEGES;
  4. 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点,跳过即可,如果有多个则重复执行,正如上面图片中框出的则是报错的点,将框中信息填入下面的命令后执行即可:

  1. stop slave ;
  2. set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298637'; #如有多个报错点,则重复执行该命令
  3. begin; #如有多个报错点,则重复执行该命令
  4. commit; #如有多个报错点,则重复执行该命令
  5. set @@session.gtid_next=automatic;
  6. start slave;

从节点开启super_read_only (slave只读)

set global super_read_only=1;

测试是否设置同步成功(可选)

上面完成设置同步,下面进行测试,新手上面安装没问题就先往后走,要不会卡住,不过确实建议试试。

主节点创建test库(master)

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

  1. 主库
  2. mysql>
  3. show databases;
  4. create database test;
  5. use test;
  6. create table test (id int primary key);
  7. insert into test values(1);
  8. select * from test;
  9. 主库
  10. DROP DATABASE [ IF EXISTS ] <数据库名>

测试主从切换
  1. 主节点从master节点切换成worker节点
  2. #从节点worker:(新主节点)
  3. mysql>
  4. stop slave;
  5. set global read_only=0; #关闭只读,可以读写
  6. #原主节点master:
  7. mysql>
  8. set global super_read_only=1;
  9. stop slave;
  10. reset slave;
  11. 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;
  12. change master to MASTER_AUTO_POSITION=1;
  13. start slave;
  14. show slave status \G
  15. 主节点从worker节点切换成master节点
  16. #从节点master:(新主节点)
  17. mysql>
  18. stop slave;
  19. set global read_only=0;
  20. #原主节点worker:
  21. mysql>
  22. set global super_read_only=1;
  23. stop slave;
  24. reset slave;
  25. 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;
  26. change master to MASTER_AUTO_POSITION=1;
  27. start slave;
  28. show slave status \G

MHA安装及配置

安装Node软件以及依赖包(master,worker)

  1. tar zxf mha-node-dep.tar.gz #node依赖
  2. rpm -ivh node/*

安装Manager软件(worker)

  1. #管理节点安装Manager软件
  2. #需要安装依赖
  3. tar zxf mha-manager-dep.tar.gz  #manager依赖
  4. rpm -ivh manager/*

验证manager版本(worker)

masterha_manager  -v #注意此时就会报错,大概是安装依赖有问题什么的

此时报错证明没有安装好mha的manager,证明node也没有安装好,所以要先把需要的依赖先安装好

  1. #打开外网权限
  2. 4142都开了外网的权限
  3. #先备份,后删除,再下载阿里云文件,清除缓存
  4. rm -f /etc/yum.repos.d/*
  5. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  6. rpm -ivh epel-release-latest-7.noarch.rpm
  7. yum install perl-DBD-MySQL
  8. yum install perl-Config-Tiny
  9. yum install perl-Log-Dispatch
  10. 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绑定的网卡

  1. vi /etc/mha/conf/mha.cnf
  2. #注意修改里面的ip,路径,用户,密码等(password与repl_password均为mysql密码)
  3. #进入
  4. [server default]
  5. manager_log=/etc/mha/log/manager.log
  6. manager_workdir=/etc/mha/log
  7. master_binlog_dir=/data/binlog
  8. #failover和switchover脚本
  9. master_ip_failover_script=/etc/mha/scripts/master_ip_failover
  10. master_ip_online_change_script=/etc/mha/scripts/master_ip_online_change
  11. user=root
  12. password=worker_42
  13. #配置检查主节点的次数
  14. ping_interval=3
  15. repl_password=123456
  16. repl_user=repluser
  17. ssh_user=root
  18. ssh_port=22
  19. # masters
  20. [server1]
  21. hostname=11.146.212.41
  22. port=3306
  23. #cadidate_master为1表示优先考虑此节点转为主节点
  24. candidate_master=1
  25. master_binlog_dir=/data/binlog
  26. remote_workdir=/etc/mha/log
  27. [server2]
  28. hostname=11.146.212.42
  29. port=3306
  30. candidate_master=1
  31. check_repl_delay=0
  32. master_binlog_dir=/data/binlog
  33. remote_workdir=/etc/mha/log

注意:

配置中引用的脚本在附件里面,需要修改脚本master_ip_failover/master_ip_online_change中的my $vip和my $ifdev,代表vip和网卡名称,并上传到db3目录/etc/mha/scripts/

脚本添加执行权限(worker)

  1. #将脚本文件移到./etc/mha/scripts/
  2. chmod +x /etc/mha/scripts/*
  3. 脚本中记着修改vip地址以及用户密码,均为后续需要登录的数据库密码,方便切换主从。

ssh免密检查(worker)

  1. masterha_check_ssh --conf=/etc/mha/conf/mha.cnf
  2. #输出如下
  3. . . .
  4. [info] All SSH connection tests passed successfully.

各节点复制情况检查(worker)

  1. masterha_check_repl --conf=/etc/mha/conf/mha.cnf
  2. #Result:Checking the Status of the script.. OK
  3. #       MySQL Replication Health is OK.
  4. #not ok的话是出了一些问题
  5. ln -s /usr/share/perl5/vendor_perl/MHA /usr/lib64/perl5/vendor_perl/

问题汇总

1.以下问题需要重新创建一个用户(在主/从节点都设置,名字、密码一致比较好理解),然后再mha.cnf文件修改user的值和响应的密码即可
  1. [root@worker usr]# masterha_check_repl --conf=/etc/mha/conf/mha.cnf
  2. Wed Apr 17 14:49:10 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
  3. Wed Apr 17 14:49:10 2024 - [info] Reading application default configuration from /etc/mha/conf/mha.cnf..
  4. Wed Apr 17 14:49:10 2024 - [info] Reading server configuration from /etc/mha/conf/mha.cnf..
  5. Wed Apr 17 14:49:10 2024 - [info] MHA::MasterMonitor version 0.58.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. Wed Apr 17 14:49:11 2024 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln309] Got fatal error, stopping operations
  11. 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.
  12. Wed Apr 17 14:49:11 2024 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
  13. Wed Apr 17 14:49:11 2024 - [info] Got exit code 1 (Not master dead).
  14. MySQL Replication Health is NOT OK!

2.下面的情况重新设置如下即可
  1. [root@worker ~]# masterha_check_repl --conf=/etc/mha/conf/mha.cnf
  2. Fri Apr 19 08:48:39 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
  3. Fri Apr 19 08:48:39 2024 - [info] Reading application default configuration from /etc/mha/conf/mha.cnf..
  4. Fri Apr 19 08:48:39 2024 - [info] Reading server configuration from /etc/mha/conf/mha.cnf..
  5. Fri Apr 19 08:48:39 2024 - [info] MHA::MasterMonitor version 0.58.
  6. 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
  7. 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.
  8. Fri Apr 19 08:48:40 2024 - [error][/usr/lib64/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
  9. Fri Apr 19 08:48:40 2024 - [info] Got exit code 1 (Not master dead).
  10. MySQL Replication Health is NOT OK!

  1. mysql> set global read_only=1;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql>

检查manager的状态(worker)

  1. masterha_check_status --conf=/etc/mha/conf/mha.cnf
  2. # mha is stopped(2:NOT_RUNNING).
  3. 此处还未启动,停止状态为正常结果。

Master 节点上手动开启虚拟IP(worker)

  1. # 虚拟ip与之前在脚本中配置的保持一直,选用未占用的地址
  2. # 用于切换主从时ip指向最新的主库
  3. /sbin/ip addr add 11.146.212.43/24 dev ens160 label ens160:1(添加)
  4. /sbin/ip addr del 11.146.212.43/24 dev ens160 label ens160:1(删除)(需要时再用,后续故障模拟时候会用到)
  5. # 可参考/etc/mha/scripts/master_ip_failover 中的命令,虚拟ip详细地址参选主机同网段空心地址,ens从ifconfig配置中查看本机网卡再填入

启动manager(worker)

  1. 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 &
  2. --remove_dead_master_conf 删除宕机主机配置
  3. --ignore_last_failover 任何时间出现错误都会进行切换
  4. # 检查日志
  5. tail -f /etc/mha/log/manager.log
  6. ...
  7. Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
  8. ...

检查日志这时候可能会比较卡,可能是我服务器本身就比较卡,而且会报错VIP的问题

  1. USE of uninitialized value $ssh_user in concatenation (.)  or string at /etc/mha/scripts/master_ip_failover ;ine 77.
  2. Failed to deactivate master IP eith return code 1:0
  3. GOT ERROE: at /usr/bin/masterha_manager line 65.
  4. got error so couldn't continue failover from here

这时检查复制状态,如果显示IO:NO,重启MySQL,再设置read_only为1

再次检查manager状态(worker)

  1. masterha_check_status --conf=/etc/mha/conf/mha.cnf
  2. #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高可用集群(一主一从)的搭建,一路以来我们一起解决了很多问题,放松一下吧!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号