MYSQL高可用MHA
1.MHA工具介绍
MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下:
#Manager工具包主要包括以下几个工具:
masterha_check_ssh #检查MHA的SSH配置状况
masterha_check_repl #检查MySQL复制状况
masterha_check_status #检测当前MHA运行状态
masterha_master_monitor #检测master是否宕机
masterha_manger #启动MHA
masterha_master_switch #控制故障转移(自动或者手动)
masterha_conf_host #添加或删除配置的server信息
masterha_secondary_check #试图建立TCP连接从远程服务器
masterha_stop #停止MHA
#Node工具包主要包括以下几个工具:
save_binary_logs #保存和复制master的二进制日志
apply_diff_relay_logs #识别差异的中继日志事件
filter_mysqlbinlog #去除不必要的ROLLBACK事件
purge_relay_logs #清除中继日志
2.mysql环境准备
环境检查
centos 7.3
一组二从,三实例:
主:10.121.151.234 port:3306
从1:10.121.151.235 port:3306
从2:10.121.151.236 port:3306
增加EDIT参数:(my.cnf下)
gtid_mode = ON #打开GTID状态
log_slave_updates=1
enforce_gtid_consistency=true #貌似是进数据库就自启动
mha文件(所有库安装)
mha文件(负责做转换的从库用安装)
############理论知识,用是因为我能搞定一些东西##############################
什么是GTID
GTID(Global Transaction)全局事务标识符:是一个唯一的标识符,它创建并与 源服务器(主)上提交的每个事务相关联。此标识符不仅对其发起的服务器是唯一 的,而且在给定复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间 都有1对1的映射。 GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。
下面是一个GTID的具体形式: 3E11FA47-71CA-11E1-9E33-C80AA9429562:23
GTID的新特性
(1)支持多线程复制:事实上是针对每个database开启相应的独立线程,即每个库有一个单 独的(sql thread)
(2)支持启用GTID,在配置主从复制,传统的方式里,你需要找到binlog和POS点,然后 change master to 指向。在mysql5.6里,无须再知道binlog和POS点,只需要知道master的 IP/端口/账号密码即可,因为同步复制是自动的,MySQL通过内部机制GTID自动找点同步。
(3)基于Row复制只保存改变的列,大大节省磁盘空间,网络,内存等
(4)支持把Master和Slave的相关信息记录在Table中;原来是记录在文件里,现在则记录在 表里,增强可用性
(5)支持延迟复制解决办法如下:
详细搭建步骤: 是上面多实例步骤,无非就是分了三个个多实例,
初始化-启动实例-配置账户密码-登录 然后从库通过CHANGE MASTER TO连接主库用户) 因为是要做高可用,所以需要用到个Gtid的功能,可以自动记录主从复制位置点的信息, 并在日志中输出出来。
(查询:show global variables like '%gtid%';)
配置文件
(主从库都要操作:
(1)修改从库server_id是2和3 ;
(2)在[mysql]标签下增加本行代码。永久禁用自带删除relay_log功能 relay_log_purge = 0;
#客户端相关配置
主:10.121.151.234 port:3306
1.vi /data/mysql/mysql3306/data/my.cnf编辑如下
[client]
#客户端连接端口
port=3306
#客户端连接socket,必须与服务端的socket使用同一个
socket=/data/mysql/mysql3306/mysql.sock
[mysqld]
user = mysql
port = 3306
#mysqlx_port = 33060
server-id = 1
log-bin = /data/mysql/mysql3306/mysql-bin
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
tmpdir = /data/mysql/mysql3306/tmp
socket = /data/mysql/mysql3306/mysql.sock
log_error = /data/mysql/mysql3306/error.logvi
#lower_case_table_names = 1
#default-storage-engine = InnoDB
#character-set-server = utf8
innodb_buffer_pool_size = 200M
slave-parallel-workers = 8
thread_cache_size = 600
slave_net_timeout = 60
max_binlog_size = 512M
key_buffer_size = 8M
#设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数
#query_cache_size = 4M
join_buffer_size = 2M
sort_buffer_size = 2M
#query_cache_type = 1
thread_stack = 192K
gtid_mode = ON #打开GTID状态
log_slave_updates=1
enforce_gtid_consistency=true #貌似是进数据库就自启动
#default_authentication_plugin=mysql_native_password
主:10.121.151.234 port:3306
从1:10.121.151.235 port:3306
从2:10.121.151.236 port:3306
2.mysql启动多实例&&主从复制(以下主从都需要配置进入)
#初始化的路径&&存放my.cnf路径
cd /data/mysql/mysql3306/data/
#如果两个实例那么就是以下区分开来的初始化
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/mysql3306/data/
启动 MySQL双实例
mysqld_safe --defaults-file=/data/mysql/mysql3306/data/my.cnf 2>&1 >/dev/null &
为mysql设置密码(需要进行设置密码后后续才可以把服务快速关停:下面命令最后接命令:密码)
mysqladmin -u root -S /data/mysql/mysql3306/mysql.sock
带密码登录不同实例数据库的方法
mysql -uroot -p123123 -S /data/mysql/mysql3306/mysql.sock
GTID状态-创建用户和密码
mysql> show global variables like '%gtid%'; #看一下GTID状态
+----------------------------------+------------------------------------------+
| Variable_name | Value |
+----------------------------------+------------------------------------------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed | 628bece6-b106-11ec-9c7b-000c29932170:1-5 |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+------------------------------------------+
mysql> show master status; #查询master状态,查询GTID是不是存在
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 1541 | | | 628bece6-b106-11ec-9c7b-000c29932170:1-5 |
+------------------+----------+--------------+------------------+------------------------------------------+
主:10.121.151.234 port:3306
(1)主库建立用于从库复制的账号rep,命令如下:
create user 'rep'@'10.121.151.%' identified by '123123';
(2)授权
grant replication slave on *.* to 'rep'@'10.121.151.%';
(3)刷新权限,生效
flush privileges;
(4)建立用于mha高可用账号mha
create user 'rep'@'10.121.151.%' identified by '123123';
(5)密码加密方式
alter user 'mha'@'10.121.151.%' identified with mysql_native_password by '123123';
(6)授权
grant all on *.* to mha@'10.121.151.%';
(7)刷新权限,生效
flush privileges;
(8)查询用户
mysql> select user,host,plugin from mysql.user;
+------------------+--------------+-----------------------+
| user | host | plugin |
+------------------+--------------+-----------------------+
| mha | 10.121.151.% | mysql_native_password |
| rep | 10.121.151.% | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+--------------+-----------------------+
格外补充:
删除用户
drop user 'rep'@'192.168.31.%';
从1:10.121.151.235 port:3306
从2:10.121.151.236 port:3306
(1)从库操作,配置主从复制
登录
mysql -uroot -p123123 -S /data/mysql/mysql3306/mysql.sock
(2)#配置主从复制
CHANGE MASTER TO MASTER_HOST='10.121.151.234',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='123123',master_auto_position=1;
#GTID位置点(自动追踪需要同步的 position):master_auto_position=1
(3)开启从库的主从复制功能
mysql> start slave; #开启主从同步功能 停止:stop slave;
mysql> show slave status\G #查询状态,是否成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
***************************************主从复制报错集锦***********************************************
(1) error connecting to master 'rep@10.121.151.234:3306' - retry-time: 60 retries: 4 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
在MySQL8.0之前,身份验证的插件是mysql_native_password,在MySQL 8.0中,caching_sha2_password 是默认的身份验证插件,安全性更高。
在MySQL中,系统状态变量Rsa_public_key,此值是sha256_password身份验证插件用于基于RSA密钥对的密码交换的公用密钥 。对于使用该sha256_password 插件的客户端,连接到服务器时,密码永远不会以明文形式公开。密码传输的方式取决于是否使用安全连接或RSA加密:
通过上面对插件caching_sha2_password的介绍,这次故障的原因可以猜测为:在从库连接主库的时候使用的是不被 caching_sha2_password认可的RSA公钥,所以主库MySQL拒绝了数据库连接的请求,从而,从库报错’caching_sha2_password’ reported error:Authentication require secure connection。
解读(1):从库新开一个窗口,然后mysql登录到创建用户的数据库内 mysql -urep -p123123 -h 10.121.151.234 -S /data/mysql/mysql3306/mysql.sock 从库操作:stop slave-start slave-show slave status\G,如果还不行就多来几次,或者看下show master status;
解读(2):从库新开一个窗口,然后mysql登录到创建用户的数据库内 使用复制用户请求服务器公钥: mysql -u rep -p123123 -h 10.121.151.234 -P3306 --get-server-public-key 在这种情况下,服务器将RSA公钥发送给客户端,后者使用它来加密密码并将结果返回给服务器。插件使用服务器端的RSA私钥解密密码,并根据密码是否正确来接受或拒绝连接。 重新在从库配置change masrer to并且start slave,复制可以正常启动:
解读(3):从库新开一个窗口,然后mysql登录到创建用户的数据库内
使用复制用户请求服务器公钥: mysql -u rep -p123123 -h 10.121.151.234 -P3306 --server-public-key-path=/mysqldata/my3308/data/public_key1.pem
重新在从库配置change masrer to并且start slave,复制可以正常启动:
(2)error connecting to master 'rep@10.121.151.234:3306' - retry-time: 60 retries: 1 message: Can't connect to MySQL server on '10.121.151.134' (111)
解读:主从复制文件没有加主库(3308)端口
因为搭建的是默认用3306端口,3306端口不报错,你要用别的端口就会报错,需要特别指定这个端口
CHANGE MASTER TO MASTER_HOST='10.121.151.234',MASTER_PORT=3308,MASTER_USER='rep',MASTER_PASSWORD='123123',master_auto_position=1;
(3)[ERROR] [MY-013114] [Repl] Slave I/O for channel '': Got fatal error 1236 from master when reading data from binary log: 'Cannot replicate because the master purged required binary logs. Replicate the missing transactions from elsewhere, or provision a new slave from backup. Consider increasing the master's binary log expiration period. The GTID set sent by the slave is '6aa8422c-b006-11ec-8c15-000c29932170:1-3', and the missing transactions are '5a7bd1ae-b006-11ec-b637-000c29932170:1-25'', Error_code: MY-013114
解读:emmm,这个是把主库中的mysql-bin文件删除了,就一直出错,报错信息翻译即可,百度恶心人(默认主库和从库都不能删除mysql-bin文件,不然就一直出错)
(4)mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
解读:
mysql> reset slave;
Query OK, 0 rows affected (0.10 sec)
mysql> start slave;
Query OK, 0 rows affected (0.10 sec)
**************************************************************************************************************