MySQL主从复制的原理与实操+mycat2读写分离

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL主从复制的原理与实操+mycat2读写分离

MySQL主从复制的原理与实操

主从复制原理

当一个MySQL数据库服务器负载过重或者需要横向扩展时,主从复制是一种非常常见的解决方案。MySQL主从复制是将一个数据库服务器(master)的数据复制到其他数据库服务器(salve)的过程。在这个过程中,主服务器上的所有更改都将被自动复制到从服务器,从而实现数据同步。

下面是MySQL主从复制的基本原理:

  1. 主服务器记录二进制日志(Binary Log)。
  2. 从服务器连接到主服务器并请求复制数据。主服务器创建一个复制线程,将复制数据发送给从服务器。从服务器通过IO Thread(输入/输出线程)连接到主服务器,并从主服务器请求二进制日志文件。主服务器在二进制日志中记录所有的更改,然后将这些更改发送给从服务器。IO Thread 将这些更改写入从服务器上的中继日志文件(Relay Log)。
  3. 从服务器执行中继日志中的更改。SQL Thread(SQL 线程)从中继日志中读取数据并将其应用到从服务器上。SQL Thread 按照主服务器的顺序执行每个更改,以确保从服务器与主服务器保持同步。
  4. 当有新的更改发生时,主服务器将记录更改并将其发送到所有连接的从服务器。从服务器将这些更改写入中继日志文件并应用这些更改。
  5. 如果从服务器出现问题,可以通过将一个新的从服务器连接到主服务器来重新启动复制进程。

需要注意的是,MySQL主从复制并不是一种高可用性解决方案。如果主服务器宕机,从服务器将不能自动接管服务。因此,在设计高可用性系统时,可能需要使用其他技术。

MySQL主从复制的高级应用

  1. 复制方式:MySQL主从复制可以通过同步或异步的方式进行复制。在同步复制中,主服务器必须等待所有的从服务器确认它们已成功地接收并应用了所有更改,才能提交更改。这确保了数据的一致性,但会降低系统的性能。在异步复制中,主服务器无需等待从服务器确认,因此可以提高系统的性能,但可能会导致数据不一致。
  2. 复制过滤:在进行主从复制时,可以使用复制过滤来控制哪些更改将被复制到从服务器。例如,可以指定仅复制特定的数据库、表或列。
  3. 自动故障转移:MySQL主从复制本身并不支持自动故障转移,因此在设计高可用性系统时,需要使用其他技术,例如基于虚拟IP地址的故障转移技术或者结合使用MySQL主从复制和集群技术来实现。
  4. 主从切换:在某些情况下,需要手动切换主从角色,例如当主服务器出现故障时,需要手动将从服务器提升为主服务器。在进行主从切换时,需要注意切换的正确性以及避免数据不一致。

总的来说,MySQL主从复制是一种非常强大和灵活的技术,它可以实现数据的高可用性、负载均衡和数据备份等目的。但是在使用时需要了解其原理和细节,以避免出现潜在的问题。

MySQL主从复制实操(一主两从)

环境准备

两台机器一主两从。

主master:IP 192.168.133.129

从slave1:IP 192.168.133.130

从slave2:IP 192.168.133.131

master配置

[mysqld] 
log_bin = mysql-bin 
server_id = 1
systemctl restart mysqld      # 重启服务

2.建立同步账号

mysql> grant replication slave on *.* to 'rep'@'192.168.133.%' identified by
'123456';
mysql> show grants for 'rep'@'192.168.133.%';

3.通过mysqldump同步三个数据库中的db

# 锁表设置只读为后面备份准备,注意生产环境要提前申请停机时间; 
mysql> flush tables with read lock; 
# 提示:如果超过设置时间不操作会自动解锁。 
mysql> show variables like '%timeout%'; 
# 测试锁表后是否可以创建数据库:
# 查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
# 备份数据库数据
mysqldump -uroot -p -A  -B ···> /server/backup/mysql_bak.$(date +%F).sql

4.解锁
mysql> unlock tables;

5.主库备份数据上传到从库

scp /server/backup/mysql_bak.2015-11-18.sql.gz 192.168.95.130:/server/backup

slave设置

1)设置server-id值并关闭binlog参数

[mysqld] 
log_bin = mysql-bin 
server_id = 130
# 重启数据库
systemctl restart mysqld  

2.还原从主库备份数据

cd /server/backup/ 
mysql -uroot -p < /server/backup/mysql_bak.$(date +%F).sql
# 检查还原: 
mysql -uroot -p -e 'show databases;' 

3.设定从主库同步

mysql> change master to 
MASTER_HOST='192.168.95.120', 
MASTER_PORT=3306, 
MASTER_USER='rep', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql-bin.000003', 
MASTER_LOG_POS=329; 

4.启动从库同步开关

mysql> start slave; 
# 检查状态: 
mysql> show slave status\G
# Slave_IO_Running: IO线程是否打开 YES/No/NULL
# Slave_SQL_Running: SQL线程是否打开 YES/No/NULL

MySQL读写分离配置(一主两从)

创建数据源

# 添加读写的数据源 
/*+ mycat:createDataSource{ 
"dbType":"mysql", 
"idleTimeout":60000, 
"initSqls":[], 
"initSqlsGetConnection":true, 
"instanceType":"READ_WRITE", 
"maxCon":1000, 
"maxConnectTimeout":3000, 
"maxRetryCount":5, 
"minCon":1, 
"name":"m1", 
"password":"123456", 
"type":"JDBC", 
"url":"jdbc:mysql://127.0.0.1:3306/db1? useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8", "user":"root", 
"weight":0 
} */;
# 添加读的数据源 
/*+ mycat:createDataSource{ 
"dbType":"mysql", 
"idleTimeout":60000, 
"initSqls":[], 
"initSqlsGetConnection":true, 
"instanceType":"READ", 
"maxCon":1000, 
"maxConnectTimeout":3000, 
"maxRetryCount":5,
"minCon":1, 
"name":"m1s1", 
"password":"123456", 
"type":"JDBC", 
"url":"jdbc:mysql://127.0.0.1:3307/db1? useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
"user":"root", 
"weight":0 }
*/;
/*+ mycat:createDataSource{ 
"dbType":"mysql", 
"idleTimeout":60000, 
"initSqls":[], 
"initSqlsGetConnection":true, 
"instanceType":"READ", 
"maxCon":1000, 
"maxConnectTimeout":3000, 
"maxRetryCount":5,
"minCon":1, 
"name":"m1s2", 
"password":"123456", 
"type":"JDBC", 
"url":"jdbc:mysql://127.0.0.1:3308/db1? useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
"user":"root", 
"weight":0 }
*/;

查询数据源

/*+ mycat:showDataSources{} */

7.3 创建集群

/*! mycat:createCluster{ 
"clusterType":"MASTER_SLAVE", 
"heartbeat":{ 
"heartbeatTimeout":1000, 
"maxRetry":3,
"minSwitchTimeInterval":300, 
"slaveThreshold":0 
}, "masters":[ 
"m1
" ], 
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"replicas":[
"m1s1"
"m1s2"
],
"switchType":"SWITCH"
} */;

查询集群

/*+ mycat:showClusters{} */

创建逻辑库

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

修改逻辑库的数据源

修改conf/schemas/db1.schema.json

vim /data/mycat/conf/schemas/db1.schema.json

在里面添加 "targetName":"prototype",

[root@node4 mysqlms]# cat /data/mycat/conf/schemas/db1.schema.json
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"db1",
"shardingTables":{},
"targetName":"prototype",
"views":{}
}

测试读写分离是否成功

在MyCAT里面测试

重启MyCAT:

[root@node4 mysqlms]# cd /data/mycat/bin/
[root@node4 bin]# ./mycat restart

1)在MyCAT里面创建一个sys_user表:

use db1;
CREATE TABLE SYS_USER( ID BIGINT PRIMARY KEY, USERNAME VARCHAR(200) NOT NULL,ADDRESS VARCHAR(500));

2)通过注释生成物理库和物理表:

如果物理表不存在,在 MyCAT2 能正常启动的情况下,根据当前配置自动创建分片表,全局表和物理 表:

/*+ mycat:repairPhysicalTable{} */;

3)查看后端物理库

4)在MyCAT里面向sys_user表添加一条数据:

INSERT INTO SYS_USER(ID,USERNAME,ADDRESS) VALUES(1,"XIAOMING","WUHAN");

5)修改MySQL里面的让数据不一样

6)在MyCAT里面查询数据,会发现每次查询的结果不一样

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
2月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
115 1
|
3天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
47 24
|
7天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
27 5
|
18天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
2月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
111 1
MySQL主从复制原理和使用
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1698 14
|
2月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
2月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
12天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
81 15

推荐镜像

更多
下一篇
DataWorks