MySQL读写分离的项目时间实践

 更新时间:2025年03月06日 10:58:24   作者:Bean295  
本文主要介绍了MySQL数据库的读写分离技术,包括一主一从和双主双从两种架构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。

一、一主一从读写分离

1、一主一从原理:

MySQL的主从复制,是基于二进制日志(binlog)实现的。

10.1.1.10 :master

10.1.1.20 :slave

检查主从同步是否生效:

2、一主一从读写分离

(1) 介绍:

MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。

负载均衡策略 balance 配置:

(2) 配置:

① 修改 schema.xml:

② 修改 server.xml:

③ 启动mycat:

balance 值设置为3,所有的读操作均由从库承担,从库的数据变更不会同步到从库。如果从库与主库上的数据不一致,mycat查询数据得到的结果是从库中的数据。

加入主库宕机,查询操作不受影响,但插入、更新等操作则无法实现。

二、双主双从读写分离

1、双主双从搭建:

(1) 介绍:

一个主机 Master1 用于处理所有写请求,它的从机 Slave1 和另一台主机 Master2 还有它的从机 Slave2 负责所有读请求。当 Master1 主机宕机后,Master2 主机负责写请求,Master1 、 Master2 互为备机。

10.1.1.10 :mycat 服务器

10.1.1.30 :master1

10.1.1.40 :master2

10.1.1.50 :slave1

10.1.1.60 :slave2

(2) 主库配置:

① master1(10.1.1.30)

● 修改配置文件:

vim /etc/my.cnf

#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,默认为1
server-id=1
#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03

# 在作为从数据库的时候,有写入操作也要更新二进制日志文件

log-slave-updates

log-slave-updates:双主双从结构下,两个主库不仅互为对方的从库,也有自己的从库,slave1、2需要读取master1、2的二进制日志文件保证数据同步。

● 重启mysql服务器:systemctl restart mysqld

● 创建账户并授权:

CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY'6666' ;
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';

查看二进制日志坐标:

② master2(10.1.1.40)

配置步骤与master1类似:

vim /etc/my.cnf

server-id=3
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
log-slave-updates
systemctl restart mysqld

CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY'6666' ;

GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';

(3) 从库配置:

① slave1(10.1.1.50)

● 修改配置文件

vim /etc/my.cnf

#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 23^2-1,默认为1

server-id=2

systemctl restart mysqld

● 关联对应的主库:

CHANGE MASTER TO MASTER_HOST='10.1.1.30', MASTER_USER='itcast', MASTER_PASSWORD='6666', MASTER_LOG_FILE='binlog.000010', MASTER_LOG_POS=663;

● 启动主从复制,查看从库状态:

start slave;

show slave status \G;

② slave2(10.1.1.60)

● 修改配置文件

vim /etc/my.cnf

#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 23^2-1,默认为1

server-id=4

systemctl restart mysqld

● 关联对应的主库:

CHANGE MASTER TO MASTER_HOST='10.1.1.40', MASTER_USER='itcast', MASTER_PASSWORD='6666', MASTER_LOG_FILE='binlog.000009', MASTER_LOG_POS=663;

● 启动主从复制,查看从库状态:

start slave;

show slave status \G;

(4) 两台主库互相复制:

① master1:

CHANGE MASTER TO MASTER_HOST='10.1.1.40', MASTER_USER='itcast', MASTER_PASSWORD='6666', MASTER_LOG_FILE='binlog.000009', MASTER_LOG_POS=663;

start slave;

show slave status \G;

② master2:

CHANGE MASTER TO MASTER_HOST='10.1.1.30', MASTER_USER='itcast', MASTER_PASSWORD='6666', MASTER_LOG_FILE='binlog.000010', MASTER_LOG_POS=663;

start slave;

show slave status \G;

(5) 测试:

在master1上创库创表,插入数据:

create database db01;
use db01;
create table tb_user(
id int(11) not null,
name varchar(50) not null,
sex varchar(1),
primary key (id)
)engine=innodb default charset=utf8;
insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');
insert into tb_user(id,name,sex) values(4,'Jack Ma','1');
insert into tb_user(id,name,sex) values(5,'Coco','0');
insert into tb_user(id,name,sex) values(6,'Jerry','1');

2、双主双从读写分离:

(1) 介绍:

MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制,通过writeType及switchType来完成失败自动切换的。

(2) 配置:

① 配置 schema.xml:

配置逻辑库和数据节点:

配置节点主机:

● balance="1" :代表全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,即 M2,S1,S2 都参与 select 语句的负载均衡。

● writeType 0:写操作都转发到第1台writeHost,writeHost1挂了会切换到writeHost2上;1:所有的写操作都随机地发送到配置的writeHost上。

● switchType -1 : 不自动切换 ;1 : 自动切换。

② 修改 server.xml:

③ 重启启动mycat进行测试:

当主节点master1宕机后,在mycat上执行insert和select操作均不受影响,说明双主双从读写分离配置成功。

到此这篇关于MySQL读写分离的项目时间实践的文章就介绍到这了,更多相关MySQL读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • DB为何大量出现select @@session.tx_read_only 详解

    DB为何大量出现select @@session.tx_read_only 详解

    这篇文章主要给大家介绍了关于DB为何大量出现select @@session.tx_read_only 的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 获取MySQL的表中每个userid最后一条记录的方法

    获取MySQL的表中每个userid最后一条记录的方法

    这篇文章主要介绍了获取MySQL的表中每个userid最后一条记录的方法,并且针对userid不唯一的情况,需要的朋友可以参考下
    2015-05-05
  • MySQL索引总结(Index Type)

    MySQL索引总结(Index Type)

    本文主要介绍了MySQL索引总结(Index Type),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Mysql分库分表实现方式

    Mysql分库分表实现方式

    这篇文章详细介绍了分库分表的概念,原因,如何实现,以及不同中间件的优缺点,同时,也介绍了如何进行数据迁移和扩容缩容,以及如何处理分库分表后的ID和事务问题
    2025-02-02
  • Mysql修改字段名和修改字段类型的实例代码

    Mysql修改字段名和修改字段类型的实例代码

    MySQL中如何使用SQL语句来修改表中某一个字段的数据类型呢,下面这篇文章主要给大家介绍了关于Mysql修改字段名和修改字段类型的相关资料,需要的朋友可以参考下
    2022-05-05
  • MySQL如何添加环境变量和初始化MySQL

    MySQL如何添加环境变量和初始化MySQL

    本文主要介绍了如何在Windows系统中添加MySQL的环境变量以及如何初始化MySQL,通过添加环境变量,可以在任意一个命令提示符中直接调用MySQL的相关程序,大大简化了操作,初始化MySQL时,需要新建一个配置文件并指定默认编码集和存储引擎,如果初始化过程中出现错误
    2024-11-11
  • mysql ONLY_FULL_GROUP_BY设置sql_mode无效排查问题(windows)

    mysql ONLY_FULL_GROUP_BY设置sql_mode无效排查问题(windows)

    这篇文章主要介绍了mysql ONLY_FULL_GROUP_BY设置sql_mode无效排查问题(windows),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • MySQL数据库常用操作和技巧(DBA必备知识)

    MySQL数据库常用操作和技巧(DBA必备知识)

    MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老MySQL DBA总结了MySQL数据库最常见和最常使用的一些经验和技巧,与分享大家!
    2011-03-03
  • MySQL查看事务与锁的操作示例小结

    MySQL查看事务与锁的操作示例小结

    本文介绍了MySQL中事务和锁的基本概念以及不同隔离级别下的锁类型,并通过实际测试验证了这些锁的使用情况,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • MySQL不推荐使用uuid或者雪花id作为主键的原因分析

    MySQL不推荐使用uuid或者雪花id作为主键的原因分析

    在数据库设计中,选择适当的主键类型对于数据的存储和查询效率至关重要,在MySQL中,有些开发者倾向于使用UUID或者雪花ID作为主键,以确保数据的唯一性,本文将探讨在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并与其他主键类型进行差异化对比
    2023-11-11

最新评论