美文网首页
Mysql 主从库搭建

Mysql 主从库搭建

作者: taogan | 来源:发表于2021-12-17 16:12 被阅读0次

注意:确保主从库上安装了相同版本的数据库,因为主从库的角色可能会互换,同时减少出错的概率,所以在可能的情况下推荐安装最新的稳定版,本文使用版本为5.7.36

搭建主库

1、创建主库复制使用的账户

create user slavauser@'ip' identified by 'password';

grant replication slave on *.* to slavauser@'ip';

2、查看权限是否正确

show grants for slavauser@'ip';
image.png

3、修改主数据库配置文件my.cnf,开启binlog,并设置server-id,这两个参数修改需要重启数据库服务

[mysqld]
server-id=1
log-bin=/var/log/mysql/localhost-binlog

#需要同步的表,不配置默认同步所有数据库
binlog-do-db=db_a
binlog-do-db=db_b
binlog-do-db=db_c
......

4、将主数据库的数据备份到从数据库,建议设置读锁有效,确保没有数据库写操作,以便获得一致性的快照

flush tables with read lock

主数据库备份完成后,可以恢复写操作

unlock tables

5、查询主库上当前二进制日志名和偏移量值,目的是为了在从数据库启动以后,从这个点开始进行数据的恢复

show master status
image.png

6、启动或重启主数据库服务

搭建从库

1、修改my.cnf,增加server-id参数,注意值必须是唯一的,不能和主数据库的server-id相同:

[mysqld]
server-id=2

#指定同步的数据库,如果不配置,默认同步所有数据库
replicate-do-db=sql_inform

skip-slave-start

在从库上,使用--skip-slave-start选项启动从数据库,也可以在my.cnf中加入skip-slave-start配置,这样不会立即启动从数据库服务器上的复制进行,方便做进一步配置。

2、对从数据库服务器做相应设置
change master to
master_host = '主数据库服务器IP',
master_port = 数据库端口,
master_user = '主数据复制用户',
master_password = '主数据复制用户密码',
master_log_file = '主数据当前二进制日志名',
master_log_pos = 主数据当前二进制日志偏移量值;
示列:

change master to 
master_host = '192.168.1.102',
master_port = 9802,
master_user = 'slavauser',
master_password = '123456',
master_log_file = 'localhost-binlog.000009',
master_log_pos = 2329;

3、在从库上,启动slave线程

start slave

这时在从库上执行show processlist命令将显示类似如下进程:

image.png

这表明slave已经连上master,并开始接受并执行日志。也可以在从库上执行 show slave status 命令,查看两个重要字段是否都为yes

image.png

还可以在主数据库上执行一个更新操作,观察是否同步到从数据库。

如果以上操作之一没有成功,请查看从数据库上的错误日志,进行排查。

多线程复制(扩展)

mysql5.7,带来了全新的多线程复制技术,解决了master同一个schema下的数据发生了变更,从库不能并发应用的问题。

1、在从库my.cnf上追加配置以下参数

[mysqld]
#多线程复制(从库)
#复制依赖主库commit时刻的时间戳
slave_parallel_type=LOGICAL_CLOCK
#执行线程数量
slave_parallel_workers=4
#在复制过程中,保证和主库事务提交顺序的一致性
slave_preserve_commit_order=ON
relay_log_recovery=ON
master_info_repository=table
relay_log_info_repository=table  

增强半同步复制(扩展)

前面介绍的复制是异步操作,主库和从库的数据之间难免会存在一定的延迟,这样存在一个隐患:当在主库中写入一个事务并提交,而从库未得到主库的binlog日志时,主库由于磁盘损坏,内存故障,断点等原因意外宕机,导致主库上该事务binlog丢失,此时从库就会损失这个事务,从而造成主从不一致。

在传统的半同步复制中,主库写数据到BINLOG,且执行Commit操作后,会一直等待从库的ACK,即从库写入RelayLog(中继日志)后,并将数据落盘,返回给主库消息,通知主库可以返回前端应用操作成功,这样会出现一个问题,就是实际上主库已经将该事务Commit到了事务引擎层,应用已经可以看到数据发生了变化,只是在等返回而已,如果此时主库宕机,有可能从库还没能写入RelayLog,就会发生主从库数据不一致。

增强半同步就是为了解决这个问题,做了微调,即主库写数据到BINLOG后,就开始等待从库的应答ACK,直到至少一个从库写入RelayLog后,并将数据落盘,然后返回给主库消息,通知主库可以执行Commit操作,然后主库开始提交到事务引擎层,应用此时可以看到数据发生了变化。增强半同步复制的大致流程如图30-9所示。

image.png

半同步复制模式下,假如在传送 BINLOG日志到从库时,从库宕机或者网络故障,导致BINLOG并没有及时地传送到从库上,此时主库上的事务会等待一段时间(时间长短由参数rpl_semi_sync_master_timeout设置的毫秒数决定)如果 BINLOG在这段时间内都无法成功发送到从库上,则MySQL自动调整复制为异步模式,事务正常返回提交结果给客户端。

半同步复制很大程度上取决于主从库之间的网络情况,往返时延RTT越小决定了从库的实时性越好。通俗地说,主从库之间网络越快,从库越实时。

注意:往返时延RTT(Round-TripTime)在计算机网络中是一个重要的性能指标,它表示从发送端发送数据开始到发送端接收到接收端的确认,总共经历的时长。

1、在主库上安装semisync_master.so插件

install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

2、在从库上安装 semisync_slave.so插件

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

查看安装的插件

select * from mysql.plugin;
image.png

3、在主库my.cnf中配置参数打开半同步,默认是不打开的

[mysqld]
#半同步配置(主库)
rpl_semi_sync_master_enabled=on
#主库上的事务等待从库响应时间
rpl_semi_sync_master_timeout=1000
#增强半同步
rpl_semi_sync_master_wait_point=AFTER_SYNC

4、在从库my.cnf中配置参数,打开半同步

[mysqld]
#打开半同步(从库)
rpl_semi_sync_slave_enabled=ON

5、由于之前的配置,需要重启从库I/O线程(如果是全新配置的半同步复制,则不需要)

stop slave
start slave

到此半同步配置完成。主库上通过show status like '%semi_sync%'命令能够看到当前半同步复制的一些状态

image.png

着重关注以下3个状态值:
Rpl_semi_sync_master_status:值为ON,表示半同步复制目前处于打开状态。

Rpl_semi_sync_master_yest:值为6表示主库当前有6个事务是通过半同步复制到从库。

Rpl_semi_sync_master_no:值为1表示在半同步模式下,从库没有及时响应的事务为1个。

命令集合:

show master status;
show processlist;
start slave;
stop slave;
reset slave all;  //重置从库连接主库所有配置内容

change master to 
master_host = '192.168.1.102',
master_port = 9802,
master_user = 'repl',
master_password = 'Re123456..',
master_log_file = 'localhost-binlog.000007',
master_log_pos = 5665;

select @@have_dynamic_loading; // 查看是否支持动态增加插件
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
show status like '%semi_sync%'

主库my.cnf配置文件参考

[mysqld]
server-id=1
#端口
port=9802
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
pid-file=/usr/local/mysql/mysql.pid
symbolic-links=0
log_timestamps=SYSTEM

#需要同步的表
binlog-do-db=sql_inform
binlog-do-db=test

#半同步配置(主库)
rpl_semi_sync_master_enabled=on
rpl_semi_sync_master_timeout=1000
#增强半同步
rpl_semi_sync_master_wait_point=AFTER_SYNC

#启动日志,错误日志
log-error=/var/log/mysql/localhost-error.log

#慢日志
slow_query_log=ON
slow_query_log_file=/var/log/mysql/localhost-slow.log
#超时时间
long_query_time=5

#二进制日志
log-bin=/var/log/mysql/localhost-binlog
log_bin_index=/var/log/mysql/localhost-binlog.index
#二进制日志保留天数
expire_logs_days=7

#查询日志
general_log=0
general_log_file=/var/log/mysql/localhost-query.log

#密码强度
plugin-load-add=validate_password.so
validate_password_length=8
validate_password_policy=MEDIUM

#模式
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]
default-character-set=utf8

[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.dlog
#pid-file=/var/run/mariadb/mariadb.pid
log-error=/var/log/mysql/localhost-error.log
pid-file=/usr/local/mysql/mysql.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

从库my.cnf配置文件参考

[mysqld]
server-id=3
port=9803
datadir=/usr/local/mysql9803/data
socket=/usr/local/mysql9803/mysql.sock
pid-file=/usr/local/mysql9803/mysql.pid
log_timestamps=SYSTEM

#多线程复制(从库)
slave_parallel_type=LOGICAL_CLOCK  #复制依赖主库commit时刻的时间戳
slave_parallel_workers=4   #执行线程数量
slave_preserve_commit_order=ON  #在复制过程中,保证和主库事务提交顺序的一致性
relay_log_recovery=ON
master_info_repository=table
relay_log_info_repository=table

#打开半同步(从库)
rpl_semi_sync_slave_enabled=ON

#error日志
log-error=/var/log/mysql9803/localhost-error.log

#慢日志
slow_query_log=ON
slow_query_log_file=/var/log/mysql9803/localhost-slow.log
#超时时间
long_query_time=5

#二进制日志
log-bin=/var/log/mysql9803/localhost-binlog
log_bin_index=/var/log/mysql9803/localhost-binlog.index
#二进制日志保留天数
expire_logs_days=7

#中继日志
relay_log=/var/log/mysql9803/localhost-relay-bin
log_slave_updates=on

#查询日志
general_log=0
general_log_file=/var/log/mysql9803/localhost-query.log

#密码强度
#plugin-load-add=validate_password.so
#validate_password_length=8
#validate_password_policy=MEDIUM

#模式
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]
default-character-set=utf8

[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.dlog
#pid-file=/var/run/mariadb/mariadb.pid
log-error=/var/log/mysql9803/localhost-error.log
pid-file=/usr/local/mysql9803/mysql.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

相关文章

  • cloudera集群搭建1:准备步骤之mysql数据库搭建

    前言: 为搭建cloudera环境而安装mysql数据库,以及适用于生产环境下mysql主从库的搭建,并演示导入测...

  • Mysql主从和故障

    1) 搭建传统的mysql主从 2) 搭建GTID的mysql主从(建议使用基于GTID来搭建主从) 3) IO线...

  • MySQl优化学习笔记(九)二进制日志

    二进制日志应用场景就是搭建MySQL主从备份。 MySQL主从备份含义:假设有个库a和库b,两个主机基于协议通信,...

  • MySQL主从复制

    使用Docker Compose搭建MySQL主从复制架构 环境准备 docker 安装MySQL数据库 dock...

  • mysql 主从复制

    mysql 主从复制 网易数据库 石勇 提纲 什么是主从复制 主从复制的原理 主从复制的用途 主从复制的搭建 主从...

  • 搭建MySQL主从库

    脚本详情 使用docker-compose安装MySQL主从库,文件架构如下: docker-compose.ym...

  • [MYSQL]主从库搭建

    主库配置 1 修改配置文件修改主库配置文件my.cnf ,添加 log-bin = mysql-bin 要打开,也...

  • Mysql 主从库搭建

    注意:确保主从库上安装了相同版本的数据库,因为主从库的角色可能会互换,同时减少出错的概率,所以在可能的情况下推荐安...

  • 2018-09-16;集群搭建;

    1.Mysql主从复制集群搭建: 1.先在Linux下安装好Mysql数据库; 2.然后输入...

  • Linux上Mysql8主从搭建1主2从及监控

    上一篇文章介绍了mysql8的数据库搭建,下面介绍mysql的主从搭建,非常简单 首先改my.cnf文件,主库增加...

网友评论

      本文标题:Mysql 主从库搭建

      本文链接:https://www.haomeiwen.com/subject/zysifrtx.html