【MySQL】Gaea 数据库中间件实现 MySQL 读写分离

7 篇文章 0 订阅
5 篇文章 0 订阅
声明:

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

1、Gaea简介

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

2、MySQL主从复制

使用Gaea需要依赖MySql的主从复制环境,关于MySql的主从复制可以参考:

3、直接在 Linux 下安装

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

3.1 安装Go语言环境

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

tar -zxvf go1.16.3.linux-amd64.tar.gz -C /mydata/
  • 添加/mydata/go/bin目录到PATH变量中:
# 编辑环境变量配置文件
vim /etc/profile
# 在最后一行添加,添加完成wq保存退出
export GOROOT=/mydata/go # 这一行最底下一行貌似原来就有
export PATH=$PATH:$GOROOT/bin
# 然后刷新配置文件
source /etc/profile

  • 查看版本号,测试是否安装成功:
go version
  • 返回以下信息表示Go语言环境已经安装成功了:
go version go1.16.3 linux/amd64

4、安装 Gaea

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

  • 下载Gaea的源码,直接下载zip包即可,下载地址:Gaea安装包下载链接 我这里下载最新版本的上一个版本
    在这里插入图片描述

  • 将下载好的压缩包进行解压操作,这里我们解压到/mydata/gaea/目录下:

cd /mydata
mkdir gaea
unzip Gaea-1.2.1.zip

在这里插入图片描述

  • 进入/mydata/gaea/Gaea-1.2.1目录下,使用make命令对源码编译:(注意:这里需要设置一下代理,不然下载速度慢的离谱,动不动就是超时)
go env -w GOPROXY=https://goproxy.cn

make build
  • 编译完成后在/mydata/gaea/Gaea-1.2.1/bin目录下会生成Gaea的执行文件gaea
    在这里插入图片描述
  • 由于我们没有搭建etcd配置中心,所以需要修改本地配置文件/mydata/gaea/Gaea-1.2.1/etc/gaea.ini,将配置类型改为file
; 配置类型,目前支持file/etcd两种方式,file方式不支持热加载
config_type=file
  • 添加namespace配置文件,用于配置我们的主从数据库信息,配置文件地址:/mydata/gaea/Gaea-1.2.1/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": "121.4.77.xxx:3307",
            "slaves": ["121.4.77.xxx: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
}

5、namespace配置文件

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

  • 整体配置说明:
    在这里插入图片描述
  • slice配置:
    在这里插入图片描述
  • users配置:
    在这里插入图片描述

6、在Docker容器中运行

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

打包成Docker镜像

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

  • 这里我们使用Dockerfile构建Docker镜像,Dockerfile中的内容如下:(注意点:这里需要用到代理,不然下载速度巨慢,已经在文件里添加)
# 该镜像需要依赖的基础镜像
FROM golang:latest
# 将当前目录下的gaea源码包复制到docker容器的/go/Gaea-master目录下,对于.tar.gz文件会自动解压
ADD Gaea-1.2.1.tar.gz /go/Gaea-1.2.1
# 将解压后的源码移动到/go/gaea目录中去
RUN bash -c 'mv /go/Gaea-1.2.1/Gaea-1.2.1 /go/gaea'
# 进入/go/gaea目录
WORKDIR /go/gaea
ENV GOPROXY=https://goproxy.cn
# 将gaea源码进行打包编译
RUN bash -c 'make build'
# 声明服务运行在13306端口
EXPOSE 13306
# 指定docker容器启动时执行的命令
ENTRYPOINT ["/go/gaea/bin/gaea"]
# 指定维护者的名字
MAINTAINER macrozheng
  • 在此之前我们需要把Gaea的源码压缩包Gaea-1.2.1.tar.gz,然后放到/mydata:(注意点:该压缩包就在上面那张图里的链接可以下载,不要改后面属性名,没有用)
    在这里插入图片描述
  • 之后使用Docker命令构建Gaea的Docker镜像:
docker build -t gaea:1.2.1 .
  • 构建成功控制台输出:
    在这里插入图片描述
  • 将本地安装的Gaea配置文件复制到/mydata/gaea-docker/etc/目录下:
cd /mydata
mkdir gaea-docker
cp -r /mydata/gaea/Gaea-1.2.1/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.2.1

在这里插入图片描述

7、测试读写分离

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

  • 通过Navicat连接到Gaea代理,注意此处账号密码为Gaea的namespace中配置的内容,端口为Gaea的服务端口;
    在这里插入图片描述

  • 通过Navicat分别连接到主库和从库,用于查看数据,此时建立了以下三个数据库连接;
    在这里插入图片描述

  • 通过stop slave命令关闭mysql-slave实例的主从复制功能:
    在这里插入图片描述

  • 通过Gaea代理在test表中插入一条数据:
    在这里插入图片描述

  • 在主库中查看test表的数据,发现已有该数据,说明插入成功:
    在这里插入图片描述

  • 在从库中查看test表的数据,发现没有该数据,证明写操作走的是主库:
    在这里插入图片描述

  • 直接在代理中查看test表中的数据,再刷新一下表数据,发现没有该数据,证明读操作走的是从库。
    在这里插入图片描述

8、结合SpringBoot使用

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

9、总结

  • 这一顿操作也是不容易,但也算理解了其中的一些过程,会配置,但是在实战项目中,我没遇到过,希望以后能在实际项目中,能遇到高并发的一些内容
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值