回顾,以最佳实践为起点
作为一款 HTAP 数据库,TiDB 能同时处理来自用户端的 OLTP 在线业务与 OLAP 分析业务。针对分析类需求,优化器会自动将请求路由到列存的 TiFlash 节点;而对于在线请求,优化器会自动路由到行存 TiKV 请求。对于 HTAP 数据库,我们最关心的莫过于占用大量资源的分析类查询是否会影响到在线的 OLTP 业务,针对这个问题,TiDB 在物理层上对 TiKV 与 TiFlash 进行了隔离,很好的避免了这种情况。 反思,最佳实践结构之痛 通过资源隔离的方式,我们解决了业务之间的相互影响。然而要想实现更灵活、高效的应用,上面的架构中仍然存在一定的问题: HAProxy 暂时没有高可用功能 对于 TiDB Server 来说,没有做到 TP 业务与 AP 业务的隔离 HAProxy 的高可用方案 TP 与 AP 的隔离方案 我希望存储层数据是分离的,OLTP 和 OLAP 业务互不影响 我希望计算层的请求是分离的,OLTP 和 OLAP 请求互不影响 变更,需求驱动架构转型 基于 HAProxy 的改造 结构较为复杂,以致为了保证系统的高可用性,花费的相对物理结点较高 Proxy 的出口不统一,需要两套 Keepalived 维护两个 VIP,在业务逻辑中需要进行编码操作 使用 ProxySQL 实现 SQL 的路由 灵活强大的 SQL 路由规则,可以智能的负载 SQL 请求。 无状态服务,方便的高可用管理方案。 自动感知结点的监控状态,快速剔除异常结点。 方便的 SQL 监控分析统计。 配置库基于 SQLite 存储,可以在线修改配置并且动态加载。 相比于 MySQL query cache 更灵活的 cache 功能,可以在配置表中多维度的控制语句缓存。 全链路的高可用 多个相互独立的 ProxySQL 使用 ProxySQL 的高可用集群 应用程序与数据库集群使用唯一的接口。 简单的高可用结构,通过一套 keepalived 与一套 Proxy 集群实现高可用性。 TP/AP 的请求能够自动的路由到对应的计算节点 TiDB Server 中。 践行,从案例入手求结果 部署了一个 demo 系统,简单的展示一下整套架构的运行流程与结果。 安装 TiDB 安装 ProxySQL 配置 ProxySQL 配置 Keepalived 验证 ProxySQL test.t_tikv(idi int),数据从 1 - 1000 test.t_tiflash(idi int),数据从 1 - 1000 TiDB Server log 过滤关键字 “select * from test.t_tikv where idi =” 的条数。可以看出针按照路由表中配置的 TiKV SQL,1000 条较为分散的路由到了 TiDB-1,TiDB-2,TiDB-3 结点上。 彩蛋,你想要的审计功能 数据库审计是对数据库的访问行为进行监管的系统,他能够在发生数据库安全事件之后为事件的罪责定责提供依据。将审计日志抽取到实时数仓中进行风控处理,能够及时的发现风险,最大程度的挽回损失。审计日志在一些重要的金融、订单交易系统中至关重要。 如何捕获 audit log /opt/tidb-c1/proxysql-6033/proxysql -c /opt/tidb-c1/proxysql-6033/proxysql.cfg
[root@r31 proxysql-6033]# mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt 'admin>'## set server infoinsert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.232.31',14000);insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.232.32',14000);insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.232.33',14000);insert into mysql_servers(hostgroup_id,hostname,port) values(20,'192.168.232.34',14000);insert into mysql_servers(hostgroup_id,hostname,port) values(20,'192.168.232.35',14000);load mysql servers to runtime;save mysql servers to disk;## set userinsert into mysql_users(username,password,default_hostgroup) values('root','mysql',10);load mysql users to runtime;save mysql users to disk;## set monitoring userset mysql-monitor_username='monitor';set mysql-monitor_password='monitor';load mysql variables to runtime;save mysql variables to disk;## set sql router rule## this is just a demoinsert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(1,1,'^select.*tikv.*',10,1),(2,1,'^select.*tiflash.*',20,1);load mysql query rules to runtime;save mysql query rules to disk;
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script check_proxysql { script 'killall -0 proxysql || systemctl stop keepalived' interval 2 weight 10}vrrp_script test_script { script 'echo `date` >> /tmp/aaa' interval 1 weight 1}vrrp_instance proxysql_kp { state MASTER interface ens33 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1888 } virtual_ipaddress { 192.168.232.88 } track_script{ check_proxysql ##test_script }}
for i in `seq 1000`; do mysql -uroot -P6033 -h192.168.232.88 -pmysql -e "select * from test.t_tikv where idi = $i"; donefor i in `seq 1000`; do mysql -uroot -P6033 -h192.168.232.88 -pmysql -e "select * from test.t_tiflash where idi = $i"; done
与现在很多用户一样,曾经我也遇到过 audit 的需求。像 MongoDB 这样的开源数据库,很多都是不提供免费的审计功能的。审计功能对于很多金融类的场景是尤其的重要,为了完成审计功能,我们通常有两种方式:
在源码中解析语义
数据的流量采集
在 TiDB 中捕获 audit log 在 ProxySQL 中获取 audit log 通过探针截获 audit 其中可以抓到 query point,从中可以获取到 query 的文本,用户的 client IP,而 function name 与 time 是我通过 systemtap 的脚本直接本底写入的。>>>>>>>>>>>>>>>>>>>[ function >> ZN10Query_Info25query_parser_command_typeEv ] [ time >> 1622953221 ] this={.QueryParserArgs={.buf="select ?", .digest=2164311325566300770, .digest_total=17115818073721422293, .digest_text="select ?", .first_comment=0x0, .query_prefix=0x0}, .sess=0x7f1961a3a300, .QueryPointer="select 1113 192.168.232.36", .start_time=2329486915, .end_time=2329486535, .mysql_stmt=0x0, .stmt_meta=0x0, .stmt_global_id=0, .stmt_info=0x0, .QueryLength=11, .MyComQueryCmd=54, .bool_is_select_NOT_for_update=0, .bool_is_select_NOT_for_update_computed=0, .have_affected_rows=0, .affected_rows=0, .rows_s ######
2023-07-18 PingCAP发布了 《时刻领先丨PingCAP 用户峰会 2023 圆满收官》的文章
2023-02-13 PingCAP发布了 《促进关键软件高层次人才培养:平凯星辰与华东师范大学签订联合博士培养合作协议》的文章
2023-01-10 PingCAP发布了 《同盾科技 x TiDB丨实时数据架构为风控智能决策保驾护航》的文章
2022-12-09 PingCAP发布了 《PingCAP 成为中国唯一入选 Forrester Wave 数据库厂商,被评为卓越表现者》的文章
2022-12-09 PingCAP发布了 《案例故事丨老虎国际 x TiDB ,降低架构复杂性,保障全球用户安全可靠投资》的文章