MySQL主从结构搭建

说明:本文介绍如何搭建MySQL主从结构;

原理

主从复制原理如下:

在这里插入图片描述

(1)master数据写入,更新binlog;

(2)master创建一个dump线程向slave推送binlog;

(3)slave连接到master,创建一个IO线程接收binlog,并记录到relay log中继日志中;

(4)slave开启一个sql线程读取relay log并在slave执行,完成同步;

(5)slave记录自己的binlog;

搭建

Step1:安装MySQL

首先,在两台服务器上安装好MySQL服务,如下:

(ECS_1)

在这里插入图片描述

(ECS_2)

在这里插入图片描述

安装步骤参考:CentOS 7安装、卸载MySQL数据库(一)

安装完,需要确保这两台服务器能够互相感知对方,简单说就是能互相ping通,且相关端口是开放的。正式情况网络一般都是连通的,如果是自己练习,可在本地和虚拟机之间搭建,或者在虚拟机和docker之间搭建。我这里是斥巨资(60块/月)买了一台轻量级应用服务器,来和云服务器ECS搭建主从。

在这里插入图片描述

Step2:主节点

接着,修改两台MySQL服务器的配置文件,对于主节点,配置文件新增如下配置:

# mysql服务ID,保证在整个集群环境中唯一
server_id=1

# 是否只读,1 代表只读,0代表读写,主数据库需要读写,设置0
read-only=0

# 开启binlog
log-bin=mysql-bin

在这里插入图片描述

另外,如需要指定同步某些数据库、忽略某些数据库不同步,可增加如下配置

# 忽略的,不同步的数据库
binlog-ignore-db=mysql

# 指定的,需要同步的数据库
binlog-do-db=mydb

修改完后,需重启MySQL服务

# 重启服务
systemctl restart mysql

连接数据库,输入下面SQL,开放给账户主从复制权限;

grant replication slave on *.* to 'admin'@'%';

查看binlog日志的信息

show master status;

记住文件名,位置,后面需要用到

在这里插入图片描述

Step3:从节点

从节点配置如下:

# mysql服务ID,保证在整个集群环境中唯一
server_id=2

# 是否只读,1 代表只读,0代表读写,从数据库仅读,设置1
read-only=1

在这里插入图片描述

修改完后,需重启MySQL服务

# 重启服务
systemctl restart mysql

连接数据库,敲下面的语句,设置同步的主库

change master to source_host='主节点IP', source_user='admin', source_password='MySQL@3306', source_log_file='mysql-bin.000001', source_log_pos=538;

在这里插入图片描述

敲下面的命令,开始同步:

start replica;

在这里插入图片描述

没有报错,继续敲下面的命令,查看主从同步状态

show replica status\G;

在这里插入图片描述

这里我遇到了许多问题,搭建成功,如下图方框中的状态:

在这里插入图片描述

遇到问题,参考下面这篇文章,希望能帮到你


如果是8.0.23前版本的数据库,敲下面的语句

(建立连接)

change master to master_host='主节点IP', master_user='admin', master_password='MySQL@3306', master_log_file='binlog.000002', master_log_pos=545;

(开始同步)

start slave;

(查看从节点状态)

show slave status\G;

Step4:测试

现在,我们打开Navicat,在主节点创建一个数据库,查看从节点有没有同步;

在这里插入图片描述

(刷新,Pink!,从库也出现了test数据库)

在这里插入图片描述

到这里,MySQL主从就搭建完成了,后续往主数据修改,从库也会同步修改。但需要注意,如果一开始主从库内容不一致,比如有的库只在主库中有,而从库中没有,在主从状态下删除掉主库中从库没有的数据库,就会报错。

如下,在搭建前,主从没搭建成功,我忘把主库中的test数据库删掉,搭建完之后,把只在主库中有的test数据库删掉,从库报下面的错误,说不能删除一个不存在数据库。更坑的是,报错之后主从就不能同步了。需要停止同步,重新建立连接。

在这里插入图片描述

另外

另外,搭建主从MySQL,对配置文件的修改实际上非常少,这里我把完整的配置文件复制到这里,以供参考:

(主节点)

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# 注意这行配置,如果你报了相关错误,考虑开启此行配置
default-authentication-plugin=mysql_native_password

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# mysql服务ID,保证在整个集群环境中唯一
server-id=1
#
# 是否只读,1 代表只读,0代表读写,主数据库需要读写,设置0
read-only=0

# 开启binlog
log-bin=mysql-bin

(从节点)

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

port = 3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# mysql服务ID,保证在整个集群环境中唯一
server-id=2

# 是否只读,1 代表只读,0代表读写,从数据库仅读,设置1
read-only=1

总结

本文介绍了MySQL主从结构搭建的过程,参考B站视频:

搭建过程遇到问题,可参考:

MySQL搭建主从复制主要包括以下几个步骤: 1. **准备**: - 确保主库和从库都是安装了最新版本的MySQL,并且权限管理设置正常。 - 主库需要开启二进制日志(`innodb_log_file_size` 和 `binlog_format` 需要适当调整),以便从库能够读取。 2. **配置主库**: - 登录主库,在`my.cnf`或其他配置文件中设置`server-id`,给主库一个唯一的标识,防止冲突。同时开启`bind-address`允许远程访问。 - 开启二进制日志(`binlog-server-id` 设置为主库ID,`expire_logs_days` 控制保留的日志天数,`log_bin` 设为`ON`)。 3. **创建从库**: - 创建一个新的数据库实例,作为从库。 - 在`my.cnf`中配置从库的相关信息,比如`replicate_do_db`指定哪些数据库要同步,`server-id`设置为一个大于主库的值。 - 关闭从库的`innodb_buffer_pool_size`和`query_cache_size`以减少内存占用,让资源更多地用于复制。 4. **启动复制流程**: - 在从库上,使用`mysqladmin`命令或`GRANT REPLICATION SLAVE` SQL语句授权给从库账号,使其可以从主库复制数据。 - 使用`CHANGE MASTER TO` 或 `START SLAVE` 命令配置从库指向主库的详细信息,如IP地址、端口、用户名、密码和位置信息。 5. **检查并同步数据**: - 执行`SHOW SLAVE STATUS \G` 检查从库的状态,确认是否已经开始同步,查看延迟和错误信息。 - 调整同步速度和策略,如`SLAVE_DELAY` 可以设置同步的滞后时间,`binlog_format` 的选择影响同步效率。 6. **监控与维护**: - 使用监控工具(如Prometheus、Nagios等)持续监控主从复制状态。 - 定期清理过期的二进制日志,避免空间不足导致无法继续复制。 在实际操作过程中,可能会遇到各种问题,例如网络问题、权限问题、磁盘空间不足等,需要逐一排查解决。完成上述步骤后,你的MySQL就已经成功搭建主从复制结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

何中应

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

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

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

打赏作者

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

抵扣说明:

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

余额充值