前面介绍了单机mysql的安装的方式,实际在生产系统中为了避免单台数据库意外宕机引发单点故障导致生产环境瘫痪,一般都会在数据库层做相应的集群处理。
常见的方案分成​主从复制(异步、半同步、全同步);MMM架构(双主多从);MHA架构(多主多从)​等方案,本博客本次搭建的是主从复制模式(半复制模式)
本次采用的版本是mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz安装包在redhat系统上面搭建。

介绍

  1. mysql主从复制分为主库跟多从
  2. 主库进行数据操作时会将操作写入binlog日志,通过binlog_dump_thread通知从库的io_thread同步binlog到relay-log日志中。
  3. 默认mysql的主从复制时异步,说白了就行通知到从库后,就不管从库有没有同步成功,就写入commit通知客户端写入成功,因此有很大机率从库存在丢数据的情况。
  4. 半同步机制是当主库写完binlog日志,通知从库来同步日志,必须等从库返回ack确认同步成功的日志(这里如果是1主多从,可以配置几个从库确认同步成功)
  5. 当从库提交确认同步成功后,主库才commit,告诉客户端同步成功。
  6. SQL_Thread是从库从relay-info日志,解析成SQL语句在从库恢复操作。与IO_thread分开是为了避免解析耗时,影响从库确认ACK导致整体超时。其实这套机制与kafka的异步发送,异步发送确认的机制类似。

mysql从主复制(半同步).png

主从复制模式搭建

  1. 使用192.28.4.41与192.28.4.42两台服务器,见文章搭建单机的MySQL数据库

主库配置

[mysql]
default-character-set=utf8mb4
[mysqld]
#忽略大小写
server_id=41
lower_case_table_names=1
skip-name-resolve
port=3306
#mysql安装目录
basedir=/home/mysql/
#mysql数据库数据存放目录
datadir=/home/mysql/data
log_bin=mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log_error=/home/mysql/logs/mysql_err.log
#允许最大连接数
max_connections=200
character-set-server=utf8mb4
default-storage-engine=INNODB
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000# 毫秒为单位,超时时间根据实际需要设置

从库配置

[mysql]
default-character-set=utf8mb4
[mysqld]
#忽略大小写
server_id=42
lower_case_table_names=1
skip-name-resolve
port=3306
#mysql安装目录
basedir=/home/mysql/
#mysql数据库数据存放目录
datadir=/home/mysql/data
log_bin=mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log_error=/home/mysql/logs/mysql_err.log
#允许最大连接数
max_connections=200
character-set-server=utf8mb4
default-storage-engine=INNODB
rpl_semi_sync_slave_enabled = 1
  1. 创建复制用户
create user 'replica'@'%' identified by '123456';
grant replication slave on *.* to 'replica'@'%';
flush privileges;
  1. 安装主库半同步插件

    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    show plugins;
    show status like '%Rpl_semi_sync%'
    
  2. 查看主库192.28.4.41当前master节点信息

image-rhrk.png

  1. 配置从库192.28.4.42连接主库进行复制参数
change master to master_host='192.28.4.1',
master_user='replica',
master_password='123456',
master_log_file='mysql-bin.000003',
master_log_pos=894;
  1. 开启从库同步主库
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
start slave;
show slave status;
show status like '%Rpl_semi_sync%'

image-repl.png

这里发现同步主库报错Authentication plugin‘caching_sha2_password‘ reported error,停止备库复制,执行下面命令,再次同步。

stop slave;
CHANGE MASTER TO GET\_MASTER\_PUBLIC\_KEY=1;
start slave;
show slave status;

image-rgej.png

总结

此时mysql的一主一丛节点搭建成功,在mysql的服务外层再套一层keepalived,客户端通过VIP连接数据库。建议发生故障时DBA按实际情况手动切换到备库,或者简单点发生故障时keepalived配合脚本切换到备库。
第二种思路就是客户端多数据源区分主库与从库,或者使用第三方插件mycat,ShardingSphere实现读写分离。
mysql的一主一丛的利用大概如此,一是提高稳定性有避免单点故障二是利用多库进行读写分离,提高性能。

文章作者: 编程之家
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 编程之家
Mysql mysql主从复制 半同步复制
喜欢就支持一下吧