Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你还在代码里做读写分离么,试试这个中间件吧!

你还在代码里做读写分离么,试试这个中间件吧!

作者头像
macrozheng
发布于 2020-02-13 10:02:37
发布于 2020-02-13 10:02:37
1.4K00
代码可运行
举报
文章被收录于专栏:mall学习教程mall学习教程
运行总次数:0
代码可运行

传统的MySql读写分离方案是通过在代码中根据SQL语句的类型动态切换数据源来实现的,那么有没有什么中间件可以自动实现读写分离呢?小米开源的数据库中间件Gaea就可以实现,接下来我们将详细讲解如何使用Gaea来实现MySql的读写分离。

Gaea简介

Gaea是小米中国区电商研发部研发的基于MySql协议的数据库中间件,目前在小米商城大陆和海外得到广泛使用,包括订单、社区、活动等多个业务。Gaea支持分库分表、SQL路由、读写分离等基本特性,其中分库分表方案兼容了mycat和kingshard两个项目的路由方式。

MySql主从复制

使用Gaea需要依赖MySql的主从复制环境,关于MySql的主从复制可以参考:MySql主从复制,从原理到实践!

直接在Linux下安装

目前官方提供的是在Linux下直接安装的方式,我们先按此方法来安装Gaea。

安装Go语言环境

由于Gaea是使用Go语言编写的,所以我们需要先安装Go语言的环境。

  • 安装Go语言环境,下载地址:https://golang.org/dl/
  • 下载完成后解压到/mydata目录下;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar -zxvf go1.13.5.linux-amd64.tar.gz -C /mydata/
  • 添加/mydata/go/bin目录到PATH变量中:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 编辑环境变量配置文件
vim /etc/profile
# 在最后一行添加
export GOROOT=mydata/go
export PATH=$PATH:$GOROOT/bin
# 刷新配置文件
source /etc/profile
  • 查看版本号,测试是否安装成功:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go version
  • 返回以下信息表示Go语言环境已经安装成功了:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go version go1.13.5 linux/amd64

安装Gaea

由于Gaea并没有提供安装包,所以我们需要自行编译源码获取可执行文件。

  • 下载Gaea的源码,直接下载zip包即可,下载地址:https://github.com/XiaoMi/Gaea
  • 将下载好的压缩包进行解压操作,这里我们解压到/mydata/gaea/目录下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unzip Gaea-master.zip
  • 进入/mydata/gaea/目录下,使用make命令对源码编译:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make build
  • 注意:由于网络问题,某些Go的依赖会下载不下来导致编译失败,多尝试几次即可成功;
  • 编译完成后在/mydata/gaea/bin目录下会生成Gaea的执行文件gaea
  • 由于我们没有搭建etcd配置中心,所以需要修改本地配置文件/mydata/gaea/etc/gaea.ini,将配置类型改为file
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
; 配置类型,目前支持file/etcd两种方式,file方式不支持热加载
config_type=file
  • 添加namespace配置文件,用于配置我们的主从数据库信息,配置文件地址:/mydata/gaea/etc/file/namespace/mall_namespace_1.json
  • 配置文件内容如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "name": "mall_namespace_1",
    "online": true,
    "read_only": false,
    "allowed_dbs": {
        "mall": true
    },
    "slow_sql_time": "1000",
    "black_sql": [
        ""
    ],
    "allowed_ip": null,
    "slices": [
        {
            "name": "slice-0",
            "user_name": "root",
            "password": "root",
            "master": "192.168.6.132:3307",
            "slaves": ["192.168.6.132:3308"],
            "statistic_slaves": null,
            "capacity": 12,
            "max_capacity": 24,
            "idle_timeout": 60
        }
    ],
    "shard_rules": null,
    "users": [
        {
            "user_name": "macro",
            "password": "123456",
            "namespace": "mall_namespace_1",
            "rw_flag": 2,
            "rw_split": 1,
            "other_property": 0
        }
    ],
    "default_slice": "slice-0",
    "global_sequences": null
}

namespace配置文件

namespace的配置格式为json,包含分表、非分表、实例等配置信息,都可在运行时改变。

  • 整体配置说明:
  • slice配置:
  • users配置:

在Docker容器中运行

由于官方只提供了Linux下直接安装运行的方式,这里我们提供另一种运行方式,在Docker容器中作为服务运行。

打包成Docker镜像

Docker Hub 中并没有打包好的Gaea镜像,我们需要自行构建一个,下面详细介绍下如何构建Gaea的Docker镜像。

  • 这里我们使用Dockerfile构建Docker镜像,Dockerfile中的内容如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 该镜像需要依赖的基础镜像
FROM golang:latest
# 将当前目录下的gaea源码包复制到docker容器的/go/Gaea-master目录下,对于.tar.gz文件会自动解压
ADD Gaea-master.tar.gz /go/Gaea-master
# 将解压后的源码移动到/go/gaea目录中去
RUN bash -c 'mv /go/Gaea-master/Gaea-master /go/gaea'
# 进入/go/gaea目录
WORKDIR /go/gaea
# 将gaea源码进行打包编译
RUN bash -c 'make build'
# 声明服务运行在13306端口
EXPOSE 13306
# 指定docker容器启动时执行的命令
ENTRYPOINT ["/go/gaea/bin/gaea"]
# 指定维护者的名字
MAINTAINER macrozheng
  • 在此之前我们需要把Gaea的源码压缩包转换为.tar.gz格式方便在Docker容器中的解压,可以使用压缩软件来实现:
  • 之后使用Docker命令构建Gaea的Docker镜像:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build -t gaea:1.0.2 .
  • 构建成功控制台输出:
  • 将本地安装的Gaea配置文件复制到/mydata/gaea-docker/etc/目录下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp -r /mydata/gaea/etc/ /mydata/gaea-docker/etc/
  • 使用Docker命令启动Gaea容器:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 13306:13306 --name gaea \
-v /mydata/gaea-docker/etc:/go/gaea/etc \
-d gaea:1.0.2

测试读写分离

测试思路:首先我们关闭从实例的主从复制,然后通过Gaea代理来操作数据库,插入一条数据,如果主实例中有这条数据而从实例中没有,说明写操作是走的主库。然后再通过Gaea代理查询该表数据,如果没有这条数据,表示读操作走的是从库,证明读写分离成功。

  • 通过Navicat连接到Gaea代理,注意此处账号密码为Gaea的namespace中配置的内容,端口为Gaea的服务端口;
  • 通过Navicat分别连接到主库和从库,用于查看数据,此时建立了以下三个数据库连接;
  • 通过stop slave命令关闭mysql-slave实例的主从复制功能:
  • 通过Gaea代理在test表中插入一条数据:
  • 在主库中查看test表的数据,发现已有该数据:
  • 在从库中查看test表的数据,发现没有该数据,证明写操作走的是主库:
  • 直接在代理中查看test表中的数据,发现没有该数据,证明读操作走的是从库。

结合SpringBoot使用

在我们的SpringBoot应用中,我们只需要把Gaea的代理服务直接当做数据库服务来使用就可以实现读写分离了。这样就不用在代码中添加任何读写分离逻辑了,是不是很方便!

参考资料

更多资料请参考官方文档:https://github.com/XiaoMi/Gaea

推荐阅读


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 macrozheng 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【详解】Mycat在MySQL主从复制基础上实现读写分离
随着互联网应用的快速发展,数据库的性能瓶颈逐渐成为制约系统扩展的主要因素之一。为了提高数据库的读写性能,读写分离技术被广泛采用。本文将介绍如何使用Mycat在MySQL主从复制的基础上实现读写分离,以提升系统的整体性能。
大盘鸡拌面
2025/05/08
680
面试官:你项目是如何实现读写分离的?
读写分离(Read-Write Splitting)是一种常见的数据库架构优化策略,通过将数据库的读操作(查询)和写操作(插入、更新、删除)分离到不同的数据库实例上,从而提高系统的性能、可扩展性和高可用性。
磊哥
2025/02/27
2070
面试官:你项目是如何实现读写分离的?
mycat oracle读写分离_mycat读写分离原理
每个方法都有优缺点,我们选择对程序代码改动最小(只改数据源)的方法三,讲解mycat的配置和使用。
全栈程序员站长
2022/11/04
9730
mycat oracle读写分离_mycat读写分离原理
MySQL主从复制 mysql-proxy实现读写分离
docker安装步骤 https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce-1
星哥玩云
2022/08/17
6260
MySQL主从复制 mysql-proxy实现读写分离
如何使用Docker安装Mycat中间件 | 实现主从的读写分离,搭建属于你的Mysql 集群 | 来看看这篇吧
将Mycat-server-1.6.7.1-release-20190627191042-linux重命名为mycat
宁在春
2022/10/31
1.2K0
如何使用Docker安装Mycat中间件 | 实现主从的读写分离,搭建属于你的Mysql 集群 | 来看看这篇吧
mysql读写分离怎么实现(数据库读写分离实现)
大型网站为了解决大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别是数据丢失的话,后果更是不堪设想。这时候,我们会考虑如何减少数据库的连接,下面就进入我们今天的主题。
全栈程序员站长
2022/08/01
4.3K0
mysql读写分离怎么实现(数据库读写分离实现)
基于Spring boot的外卖项目 瑞吉外卖Day11 实现Mysql读写分离
​ MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySOL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySOL主从复制是MySQL数据库自带功能,无需借助第三方工具。
小小程序员
2023/04/12
6670
MySQL运维15-一主一从读写分离
  读写分离,是把数据库的读和写分开操作,以应对不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效的减轻单台数据库的压力。
Se7eN_HOU
2023/12/26
2530
MySQL运维15-一主一从读写分离
mycat如何实现读写分离_数据库读写分离中间件
众所周知,随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,而且一般的系统“读”的压力远远大于“写”,因此我们可以通过实现数据库的读写分离来提高系统的性能。
全栈程序员站长
2022/11/08
9430
mycat如何实现读写分离_数据库读写分离中间件
MySQL 读写分离配置实践
master(虚拟机centos7,NAT模式,固定ip):192.168.131.129
终有救赎
2023/11/12
3820
MySQL 读写分离配置实践
mysql 读写分离_详解MySQL读写分离
MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离。
全栈程序员站长
2022/08/11
7.5K0
mysql 读写分离_详解MySQL读写分离
冰河,能讲讲Mycat如何实现MySQL的读写分离吗?
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/12/24
4260
冰河,能讲讲Mycat如何实现MySQL的读写分离吗?
什么?你们项目没用过主从复制和读写分离?
这里我只准备了一台服务器进行搭建测试,遂主库和从库均在一台服务器上,只不过是访问端口不一样而已
IT大咖说
2021/07/19
3320
MySQL 结合 MyCAT 实现主从复制读写分离
MySQL 结合 MyCAT 实现主从复制读写分离是一个用于提高数据库性能和可用性的常见方案。
用户7353950
2024/04/03
1450
MySQL 结合 MyCAT 实现主从复制读写分离
MYSQLg高级------Sharding-JDBC 实现读写分离
上面的读写分离其实就是:2太数据库主从机制,一个提供读(select )另一个提供 增删改 为了保证数据的一致性他们直接是数据同步的;
默 语
2024/11/20
1750
MYSQLg高级------Sharding-JDBC 实现读写分离
Demo之Mycat读写分离【面试+工作】
数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能;对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,其中包含两个步骤,其一是数据源的主从同步,其二是sql的读写分发;而Mycat不负责任何数据的同步,具体的数据同步还是依赖Mysql数据库自身的功能。
Java帮帮
2018/12/05
9090
基于Mycat中间件的MySQL读写分离
mycat是国内开源的数据库中间件,可以实现mysql读写分离和主备热切换,容灾,数据分片等功能。
用户7353950
2022/05/10
4570
基于Mycat中间件的MySQL读写分离
MY SQL 的读写分离
每日一句 去过的地方越多,越知道自己想回到什么地方去。见过的人越多,越知道自己真正想待在什么人身边. from 夏正正 MY SQL 读写分离 1 MySQL读写分离原理 MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先部署主从复制,只有主从复制完了,才能在此基础上进行数据的读写分离。 这就是典型的并发问题,单机数据库承担了太多的请求,导致作者无法提交编辑的内容。一个直觉的想法是,多加几台服务器,把压力分担到多台服务器上,但是这样会带来一个问题,多台数据库之间的数据同步,这是一
企鹅号小编
2018/03/02
8780
MY SQL 的读写分离
SpringBoot 2.x ShardingSphere读写分离实战
MySQL 主从复制的方式有多种,本文主要演示基于基于日志(binlog)的主从复制方式。
小东啊
2019/06/26
1.1K0
SpringBoot 2.x ShardingSphere读写分离实战
MySQL读写分离
  当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里我们将采用读写分离技术进展缓解数据库的压力。
那一叶随风
2018/08/22
2.5K0
MySQL读写分离
推荐阅读
相关推荐
【详解】Mycat在MySQL主从复制基础上实现读写分离
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验