MYSQL高可用MHA一:GTID方式主从复制

本文介绍了MySQL高可用性解决方案MHA(Master High Availability)的组件及功能,包括Manager和Node工具包的职责。详细阐述了GTID(全局事务标识符)的概念及其在MySQL复制中的作用,如支持多线程复制、自动找点同步等。同时,展示了配置MHA环境的步骤,包括修改MySQL配置、设置GTID模式、创建复制用户等,并分析了主从复制过程中的常见错误及解决方法。
摘要由CSDN通过智能技术生成

 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)

**************************************************************************************************************

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.大橙子.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值