DBProxy安装使用初探

前言:

DBProxy是由美团点评公司技术工程部DBA团队(北京)开发维护的一个基于MySQL协议的数据中间层。它在奇虎360公司开源的Atlas基础上,修改了部分bug,并且添加了很多特性,支持读写分离,从库负载均衡,IP过滤,分表,DBA可平滑上下线DB,自动摘除宕机的DB,监控信息完备,SQL过滤,从库流量配置。

架构:

DBProxy 可以配置一主多从结构,即必须配置一个主库,0个或多个从库,主库可进行读写操作,从库只可进行读操作。上游组件/应用的流量可以通过DBProxy中设置的规则,将流量路由到合适的数据库中。DBProxy部署示意图如下所示:

安装包:

DBProxy-github地址:https://github.com/Meituan-Dianping/DBProxy/

jemalloc-github地址:   https://github.com/jemalloc/jemalloc

glib-2.42.0地址: https://src.fedoraproject.org/repo/pkgs/mingw-glib2/glib-2.42.0.tar.xz/71af99768063ac24033ac738e2832740/

percona地址:https://www.percona.com/downloads/percona-release/

centos地址:https://centos.pkgs.org/7/centos-x86_64

安装步骤:

github下载DBProxy源代码

 安装依赖包

--centos
yum install -y Percona-Server-devel-55.x86_64 Percona-Server-client-55.x86_64 Percona-Server-shared-55 jemalloc jemalloc-devel libevent libevent-devel openssl openssl-devel lua lua-devel bison flex libtool.x86_64
#安装jemalloc
unzip /root/jemalloc-dev.zip
mv jemalloc-dev jemalloc
cd jemalloc
./autogen.sh
make -j 4
make install
echo /root/jemalloc/lib >> /etc/ld.so.conf   
ldconfig
#安装Percona依赖包
[root@ol7db1 ~]# rpm -ivh Percona-Server-shared-56-5.6.51-rel91.0.1.el7.x86_64.rpm 
warning: Percona-Server-shared-56-5.6.51-rel91.0.1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:Percona-Server-shared-56-5.6.51-rwarning: /etc/my.cnf created as /etc/my.cnf.rpmnew
################################# [100%]
[root@ol7db1 ~]# rpm -ivh Percona-Server-client-56-5.6.51-rel91.0.1.el7.x86_64.rpm 
warning: Percona-Server-client-56-5.6.51-rel91.0.1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:Percona-Server-client-56-5.6.51-r################################# [100%]
[root@ol7db1 ~]# rpm -ivh Percona-Server-devel-56-5.6.51-rel91.0.1.el7.x86_64.rpm 
warning: Percona-Server-devel-56-5.6.51-rel91.0.1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:Percona-Server-devel-56-5.6.51-re################################# [100%]
#安装glibc
#使用glib2-2.54没问题
cd glib-2.42.0
autoreconf -ivf
./configure
make && make install
--Ubuntu & Debian
apt-get install libmysqlclient-dev libgcrypt11-dev  pkg-config lua5.1-0 liblua5.1-0-dev libtool flex bison openssl  libssl-dev libjemalloc1 libjemalloc-dev  libevent-dev

编译源码并安装


#进入解压后的目录DBProxy-master/
sh autogen.sh
sh bootstrap.sh
make && make install
#安装成功,可以看到以下执行文件
[root@ol7db1 bin]# ls -rlt /usr/local/mysql-proxy/bin/
total 4552
-rwxr-xr-x 1 root root 1496320 Apr 20 19:05 mysql-binlog-dump
-rwxr-xr-x 1 root root 1491456 Apr 20 19:05 mysql-myisam-dump
-rwxr-xr-x 1 root root 1638400 Apr 20 19:05 mysql-proxy
-rwxr-xr-x 1 root root   10368 Apr 20 19:05 encrypt
-rwxr-xr-x 1 root root    2351 Apr 20 19:05 mysql-proxyd
-rwxr-xr-x 1 root root     267 Apr 20 19:05 log.sh
-rwxr-xr-x 1 root root     997 Apr 20 19:05 create_table.sh
-rwxr-xr-x 1 root root     785 Apr 20 19:05 cron.sh
[root@ol7db1 bin]#

注意,目前DBProxy默认安装路径为:/usr/local/mysql-proxy。修改DBProxy默认安装路径,需要修改bootstrap.sh文件。例如将默认安装路径修改为:/usr/dbproxy,则需修改bootstrap.sh中--prefix后的参数,修改如下:

#!/bin/sh
base=$(cd "$(dirname "$0")"; pwd)
cd $base
./configure --prefix=/usr/dbproxy CFLAGS="-g -O0"  ##仅仅修改该行

安装报错处理:

编译glibc报错:

#报错
gdate.c:2497:7: error: format not a string literal, format string not checked [-Werror=format-nonliteral]
       tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);
#解决方法打开gdate.c文件(在glib目录下),找到调用strftime函数的2497行,在strftime前后加上如下预处理命令
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);
#pragma GCC diagnostic pop

bootstrap.sh报错:


#报错1
configure: error: checked for Lua via pkg-config: No package 'lua5.1' found. Make sure lua and its devel-package, which includes the lua5.1.pc (debian and friends) or lua.pc (all others) file, is installed
#解决方法1:/etc/profile 添加以下环境变量
export LUA_CFLAGS="-I/usr/local/lua/include"
export LUA_LIBS="-L/usr/local/lua/lib -llua -ldl"

#报错2
configure: error: libevent is required
#解决方法2
安装libevent-devel

make报错:

#报错
ua-load-factory.c:34:10: fatal error: lua.h: No such file or directory
#解决方法
安装lua-devel

配置启动文件:

拷贝模板配置文件

#创建配置文件所在文件夹
mkdir /usr/local/mysql-proxy/conf   
#拷贝示例配置文件
cp /root/DBProxy-master/script/source.cnf.samples /usr/local/mysql-proxy/conf/source.cnf

编辑配置文件


[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名
admin-username=guest

#管理接口的密码
admin-password=guest

#dbproxy后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses=192.168.1.110:3306

#dbproxy后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses=192.168.1.111:3306@1,192.168.1.111:3306@2

#用户名与其对应的加密过的MySQL密码(用户为MySQL用户密码),密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds=guest:JApndxsQ

#设置dbproxy的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true
daemon=true

#设置dbproxy的运行方式,设为true时dbproxy会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true
keepalive=true

#工作线程数,对dbproxy的性能有很大影响,可根据情况适当设置
event-threads=16


#日志级别,分为message、warning、critical、error、debug五个级别
log-level=message

#日志存放的路径
log-path=/tmp/dbproxy_log/

#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log=ON

#SELECT无where条件的限制,分为ON,OFF
select-where-limit = ON

#实例名称,用于同一台机器上多个dbproxy实例间的区分
instance=test1

#dbproxy监听的工作接口IP和端口
proxy-address=0.0.0.0:3308

#dbproxy监听的管理接口IP和端口
admin-address=0.0.0.0:3309

#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3

#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
#charset=utf8

#dbproxy前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1

max-connections=1000

#长时等待阈值,同步等待时间超过该阈值则认为是长时等待
long-wait-time=500 

#慢查询阈值,查询执行时间超过该阈值则认为是慢查询
long-query-time=500 

#0:不统计,1:仅统计总体的响应时间,其中包括慢查询,2:进行直方图统计;默认为1。
query-response-time-stats=2

#SQL日志文件最大大小,单位为字节,默认为1G
sql-log-file-size=1073741824

#保留的最大SQL日志文件个数,默认为0,不保留历史文件,仅保留当前文件
sql-log-file-num=500

#后台MySQL版本号,默认为5.5,只支持5.5,5.6
mysql-version=5.6

#后台MySQL最大连接数,默认为0,表示不限制
backend-max-thread-running=64

#后台MySQL连接超过backend-max-thread-running后,每次sleep的时间,单位为ms
thread-running-sleep-delay=10

#SQL过滤统计缓存的SQL模板数,默认为0
lastest-query-num=100000

#SQL过滤的时间阈值
query-filter-time-threshold=500

#SQL过滤的频率阈值
query-filter-frequent-threshold=10

#SQL过滤频率统计时间窗口内的最小执行次数,根据频率和该参数计算时间窗口
access-num-per-time-window = 5

#手动过滤SQL是否生效,默认为OFF
manual-filter-flag=OFF

#自动过滤SQL是否生效,默认为OFF
auto-filter-flag=OFF

注意,配置文件中配置的“pwds=guest:uqmOY9A=”项中的密码是加密后的密码,加密方法:

./dbproxy/script/encrypt [原始密码]

启动DBProxy:

在安装目录下的bin/mysql-proxy进行启动,启动时需传入配置文件的路径。例如:默认安装的路径为:/usr/local/mysql-proxy,配置文件路径为:/usr/local/mysql-proxy/conf/source.cnf,且配置文件中配置了必须配置的参数,启动命令如下:

/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/source.cnf

启动之后可以看到两个主进程worker和monitor

[root@ol7db1 dbproxy_log]# ps -ef |grep -i mysql-proxy |grep -v grep
root      94292      1  0 19:42 ?        00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/source.cnf
root      94293  94292  0 19:42 ?        00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/source.cnf

查看后台日志目录以及进程pid

[root@ol7db1 dbproxy_log]# pwd
/tmp/dbproxy_log
[root@ol7db1 dbproxy_log]# ls -rlt
total 8
-rw------- 1 root root    5 Apr 20 19:42 test1.pid
drwxr-xr-x 2 root root   27 Apr 20 19:42 sql
-rw-r----- 1 root root 1814 Apr 20 19:42 test1.log
[root@ol7db1 dbproxy_log]# tail -100f test1.log 
2022-04-20 19:42:45.564036: (message)mysql-proxy-cli.c:954(main_cmdline)dbproxy 0.2.5 started - instance: test1
2022-04-20 19:42:45.564152: (warning)chassis-filter.c:195(load_sql_filter_from_file)[filter][load from file][failed][No such file or directory]
2022-04-20 19:42:45.564704: (message)proxy-plugin.c:3833(network_mysqld_proxy_plugin_apply_config)proxy listening on port 0.0.0.0:3308
2022-04-20 19:42:45.571103: (message)network-backend.c:615(network_backends_add)add read/write backend: 192.168.1.110:3306 success
2022-04-20 19:42:45.573224: (message)network-backend.c:606(network_backends_add)add read-only backend 192.168.1.111:3306 to default backends
2022-04-20 19:42:45.573244: (message)network-backend.c:615(network_backends_add)add read-only backend: 192.168.1.111:3306@1 success
2022-04-20 19:42:45.575125: (warning)network-backend.c:586(network_backends_add)backend 192.168.1.111:3306 is already known!
2022-04-20 19:42:45.575153: (message)proxy-sql-log.c:484(load_sql_filenames)load_files_from_dir /tmp/dbproxy_log//sql
2022-04-20 19:42:45.575182: (message)proxy-sql-log.c:505(load_sql_filenames)load_files_from_dir /tmp/dbproxy_log//sql success
2022-04-20 19:42:45.575775: (message)chassis-event-thread.c:382(chassis_event_threads_start)starting 16 threads
2022-04-20 19:42:45.580504: (message)chassis-unix-daemon.c:131(chassis_unix_proc_keepalive)[angel] we try to keep PID=94293 alive
2022-04-20 19:42:45.591603: (message)proxy-sql-log.c:25(log_manager)log_manager thread start
2022-04-20 19:42:45.724108: (message)proxy-percentile.c:336(check_percentile)check_percentile thread start
2022-04-20 19:42:46.621287: (message)proxy-plugin.c:3444(check_state)check_state thread start
2022-04-20 19:42:46.635664: (warning)proxy-plugin.c:3548(check_state)set backend (192.168.1.111:3306) state to UP

通过admin连接:

 管理用户和端口,可以通过配置文件查看

#管理接口的用户名
admin-username=guest
#管理接口的密码
admin-password=guest
#DBProxy监听的管理接口IP和端口
admin-address=0.0.0.0:3308

通过3309端口登陆,方式跟mysql一样

mysql -uguest -pguest -h10.38.12.100 -P3309

进入之后,可以通过help查看命令

select * from help;

通过proxy连接:    

可以通过以下查询类型proxy用户

SELECT * FROM pwds ;

guest@10.38.12.100 : (none)08:05:32> SELECT * FROM pwds ;
+----------+----------+-------+----------+-------+
| username | password | hosts | backends | type  |
+----------+----------+-------+----------+-------+
| test     | NxpxcA== |       |          | proxy |
| ziniu    | ORZsbQs= |       |          | proxy |
| guest    | JApndwo= |       |          | admin |
| %        |          |       |          | proxy |
+----------+----------+-------+----------+-------+

使用用户连接proxy,通过3308端口

mysql -uziniu -pziniu -h10.38.12.100 -P3308


ziniu@10.38.12.100 : (none)08:08:22>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

奇虎360公司开源的Atlas是优秀的数据库中间件,美团点评DBA团队针对公司内部需求,在其上做了很多改进工作,形成了新的高可靠、高可用企业级数据库中间件DBProxy,已在公司内部生产环境广泛使用,较为成熟、稳定。 DBProxy的优点 支持多语言MySQL客户端 读写分离 负载均衡 Slave故障感知与摘除(Master需要MHA等其他联动) 后端连接池 自定义SQL拦截与过滤 流量分组与控制 丰富的监控状态 支持分表(分库版本正在内测中) Client IP限制 DBProxy对Atlas的改进 新增功能点 新增参数 backend-max-thread-running用于指定每个MySQL后台的最大thread running数 thread-running-sleep-delay用于指定在thread running数超过backend-max-thread-running时,客户端连接等待的时间 添加到黑名单中需要满足两个条件:SQL执行的时间和频率 提供了查看、修改、添加、删除黑名单的功能 黑名单管理提供了将黑名单保存到文件以及从文件中Load到内存中的功能 在手动添加黑名单时,只需要将用户的SQL语句输入,在内部自动转化成过滤条件,手动添加时是否生效由参数 manual-filter-flag 来控制,OFF:不生效,ON:立即生效 手动添加与自动添加两种情况下的过滤条件是否生效是分别由不同参数控制,这个要区分清楚。另外,也可以使用 admin 的命令来设置是否开启/关闭某个过滤条件 SQL执行的时间 由参数 query-filter-time-threshold 来指定,如果SQL执行时间超过此值,则满足条件 SQL执行频率 由参数 query-filter-frequent-threshold 来指定,如果SQL执行频率超过此值,则满足条件 频率就是在时间窗口内执行的次数。时间窗口则是由频率阈值和最小执行次数来计算出来的,当时间窗口小于60s时,扩展到60s 参数 access-num-per-time-window 用来指定在时间窗口内的最小执行次数,添加此参数是考虑到执行时间长的SQL在计算频率时同时参考其执行的次数,只有执行一定次数时才去计算其频率。当执行时间与执行频率都满足时条件时,会自动将查询作为过滤项放到黑名单中,加入到黑名单中是否生效由参数 auto-filter-flag 来控制,OFF:不生效,ON:立即生效 黑名单的管理 从库流量配置 指定查询发送到某个从库 参数动态设置(完善show proxy status/variables) 支持save config,动态增加、删除分表 响应时间percentile统计 统计最近时间段DBProxy的响应时间 kill session 支持DBProxy的admin接口kill session操作 backend平滑上下线 支持平滑的backend上下线 DBProxy非root用户启动 使用非root用户启动 admin账号的安全限制 admin账号密码的动态修改及host限制 增加异步刷日志的功能 增加日志线程、异步刷日志,提高响应时间 支持DBProxy平滑重启功能 支持SQL过滤的黑名单功能 支持对于MySQL后台的thread running限制功能 该功能通过在DBProxy内限制每个后台MySQL的并发查询,来控制对应MySQL的thread running数 当发向某个MySQL后台的的并发查询超过某个阈值时,会进行超时等待,直到有可用的连接,其中阈值与超时等待的时间都已经参数化,可以动态配置 set backend offline不再显示节点状态 支持set transaction isolation level 支持use db 支持set option语句 支持set session级系统变量 支持建立连接时指定连接属性 改进连接池的连接管理,增加超时释放机制。当连接池中的空闲连接闲置超过一定时
OpenCloudb介绍 什么是OpenCloudb?简单的说,OpenCloudb就是: • 一个彻底开源的,面向企业应用开发的“大数据库集群” • 支持事务、ACID、可以替代Mysql的加强版数据库 • 一个可以视为“Mysql”集群的企业级数据库,用来替代昂贵的Oracle集群 • 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 • 一个新颖的数据库中间件产品 OpenCloudb的目标是:低成本的将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。 OpenCloudb的关键特性: • 支持Mysql集群,可以作为Proxy使用 • 自动故障切换,高可用性 • 支持全局表,数据自动分片到多个节点,用于高效表关联查询 • 支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询 • 多平台支持,部署和实施简单 OpenCloudb的优势: • 基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能,以及众多成熟的使用案例使得OpenCloudb一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。 • 广泛吸取业界优秀的开源项目和创新思路,将其融入到OpenCloudb的基因中,使得OpenCloudb在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。 • OpenCloudb背后有一只强大的技术团队,其参与者都是5年以上资深软件工程师、架构师、DBA等,优秀的技术团队保证了OpenCloudb的产品质量。 • OpenCloudb并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。 OpenCloudb的长期路线规划: • 在支持Mysql的基础上,后端增加更多的开源数据库和商业数据库的支持,包括原生支持PosteSQL、FireBird等开源数据库,以及通过JDBC等方式间接支持其他非开源的数据库如Oracle、DB2、SQL Server等 • 实现更为智能的自我调节特性,如自动统计分析SQL,自动创建和调整索引,根据数据表的读写频率,自动优化缓存和备份策略等 • 实现更全面的监控管理功能 • 与HDFS集成,提供SQL命令,将数据库装入HDFS中并能够快速分析 • 集成优秀的开源报表工具,使之具备一定的数据分析的能力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值