首页 文章 精选 留言 我的

精选列表

搜索[开发者预览],共10000篇文章
优秀的个人博客,低调大师

一名开发者眼中的TiDB与MySQL选择

作者: angryart 原文来源:https://tidb.net/blog/60200e06 TiDB长期霸榜国产数据库第一名,社区活跃人气旺盛。作为TiDB其中的一个粉丝,我把近年的学习调研实践归纳如下,TiDB是一款通用性的数据解决方案,任何数据场景都可以使用它来解决问题,所以它与所有市场上所有的数据库产品 多多少少存在直接上的或者间接上的竞争关系。 那么市场竞争上谁是TiDB的第一梯队竞争对手,本人认为是MySQL是其中一个,当然也可以是Oracle、DB2等等,主要是MySQL在中国深入人心,工程师信手拿来就能使用。 TiDB与MySQL的对比 有些人直接称TiDB为大号的MySQL,其实不对,为了工程师像使用MySQL使用TiDB,TiDB在接口层下了大量的功夫,在语法、表名、引用甚至元数据方面尽量与MySQL贴合,但是每个语句背后执行的都是不同的数据流程和服务流向。 类型上比较,MySQL是纯粹单机式数据库,TiDB是分布式数据库,TiDB可以方便自由增加节点扩展存算能力,而MySQL增加节点增强性能,必须通过定向策略,例如中间件路由或者读写分离的方式,显得呆滞固化。 引擎上比较,MySQL有myisam、innodb、memory等引擎 ,也可以通过插件支持更多的引擎例如rocksdb,HandlerSocket等等,而TiDB虽然只有两个引擎,但是却能应对所有的应用场景。 架构上比较,MySQL是偏紧密耦合,分为三层分别是接口层、服务层、存储层,接口层负责请求处理、授权认证、安全,服务层负责查询解析、分析、优化、缓存、系统内置函数,存储层负责数据的 存储和处理,统一体现在一个服务进程上。TiDB则是松散耦合型,把数据库的关键组件抽象,根据本身分布式的特性,分别是计算层、存储层、协调层。 TiDB计算层类似MySQL接口层,负责负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过协调层找到存储计算所需存储层数据的地址,与 存储层交互获取数据,最终返回结果。 TiDB存储层负责存储数据,数据的存储容量没有上限,存储层上同一份数据一般有3个副本,满足高并发需求。协调层会对存储层中的数据做出负载均衡的处理。 TiDB协调层负责集群的管理模块,经常干的事情有3个,一个是集群的元信息,一个是对存储层的数据进行调度和负载均衡,一个分配全局唯一且递增的事务 ID。 数据处理技术上,MySQL是B+树的组织存储结构,B+树适合读多写少,如果写多了,写的影响动作主要是插入、删除,会导致全局的平衡树下面的页频繁分裂或者合并,直接影响性能,影响读放大。TiDB是LSM树的组织存储结构,擅长写多读少,如果读多了,在内存扫描不到数据,就会去硬盘里面去寻找无序的sst文件,所以数据越多越大就会读放大。 TiDB做了诸多优化,例如使用RocksDB作为背端存储,优化LSM机制等等,协同提高数据全链条的处理性能,而且是存算分离的组织完成这个性能的。 产品方向上比较,MySQL默认innodb,擅长OLTP的业务场景,同时MySQL可以插件组装各式引擎,换言之MySQL是一个通用型的数据库产品支持所有的业务场景。而TiDB默认悲观事务,同样是以OLTP为重,同样是一个通用型的数据库产品。但是两者是不一样的,由于MySQL是单机型的结构,如果它要扩展,只能通过数据库中间件路由划分,如果数据满了需要停机停服,重新进行数据的割分。 TiDB对业务无侵入性,扩展非常简单,发展至今安装与维护都非常成熟 ,通过Tiup就可以就可以对分布式集群进行组装维护的相关操作,并且支持在线升级,无缝迁移。 总结,TiDB与MySQL没有对比性, 他们不是同一类的数据产品,但是从数据库的特性和市场方向上出发 ,他们又有了对比的维度指标。事实上,TiDB努力向MySQL学习,甚至还聘请了innodb的内核开发工程师,努力调整TiDB的底盘,让TiDB从内向外都像MySQL。 同类竞争产品 TiDB是一款分布式数据库产品,以分布式为标识并能基于线下安装 ,国内同样竞比产品有OceanBase,国外同比有CockroachDB。TiDB的商业经营主要集中在云数据库上,所以PolarDB也是TiDB的竞争对手。那么TiDB与PolarDB、OceanBase、CockroachDB有什么不同? 从数据库处理的流程开始讲,从任务开始到任务结束。 用户发起请求, 数据库客户端发起请求到指定的数据库集群。 目标数据库响应 指定的数据库集群指定一个节点响应用户的请求。 两者建立会话, 数据库集群其中一个节点与客户端产生会话。 对象请求解析, 数据库将接收的请求进行 语法检查,对象解析、转换对应的关系代数结构、并进行计划任务优化。 调度并且执行, 寻找最合适的副本 ,根据优先级进行,是内存、缓存、数据快照、存储等等。 监测任务状态, 观测数据库的执行中状态。 返回数据结果, 数据库服务端返回结果给数据库客户端 最关键的是第2步、第4步、第5步。 第2步是 哪一个节点响应数据库客户的请求,分布式数据库有两种系统架构,一种是中心化架构【master\slave】,一种是去中心化架构。中心化架构的负色职责分清,负责干活、负责指挥、负责接待用户,而去中心货架构则是每个节点角色平等,对待客户的请求,其中的一个节点会瞬间切换成负责接待,剩余的节点根据情况转化执行。 TiDB在这里采用中心化的架构,节点角色之间的职责更加清晰,分工更加明确。 第4步和第5步是数据计算和数据存储的关键步骤,TiDB在这里做了深度的松散解耦,数据计算用TIDB,数据存储用TIKV,两者是真正意义上的存算分离,要增加存储容量,可以增加没有CPU的硬盘服务器,要增加计算能力,可以增加没有硬盘的服务器。关于分布式的功能和作用则集中在一个PD的模块上。 OB则是去中心架构,而且计算和存储高度耦合,所以OB又称为集中式的分布式架构,后面又称为单机式的分布式架构。 TiDB比起同类产品在架构上更加高度松散耦合,与云计算技术更加紧密协作,珠联壁合。 TiDB vs MySQL 如果TiDB要做大做强,必须要撼动广大码农的工作使用习惯,广大码民对MySQL的使用已经深入人心了,不管是TP应用,还是AP应用,先不管性能,首先用MySQL完成业务代码的开发,这意味着MySQL经常被当HTAP数据库来用。下面我用CH-benchmark 针对 TiDB6.0以及MySQL8.0来做一个测试。 TPC-CH 由未经修改的 TPC-C 模型和事务、以及 TPC-H 查询的改编版本构成,TPC-CH 保持所有 TPC-C 实体和关系完全不变,并集成了 TPC-H 模型中的 SUPPLIER、REGION 和 NATION 表。这些表在 TPC-H 查询中频繁使用,并允许以非侵入的方式集成到 TPC-C 模型中。SUPPLIER 包含固定数量(10,000条)的条目。因此,STOCK 中的一条记录可以通过 STOCK.S I ID × STOCK.S W ID mod 10, 000 = SUPPLIER.SU SUPPKEY 与其唯一的供应商(SUPPLIER 表中对应记录)关联起来。TPC-C 中的原始 CUSTOMER 表不包含引用自 NATION 表的外键。我们并没有改变原始模型,从而保持了与现有 TPC-C 的兼容性,所以外键是从字段 C STATE 的第一个字符开始计算的。TPC-C 规定第一个字符可以有62个不同的值(即大写字母、小写字母、数字),因此我们选择了62个国家来填充 NATION。根据 TPC-H 规范,主键 N NATIONKEY 是一个标识符。它的值被规定,从而使得与这些值相关联的 ASCII 值是一个字母或数字,即 N NATIONKEY ∈ [48, 57]∪[65, 90]∪[97. 122]。因此,不需要额外的计算来跳过 ASCII 码中数字、大写字母和小写字母之间的间隔。不支持从字符转换到 ASCII 码的数据库系统可能会偏离 TPC-H 模式,使用单个字符作为 NATION 的主键。REGION 包含国家的五个地区。新表之间的关系使用简单的外键字段来建模:NATION.N REGIONKEY 和 SUPPLIER.SU NATIONKEY。 在CH-Benchmark 中结合了 TPC-C 和 TPC-H 两种基准,它把原来 TPC-C 中的 9 个表和 TPC-H 中的 8 个表修改合并成了 12 个表,并将两者的伸缩模型也统一起来(Scaling TPC-H by the same factors of TPC-C)。 测试环境 硬件配置 操作系统 CentOS Linux release 7.6.1810 CPU 8核 Intel(R) Xeon(R) 内存 16 测试配置 软件版本 IP 作用 MySQL8.0 192.168.1.X MySQL单机 TiDB6.0 192.168.1.X TiDB单机 CH-benchmark 192.168.2.X HTAP测试工具,生成数据 TiUP Bench 192.168.2.X HTAP测试工具,进行测试 生成数据 我这里是通过TiDB Bench对数据进行压测,但是数据却是通过CH-benchmark 去生成的。 安装CH-benchmark ​ https://github.com/DASLab-IDA/CH-benchmark ​ ​ -rwxr-xr-x. 1 root root 1007440 Mar 29 16:13 chBenchmark -rw-r--r--. 1 root root 12745 Mar 3 2022 chBenchmark.cpp -rw-r--r--. 1 root root 194096 Mar 29 16:13 chBenchmark.o -rw-r--r--. 1 root root 561 Mar 3 2022 LICENSE -rw-r--r--. 1 root root 1167 Mar 3 2022 Makefile -rw-r--r--. 1 root root 2650 Mar 3 2022 README.md drwxr-xr-x. 3 root root 4096 Mar 29 16:13 src [root@hdp1 CH-benchmark-main]# make ​ ​ 运行make之后会就对当天的文件进行编译,生成chBenchmark 执行命令 ​ chBenchmark命令如下 Create initial database as CSV files: chBenchmark -csv -wh <WAREHOUSE_COUNT> -pa <INITIAL_DB_GEN_PATH> ​ example: chBenchmark -csv -wh 50 -pa /path/to/any/directory 生成数据如下,生成一个warehouse的数据 ​ chBenchmark -csv -wh 1 -pa /tmp/chBenchmark1 ​ ​ ​ 建表语句 CREATE TABLE `customer` ( `c_id` int NOT NULL, `c_d_id` int NOT NULL, `c_w_id` int NOT NULL, `c_first` varchar(16) DEFAULT NULL, `c_middle` char(2) DEFAULT NULL, `c_last` varchar(16) DEFAULT NULL, `c_street_1` varchar(20) DEFAULT NULL, `c_street_2` varchar(20) DEFAULT NULL, `c_city` varchar(20) DEFAULT NULL, `c_state` char(2) DEFAULT NULL, `c_zip` char(9) DEFAULT NULL, `c_phone` char(16) DEFAULT NULL, `c_since` datetime DEFAULT NULL, `c_credit` char(2) DEFAULT NULL, `c_credit_lim` decimal(12,2) DEFAULT NULL, `c_discount` decimal(4,4) DEFAULT NULL, `c_balance` decimal(12,2) DEFAULT NULL, `c_ytd_payment` decimal(12,2) DEFAULT NULL, `c_payment_cnt` int DEFAULT NULL, `c_delivery_cnt` int DEFAULT NULL, `c_data` varchar(500) DEFAULT NULL, PRIMARY KEY (`c_w_id`,`c_d_id`,`c_id`), KEY `idx_customer` (`c_w_id`,`c_d_id`,`c_last`,`c_first`) ); ​ ​ CREATE TABLE `district` ( `d_id` int NOT NULL, `d_w_id` int NOT NULL, `d_name` varchar(10) DEFAULT NULL, `d_street_1` varchar(20) DEFAULT NULL, `d_street_2` varchar(20) DEFAULT NULL, `d_city` varchar(20) DEFAULT NULL, `d_state` char(2) DEFAULT NULL, `d_zip` char(9) DEFAULT NULL, `d_tax` decimal(4,4) DEFAULT NULL, `d_ytd` decimal(12,2) DEFAULT NULL, `d_next_o_id` int DEFAULT NULL, PRIMARY KEY (`d_w_id`,`d_id`) ); ​ ​ CREATE TABLE `history` ( `h_c_id` int NOT NULL, `h_c_d_id` int NOT NULL, `h_c_w_id` int NOT NULL, `h_d_id` int NOT NULL, `h_w_id` int NOT NULL, `h_date` datetime DEFAULT NULL, `h_amount` decimal(6,2) DEFAULT NULL, `h_data` varchar(24) DEFAULT NULL, KEY `idx_h_w_id` (`h_w_id`), KEY `idx_h_c_w_id` (`h_c_w_id`) ); ​ ​ CREATE TABLE `item` ( `i_id` int NOT NULL, `i_im_id` int DEFAULT NULL, `i_name` varchar(24) DEFAULT NULL, `i_price` decimal(5,2) DEFAULT NULL, `i_data` varchar(50) DEFAULT NULL, PRIMARY KEY (`i_id`) ); ​ CREATE TABLE `nation` ( `n_nationkey` tinyint NOT NULL, `n_name` char(25) NOT NULL, `n_regionkey` tinyint NOT NULL, `n_comment` char(152) NOT NULL, PRIMARY KEY (`n_nationkey`) ); ​ CREATE TABLE `new_order` ( `no_o_id` int NOT NULL, `no_d_id` int NOT NULL, `no_w_id` int NOT NULL, PRIMARY KEY (`no_w_id`,`no_d_id`,`no_o_id`) ); ​ ​ CREATE TABLE `orderline` ( `ol_o_id` int NOT NULL, `ol_d_id` tinyint NOT NULL, `ol_w_id` int NOT NULL, `ol_number` tinyint NOT NULL, `ol_i_id` int DEFAULT NULL, `ol_supply_w_id` int DEFAULT NULL, `ol_delivery_d` date DEFAULT NULL, `ol_quantity` smallint DEFAULT NULL, `ol_amount` decimal(6,2) DEFAULT NULL, `ol_dist_info` char(24) DEFAULT NULL, PRIMARY KEY (`ol_w_id`,`ol_d_id`,`ol_o_id`,`ol_number`), KEY `fk_orderline_order` (`ol_w_id`,`ol_d_id`,`ol_o_id`), KEY `fk_orderline_stock` (`ol_supply_w_id`,`ol_i_id`) ); ​ ​ CREATE TABLE `orders` ( `o_id` int NOT NULL, `o_d_id` int NOT NULL, `o_w_id` int NOT NULL, `o_c_id` int DEFAULT NULL, `o_entry_d` datetime DEFAULT NULL, `o_carrier_id` int DEFAULT NULL, `o_ol_cnt` int DEFAULT NULL, `o_all_local` int DEFAULT NULL, PRIMARY KEY (`o_w_id`,`o_d_id`,`o_id`), KEY `idx_order` (`o_w_id`,`o_d_id`,`o_c_id`,`o_id`) ); ​ ​ CREATE TABLE `region` ( `r_regionkey` tinyint NOT NULL, `r_name` char(55) NOT NULL, `r_comment` char(152) NOT NULL, PRIMARY KEY (`r_regionkey`) ); ​ ​ CREATE TABLE `stock` ( `s_i_id` int NOT NULL, `s_w_id` int NOT NULL, `s_quantity` int DEFAULT NULL, `s_dist_01` char(24) DEFAULT NULL, `s_dist_02` char(24) DEFAULT NULL, `s_dist_03` char(24) DEFAULT NULL, `s_dist_04` char(24) DEFAULT NULL, `s_dist_05` char(24) DEFAULT NULL, `s_dist_06` char(24) DEFAULT NULL, `s_dist_07` char(24) DEFAULT NULL, `s_dist_08` char(24) DEFAULT NULL, `s_dist_09` char(24) DEFAULT NULL, `s_dist_10` char(24) DEFAULT NULL, `s_ytd` int DEFAULT NULL, `s_order_cnt` int DEFAULT NULL, `s_remote_cnt` int DEFAULT NULL, `s_data` varchar(50) DEFAULT NULL, PRIMARY KEY (`s_w_id`,`s_i_id`) ) ; ​ ​ CREATE TABLE `supplier` ( `s_suppkey` smallint NOT NULL, `s_name` char(25) NOT NULL, `s_address` char(40) NOT NULL, `s_nationkey` tinyint NOT NULL, `s_phone` char(15) NOT NULL, `s_acctbal` decimal(12,2) NOT NULL, `s_comment` char(101) NOT NULL, PRIMARY KEY (`s_suppkey`) ); ​ ​ CREATE TABLE `warehouse` ( `w_id` int NOT NULL, `w_name` varchar(10) DEFAULT NULL, `w_street_1` varchar(20) DEFAULT NULL, `w_street_2` varchar(20) DEFAULT NULL, `w_city` varchar(20) DEFAULT NULL, `w_state` char(2) DEFAULT NULL, `w_zip` char(9) DEFAULT NULL, `w_tax` decimal(4,4) DEFAULT NULL, `w_ytd` decimal(12,2) DEFAULT NULL, PRIMARY KEY (`w_id`) ); ​ ​ ​ ​ ​ 导入数据 导入数据前,注意要对tidb运行以下命令 ​ ALTER DATABASE tpcch SET tiflash replica 1; ​ mysql> SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'tpcch'; +--------------+------------+----------+---------------+-----------------+-----------+----------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS | +--------------+------------+----------+---------------+-----------------+-----------+----------+ | tpcch | customer | 90 | 1 | | 0 | 0 | | tpcch | district | 93 | 1 | | 0 | 0 | | tpcch | history | 96 | 1 | | 0 | 0 | | tpcch | item | 99 | 1 | | 0 | 0 | | tpcch | nation | 102 | 1 | | 0 | 0 | | tpcch | new_order | 105 | 1 | | 0 | 0 | | tpcch | neworder | 108 | 1 | | 0 | 0 | | tpcch | order | 111 | 1 | | 0 | 0 | | tpcch | order_line | 113 | 1 | | 0 | 0 | | tpcch | orderline | 115 | 1 | | 0 | 0 | | tpcch | orders | 117 | 1 | | 0 | 0 | | tpcch | region | 119 | 1 | | 0 | 0 | | tpcch | stock | 121 | 1 | | 0 | 0 | | tpcch | warehouse | 125 | 1 | | 0 | 0 | | tpcch | supplier | 128 | 1 | | 0 | 0 | +--------------+------------+----------+---------------+-----------------+-----------+----------+ 15 rows in set (0.00 sec) ​ ​ ​ LOAD DATA local INFILE '/tmp/chBenchmark1/CUSTOMER.tbl' INTO TABLE tpcch.customer FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/DISTRICT.tbl' INTO TABLE tpcch.district FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/HISTORY.tbl' INTO TABLE tpcch.history FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/ITEM.tbl' INTO TABLE tpcch.item FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/NATION.tbl' INTO TABLE tpcch.nation FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/NEWORDER.tbl' INTO TABLE tpcch.new_order FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/ORDER.tbl' INTO TABLE tpcch.orders FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/ORDERLINE.tbl' INTO TABLE tpcch.orderline FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/REGION.tbl' INTO TABLE tpcch.region FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/STOCK.tbl' INTO TABLE tpcch.stock FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/SUPPLIER.tbl' INTO TABLE tpcch.supplier FIELDS TERMINATED BY '|'; LOAD DATA local INFILE '/tmp/chBenchmark1/WAREHOUSE.tbl' INTO TABLE tpcch.warehouse FIELDS TERMINATED BY '|'; 运行压测命令 192.168.2.x上面安装tiup bench ​ ​ tiup install bench 持续对TIDB的数据库tpcch发起50个TP并发量,并进行一次AP的21个语句查询 tiup bench ch --host 192.168.1.x -Uhenley -pxxxxxx -P4000 --warehouses 1 run -D tpcch -T 50 -t 1 --time 1m ​ 持续对mysql的数据库tpcch发起50个TP并发量,并进行一次AP的21个语句查询 tiup bench ch --host 192.168.1.x -Uhenley -pxxxxxx -P3306 --warehouses 1 run -D tpcch -T 50 -t 1 --time 1m 测试摘要 tiup bench ch --host 192.168.1.x -Uhenley -pxxxxxx -P3306 --warehouses 1 run -D tpcch -T 50 -t 1 --time 1m ​ tpmC: 4168.9, tpmTotal: 9231.7, efficiency: 32417.2% [Summary] Q1 - Count: 1, Sum(ms): 67.7, Avg(ms): 67.7 [Summary] Q10 - Count: 1, Sum(ms): 30.6, Avg(ms): 30.6 [Summary] Q11 - Count: 1, Sum(ms): 558.8, Avg(ms): 558.6 [Summary] Q12 - Count: 1, Sum(ms): 19.8, Avg(ms): 19.8 [Summary] Q13 - Count: 1, Sum(ms): 163.9, Avg(ms): 163.9 [Summary] Q14 - Count: 1, Sum(ms): 14.5, Avg(ms): 14.5 [Summary] Q15_ERR - Count: 1, Sum(ms): 277.5, Avg(ms): 277.5 [Summary] Q2 - Count: 1, Sum(ms): 1360.0, Avg(ms): 1359.5 [Summary] Q3 - Count: 1, Sum(ms): 90.3, Avg(ms): 90.3 [Summary] Q4 - Count: 1, Sum(ms): 116.4, Avg(ms): 116.4 [Summary] Q5 - Count: 1, Sum(ms): 204.9, Avg(ms): 204.8 [Summary] Q6 - Count: 1, Sum(ms): 18.9, Avg(ms): 18.9 [Summary] Q7 - Count: 1, Sum(ms): 21.2, Avg(ms): 21.3 [Summary] Q8 - Count: 1, Sum(ms): 195.2, Avg(ms): 195.1 [Summary] Q9 - Count: 1, Sum(ms): 265.0, Avg(ms): 265.0 QphH: 62.5 ​ ​ tiup bench ch --host 192.168.2.xx -Uhenley -pP@xxx -P4000 --warehouses 1 run -D tpcch -T 50 -t 1 --time 1m tpmC: 1805.5, tpmTotal: 4092.0, efficiency: 14039.7% [Summary] Q1 - Count: 1, Sum(ms): 145.6, Avg(ms): 145.6 [Summary] Q10 - Count: 1, Sum(ms): 275.2, Avg(ms): 275.1 [Summary] Q11 - Count: 1, Sum(ms): 330.5, Avg(ms): 330.4 [Summary] Q12 - Count: 1, Sum(ms): 124.3, Avg(ms): 124.4 [Summary] Q13 - Count: 1, Sum(ms): 98.4, Avg(ms): 98.4 [Summary] Q14 - Count: 1, Sum(ms): 275.1, Avg(ms): 275.1 [Summary] Q15_ERR - Count: 1, Sum(ms): 1.1, Avg(ms): 1.1 [Summary] Q2 - Count: 1, Sum(ms): 469.7, Avg(ms): 469.6 [Summary] Q3 - Count: 1, Sum(ms): 283.8, Avg(ms): 283.8 [Summary] Q4 - Count: 1, Sum(ms): 481.1, Avg(ms): 481.2 [Summary] Q5 - Count: 1, Sum(ms): 256.7, Avg(ms): 256.7 [Summary] Q6 - Count: 1, Sum(ms): 98.1, Avg(ms): 98.1 [Summary] Q7 - Count: 1, Sum(ms): 192.4, Avg(ms): 192.3 [Summary] Q8 - Count: 1, Sum(ms): 143.1, Avg(ms): 143.1 [Summary] Q9 - Count: 1, Sum(ms): 667.7, Avg(ms): 667.7 QphH: 62.4 测试总结 保留对MySQL8.0和TiDB6.0的内部参数不变, 从load data数据插入、 tpmC性能、以及tpc-h的性能数据表面来看,MySQL8.0要比TiDB6.0要好,其实不然,TiDB还有很多调优的空间。前面说了,毕竟他们是两个不同的产品线,但是这里证明TiDB的友好性,它是十分兼容MySQL的,如果你从单机版TiDB开始,随着你的业务扩大,你可以自由轻易的扩展。 我对TiDB的展望 软件开发的角度,TiDB的解耦是完整的,如果TiDB的发展已经去到7.0。我对TiDB的未来展望是三路发展,TiDB模块源代码,可以做为分布式计算基础参考,派生更多的可能性,类似presto的路线延伸。TiKV模块源代码,可以作为分布式存储参考,以后的发展方向可能是文件数据存储。PD模块源代码的技术路径发展是轻量级的元数据存储的管理,三者兼进,帮助用户降低存储成本,提升计算弹性,通过分布式实现元数据最优存储,多姿多彩,发扬光大。

优秀的个人博客,低调大师

ipmitool 开发者账号被 GitHub 无故封锁,项目被归档

Ipmitool 是一种可用在 Linux 系统下的 IPMI平台管理工具,但出于GitHub 方面的原因,该项目正处于开发停滞状态。其 GitHub 仓库目前已被标识为“public archive”,且并没有任何相关的解释公告发布。 在没有任何警告的前提下,项目开发人员 Alexander Amelkin 的账号已被 GitHub 封锁。Alexander Amelkin 自 2018 年以来一直在维护 ipmitool,他在ipmitool 的旧 SourceForge 页面表示: 很抱歉,但在 3 月 1 日,在没有任何事先通知或任何解释的情况下。GitHub 已经暂停了我的个人账户,并使我拥有/维护的所有项目成为“孤儿”。 这包括 ipmitool 和 frugen。 这个邮件列表和旧的 sourceforge 项目页面是我留下的唯一与你们沟通的方式。我目前正在寻找一种方法来解除对我的 GitHub 的封锁,或者(不太优选的是)将 ipmitool 再次迁移到另一个不那么敌对的服务。 如今时间已经过去了两周,Amelkin 的账号封锁和所维护的所有开源项目被归档的状态仍没有任何改善,且没有明显的解决方案。 科技网站Phoronix 指出,没有任何明确的迹象表明 GitHub 封锁 Amelkin 的原因,但可能与他居住在俄罗斯莫斯科有关;因为除此之外,他的仓库似乎不存在其他任何争议。“无论如何只是在这里简单地提一下,以引起人们对 ipmitool 被封锁/归档问题的注意,如果继续被 GitHub 封锁,它的仓库/家可能会改变,并帮助向任何其他认为 ipmitool 开发可能已经停滞/放弃的人澄清。” Amelkin 本人也发帖表示,自己从未参与过任何政治活动,目前他正在为项目寻找一个没有那么大敌对性、不掺杂政治性的托管服务平台。日本开源组织 (Open Source Group Japan) 主席佐渡修二则回帖向其推荐了中国的 Gitee 或者日本的 OSDN平台,Amelkin 看到了这一建议,并对此表达了感谢。

优秀的个人博客,低调大师

京东云开发者|ElasticSearch降本增效常见的方法

Elasticsearch在db_ranking 的排名又(双叒叕)上升了一位,如图1-1所示;由此可见es在存储领域已经蔚然成风且占有非常重要的地位。 随着Elasticsearch越来越受欢迎,企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢?今天我们就特地来聊聊ES降本增效的常见方法: 弹性伸缩 分级存储 其他:(1)数据压缩(2)off heap 图 1-1 Elasticsearch db_ranking 1 弹性伸缩 所谓弹性伸缩翻译成大白话就是随时快速瘦身与增肥,并且是头痛医头,按需动态调整资源。当计算能力不足的时候我们可以快速扩充出计算资源;当存储资源不足时,能够快速扩容磁盘。 1-1 计算存储分离 ES使用计算存储分离架构之后,解决了资源预留而造成资源浪费的问题。在早期大家认为的计算存储分离的实现方式为:使用云盘代替本地盘,这种实现方式可以提高数据的可靠性、可以快速弹扩磁盘资源和计算资源,但是es自身弹性需求是无法解决,即秒级shard搬迁和replica扩容。 那么如何解决es自身的弹性呢?本文该部分将给出答案。 共享存储版ES 本文该部分将介绍我们京东云-中间件搜索团队,研发的共享存储版本ES;计算存储分离架构如图1-2所示 图 1-2 计算存储分离架构(共享) 如图1-2所示,我们只存储一份数据,primary shard负责读写,replica只负责读;当我们需要扩容replica的时候无需进行数据搬迁,直接跳过原生es的peer recover两阶段,秒级完成replica的弹扩。 当主分片发生relocating时,可以直接跳过原生es的peer recover第一阶段(该阶段最为耗时),同时也不需要原生es的第二阶段发送translog。 共享版本的计算存储分离ES,相对于原生的ES和普通版本的计算存储分离,具有如下突出的优势: 数据只保存一份,存储成本倍数级降低 存储容量按需自动拓展,几乎无空间浪费 按实际用量计费,无需容量规划 性能测试 数据集为esrally提供的http_logs 共享版ES7.10.2: 3个data节点(16C64GB) 原生ES7.10.2: 3个data节点(16C64GB) 表 1-1 副本性能测试对比 我们的初步性能测试结果如表1-1所示;副本数越多,共享版本的es越具有优势; 从表1-1所示我们可以看出性能似乎提升的不是特别理想,目前我们正从两个方面进行优化提升: 底层依赖的云海存储,目前正在有计划地进行着性能提升 源码侧,我们也在正在优化ing 在研发es计算存储分离的过程中,我们攻克了很多的问题,后续将输出更加详细的文章进行介绍,比如:主写副只读的具体实现,replica的访问近实时问题,ES的主分片切换脏写问题等等。 1-2 外部构建Segment 对于有大量写入的场景,通常不会持续的高流量写入,而只有1-2个小时写入流量洪峰;在写入过程中最耗费时间的过程并不是写磁盘而是构建segment,既然构建segment如此耗时,那么我们是否可以将该部分功能单独出来,形成一个可快速扩展的资源(避免去直接改动es源码而引入其他问题)。 目前业界已经有比较好的案例外部构建Segment,相对于共享存储版的es实现起来更简单;它的核心解决方案使用了spark或者map reduce这种批处理引擎进行批量计算处理,然后将构建好的segment搬运到对应的索引shard即可。外部构建segment的功能也在我们的规划中。 2 分级存储 ES实现降本增效的另外一个方向:分级存储,该解决方案主要是针对数据量大查询少且对查询耗时不太敏感的业务。分级存储,比较成熟的解决方案有es冷热架构和可搜索快照。 2-1 冷热架构 冷热架构适用场景:时序型数据或者同一集群中同时存在这两个索引(一个热数据,另外一个冷数据) es冷热架构架构,该功能已经在京东云上线有一段时间了,欢迎大家根据自己的业务形态进行试用,冷数据节点开启如图2-1所示 图 2-1 冷数据节点开启 建议如果索引表是按天/小时,这种周期存储的数据,且数据查询具有冷热性,建议开启冷节点;开启冷节点后你可能会获得如下的收益: 开启冷节点后可以降低你的存储成本,因为存放冷节点的索引我们可以选择减少副本数、冷节点的存储介质更便宜 集群可以存放更多的数据 冷数据forcemerge,提升冷数据的查询性能 冷数据从热节点迁移走之后,减少热节点的资源占用,从而使热查询更快 冷热架构的核心技术为 shard-allocation-filtering; 冷热架构实现原理: es的hot节点增加如下配置 node.attr.box_type: hot es的warm节点增加如下配置 node.attr.box_type: warm 热数据索引setting增加如下配置,即可限制shard分配在hot节点 "index.routing.allocation.require.box_type": "hot" 当数据查询减弱,我们通过如下配置,即可使数据由hot节点迁移到warm节点 "index.routing.allocation.require.box_type": "warm" 2-2 可搜索快照 可搜索快照是在冷热架构的基础上更进一步的分级存储,在之前我们将数据快照之后是无法对快照的数据进行搜索,如果要对快照的数据进行搜索,则需将快照数据先restore(restore的过程可能会比较长)之后才能被搜索。 在引入可搜索快照之后,我们可以直接搜索快照中的数据,大大降低了没必要的资源使用。 3 其他 3-1 数据压缩 除了从资源的角度进行降低存储成本之外,基于数据自身的特性,使用优秀的压缩算法也是一种必不可少的搜索;针对时序数据facebook开源了一个非常优秀的压缩算法zstd,目前已经在业界被大量使用。 表 3-1 三种压缩算法的对比测试结果 目前在lucene的代码库中也有开源爱好者提交了custom codec providing Zstandard compression/decompression (zstd pr) 3-2 off heap es单个节点存储数据量受到jvm堆内存的限制,为了使单个节点能够存储更多的数据,因此我们需要减少堆内存中的数据。 ES 堆中常驻内存中占据比重最大是 FST,即 tip(terms index) 文件占据的空间,1TB 索引大约占用2GB 或者更多的内存,因此为了节点稳定运行,业界通常认为一个节点 open 的索引不超过5TB。现在,从 ES 7.3版本开始,将 tip 文件修改为通过mmap的方式加载,这使 FST占据的内存从堆内转移到了堆外(即off Heap技术 )由操作系统的 pagecache 管理[6]。 使用esrally官方数据集geonames写入索引1TB,使用 _cat/segments API 查看 segments.memory内存占用量,对比 offheap 后的内存占用效果,如表3-2所示;JVM 内存占用量降低了78%左右 表 3-2 segments.memory内存占用量 4 参考 [1] Indexing Service [2] ES-Fastloader [3] 大规模测试新的 Elasticsearch 冷层可搜索快照 [4] Introducing Elasticsearch searchable snapshots [5] 7.7 版本中的新改进:显著降低 Elasticsearch 堆内存使用量 [6] Elasticsearch 7.3 的 offheap 原理 作者:杨松柏

优秀的个人博客,低调大师

Ceph v17.2.0 Quincy 发布,中国开发者贡献凸显

Ceph v17.2.0 Quincy 现已发布。Quincy是 Ceph 的第 17 个稳定版本,它以海绵宝宝的章鱼Quincy触手命名,这是 Ceph Quincy 的第一个稳定版本。 相比于 Pacific 版本的大变化有: FileStore在 Quincy 中已被弃用。BlueStore 成为 Ceph 的默认存储引擎。 ceph-mgr-modules-coredebian 软件包不再ceph-mgr-rook推荐.ceph-mgr-rook依赖于,当版本早于 1.19python3-numpy时,不能在不同的 Python 子解释器中多次导入。python3-numpy因为默认apt-get安装软件包,所以总是与debian 软件包一起作为间接依赖安装。如果您的工作流程取决于此行为,您可能需要单独安装。Recommendsceph-mgr-rookceph-mgrceph-mgr-rook device_health_metrics池已重命名.mgr。它现在用作所有ceph-mgr模块的公共存储。升级到 Quincy 后,该device_health_metrics池将.mgr在现有集群上重命名。 该ceph pg dump命令现在打印三个附加列:LAST_SCRUB_DURATION显示最后完成的擦洗的持续时间(以秒为单位);SCRUB_SCHEDULING传达一个 PG 是否被安排在指定时间被擦洗,它是否排队等待擦洗,或者它是否正在被擦洗;OBJECTS_SCRUBBED显示擦洗开始后在 PG 中擦洗的对象数量。 require-osd-release如果在集群升级后未将标志设置为适当的版本,现在会报告运行状况警告。 LevelDB 支持已被删除。WITH_LEVELDB不再是受支持的构建选项。用户 - 应该 - 在升级到 Quincy 之前将他们的监视器和 OSD 迁移到 RocksDB。 Cephadm:osd_memory_target_autotune默认启用,设置mgr/cephadm/autotune_memory_target_ratio为0.7总 RAM。这不适合超融合基础架构。对于超融合 Ceph,请参考文档或设置mgr/cephadm/autotune_memory_target_ratio为0.2. 遥测:改进了选择加入流程,以便用户可以继续共享相同的数据,即使有新的数据收集可用。现在可以选择使用一个新的“性能”频道来收集各种性能指标:ceph telemetry onceph telemetry enable channel perf查看带有 的示例报告ceph telemetry preview。请注意,在大型集群中使用“perf”通道数据生成遥测报告可能需要一些时间。有关更多详细信息,请参阅:https ://docs.ceph.com/en/quincy/mgr/telemetry/ MGR:progress 模块默认禁用 pg 恢复事件,因为该事件代价高昂,并且当有 OSD 被标记为从集群中进入/退出时会中断其他服务。但是,用户仍然可以随时启用此事件。有关更多详细信息,请参阅https://docs.ceph.com/en/quincy/mgr/progress/ https://tracker.ceph.com/issues/55383是一个已知问题。mon_cluster_log_to_journald当设置为 true 时需要设置为 falsemon_cluster_log_to_file以在日志轮换后继续将集群日志消息记录到文件中。 Cephadm SNMP 支持 守护进程托管 (mgr, mds, rgw) osd内存自动调整 与新的 NFS 管理模块集成 能够在 osd 被删除时对其进行删除 用于提高性能/可扩展性的 cephadm 代理 Dashboard 第 1 天:新的“集群扩展向导”将引导用户完成安装后的步骤:添加新主机、存储设备或服务。 NFS:仪表板现在允许用户从一个地方完全管理所有 NFS 导出。 新的 mgr 模块(反馈):用户可以直接从 Dashboard 或 CLI 快速报告 Ceph 跟踪器问题或建议。 新的“每日消息”:集群管理员可以在横幅中发布自定义消息。 Cephadm 集成改进: ​​​​​​​主机管理:维护、规格和标签, 服务管理:编辑和显示日志, 守护进程管理(启动、停止、重启、重新加载), 支持的新服务:入口(HAProxy)和 SNMP 网关。 监控和警报: ​​​​​​​添加了 43 个新警报(总共 68 个),提高了对影响以下事件的可观察性:集群运行状况、监视器、存储设备、PG 和 CephFS。 现在可以通过新的 SNMP 网关服务(提供 MIB)将警报作为 SNMP 陷阱发送到外部。 改进的集成完整/接近完整事件通知。 Grafana 仪表板现在使用 grafonnet 格式(尽管它们仍以 JSON 格式提供)。 堆栈更新:用于监控容器的图像已更新。Grafana 8.3.5、Prometheus 2.33.4、Alertmanager 0.23.0 和 Node Exporter 1.3.1。这减少了对多个 Grafana 漏洞(CVE-2021-43798、CVE-2021-39226、CVE-2021-43798、CVE-2020-29510、CVE-2020-29511)的暴露。 RADOS OSD:Ceph 现在mclock_scheduler默认使用 BlueStore OSDosd_op_queue来提供 QoS。Filestore OSD 不支持“mclock_scheduler”。因此,默认的 'osd_op_queue' 设置为wpq用于 Filestore OSD,即使用户尝试更改它也会强制执行。有关配置 mclock 的更多详细信息,请参阅, https://docs.ceph.com/en/quincy/rados/configuration/mclock-config-ref/ 运行时存在一个突出问题,在使用命令切换到custommclock 配置文件后,无法修改与预留、重量和限制相关的 mclock 配置选项。ceph config set ...这由https://tracker.ceph.com/issues/55153跟踪。在问题得到解决之前,建议用户避免使用“自定义”配置文件或使用跟踪器中提到的解决方法。 MGR:pg_autoscaler 现在可以使用标志在全局范围内on转动。默认情况下,它设置为,但此标志可以派上用场,以防止在集群升级和维护期间由自动缩放触发重新平衡。现在可以使用该标志创建池,这允许自动缩放器将更多 PG 分配给此类池。这对于为数据密集型池获得更好的开箱即用性能很有用。offnoautoscaleon--bulk 有关自动缩放的更多详细信息,请参阅:https ://docs.ceph.com/en/quincy/rados/operations/placement-groups/ offOSD:默认支持 osd-osd 通信的在线压缩。 有关压缩模式的更多详细信息,请参阅:https ://docs.ceph.com/en/quincy/rados/configuration/msgr2/#compression-modes OSD:集群日志中慢速操作的简明报告。可以通过设置osd_aggregated_slow_ops_logging为 false 来恢复旧的和更详细的日志记录行为。 “kvs” Ceph 对象类不再打包。“kvs” Ceph 对象类提供了在 librados 对象 omap 之上实现的分布式平面 b 树键值存储。由于该对象类没有现有的内部用户,因此不再对其进行打包。 RBD block storage rbd-nbd:rbd device attach和rbd device detach添加的命令,这些允许在rbd-nbd守护进程自 Linux 内核 5.14 以来重新启动后安全重新连接。 rbd-nbd:notrim添加了映射选项以支持厚配置映像,类似于 krbd。 SSD 设备上客户端持久缓存的大量稳定工作,也可在 16.2.8 中使用。有关使用的详细信息,请参阅https://docs.ceph.com/en/quincy/rbd/rbd-persistent-write-log-cache/ 使用快速差异图像特征 + 整个对象(不精确)模式时,差异计算中的几个错误修复。在极少数情况下,这些长期存在的问题可能会导致不正确的rbd export. 也在 15.2.16 和 16.2.8 中修复。 修复了在 krbd 上运行 Windows VM 时潜在的性能下降问题。详情见rxbounce地图选项说明:https ://docs.ceph.com/en/quincy/man/8/rbd/#kernel-rbd-krbd-options RGW object storage RGW 现在支持按用户和/或按桶进行速率限制。使用此功能,可以限制用户和/或存储桶,可以交付总操作数和/或每分钟字节数。此功能允许管理员仅限制 READ 操作和/或 WRITE 操作。通过使用全局配置,可以将限速配置应用于所有用户和所有存储桶。 radosgw-admin realm delete已重命名为radosgw-admin realm rm. 这与帮助信息一致。 S3 存储桶通知事件现在包含一个eTag键而不是etag,并且 eventName 值不再带有s3:前缀,从而修复了与在 AWS 上观察到的消息格式的偏差。 现在可以为野兽前端指定 ssl 选项和密码。默认 ssl 选项设置为“no_sslv2:no_sslv3:no_tlsv1:no_tlsv1_1”。如果要返回旧行为,请将 'ssl_options='(空)添加到rgw frontends配置中。 分段上传的行为已修改,以便在分段上传结束时仅发送 CompleteMultipartUpload 通知。上传开始时的 POST 通知和每个部分上发送的 PUT 通知不再发送。 CephFS distributed file system fs:可以使用特定 ID(“fscid”)创建文件系统。这在某些恢复方案中很有用(例如,当监视器数据库丢失并重新构建时,并且恢复的文件系统预计具有与以前相同的 ID)。 fs:可以使用该fs rename命令重命名文件系统。任何为旧文件系统名称授权的 cephx 凭据都需要重新授权为新文件系统名称。由于使用这些重新授权的 ID 的客户端的操作可能会中断,因此该命令需要“--yes-i-really-mean-it”标志。此外,预计将在文件系统上禁用镜像。 MDS 升级不再需要在升级文件系统的唯一活动 MDS 之前停止所有备用 MDS 守护程序。 CephFS:如果备用重放守护进程重放日志失败,现在会导致等级被标记为“损坏”。 详情可查看官方公告。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册