暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

部署MySQL8.0 GTID双主半同步复制

原创 Jellybean 2024-04-29
1120

下载安装包

打开 MySQL 官网地址:https://dev.mysql.com/downloads/mysql/

安装

解压

tar -xzvf mysql-8.0.36-macos14-arm64.tar.gz

准备配置文件,如下是master的配置文件,slave的配置调整server-id 和相关路径即可。

[client]
  default-character-set=utf8mb4
  #password   = your_password
  port        = 3306
  #修改的socket文件的位置,默认是走的/tmp下的mysql.sock会有冲突
  #这是报错  Another process with pid 77346 is using unix socket file.
  #客户端也需要这个和服务端的一致
  socket      = /your-path/mysql.sock
[mysqld]
#开启gtid
enforce-gtid-consistency=true
gtid-mode=on
  sync-binlog = 1
  log-error = mysql.err
  event_scheduler=ON
  port        = 3306
  mysqlx_port = 33060
  bind-address=127.0.0.1
  #修改的socket文件的位置,默认是走的/tmp下的mysql.sock会有冲突
  socket=/your-path/mysql.sock
  mysqlx_socket=/your-path/mysql.sock
  skip-external-locking
  key_buffer_size = 16M
  max_allowed_packet = 1M
  table_open_cache = 64
  sort_buffer_size = 512K
  net_buffer_length = 8K
  read_buffer_size = 256K
  read_rnd_buffer_size = 512K
  myisam_sort_buffer_size = 8M
  character-set-server=utf8mb4
  init_connect='SET NAMES utf8mb4'

  #修改mysql的主目录
  basedir=/your-path/
  #添加data文件的目录,存储各种数据和日志
  datadir=/your-path/data

  log-error = mysql.err
  log-bin=mysql-bin
  binlog_format=row
  server-id   = 1
  sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
  lower_case_table_names=1

[mysqldump]
  quick
  max_allowed_packet = 16M

[mysql]
  no-auto-rehash
  # Remove the next comment character if you are not familiar with SQL
  #safe-updates
  default-character-set=utf8mb4

[myisamchk]
  key_buffer_size = 20M
  sort_buffer_size = 20M
  read_buffer = 2M
  write_buffer = 2M

[mysqlhotcopy]
  interactive-timeout

初始化阶段创建空密码的root@localhost账号

./mysqld --defaults-file=/your-path/my.cnf --initialize-insecure

初始化阶段创建带随机密码的root@localhost账号

./mysqld --defaults-file=/your-path/my.cnf --initialize


启动MySQL服务,并验证服务可用性情况。

./mysqld_safe --defaults-file=--defaults-file=/-path/my.cnf &
ps -ef | grep mysql

mysql -h127.0.0.1 -P3306 -uroot -p

配置双主同步

分别在主从两个库创建账号,并验证正常访问

create user 'repl'@'%' identified by 'repl';
grant replication slave on *.* to 'repl'@'%';
flush privileges;

# 查看主库的状态
show master status;

mysql -h 127.0.0.1 -urepl -P3306 -prepl
mysql -h 127.0.0.1 -urepl -P3307 -prepl

在两个数据库分别创建主从同步:
使用GTID方式创建同步:

change master to master_host='127.0.0.1',master_port=3306,master_user='repl',master_password='repl', master_auto_position=1;

使用Binlog位点的方式创建

#在上游主库获取binlog位置
show master status;

#在下游从库建立同步关系
change master to master_host='127.0.0.1',master_port=3306,master_user='repl',master_password='repl', master_log_file='mysql-bin.000003',master_log_pos=857;

start slave;

show salve status;

额外补充内容:

# 清理relay log同步信息
reset slave;

# 清理slave同步关系,包括账号访问等信息也会清理
reset slave all;

在主库重置binlog文件:

reset masetr;

开启半同步复制(after sync)

1.安装半同步的插件
主库
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
从库
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

show plugins;
查看是否安装成功

2.半同步需要在主从同时开启
主库
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从库
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
以上的启动方式是在命令行操作,也可写在配置文件中。

vim my.cnf
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_slave_enabled = 1;

3.重启从库的IO线程

STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

4.确认半同步复制状态正常
mysql> show status like ‘%rpl_semi_sync%’ ;
±-------------------------------------------±------+
| Variable_name | Value |
±-------------------------------------------±------+
| Rpl_semi_sync_slave_status | ON |开启了半同步从库
| Rpl_semi_sync_source_clients | 1 |半同步复制的从库数量
| Rpl_semi_sync_source_net_avg_wait_time | 0 |等待从库的平均应答时间
| Rpl_semi_sync_source_net_wait_time | 0 |等待从库的总应答时间
| Rpl_semi_sync_source_net_waits | 3 |等待从库的应答次数
| Rpl_semi_sync_source_no_times | 1 |退化为异步复制的次数
| Rpl_semi_sync_source_no_tx | 3 |从库未成功确认提交的次数
| Rpl_semi_sync_source_status | ON |开启了半同步主库
| Rpl_semi_sync_source_timefunc_failures | 0 |调用时间函数失败次数
| Rpl_semi_sync_source_tx_avg_wait_time | 368 |主库等待事务的平均时间
| Rpl_semi_sync_source_tx_wait_time | 737 |主库等待事务总时间
| Rpl_semi_sync_source_tx_waits | 2 |主库等待事务总次数
| Rpl_semi_sync_source_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_source_wait_sessions | 0 |正在等待从库应答的会话数
| Rpl_semi_sync_source_yes_tx | 2 |从库确认成功提交的次数
±-------------------------------------------±------+
15 rows in set (0.06 sec)

参考:
mysql> show variables like ‘%rpl_semi_sync%’ ;
±--------------------------------------------±-----------+
| Variable_name | Value |
±--------------------------------------------±-----------+
| rpl_semi_sync_slave_enabled | ON |开启从库半同步复制
| rpl_semi_sync_slave_trace_level | 32 |从库调试跟踪级别
| rpl_semi_sync_source_enabled | ON |开启主库半同步复制
| rpl_semi_sync_source_timeout | 10000 |主库半同步等待10s,超时退化为异步复制
| rpl_semi_sync_source_trace_level | 32 |主库调试跟踪级别
| rpl_semi_sync_source_wait_for_replica_count | 1 |默认值,主库收到从库响应的个数,达到该数值主库就认为已经完成复制
| rpl_semi_sync_source_wait_no_replica | ON |默认值,允许在超时时间内从库小于xxx_replica_count的值,继续维持半同步复制
| rpl_semi_sync_source_wait_point | AFTER_SYNC |默认值,开启无损半同步复制,也叫增强半同步
±--------------------------------------------±-----------+
8 rows in set (0.06 sec)

caching_sha2_password 报错排查

Last_IO_Error: Error connecting to source ‘repl@127.0.0.1:3306’. This was attempt 5/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.

mysql -u repl -p -h 127.0.0.1 -P3307 --get-server-public-key

原因:
在从库连接主库的时候使用的是不被 caching_sha2_password认可的RSA公钥,所以主库MySQL拒绝了数据库连接的请求,从而,从库报错’caching_sha2_password’ reported error:Authentication require secure connection。

解决:
官网给出的解决方案如下:
要从服务器请求RSA公钥,需要指定选项 --get-server-public-key 。

从服务器请求基于RSA密钥对的密码交换所需的公共密钥。此选项适用于使用caching_sha2_password身份验证插件进行身份验证的客户端 。对于该插件,除非请求,否则服务器不会发送公钥。对于未使用该插件进行身份验证的帐户,将忽略此选项。如果未使用基于RSA的密码交换,也将被忽略,例如客户端使用安全连接连接到服务器时。

或者,如果客户端的文件包含服务器所需的RSA公钥的本地副本,则可以使用—server-public-key-path选项指定文件 。

具体为:
方案1:
使用复制用户请求服务器公钥:

 mysql -u repl -p -h 127.0.0.1 -P3307 --get-server-public-key

在这种情况下,服务器将RSA公钥发送给客户端,后者使用它来加密密码并将结果返回给服务器。插件使用服务器端的RSA私钥解密密码,并根据密码是否正确来接受或拒绝连接。
重新在从库配置change masrer to并且start slave,复制可以正常启动。

方案2:
使用复制用户请求服务器公钥:

mysql -u repl -p123 -h 118.31.127.96 -P3307 --server-public-key-path=/mysqldata/my3308/data/public_key1.pem

重新在从库配置change masrer to并且start slave,复制可以正常启动。

方案3:
修改repl用户,使其使用别的秘密加密方式,不使用插件caching_sha2_password。

CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'XXXX'; 
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; 

最后修改时间:2024-04-30 17:11:43
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论