微服务架构下,利用Sharding-jdbc解决读写分离查询延迟问题
2023-03-14 22:23:53 时间
前言
当Mysql数据库数据达到一定量后,查询SQL执行会变慢起来,除了建索引、优化程序代码以及SQL语句等常规手段外,利用经典MHA数据库中间件做数据库读写分离是一个不错的选择。但是在读写分离架构中会出现一个共性问题:SQL读取延迟。
读写实时场景
比如在微服务应用端新增一条业务数据,然后立即读取,这个时候会遇到读取不到情况!
为什么呢?
来源网络
因为在读写分离架构中,主节点负责写入数据,同时mysql利用多线程技术把数据同步到从节点,从节点负责应用端读取请求。
而Mysql主从数据同步数据存在同步时间差,带来的问题是从节点同步不到主节点(Master)数据,应用端从从节点(Slave)读取不到新增的数据情况。
解决方案
利用官方HintManager 分片键值管理器, 强制路由到主库查询
通过调用hintManager.setMasterRouteOnly() 强制路由到主库查询,伪代码如下:
- public ArticleEntity getWithMasterDB(Long id, String wid) {
- HintManager hintManager = HintManager.getInstance() ;
- hintManager.setMasterRouteOnly();
- ArticleEntity article = baseMapper.queryObject(id, wid);
- }
通过强制路由到主库查询有个风险,对于更新并实时查询业务场景比较多,如果都切到主库查询,势必会对主库服务器性能造成影响,可能还影响主从数据同步,所以要根据实际业务场景评估采用这种方式带来的服务器性能问题。
另外,如果业务层面可以做妥协的话,尽量减少这种更新并实时查询方式,一种思路是实时更新库,利用线程异步查询(例如更新后,睡眠1-2秒再查询),伪代码如下:
- public class ArticleCacheTask implements Runnable {
- @Override
- public void run() {
- try {
- // 控制读写分离不同步设置
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- ArticleEntity articleEntity = articleService.getWithMasterDB(Long.valueOf(id), wid);
- }
- }
相关文章
- Ubuntu 系统中通过火狐OS模拟器轻松体验 Firefox OS
- 安装 Ubuntu 13.04 后要做的六件事
- 成人网站性能提升20倍之经验谈
- 优秀的开源系统恢复软件
- Libreoffice 4.0.3 发布 – PPA 安装源
- 在u盘上安装linux 打造你的portable linux system.
- 在 Windows 世界中使用 Linux
- Vmware 安装 Fedora 18 注意事项
- 8个实用的netcat命令实例
- 安利一款运维杀手锏,让监控部署不再尴尬!(附视频)
- 如何在安装双启动后卸载 Windows 或者 Linux
- Linux 上最优秀的数据恢复工具
- 细说自动化运维的前世今生
- Tumblr 架构设计
- 因微信支付API对IPv6支持不完整引起的一次故障
- Linux下去除windows密码
- Oracle 12cR2发布,金融行业准备大规模上了
- Linux TCP 系统参数配置
- AWS S3误操作,官方故障回顾及专家深度思考
- linux下部署goagent