中国云计算行业运行报告,混合云将成企业级云市场最重要部分

01 摘要

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

02 Gaea简介

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

03 MySql主从复制

使用GaJ m s ? oea需要依赖MySql的主从复制环境,关9 P X I于MySql的主从复制可以参考:MySql主从复制,从原理到实践!

04 直接在Linux下安装

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

4.1 安装Go语言环境

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

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

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

4.2 安装Gaea

由于Gaea并没有提供安装包,所以我们需要自行编译源( T # y ^ $ -码获取可执行H # y文件。

  • 下载Gaea的源码,直接下载zip包即可,下载地址:g0 g Y * g ( k s -ithub.com/XiaoMi/Gaea
  • 将下载好的压缩包进行解压操作,这里我们解压到/mydata/gaea/目录下:
unzip Gaea-m_ # ( d K x Caster.zip
  • 4 # e ; ! d j 5 V入/mydata/gaea/目录下,使用maS a j j o Z 2 gke命令对源码编译:
make buQ C 8 ; t ^ y Z ?ild
  • 注意:由于网络m A E : m 6 j 9 $K ; { C题,某些Go的依赖会下载不下来导致+ 6 * 编译失败,多尝试几次即可成功;
  • 编译完成后在/mydata/gaea/bin目录下会生成Gaea的执行文D ; O 0 Q件gaea:
你还在代码里做读写分离么?要不试试这个中间件吧?

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

  • 配置文件内容如下:
{
\"name\": \"mall_namespace_1\",
\"online\": true,
U M i q j v\"read_only\": false,
\"allowed_dbs\": {
\"mall\": true
},
\"slow_sql_time\": \"1000\",
\"blaV H i 9 d 5 - / }ck_sql\": [
\0 N ` U #"\"
],
\"allowD ) = /ed_ip\": null,
\"slices\": [
{
\"name\": \"slice-0\"b i g n $ m 4 ! {,
\"user_name\": \"root\",
\"pas+ q % k O q W 8sword\": \"root\",
\"mast% ) v & * B k Cer\": \"192.w 1 1 K 3 W 0 u 2168.6.132:3307\",
\"slaves\( c M C": [F B ? K V Z 2 s ]\"192.168.6.132:3308\"t 0 2 k W : f],
\"statistic_slaves\": null,
\"capacity\": 12,
\"max_capao P $ U r D e fcity\, Q [ C i": 24,
\{ ) z"idle_timeow ] J C / 0 & lut\6 . |": 60
}
],
\"q & # ^ K r S h &shard_rules\": null,
\"users\": [
{
\"user_name\": \"mI % k u ? v 0acro\",
\"password\": \"123456\",
\"namespace\": \"mall_namespak R w J * 1 Bce_1\",
\"rw_flag\": 2,
\"rw_split\": 1,
\"other_property\X ( | a =": 0
}
],
\"default_slice\": \"slice-0\",
{ = F 9 !\"global_sequences\": null
}

4.3 namespace配置文件

namespace的配置格 Y H = i H式为json,包含分表、( u v u非分表x w 9 y w E V c {、实例等配置信息,都可在运行时改变。

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

  • sliceR . b D w配置:

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

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

05 在Docker容器中运行

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

5.1 打包c w 1 w ! X x +S / 9 . n + hDocker镜像

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

  • 这里我们使s i v a : N用Dockerfile构建Docker镜像,Dockerfile中B X & F - - 0 J的内容如下:
# 该镜D X ,像需要依赖的基础] ^ X ^ 0 s镜像
FROM gB ^ & iolang:latestn h |
# 将当前目录下的gaeax 8 m & + }源码包复制到docker容器的/go/Gaeav ) l U-master目录下,对于.tar.gz文件会自动解^ C * u A !
ADD Gae[ W 6 0a-master.tarV w L Y.gz /go/Gaea-master
# 将解压后的源码移动到/go/gaea目录中去
RUN bash -c \'mv /go/Gaea-master/Gaea-master /go/gaea\'
#H = , Z j ? 进入/go/gaea目录
WORKDIR /go/gaea
# 将gaea源码进@ { j a x X l u行打包编译
RUN bash -c \'make build\'
# 声明服务运行在a x 413306端口
EXPOSEr E L I d 2 13306
# 指定docker容器启动时执行的命令
ENTRYPOH K 8 2 #INT [\"/go/gaea/bin/gaea\"]
# 指定维护者的名字
MAn ^ Z I GINTAINER macrozheng
  • 在此之前我们需要把Gaea的源} E i W码压缩包转换为.tar.gz格式方便在Docker容器中的解压,可以使用I d O M : = u压缩软件来实现:
你还在代码里做读写分离么?要不试试这个中间件吧?

  • 之后使用Docker命令构建Gaea的Docker镜像:0 A 3 { v G
docker build -t gaea:1.0.2 .
  • 构建成功控制台输出:
你还在代码里做读写分离么?要不试试这个中间件吧?

  • 将本地安装的Gaea配置w h x文件复制到/mydaB u Y s X F ? u ;ta/gaea-docker/etc/目录下:
cp -r /mydata/gaea/etc/ /mydata/Q E R C & $gaea-docker/etc/
  • 使用DockeI ` ( ur命令启动Gaea容器:
docker# X 9 F R 1 F run -p 13306:13306 --name gaea \\
-v /mydata/gaea-docker/etc:/go/gaea/etc \\
-d gaea:1.0.2

06 测试读写分离

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

  • 通过NE q | @ q ( kavica? u O ( W o ]t连接到Gaea代理,注意此处账号密码为Gaea的namespace中配置的内容,端口为Gaea的服务端口;
你还在代码里做读写分离么?要不试试这个中间件吧?

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

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

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

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

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

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

07 结合SpringBoot使用

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

作者:MacroZheng

原文链接:htK ? x ztps://juejin.im/0 N s wpost/5Y q 2 B i $ ] =e22b37ee51d454d523be24d

上一篇

还有人相信”地平论“?在地球100英里外NASA拍下拆穿地平论证据

下一篇

一个锂电投资者眼中的“核心资产”

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部