Mysql转载部分设计方案

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

2020-01-20  本文已影响0人  java菲菲

1. 一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官.
2. 秋招JAVA面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等
3. 美团一面凉凉:MySQL+Java+Redis+算法+网络+Linux等一个都讲不清
4. 面试败给微服务?别怕,我带你一起手撕Dubbo,SpringBoot与Cloud!

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语言的环境。

image.png
tar -zxvf go1.13.5.linux-amd64.tar.gz -C /mydata/
# 编辑环境变量配置文件vim /etc/profile# 在最后一行添加export GOROOT=mydata/goexport PATH=$PATH:$GOROOT/bin# 刷新配置文件source /etc/profile
go version
go version go1.13.5 linux/amd64

4.2 安装Gaea

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

unzip Gaea-master.zip
make build
; 配置类型,目前支持file/etcd两种方式,file方式不支持热加载config_type=file
image.png
{    "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,包含分表、非分表、实例等配置信息,都可在运行时改变。

image.png image.png

05 在Docker容器中运行

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

5.1 打包成Docker镜像

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

# 该镜像需要依赖的基础镜像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
image.png
docker build -t gaea:1.0.2 .
image.png
cp -r /mydata/gaea/etc/ /mydata/gaea-docker/etc/
docker run -p 13306:13306 --name gaea \-v /mydata/gaea-docker/etc:/go/gaea/etc \-d gaea:1.0.2

06 测试读写分离

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

image.png image.png image.png image.png

07 结合SpringBoot使用

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

作者:MacroZheng

原文链接:https://juejin.im/post/5e22b37ee51d454d523be24d

上一篇 下一篇

猜你喜欢

热点阅读