MySQL 配置主从复制实践

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: MySQL 配置主从复制实践

MySQL 配置主从复制实践

一、检测通信

查看master(centos7)和slave(win10)的ip地址,并检测是否可以相互通信

image.png

image.png

image.png

到这里我们知道,master的ip为192.168.131.129,slave的ip为192.168.0.6,并且可以相互通信

如果物理机可以ping通虚拟机,而虚拟机无法ping通物理机,需要在控制面板的网络中心启用网络发现

image.png

image.png

虚拟机无法ping通物理机解决方案

  • 查看防火墙状态


systemctl status firewalld.service
  • 临时手动启动、停止防火墙


systemctl start firewalld.service
systemctl stop firewalld.service
  • 持久打开、关闭防火墙(重启服务生效)


systemctl enable firewalld.service
systemctl disable firewalld.service
  • 开启防火墙3306端口


firewall-cmd --zone=public --add-port=3306/tcp --permanent  # 开放3306端口
firewall-cmd --reload                                       # 重启防护墙
firewall-cmd --list-port                                    # 查看当前开放的端口列表

image.png

开放3306端口

image.png

二、master配置

1. 开启二进制日志

/etc/mysql/my.cnf

配置log_bin和全局唯一的server-id,和slave区分开,不能配置成一样的(如果是my.cnf新添加配置,一定要重启MySQL服务)

image.png

image.png

我在/etc/mysql/mysql.conf.d/mysqld.cnf中进行配置


# 重启mysql,如果mysql报错,就改成mysqld
systemctl restart mysql
systemctl start mysql
systemctl stop mysql
# 查看mysql状态
systemctl status mysql


root@ubuntu-vm:/usr/bin# systemctl start mysql
root@ubuntu-vm:/usr/bin# systemctl status mysql
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-11-16 16:50:56 CST; 5s ago
    Process: 8333 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 8341 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 4582)
     Memory: 367.3M
     CGroup: /system.slice/mysql.service
             └─8341 /usr/sbin/mysqld      # 这是mysqld路径
11月 16 16:50:55 ubuntu-vm systemd[1]: Starting MySQL Community Server...
11月 16 16:50:56 ubuntu-vm systemd[1]: Started MySQL Community Server.
root@ubuntu-vm:/usr/bin# netstat -tanp | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      9538/mysqld         
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      9538/mysqld         
root@ubuntu-vm:/usr/bin#

2. 创建一个用于主从库通信用的账号

即在master中创建一个账号,用于slave登录master读取binlog

虽然我们在Linux上查看的ip地址是192.168.131.129,但我们创建账户登录时不写这个ip,写的是192.168.131.1。因为我这里虚拟机用的是NAT模式(桥接模式是虚拟机直连物理网络,和物理机的网络地位相同),虚拟机(master)和物理机(slave)通信的时候,虚拟机先把数据发送到网关192.168.131.1(默认与VMnet8通信),192.168.131.1再转发到物理机,所以物理机接收到的是192.168.131.1的数据,故我们在master上为slave创建账户的时候,应该写192.168.131.1

image.png

如果给slave配置的不是网关192.168.131.1地址,错误日志(可在my.cnf中指定)中会有如下信息:

image.png

意思是从192.168.131.1的mslave用户权限不够,那是因为我们在master上配置的是允许从其他地址登录,并不是允许从192.168.131.1地址登录,这就导致权限不够。

由于master这边收到的就是来自192.168.131.1的请求,所以错误日志显示的是192.168.131.1

所以创建账户的命令应如下:


mysql> CREATE USER 'mslave'@'192.168.131.1' IDENTIFIED BY '14ds@EGBFV';
mysql> GRANT REPLICATION SLAVE ON *.* to 'mslave'@'192.168.131.1' IDENTIFIED BY '14ds@EGBFV';  -- 给mslave用户主从同步的权限(REPLICATION SLAVE)
mysql> FLUSH PRIVILEGES;                   -- 刷新权限,使权限生效

开启主从复制的权限,从库可以通过这个账户和密码,从这个IP来请求访问这个主库上的任意库,同步这个主库的任意库里的任意表

(在给mslave赋予从库权限时,一直报语法错误,可能是MySQL版本更新了,不需要写IDENTIFIED BY )

3. 获取binlog文件名和position

查看当前二进制日志的名字,主库的更新是往哪个binlog写的,以及当前写日志的位置,从这个位置往后开始进行主从同步


show master status;

image.png

三、slave配置

1. 配置全局唯一的server-id

找到my.ini

image.png

配置全局唯一的server-id

image.png

重启MySQL服务

image.png

2. 使用master创建的账户读取binlog同步数据

这一步配置主要是给IO线程读取binlog使用

mysql> CHANGE MASTER TO MASTER_HOST='192.168.131.129',
MASTER_PORT=3306,
MASTER_USER='mslave',
MASTER_PASSWORD='1qaz@WSX',
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=1262;

MASTER_HOST:指定master的ip

MASTER_LOG_FILE:binlog文件名

MASTER_LOG_POS:binlog的position

3. 启动slave服务


mysql> start slave;
mysql> stop slave;

通过show slave status命令查看主从复制状态,show processlist查看master和salve相关线程的运行状态

image.png

自己配置的时候不知道为什么,slave总是连接不上master,重新在mysql.user表中设置一下密码,就能连接上了

四、配置中可能出现的问题

1. 网络连接问题

通过show slave status命令查看主从复制状态

image.png

连接connection错误,先考虑是否网络互通,ping一下

然后再检查从库里面的配置信息是否正确

image.png

如果都正确,还可以检查一下master的3306端口是否可以连接


telnet xxx.xxx.xxx.xxx 3306

最重要的是,自己玩的时候,如果虚拟机是NAT模式,则需要写成VMnet8网关ip。如果都是物理机通信,那直接写正确的ip即可

可以在MySQL数据库下的mysql库的user表中更改允许登录的ip

image.png

然后重新赋予权限


mysql> GRANT REPLICATION SLAVE ON *.* to 'mslave'@'xxx.xxx.xxx.xxx' IDENTIFIED BY '1qaz@WSX';

出现错误后还可以查看错误日志中提示的ip是否和自己允许slave登录的ip一致

image.png

2. binlog的position问题

image.png

在master中查看show master status一下binlog日志文件名以及position,然后用命令重新配置slave,比如:


mysql> CHANGE MASTER TO MASTER_HOST='192.168.131.129',MASTER_PORT=3306,MASTER_USER='mslave',MASTER_PASSWORD='1qaz@WSX',
MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=1262;

配置slave前需要stop slave,配置完成再start slave

3. SQL线程出错

问题发生原因如下:

首先配置主从复制的时候,slave的mytest库中没有user表,而master的mytest库已经有user表了

配置好主从复制后直接drop table mytest.user,这就会写到binlog里面,然后在通过dump线程和IO线程将这个操作发送到从库的relay log,然后从库的SQL线程从relay log里把drop table mytest.user捞出来在从库执行这个SQL,可从库的mytest根本就没有user表,这就是删除一个不存在的表,于是出现错误了

image.png

一般我们不会做这样的操作,一般都是主从配置以后,slave从数据开始增量进行同步,先做数据的增量,然后做数据的增删改查

不会配置好主从复制后,一开始就删主库的东西,如果真的出现这样的问题,随时可以在从库 show slave status,来查看主从同步的状态,有什么错误,就相应解决

要么stop slave,把position重新设置一下,start slave,即重新开启主从同步,从最新的位置,这个drop操作不需要在从库上同步

要么就是stop,跳过该个错误,然后start


mysql> stop slave;
mysql> set global sql_slave_skip_counter=1;
mysql> start slave;

可以通过show slave status查看以下标识,IO线程出错一般是网络问题,SQL线程出错一般是SQL在slave库执行出现了问题

image.png

总结

在网络互通的前提下,进行配置

master配置

  1. 配置文件配置server-id,开启binlog
  2. 创建slave账户,用于登录主库取数据
  3. 查看当前binlog文件以及位置

slave配置

  1. 配置server-id
  2. 使用CHANGE MASTER TO 命令,将master的ip、port、账号、密码、binlog位置等告诉slave
  3. start slave

出错后可以查看错误日志

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
1月前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
111 1
|
14天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
13天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
42 9
|
9天前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
10天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
46 2
|
14天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
25天前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
55 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
关系型数据库 MySQL Go
go抽取mysql配置到yaml配置文件
go抽取mysql配置到yaml配置文件
|
1月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
73 0