您当前的位置:首页 > 电脑百科 > 软件技术 > 软件技术

你还在代码里做读写分离么?要不试试这个中间件吧?

时间:2020-03-16 15:34:20  来源:  作者:
 

01 摘要

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

02 Gaea简介

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

03 MySql主从复制

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

04 直接在linux下安装

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

4.1 安装Go语言环境

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

  • 安装Go语言环境,下载地址:golang.org/dl/
你还在代码里做读写分离么?要不试试这个中间件吧?

 

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

4.2 安装Gaea

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

  • 下载Gaea的源码,直接下载zip包即可,下载地址:github.com/XiaoMi/Gaea
  • 将下载好的压缩包进行解压操作,这里我们解压到/mydata/gaea/目录下:
unzip Gaea-master.zip
  • 进入/mydata/gaea/目录下,使用make命令对源码编译:
make build
  • 注意:由于网络问题,某些Go的依赖会下载不下来导致编译失败,多尝试几次即可成功;
  • 编译完成后在/mydata/gaea/bin目录下会生成Gaea的执行文件gaea:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 由于我们没有搭建etcd配置中心,所以需要修改本地配置文件/mydata/gaea/etc/gaea.ini,将配置类型改为file:
; 配置类型,目前支持file/etcd两种方式,file方式不支持热加载
config_type=file
  • 添加namespace配置文件,用于配置我们的主从数据库信息,配置文件地址:/mydata/gaea/etc/file/namespace/mall_namespace_1.json
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 配置文件内容如下:
{
    "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
}

4.3 namespace配置文件

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

  • 整体配置说明:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • slice配置:

 

你还在代码里做读写分离么?要不试试这个中间件吧?

 

 

  • users配置:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

05 在Docker容器中运行

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

5.1 打包成Docker镜像

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

  • 这里我们使用Dockerfile构建Docker镜像,Dockerfile中的内容如下:
# 该镜像需要依赖的基础镜像
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镜像:
docker build -t gaea:1.0.2 .
  • 构建成功控制台输出:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 将本地安装的Gaea配置文件复制到/mydata/gaea-docker/etc/目录下:
cp -r /mydata/gaea/etc/ /mydata/gaea-docker/etc/
  • 使用Docker命令启动Gaea容器:
docker run -p 13306:13306 --name gaea 
-v /mydata/gaea-docker/etc:/go/gaea/etc 
-d gaea:1.0.2

06 测试读写分离

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

  • 通过Navicat连接到Gaea代理,注意此处账号密码为Gaea的namespace中配置的内容,端口为Gaea的服务端口;
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 通过Navicat分别连接到主库和从库,用于查看数据,此时建立了以下三个数据库连接;
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 通过stop slave命令关闭mysql-slave实例的主从复制功能:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 通过Gaea代理在test表中插入一条数据:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 在主库中查看test表的数据,发现已有该数据:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 在从库中查看test表的数据,发现没有该数据,证明写操作走的是主库:
你还在代码里做读写分离么?要不试试这个中间件吧?

 

  • 直接在代理中查看test表中的数据,发现没有该数据,证明读操作走的是从库。
你还在代码里做读写分离么?要不试试这个中间件吧?

 

07 结合SpringBoot使用

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



Tags:读写分离   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1.MySQL读写分离概念:MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读...【详细内容】
2021-10-11  Tags: 读写分离  点击:(32)  评论:(0)  加入收藏
最近学习了阿里资深技术专家李运华的架构设计关于读写分离的教程,颇有收获,总结一下。1 读写分离概述 基本架构图: 2 适用场景 读写分离不是银弹,并不是一有性能问题就上读写分...【详细内容】
2021-08-19  Tags: 读写分离  点击:(118)  评论:(0)  加入收藏
一、MySQL主从搭建主从配置原理: 主库写日志到 BinLog 从库开个 IO 线程读取主库的 BinLog 日志,并写入 RelayLog 再开一个 SQL 线程,读 RelayLog 日志,回放到从库中主从配置流...【详细内容】
2021-08-03  Tags: 读写分离  点击:(46)  评论:(0)  加入收藏
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库...【详细内容】
2021-06-09  Tags: 读写分离  点击:(77)  评论:(0)  加入收藏
本文通过docker快速搭建mysql主从数据库,并用spring boot测试读写分离的实现,这是一个实验环境,便于开发人员开发业务功能代码。一、用docker进行msyql主从环境搭建在搭建环境...【详细内容】
2021-01-14  Tags: 读写分离  点击:(194)  评论:(0)  加入收藏
MySQL-Proxy简介mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。它使用mysql协议,任何使用mysql-client的上游无...【详细内容】
2020-06-20  Tags: 读写分离  点击:(69)  评论:(0)  加入收藏
ProxySql是mysql的一款中间件产品,是灵活强大的mysql代理层,可以实现读写分离,支持query路由功能,支持动态指定某个sql进行缓存,支持动态加载配置。故障切换和一些sql过滤功能...【详细内容】
2020-05-13  Tags: 读写分离  点击:(150)  评论:(0)  加入收藏
01 摘要传统的MySql读写分离方案是通过在代码中根据SQL语句的类型动态切换数据源来实现的,那么有没有什么中间件可以自动实现读写分离呢?小米开源的数据库中间件Gaea就可以实...【详细内容】
2020-03-16  Tags: 读写分离  点击:(109)  评论:(0)  加入收藏
高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是 app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从...【详细内容】
2019-12-26  Tags: 读写分离  点击:(97)  评论:(0)  加入收藏
各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一...【详细内容】
2019-12-24  Tags: 读写分离  点击:(113)  评论:(0)  加入收藏
▌简易百科推荐
现在很多手机的摄像头都会比电脑的高,因此有不少小伙伴想要在有些时候用手机摄像头代替电脑摄像头,那么具体应该如何操作呢?下面就和小编一起来看看连接手机摄像头的方法吧。更...【详细内容】
2021-12-28  装机吧    Tags:Win10   点击:(2)  评论:(0)  加入收藏
今天教大家通过windows的CMD终端查看WIFI密码 使用管理权限打开CMD 查看本机连接过WIFI名称netsh wlan show profiles 查询某一个WIFI的密码比如这里我想查询猪猪侠的...【详细内容】
2021-12-27  吉祥同学学安全    Tags:wifi密码   点击:(1)  评论:(0)  加入收藏
从本质上来讲,PE系统最广泛的用途只是用来安装系统。通过其内置的Ghost软件来调用第三方的GHO系统镜像来完成系统的安装。从表面来看,最终的系统是否纯净、是否安全,与Gho镜像...【详细内容】
2021-12-27  u盘装系统    Tags:pe工具   点击:(3)  评论:(0)  加入收藏
Safari是苹果在iPhone和iPad上的默认网络浏览器。虽然我们天天都在使用,但是,你是否深入研究了Safari的所有功能和设置?"无痕浏览"、"阅读器"视图和下载文件等标准选项只是其...【详细内容】
2021-12-16  趣玩公社    Tags:Safari   点击:(21)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个开源的 HTML5 视频播放器插件——MuiP...【详细内容】
2021-12-16  GitHub精选    Tags:插件   点击:(23)  评论:(0)  加入收藏
给电脑安装软件,最让人担心的就是安装到“拖家带口”的,而这样的手法正是国产软件惯用的!全家桶自动安装、软文弹窗等等,这些让我们讨厌的却是软件的直接收入来源。 那么在你安...【详细内容】
2021-12-15  老毛桃winpe    Tags:软件   点击:(18)  评论:(0)  加入收藏
不知道你是否遇到过这么一种情况:在一个A4大小的图框画一个接近满框的图形,在打印的时候却发现图形很小根本不符合模型空间的实际情况。看似明显是比例问题,但又不知道究竟是什...【详细内容】
2021-12-14  设计师小仁君    Tags:CAD   点击:(21)  评论:(0)  加入收藏
哈喽大家好! 前几天一个朋友向我疯狂吐槽。 快到年底了,公司要统计年度数据。 需要把一月到十二月份,十二张表格的数据,全部汇总到一个表格内。 这样的数据汇报每年都会有,每到年...【详细内容】
2021-12-14  秋叶Excel    Tags:Excel   点击:(23)  评论:(0)  加入收藏
我发现最近不少小叶子的留言都和 Excel 相关,我寻思是时候出一期解决 Excel 疑难杂症的小合集了。于是毛毛在众多问题中,挑了三个被问次数最多的有关 Excel 的问题,今天就来给...【详细内容】
2021-12-14  叶PPT    Tags:Excel   点击:(30)  评论:(0)  加入收藏
大家好,我是Stark-C。油猴简介【油猴】一款免费的浏览器扩展和最为流行的用户脚本管理器,它是一个附加组件(扩展程序),让用户安装一些脚本使大部分HTML为主的网页改变得更方便易...【详细内容】
2021-12-13  什么值得买    Tags:油猴   点击:(46)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条