Mysql配置Replication主从复制-实现读写分离

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 概述:Mysql集群的方式可以是很多的,主从,一主多从,多组多从,主从的策略还可以进一步选择和配置。可以说是很灵活了。本文介绍的Replication是异步复制同步方案,分别有基于日志的还有基于GTID的。

概述:Mysql集群的方式可以是很多的,主从,一主多从,多组多从,主从的策略还可以进一步选择和配置。可以说是很灵活了。本文介绍的Replication是异步复制同步方案,分别有基于日志的还有基于GTID的。在docker环境下体验一下。

Replication

Replication是mysql异步复制同步方案,不难理解。异步复制速度快,但是一致性差。对于一些不特别重要的数据可以采用这总方案来同步,比如说日志这些数据。对业务影响不大的数据。

拉取mysql 5.7镜像

docker pull mysql:5.7

docker images 查看镜像

img_1c8e925519796256be87d95f4db94f8e.png

实例化两个docker容器

echo "Asia/shanghai" > /home/jorge/docker/mysql-master/timezone

docker run -p 3308:3306 \
--name mysql-master \
-v /home/jorge/docker/mysql-master/conf:/etc/mysql/conf.d \
-v /home/jorge/docker/mysql-master/logs:/logs \
-v /home/jorge/docker/mysql-master/data:/var/lib/mysql \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v /home/jorge/docker/mysql-master/timezone:/etc/timezone \
-e MYSQL_ROOT_PASSWORD=123456 \
-d docker.io/mysql:5.7

echo "Asia/shanghai" > /home/jorge/docker/mysql-slave-1/timezone

docker run -p 3309:3306 \
--name mysql-slave-1 \
-v /home/jorge/docker/mysql-slave-1/conf:/etc/mysql/conf.d \
-v /home/jorge/docker/mysql-slave-1/logs:/logs \
-v /home/jorge/docker/mysql-slave-1/data:/var/lib/mysql \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v /home/jorge/docker/mysql-slave-1/timezone:/etc/timezone \
-e MYSQL_ROOT_PASSWORD=123456 \
-d docker.io/mysql:5.7

docker ps 查看容器实例

img_f9e546cdbff28331affe6c8b8c66d600.png

方式一:使用日志文件同步数据

创建数据库配置文件

master.cnf 配置文件(/home/jorge/docker/mysql-master/conf/master.cnf)

[mysqld]
server-id=1
log-bin=mysql-bin

slave.cnf 配置文件(/home/jorge/docker/mysql-slave-1/conf/master.cnf)

[mysqld]
server_id=2
log-bin=mysql-bin
binlog-format=ROW
#忽略同步的表 
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys

进入mysql-master配置用户权限、查看MASTER_LOG_FILE

# 进入mysql-master
docker exec -it mysql-master /bin/bash
#登陆
mysql -uroot -p
#创建用户、授权、刷新
mysql> CREATE USER 'jorge-m'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'jorge-m'@'%';
mysql> FLUSH PRIVILEGES;

#查看MASTER_LOG_FILE
mysql> show master status;
+----------------------+----------+--------------+------------------+------------------------------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+----------------------+----------+--------------+------------------+------------------------------------------+
| master-binlog.000002 |     1040 |              |                  | ab240285-b4a4-11e8-9104-0242ac110003:1-4 |
+----------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

进入mysql-slave-1配置从库的master参数

mysql> stop slave;
#省略了  mysql> 方便复制粘贴
#MASTER_HOST为mysql-master的ip。在宿主机执行docker inspect mysql-master可查看
CHANGE MASTER TO
     MASTER_HOST='172.17.0.2',
     MASTER_USER='jorge-m',
     MASTER_PORT=3306,
     MASTER_PASSWORD='123456',
     MASTER_LOG_FILE='mysql-bin.000002',
     MASTER_LOG_POS=0;
mysql> reset slave;
mysql> start slave;
#查看slave的启动情况,查看基本参数以及异常信息如下则正常
mysql> show slave status \G
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.0.2
Master_User: jorge-m
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-binlog.000002
Read_Master_Log_Pos: 1040
Relay_Log_File: dfd3ebbbb2f1-relay-bin.000003
Relay_Log_Pos: 1160
Relay_Master_Log_File: master-binlog.000002
......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
Last_Errno: 0
Last_Error: 
......
Last_IO_Errno: 0
Last_IO_Error: 
Last_SQL_Errno: 0
Last_SQL_Error: 

测试

重启容器实例使其加载配置文件

docker restart mysql-master
docker restart mysql-slave-1

接下来我们可以直接在主库新建一个数据库


img_7793e1d5c0250fa143396c3db51610af.png

刷新从库之后我们会发现testdb已经被同步到从库了


img_03e971047e04ae5223bac61ebab83693.png

方式二:GTID配置主从复制

以上是基于日志的主从复制是实现读写分离。这种同步方式很依赖于主库。如果主库宕机或者网络故障等问题出现,可能导致主从库同步丢失,或者多个从库之间数据不一致问题。那么为了解决这个问题mysql5.7.6之后引入了基于事务的主从复制方案。每个事务由唯一的GTID标识。当slave都执行了sql之后,master才持久化到硬盘,否则事务回滚,解决了一致性问题。

配置文件设置打开gtid_modeenforce_gtid_consistency

master.cnf

[mysqld]
#GTID:
server_id=1
gtid_mode=on
enforce_gtid_consistency=on

#binlog
log_bin=master-binlog
log-slave-updates=1    
binlog_format=row

#relay log
skip_slave_start=1

slave.cnf

[mysqld]
#GTID:
gtid_mode=on
enforce_gtid_consistency=on
server_id=2

#binlog
log-bin=slave-binlog
log-slave-updates=1
binlog_format=row

#relay log
skip_slave_start=1

登陆主库设置

如果主从库有操作没有同步的话要执行以下命令清空gtid_purged,或者dump备份主库到从库之后再设置

#登陆mysql主库后执行
reset master;
#查看gtid_purged和gtid_executed,两个值位为空即可
mysql> show global variables like '%gtid%'\G

登陆从库设置

这里配置MASTER_AUTO_POSITION = 1;会根据GTID去获取数据,因此不需要配置 MASTER_LOG_FILE和MASTER_LOG_POS了

mysql> stop slave;
 CHANGE MASTER TO  
     MASTER_HOST='172.17.0.2',    
     MASTER_USER='jorge-m',    
     MASTER_PASSWORD='123456',    
     MASTER_PORT=3306,    
     MASTER_AUTO_POSITION = 1;

mysql> reset slave;
mysql> reset master;
mysql> start slave;
#查看slave的启动情况,查看基本参数以及异常信息如下则正常
mysql> show slave status \G
......
# 我们会发现多了如下的值
Master_UUID: ab240285-b4a4-11e8-9104-0242ac110003

总结:

体验过后发现Replication的方式是单向同步的,只能从master写,从slave读。异步复制虽然性能上比较有优势,但是容灾能力真的不强。如果用这种方式来同步日志数据库的话,还可以接受。当然,这样的考虑mysql肯定也是会考虑到的。下一次学习体验下PXC 集群方案( Percona XtraDB Cluster )。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
129 1
|
7天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
66 24
|
2月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
123 1
MySQL主从复制原理和使用
|
1月前
|
存储 SQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
166 2
|
2月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
95 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
244 0
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
18 3