微服务架构下,利用Sharding-jdbc解决读写分离查询延迟问题

数据库 MySQL
当Mysql数据库数据达到一定量后,查询SQL执行会变慢起来,除了建索引、优化程序代码以及SQL语句等常规手段外,利用经典MHA数据库中间件做数据库读写分离是一个不错的选择。但是在读写分离架构中会出现一个共性问题:SQL读取延迟。

 前言

[[276966]]

当Mysql数据库数据达到一定量后,查询SQL执行会变慢起来,除了建索引、优化程序代码以及SQL语句等常规手段外,利用经典MHA数据库中间件做数据库读写分离是一个不错的选择。但是在读写分离架构中会出现一个共性问题:SQL读取延迟。

读写实时场景

比如在微服务应用端新增一条业务数据,然后立即读取,这个时候会遇到读取不到情况!

为什么呢?

利用sharding-jdbc解决Mysql读写分离查询延迟的问题

来源网络

因为在读写分离架构中,主节点负责写入数据,同时mysql利用多线程技术把数据同步到从节点,从节点负责应用端读取请求。

而Mysql主从数据同步数据存在同步时间差,带来的问题是从节点同步不到主节点(Master)数据,应用端从从节点(Slave)读取不到新增的数据情况。

解决方案

利用官方HintManager 分片键值管理器, 强制路由到主库查询

利用sharding-jdbc解决Mysql读写分离查询延迟的问题

通过调用hintManager.setMasterRouteOnly() 强制路由到主库查询,伪代码如下:

  1. public ArticleEntity getWithMasterDB(Long id, String wid) { 
  2.  HintManager hintManager = HintManager.getInstance() ; 
  3.  hintManager.setMasterRouteOnly(); 
  4.  ArticleEntity article = baseMapper.queryObject(id, wid); 

通过强制路由到主库查询有个风险,对于更新并实时查询业务场景比较多,如果都切到主库查询,势必会对主库服务器性能造成影响,可能还影响主从数据同步,所以要根据实际业务场景评估采用这种方式带来的服务器性能问题。

另外,如果业务层面可以做妥协的话,尽量减少这种更新并实时查询方式,一种思路是实时更新库,利用线程异步查询(例如更新后,睡眠1-2秒再查询),伪代码如下:

  1. public class ArticleCacheTask implements Runnable {  
  2.  @Override 
  3.  public void run() { 
  4.   
  5.  try { 
  6.  // 控制读写分离不同步设置 
  7.  Thread.sleep(2000); 
  8.  } catch (InterruptedException e) { 
  9.  e.printStackTrace(); 
  10.  } 
  11.  ArticleEntity articleEntity = articleService.getWithMasterDB(Long.valueOf(id), wid); 
  12.  } 
责任编辑:华轩 来源: Wooola
相关推荐

2021-10-27 09:55:55

Sharding-Jd分库分表Java

2022-05-16 08:50:23

数据脱加密器

2024-03-14 09:30:04

数据库中间件

2019-09-25 11:48:08

MySQL数据库Java

2018-01-01 05:23:13

服务化读写分离架构

2022-08-16 08:50:40

微服务动态读写分离

2023-11-03 09:17:12

数据库配置库表

2022-03-24 12:15:50

MySQL数据库读写分离

2018-10-16 16:45:05

数据库读写分离

2021-03-08 08:16:42

MySQL分离架构

2015-06-01 10:14:13

微服务AWS性能弹性计算云

2020-11-06 15:30:23

分库分表Sharding-JD数据库

2021-09-28 09:43:11

微服务架构技术

2022-05-16 14:12:43

微服务流量软件

2023-07-28 09:23:24

微服务架构

2017-12-26 16:18:00

架构服务化读写分离

2021-06-22 18:00:09

微服务架构系统

2017-07-17 15:50:17

微服务Docker架构

2009-07-15 17:00:49

JDBC查询

2018-01-09 18:46:44

数据库架构读写分离
点赞
收藏

51CTO技术栈公众号