作者:刘春雷

原文来源: https://tidb.net/blog/a898b21e

TiFlash运维漫谈

  2020-10-25  刘春雷

1、前言

自TiDB 4.0版本问世之前,TiFlash就被大家高度关注。TiFlash 是什么?他能做什么?他如何使用?他运维起来麻烦么?他有什么坑?他能真正解决困扰MySQL DBA的 分析型业务无法支持 的问题么?本篇文章更偏向实际使用、运维体验,原理请移步官网~

58这边,自 4.0.0-rc.2 版本就开始调研TiFlash,到目前,大约使用 5个月 左右了, 7套 线上集群在使用TiFlash解决分析型SQL的效率问题。

2、TiFlash简介

TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展,在提供了良好的隔离性的同时,也兼顾了强一致性。列存副本通过 Raft Learner 协议异步复制,但是在读取的时候通过 Raft 校对索引配合 MVCC 的方式获得 Snapshot Isolation 的一致性隔离级别。这个架构很好地解决了 HTAP 场景的隔离性以及列存同步的问题。

整体架构

3、部署及使用

推荐:

使用更好性能的磁盘、大内存,多核CPU的机器进行部署,官方:32 VCore 64 GB 2TB (nvme ssd) * 1 ,58这边大致机器为 40核、128G内存、SSD RAID5 或闪存卡机器。

3.1、部署流程

使用tiup工具部署,分为初始化部署、已经存在集群部署TiFlash,区别不大,都是要写好yaml文件即可。

【1、集群配置】:

需要将配置模板中 replication.enable-placement-rules 设置为 true,以开启 PD 的 Placement Rules功能。,或使用pd-ctl,执行 config set enable-placement-rules true 。或者tiup也支持,tiup ctl pd -u

【2、配置文件】:

tiflash_servers:

  • host: 10.0.1.11
    data_dir: /tidb-data/tiflash-9000
    deploy_dir: /tidb-deploy/tiflash-9000
    ssh_port: 22
    tcp_port: 9000
    http_port: 8123
    flash_service_port: 3930
    flash_proxy_port: 20170
    flash_proxy_status_port: 20292
    metrics_port: 8234
    deploy_dir: /tidb-deploy/tiflash-9000
    config:
    logger.level: “info”
    learner_config:
    log-level: “info”
  • host: 10.0.1.12
  • host: 10.0.1.13

【3、执行部署】

新部署集群包括TiFlash节点:

tiup cluster deploy tidb-test v4.0.6 ./topology.yaml

扩容TiFlash节点:

tiup cluster scale-out scale-out.yaml

【4、检查节点状态】

tiup cluster display cluster-name

3.2、使用

【表添加至TiFlash】:

使用上很简单,只需要知道将哪些表同时放到列存TiFlash里面,执行个SQL就行了~

  • ALTER TABLE table_name SET TIFLASH REPLICA count
  • count 表示副本数,0 表示删除

【查看】:

SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = ‘<db_name>’ and TABLE_NAME = ‘<table_name>’;

  • AVAILABLE 字段表示该表的 TiFlash 副本是否可用。1 代表可用,0 代表不可用。副本状态为可用之后就不再改变,如果通过 DDL 命令修改副本数则会重新计算同步进度。
  • PROGRESS 字段代表同步进度,在 0.0~1.0 之间,1 代表至少 1 个副本已经完成同步。

【TiDB读取使用】:

TiDB 提供三种读取 TiFlash 副本的方式。如果添加了 TiFlash 副本,而没有做任何 engine 的配置,则默认使用 CBO 方式。 会话级别,即 SESSION 级别

【如何确认使用】:

explain 查看SQL执行计划,看task字段里面是否有tiflash,有 表示该任务会发送至 TiFlash 进行处理 。例如:

【engine隔离】:

适用于某些特殊场景:

  • 明确使用其他engine效率比较好,如使用TiKV效率更好
  • 或者进行影响隔离,例如某些大批量数据的查询,可以单独走TiFlash,减少对线上读写影响

set session tidb_isolation_read_engines = “逗号分隔的 engine list”;

【支持计算下推】:

TiFlash 支持谓词、聚合下推计算以及表连接,下推的计算可以帮助 TiDB 进行分布式加速。暂不支持的计算类型是 Full Outer Join 和 DISTINCT COUNT,会在后续版本逐步优化

set session tidb_opt_broadcast_join=1

其他下推优化

set @@tidb_opt_agg_push_down=1;

set @@tidb_opt_distinct_agg_push_down=1;

4、使用经验

4.1、元信息部分

因TiDB多端口的特性,混合部署的话,推荐集群间端口间隔的多一些,例如间隔50个端口,这样会减少端口冲突的情况。且TiFlash 想比较其他角色,端口比较多,6个左右。这样就需要单独一张角色表,记录TiFlash的基本信息,与TiDB其他实例表相关联。

4.2、有哪些坑

  • 问题1 对资源消耗很大,比tikv节点大, 某集群部署tiflash后,添加写入特别频繁的表至TiFlash,且几乎没有读TiFlash的情况,TiFlash 节点的CPU使用率100%,推荐大家 使用多核CPU的机器

  • 问题2:无法限制内存 这个写入特别频繁的表的tiflash异常重启多次,排查为内存吃满oom了,此机器的内存128G,直接使用完oom…启动占用大内存的问题,已经提给官方,官方在修复

    【排查系统日志如下】

    ep 28 16:35:42 10.0.0.1 kernel: [34135946.096974] Out of memory: Kill process 506925 (tiflash) score 896 or sacrifice child

    【监控情况如下】

【内存使用情况如下】

【tiup状态】

因重启检查超时,TiUP cluster display结果显示变成Down,或者Disconnected

  • 问题3 修改pd节点 ,切换后,TiFlash的 PD信息不同步 …不同步…需要手动修改TiFlash的配置tiflash.toml

    日志报错如下:

需要改tiflash.toml里面pd信息,改成新的

​[raft]

pd_addr = “10.0.0.1:100,10.0.0.2:100,10.0.0.3:100”

  • 问题4: 不能正常开启TiFlash 的话,也不能正常的scal-in下线,需要手动清除同步规则,及强制从 pd 删除这个节点信息,参考wiki:

docs.pingcap.com

使用 TiUP 扩容缩容 TiDB 集群

PingCAP Docs

docs.pingcap.com

使用 TiUP 扩容缩容 TiDB 集群

PingCAP Docs

5、对比ClickHouse

面对如火如荼的ClickHouse,TiFlash又性能如何呢?我们进行了如下测试。

5.1、性能对比

【机器信息】

内存: 192G

CPU: 20*2 Intel® Xeon® Silver 4114 CPU @ 2.20GHz

磁盘 :3*1.8T SSD RAID5

部署 :单机单实例部署

版本: ClickHouse版本 20.3.8.53 ,TiFlash: 4.0.0-rc

ClickHouse查询如下 】:

【汇总对比如下】:

【差异原因】:

tiflash 因为需要支持 update,所以需要额外读取三列:handle (int64), version(uint64), del_mark(uint8)

clickHouse 只需要 scan,但是 tiflash 需要把数据做一次全局排序 + mvcc 过滤,这些是固定成本。

5.2、场景对比

clickhouse目前大致的使用场景为:

  • 作为MySQL的从库使用,这样受限于MySQL的集群大小及读写效率的考虑,表可能不大,百G左右
  • 独立部署集群,大小不限制,专注于高效分析

TiDB 目前在58主要为解决MySQL的痛点问题:例如单表超100G,推荐迁移至TiDB。或者新业务,体量大,流量高的场景。

TiFlash可以依托TiDB使用,使用方便,与TiKV一起,可以支持更多的场景,所以使用的就更广泛。

大致场景对比如下:

6、TiFlash的日常使用心得

对于58的50多套集群,到底哪套集群?哪些表?哪些SQL需要使用TiFlash来优化呢?这是一个很大的难题!真的很大~

  1. 首先需要DBA了解所有集群的业务,了解所有集群的常见慢SQL、高频SQL情况,想想50套集群、想想每天大致50多亿次访问的TiDB业务,这对于DBA就要求很高了。
  2. 因为磁盘的限制,不能所有的表都添加至TiFlash里面,只能找在查询上可以使用TiFlash优化的表,这点很难!需要逐个测试,逐个…
  3. 58的集群里面,有数仓业务,有报表业务,有信安的实时写入与分析业务。这几种是大致可以确定使用TiFlash优化的,然后我们需要详细分析测试…
  4. 然后我们要查看这几套集群的慢SQL、高频SQL,然后将表添加至TiFlash里面,逐条explain 来查看执行计划,然后确定哪些是可以走TiFlash的,这个同步过程也很漫长,表越大越长,有同步1周多的…这个测试的周期就被拉的很长~很长~
  5. 然鹅现实有时候很骨感,很多SQL,explain查看执行计划是不能被TiFlash优化的,有些联合索引添加的很好,查询完全匹配的时候,就直接走TiKV的索引扫描了,只有很少部分的SQL可以通过TiFlash优化…
  6. 监控上,查看TiFlash-Summary的Request QPS监控图,也是不尽人意,很少的SQL。
  7. 目前上的几套集群里面,TiFlash优化好的SQL有一些,例如原SQL 19.9s,优化后0.48s,业务非常开心~
  8. 当然线上还是有很多的SQL可以通过TiFlash优化的,只是这个需要DBA耗费很大的人力去测试、确定

总之:

  • TiFlash能很好的优化一些分析型的SQL

  • TiFlash能很好的使用,需要DBA付出很大的精力,较长的时间~

  • TiFlash还存在很多可以优化的地方,例如

    • 添加内存限制
    • 解决TiFlash重启慢的问题
    • TiFlash机器资源使用过高的问题
    • 支持更多的查询情况优化
    • SQL能否给出智能的建议:使用TiFlash优化~,这样来减少DBA的工作量
    • 性能上的提升

希望TiFlash 使用的越来越简单,问题越来越少,效率越来越高~

TiFlash运维漫谈相关推荐

  1. 漫谈运维:半神半仙亦民工

    前言:看到chinaunix最近出的门户网站运维板块veyron大侠写的文章<门户网站运维abc>深有感触,特写以下文章: <谈网站或其他服务器运维>,这里只谈运维工程师所要做 ...

  2. 桌面运维人员的健康漫谈

    随着桌面式运维的加强,在电脑旁办公的时间越来越长,难免会出现颈椎.腰椎的问题,在日常的学习中总结了一点技巧,希望能保持健康. 变换姿势 关键是要,如果你保持一个姿势数个小时不活动,你的脖子在数天后疼痛 ...

  3. 漫谈运维:半神半仙亦民工(1)

    原帖:http://hilinux.com/bbs/thread-600-1-1.html .51CTO编辑在转载中进行了一些文字措辞的修改,并添加了一些相关阅读. 作者前言:看到chinaunix最 ...

  4. 【大型网站运维之道 天道 人道 运维之道】

    大型网站运维之道漫谈 网站运维绝不是某些人眼中安装系统.做几根网线那么简单: 除去应用开发和业务运营之外的保障网站能运转的事儿都可能是运维工作的职责范围.本系列是冯大辉(Fenng)的一个系列博文,从 ...

  5. OceanBase数据库开发和运维漫谈

    OceanBase开发和运维漫谈 目录 1     简介 2     开发视角看OceanBase 3     运维视角看OceanBase 4     再说分区Partition 5     数据拆 ...

  6. 如何构建企业内的 TiDB 自运维体系

    1. 前言 得物 App 从创立之初,关系型数据库一直使用的开源数据库产品 MySQL.和绝大部分互联网公司一样,随着业务高速增长.数据量逐步增多,单实例.单库.单表出现性能瓶颈和存储瓶颈.从选型和架 ...

  7. Linux 运维常用命令 find、awk、sed、grep、vi、ps、lsof、rpm

    先用一个脚本,模拟创建 14 个测试文件: #!/bin/bash for ((i=1;i<=10;i++)); do if [ $i -lt 3 ] thentouch /home/mysql ...

  8. 【运维学习笔记】运维入门

    前言: 这几天过的很像第一年来提高班装系统那会儿,接触了很多新的东西,大量的东西塞在脑子里!今天系统的整理了一下! 时间 事件 1周 看一些硬件的结构,拆 了一些东西(发现其实硬件也没有很神奇,是一些 ...

  9. python实时读取日志并打印关键字怎么实现_面试宝典_Python.运维开发.0004.用Python实现tail实时输出新增日志?...

    面试题目: 1. 用PYTHON实现tail -f功能,默认显示最后15行,实时输出新增行? 解题思路: 1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinotif ...

最新文章

  1. Python 微信机器人:调用电脑摄像头时时监控功能实现演示,调用电脑摄像头进行拍照并保存
  2. mysql 释放空间_07_MySQL delete后释放存储空间
  3. 外媒分析:iPhone销量低于预期是中国市场疲软影响的
  4. Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——例题9-5
  5. 【LeetCode】390. 消除游戏
  6. 下拉菜单,防鼠标反复触发
  7. 使用ip命令搭建基于隧道的虚拟专有网络
  8. 设计模式学习笔记之代理模式
  9. android mdpi对应哪一个屏幕,Android屏幕大小为ldpi,mdpi,hdpi,xhdpi显示? - 例如:ldpi为1024X768像素...
  10. 【深度学习】使用opencv在视频上添加文字和标记框
  11. win10系统matlab不能卸载不了,win10系统matlab打不开无法运行的方案
  12. 【搞个事】主页被劫持,改注册表进行修复
  13. 揭露SAP培训机构的套路
  14. 自媒体爆文标题怎么写?6种实用小技巧分享!
  15. 看了 web.dev 的 631 篇博客,我总结了这些内容
  16. 制作破壳而出的漂亮MM
  17. 大神教玩转手机摄影+后期
  18. Visual Studio 高亮引用颜色设置
  19. ISE使用,Xilinx学习
  20. 微信小程序通过云函数生成带参数的小程序码

热门文章

  1. 【区块链】区块链经济学:制度加密经济学入门指南
  2. [unknown OJ] ZZH与计数
  3. 使用ue4做一个可以显示任意数字变化的计数器方法
  4. 怎么在Unity2019中烘焙lightmap
  5. Go语言之基本数据类型
  6. 计算机远程桌面连接如何设置,电脑的远程桌面功能不知道怎么设置_远程桌面连接设置方法 - 驱动管家...
  7. 遍历List集合的三种方法
  8. 苹果HomeKit如何与安卓智能设备实现跨品牌联动?
  9. arcgis将地理坐标系转换成投影坐标系
  10. 内部方法调用,事务不起作用的原因及解决办法