一、Gaea 简介
Gaea是小米中国区电商研发部研发的基于mysql协议的数据库中间件,目前在小米商城大陆和海外得到广泛使用,包括订单、社区、活动等多个业务。Gaea支持分库分表、sql路由、读写分离等基本特性。本文将介绍Gaea 部署的过程,以及数据库监控图表的部署过程。
项目地址:https://github.com/XiaoMi/Gaea
使用版本:v1.2.2,发行日期:2020-11-24
二、Go 环境安装
可参考文章:Linux系统下安装Go语言环境_李维山的博客-CSDN博客
三、Gaea 安装教程
环境描述
系统:CentOS 7.5
Mysql:5.7
Go: 1.13.4
1、下载安装包
存放路径: /usr/local/gaea
2、修改名称
下载后,修改名称,方便直接在系统中使用
mv gaea-v1.2.2-linux-amd64-go1.13.4 gaea
3、新增配置文件,在/usr/local/gaea目录中,新增gaea.ini文件
Gaea是支持基于文件的namespace配置的,因此config_type=file
; config type, etcd/file, you can test gaea with file type, you shoud use etcd in production
config_type=file
;file config path, 具体配置放到file_config_path的namespace目录下,该下级目录为固定目录
file_config_path=cd /usr/local/gaea/file
;coordinator addr
coordinator_addr=http://127.0.0.1:2379
;远程配置(当前为etcd)根目录
;将会废弃该配置项,通过cluster name识别root
coordinator_root=/gaea
;etcd user config
username=root
password=root
;environ
environ=online
;service name
service_name=gaea_proxy
;gaea_proxy cluster name
cluster_name=gaea
;log config
log_path=./logs
log_level=Notice
log_filename=gaea
log_output=file
;admin addr
admin_addr=0.0.0.0:13307
; basic auth
admin_user=admin
admin_password=admin
;proxy addr
proto_type=tcp4
proxy_addr=0.0.0.0:13306
proxy_charset=utf8
;slow sql time, when execute time is higher than this, log it, unit: ms
slow_sql_time=100
;close session after session timeout, unit: seconds
session_timeout=3600
;stats conf
stats_enabled=true
;encrypt key
encrypt_key=1234abcd5678efg*
4、新增配置文件
- 创建namespace文件夹,路径为/usr/local/gaea/file/namespace
- 创建test_namespace_1.json文件,路径为/usr/local/gaea/file/namespace/test_namespace_1.json
关于字段解释,可参考官方文档:配置说明
{
"name": "test_namespace_1",
"online": true,
"read_only": false,
"allowed_dbs": {
"cibe_app": true,
"information_schema":true,
"mysql":true,
"performance_schema":true,
"sys":true
},
"slow_sql_time": "1000",
"black_sql": [
""
],
"allowed_ip": null,
"slices": [
{
"name": "slice-0",
"user_name": "cibeappuroot",
"password": "CIBE@app1031r00t",
"master": "121.0.0.139:43306",
"slaves": ["121.0.0.139:43307"],
"statistic_slaves": null,
"capacity": 1200,
"max_capacity": 2400,
"idle_timeout": 60
}
],
"shard_rules": null,
"users": [
{
"user_name": "root",
"password": "11223344",
"namespace": "test_namespace_1",
"rw_flag": 2,
"rw_split": 1,
"other_property": 0
}
],
"default_slice": "slice-0",
"global_sequences": null
}
5、启动命令
#进入目录
cd /usr/local/gaea
#启动方式 1
./gaea -config "/usr/local/gaea/gaea.ini"
#启动方式 2,如果想在后台运行
nohup ./gaea -config "/usr/local/gaea/gaea.ini" &
若启动成功,则会见到如下图片:
6、查询端口使用情况
进程启动后查看默认监听端口13306如果正常监听,则说明启动成功
netstat -antup | grep 13306
7、使用数据库管理工具、或使用mysql-connector-java连接数据库
IP地址:自己的IP地址
端口:13306
账号:与test_namespace_1.json中的users的user_name保持一致
密码:与test_namespace_1.json中的users的password保持一致
四、借助Prometheus 、Grafana 进行数据库监控
官方描述:“gaea proxy基于prometheus做统计数据的存储,使用grafana实现数据可视化展示。”
具体部署教程如下:
1、Prometheus 的部署
- 下载安装包 https://prometheus.io/download/
- 解压并转移目录
tar xvfz prometheus-2.15.0.linux-amd64.tar.gz
cd prometheus-2.15.0.linux-amd64
mv prometheus-2.15.0.linux-amd64 /usr/local/prometheus
- 启动
./prometheus --config.file=prometheus.yml
- 加入到服务配置文件里,并设置为热加载。步骤如下:
vim /etc/systemd/system/prometheus.service
加入 --web.enable-lifecycle
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/data/prometheus/bin/prometheus --config.file=/data/prometheus/conf/prometheus.yml --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention=90d --web.enable-lifecycle
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动、重启、停止命令
systemctl start prometheus
systemctl restart prometheus
systemctl stop prometheus
- 修改配置文件
vim /data/prometheus/conf/prometheus.yml
在rule_files中加入规则配置,在scrape_configs中加入gaea的监控
rule_files:
- "/data/prometheus/rules/gaea_proxy_rule.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: "gaea_proxy"
metrics_path: '/api/metric/metrics'
static_configs:
- targets: ["localhost:13307"]
basic_auth:
username: admin
password: admin
需要修改admin_addr,admin_user,admin_password与gaea.ini中的以下几项保持一致。
;管理地址
admin_addr=0.0.0.0:13307
;basic auth
admin_user=admin
admin_password=admin
增加gaea_proxy_rule.yml,路径为/data/prometheus/rules
groups:
- name: gaea_proxy_rule
rules:
- record: gaea_proxy_sql_timings_count_rate_each_namespace
expr: sum(avg(rate(gaea_proxy_sql_timings_count[20s])) without (slave)) by (namespace)
- record: gaea_proxy_sql_timings_count_rate_total
expr: sum(sum(avg(rate(gaea_proxy_sql_timings_count[20s])) without (slave)) by (namespace))
- record: gaea_proxy_flow_counts_rate_namespace_flowdirection
expr: sum(avg(rate(gaea_proxy_flow_counts[20s])) without (slave)) by (namespace, flowdirection)
- record: gaea_proxy_flow_counts_rate_namespace
expr: sum(avg(rate(gaea_proxy_flow_counts[20s])) without (slave)) by (namespace)
- record: gaea_proxy_flow_counts_rate_total
expr: sum(sum(avg(rate(gaea_proxy_flow_counts[20s])) without (slave)) by (namespace))
- record: gaea_proxy_sql_timings_rate_namespace_operation
expr: sum(delta(gaea_proxy_sql_timings_sum[20s])) by (namespace,operation) / sum(delta(gaea_proxy_sql_timings_count[20s])) by (namespace,operation)
- record: gaea_proxy_sql_timings_rate_namespace
expr: sum(delta(gaea_proxy_sql_timings_sum[20s])) by (namespace) / sum(delta(gaea_proxy_sql_timings_count[20s])) by (namespace)
- record: gaea_proxy_sql_error_counts_rate_namespace
expr: sum(avg(rate(gaea_proxy_sql_error_counts[20s])) without (instance)) by (namespace)
运行热加载命令
curl -XPOST http://localhost:9090/-/reload
打开浏览器,输入IP+端口,9090为默认侦听端口,菜单切换到 Status >> Targets ,即可发现多了一个Target
2、Grafana 的部署
- 下载安装包 https://grafana.com/grafana/download
- 解压并转移目录
tar xvfz grafana-enterprise-8.1.5.linux-amd64.tar.gz
cd grafana-enterprise-8.1.5.linux-amd64
mv grafana-enterprise-8.1.5.linux-amd64 /usr/local/grafana
- 后台启动
cd /usr/local/grafana/bin
nohup ./grafana-server web &
打开浏览器,输入IP+端口,3000为Grafana的默认端口
系统默认用户名和密码为admin/admin,第一次登陆系统会要求修改密码,修改密码后登陆,界面显示如下:
- 添加 Prometheus 的配置
-
配置监控图表
填充官方提供的json文件:gaea_proxy.json
效果如下:
参考文章:
1、 小米开源数据库中间件Gaea实战
2、【MySQL】Gaea 数据库中间件实现 MySQL 读写分离_yuxiangdeming的博客-CSDN博客