mysql并发写入能支持多大并发_打通MySQL架构和业务的通道

目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式。从数据库的业务需求、架构设计、运营维护、再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解决一定的业务问题。

本文从MySQL常见架构、业务环境分类、业务与架构结合使用原则三个方面对MySQL数据库和业务场景进行探讨和说明,让大家先分别对MySQL的架构和业务分类有所了解,然后再将两者贯通起来,使得能够在进行业务与MySQL架构设计时纲举目张,让用户可以用合适的技术解决支撑业务需求。

一、MySQL数据库常见架构

24712a1574b5c1577e0a22a544c4c1c5.png

为了对MySQL数据库常见架构,能够有进行比较清晰的认识,下面先从MySQL三种通用基础架构、五种特殊需求架构、架构组合与综合使用三个方面进行说明。

1、MySQL三种常见基础架构

(1)MySQL单实例架构

MySQL单实例,就是在服务器上部署一个MySQL实例来对外提供服务,这是最开始接触MySQL数据库会使用的方式,也是常见学习、研究MySQL数据库的使用方式。

MySQL单实例的使用方式,是MySQL数据库使用的第一阶段,通常这种情况下,MySQL数据库与应用程序会在同一个服务器上。

这种方式主要好处就是部署和使用简单,直接通过编译安装,或者二进制包解压安装,很快就可以有一个可以使用的MySQL数据库环境。同时,这种方式,依赖性少,不需要依赖其他第三方工具或者软件,维护和故障定位也比较容易。

熟悉和掌握好MySQL单实例环境的技能,也是维护其它MySQL架构的基础。

需要注意的是,MySQL单实例在学习和开发环境可以使用一下,但这种方式的可用性和灾备性较弱,如果作为业务系统使用的数据库,尽量不要用这种方式。

a0b7ef803766fd8289d892137d893f6a.png

(2)MySQL master-slave主从架构

MySQL master-slave主从环境,是在MySQL单实例环境的基础上,将MySQL进行全库备份,再恢复出一个或多个MySQL实例,通过change master命令,指定新恢复出的MySQL实例,从那个MySQL节点上读取变化日志,并在本地应用,使新恢复的实例与原来的MySQL实例数据一致保持一致。

所以,原来的数据一致变化的实例,叫master主节点;从master节点获取日志,并在本地应用,使数据与master阶段保持一致的节点,叫slave从节点;这样的架构环境,就叫 master-slave主从环境。

Master-slave主从环境,是MySQL数据库非常具有特色的功能,也是MySQL数据库应用在生产环境的常见架构。

通过master-slave架构,就可以使线上数据库的数据有了多份,起到了一定的数据备份功能。Slave从库数据变化只通过应用日志实现,一般不会主动产生写数据的情况,但可以提供对外数据读服务,这样通过增加几个slave从库,让只进行数据读取的业务到slave从库上查询,就都可以大大提高业务的读性能和吞吐量。在互联网行业中,非常多的数据读操作远高于数据写操作的业务场景,通过在master主节点写数据,在slave节点上读数据,进行这种读写分离的架构,可以很好地满足业务需求。

当然,MySQL的master-slave主从架构,具体实现也可以非常灵活,1个master主节点,可以有1个或多个slave从节点;而一个slave节点,也可以当做其它节点的slave节点,如果一个slave节点后面再有其它节点当做这个节点的slave从节点,就叫做级联复制。

MySQL的master-save架构,在MySQL单实例架构的基础上,提高了MySQL数据库的性能、可用性和可扩展性,同时也为MySQL数据库追求更高的可用性,提供了基础保障。

8a952659e97248cf9a3d3da17712a530.png

(3MySQL MHA高可用架构

虽然MySQL数据库的master-salve主从架构,使数据库有了多份,但这些maste主节点和slave从节点之间,仍然是相对独立的,尤其是master主节点如果出现故障了,仍然是不能对外提供数据库服务的。为了应该各种故障和特殊情况,实现数据库更高的可用性,就需要在master-slave的基础上,通过其它组件来实现更高的可用性。MySQL高可用性的方案比较多,但目前比较主流、比较成熟的方案,还是MySQL + MHA高可用架构。

简单来说,为了实现更高的可用性,就要在master-slave主从环境的基础上,将业务连接master的IP,有master主机的实际IP,变成虚拟的VIP或者域名。应用程序通过VIP访问数据库,进行数据读写,在正常情况下,业务在master上进行读写;如果master节点出现故障,高可用组件会监测到这个故障,并将VIP切换到slave从库上,同时对于slave从库上进行日志的传输和应用,保证slave上的数据,与master节点故障前的数据尽量一致,这样切换后新的slave节点就仍然可以对外提供数据库服务。

当然,对于具体实现来说,在MySQL的master-slave主从结构外,VIP和数据库

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spark中将计算结果写入MySQL时,可能会遇到并发问题。下面是一些常见问题及解决方法: 1. 插入重复数据:如果在并行处理过程中,多个任务尝试将相同的数据插入到MySQL中,可能会导致插入重复数据的问题。解决方法是使用MySQL的唯一约束或主键来避免插入重复数据。 2. 数据丢失:如果在并行处理过程中,多个任务尝试同时更新相同的数据,可能会导致数据丢失问题。解决方法是使用MySQL的事务隔离级别来保证数据一致性。 3. 性能问题:如果并发写入MySQL的数量过多,可能会导致性能下降。解决方法是使用连接池来管理MySQL连接,以便重用连接,避免频繁创建和销毁连接。 下面是一个Spark计算结果写入MySQL的示例: ```scala import java.sql.{Connection, DriverManager, PreparedStatement} import org.apache.spark.sql.{DataFrame, SparkSession} object SparkWriteToMysql { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("SparkWriteToMysql") .master("local[*]") .getOrCreate() // 读取数据 val df: DataFrame = spark.read .option("header", "true") .csv("data.csv") // 写入MySQL df.foreachPartition(partition => { // 获取MySQL连接 val conn: Connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password") // 批量插入数据 val sql: String = "INSERT INTO test_table (col1, col2) VALUES (?, ?)" val pstmt: PreparedStatement = conn.prepareStatement(sql) partition.foreach(row => { pstmt.setString(1, row.getAs[String]("col1")) pstmt.setString(2, row.getAs[String]("col2")) pstmt.addBatch() }) pstmt.executeBatch() // 关闭连接 pstmt.close() conn.close() }) spark.stop() } } ``` 在这个示例中,我们使用了`foreachPartition`操作,将DataFrame的每个分区并行写入MySQL中。我们使用`DriverManager`获取MySQL连接,并使用`PreparedStatement`批量插入数据。最后,我们关闭连接,并停止SparkSession。 请注意,这个示例并没有处理并发问题,您需要根据您的具体情况进行适当的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值