From af0b59ed6e709ddfe37c58fc130922501f612fb6 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:14:51 +0800 Subject: [PATCH 01/47] docs: taosBenchmark document make good --- .../14-reference/02-tools/10-taosbenchmark.md | 211 ++++++------------ 1 file changed, 64 insertions(+), 147 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index d655290577..73b44b22ed 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -4,59 +4,59 @@ sidebar_label: taosBenchmark toc_max_heading_level: 4 --- -taosBenchmark (曾用名 taosdemo ) 是一个用于测试 TDengine 产品性能的工具。taosBenchmark 可以测试 TDengine 的插入、查询和订阅等功能的性能,它可以模拟由大量设备产生的大量数据,还可以灵活地控制数据库、超级表、标签列的数量和类型、数据列的数量和类型、子表的数量、每张子表的数据量、插入数据的时间间隔、taosBenchmark 的工作线程数量、是否以及如何插入乱序数据等。为了兼容过往用户的使用习惯,安装包提供 了 taosdemo 作为 taosBenchmark 的软链接。 +taosBenchmark 是 TDengine 产品性能基准测试工具,提供对 TDengine 产品的写入、查询及订阅性能测试,输出性能指标。 ## 安装 -taosBenchmark 有两种安装方式: +taosBenchmark 提供两种安装方式: -- 安装 TDengine 官方安装包的同时会自动安装 taosBenchmark, 详情请参考[ TDengine 安装](../../../get-started/)。 +- taosBenchmark 是 TDengine 安装包中默认安装组件,TDengine 安装包可参考[ TDengine 安装](../../../get-started/)。 -- 单独编译 taos-tools 并安装, 详情请参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 +- 单独编译 taos-tools 并安装, 参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 ## 运行 -### 配置和运行方式 +### 运行方式 -taosBenchmark 需要在操作系统的终端执行,该工具支持两种配置方式:[命令行参数](#命令行参数详解) 和 [JSON 配置文件](#配置文件参数详解)。这两种方式是互斥的,在使用配置文件时只能使用一个命令行参数 `-f ` 指定配置文件。在使用命令行参数运行 taosBenchmark 并控制其行为时则不能使用 `-f` 参数而要用其它参数来进行配置。除此之外,taosBenchmark 还提供了一种特殊的运行方式,即无参数运行。 +taosBenchmark 支持三种运行模式: +- 无参数模式 +- 命令行模式 +- JSON 配置文件模式 +命令行方式是 JSON 配置文件的功能子集,当即使用了命令行,又使用了配置文件,命令行指定的参数优先。 -taosBenchmark 支持对 TDengine 做完备的性能测试,其所支持的 TDengine 功能分为三大类:写入、查询和订阅。这三种功能之间是互斥的,每次运行 taosBenchmark 只能选择其中之一。值得注意的是,所要测试的功能类型在使用命令行配置方式时是不可配置的,命令行配置方式只能测试写入性能。若要测试 TDengine 的查询和订阅性能,必须使用配置文件的方式,通过配置文件中的参数 `filetype` 指定所要测试的功能类型。 **在运行 taosBenchmark 之前要确保 TDengine 集群已经在正确运行。** ### 无命令行参数运行 -执行下列命令即可快速体验 taosBenchmark 对 TDengine 进行基于默认配置的写入性能测试。 - ```bash taosBenchmark ``` -在无参数运行时,taosBenchmark 默认连接 `/etc/taos` 下指定的 TDengine 集群,并在 TDengine 中创建一个名为 test 的数据库,test 数据库下创建名为 meters 的一张超级表,超级表下创建 10000 张表,每张表中写入 10000 条记录。注意,如果已有 test 数据库,这个命令会先删除该数据库后建立一个全新的 test 数据库。 +在无参数运行时,taosBenchmark 默认连接 `/etc/taos/taos.cfg` 中指定连接的 TDengine 集群。 +连接成功后,会创建智能电表示例数据库 test,超级表 meters, 子表创建 1 万,每子表 1 万条记录,如果 test 库已存在,会先删除再新建。 -### 使用命令行配置参数运行 - -在使用命令行参数运行 taosBenchmark 并控制其行为时,`-f ` 参数不能使用。所有配置参数都必须通过命令行指定。以下是使用命令行方式测试 taosBenchmark 写入性能的一个示例。 +### 使用命令行参数运行 +命令行支持的参数为写入功能中使用较为频繁的参数,查询与订阅功能不支持命令行方式 +示例: ```bash -taosBenchmark -I stmt -n 200 -t 100 +taosBenchmark -d db -t 100 -n 1000 -T 4 -I stmt -y ``` -上面的命令 `taosBenchmark` 将创建一个名为`test`的数据库,在其中建立一张超级表`meters`,在该超级表中建立 100 张子表并使用参数绑定的方式为每张子表插入 200 条记录。 +此命令表示使用 `taosBenchmark` 将创建一个名为 `db` 的数据库,并建立默认超级表 `meters`,子表 100 ,并使用参数绑定(stmt)方式为每张子表插入 1000 条记录。 ### 使用配置文件运行 -taosBenchmark 安装包中提供了配置文件的示例,位于 `/examples/taosbenchmark-json` 下 - -使用如下命令行即可运行 taosBenchmark 并通过配置文件控制其行为。 +配置文件方式运行提供了全部功能,所以参数都可以配置在配置文件中运行 ```bash taosBenchmark -f ``` -**下面是几个配置文件的示例:** +**下面为支持的写入、查询、订阅三大功能的配置文件示例:** -#### 插入场景 JSON 配置文件示例 +#### 写入场景 JSON 配置文件示例
insert.json @@ -89,130 +89,62 @@ taosBenchmark -f
+查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) + ## 命令行参数详解 - -- **-f/--file \** : - 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值。 - -- **-c/--config-dir \** : - TDengine 集群配置文件所在的目录,默认路径是 /etc/taos 。 - -- **-h/--host \** : - 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost 。 - -- **-P/--port \** : - 要连接的 TDengine 服务器的端口号,默认值为 6030 。 - -- **-I/--interface \** : - 插入模式,可选项有 taosc, rest, stmt, sml, sml-rest, 分别对应普通写入、restful 接口写入、参数绑定接口写入、schemaless 接口写入、restful schemaless 接口写入 (由 taosAdapter 提供)。默认值为 taosc。 - -- **-u/--user \** : - 用于连接 TDengine 服务端的用户名,默认为 root 。 - -- **-U/--supplement-insert ** : - 写入数据而不提前建数据库和表,默认关闭。 - -- **-p/--password \** : - 用于连接 TDengine 服务端的密码,默认值为 taosdata。 - -- **-o/--output \** : - 结果输出文件的路径,默认值为 ./output.txt。 - -- **-T/--thread \** : - 插入数据的线程数量,默认为 8 。 - -- **-B/--interlace-rows \** : - 启用交错插入模式并同时指定向每个子表每次插入的数据行数。交错插入模式是指依次向每张子表插入由本参数所指定的行数并重复这个过程,直到所有子表的数据都插入完成。默认值为 0, 即向一张子表完成数据插入后才会向下一张子表进行数据插入。 - -- **-i/--insert-interval \** : - 指定交错插入模式的插入间隔,单位为 ms,默认值为 0。 只有当 `-B/--interlace-rows` 大于 0 时才起作用。意味着数据插入线程在为每个子表插入隔行扫描记录后,会等待该值指定的时间间隔后再进行下一轮写入。 - -- **-r/--rec-per-req \** : - 每次向 TDengine 请求写入的数据行数,默认值为 30000 。 - -- **-t/--tables \** : - 指定子表的数量,默认为 10000 。 - -- **-S/--timestampstep \** : - 每个子表中插入数据的时间戳步长,单位是 ms,默认值是 1。 - -- **-n/--records \** : - 每个子表插入的记录数,默认值为 10000 。 - -- **-d/--database \** : - 所使用的数据库的名称,默认值为 test 。 - -- **-b/--data-type \** : - 超级表的数据列的类型。如果不使用则默认为有三个数据列,其类型分别为 FLOAT, INT, FLOAT 。 - -- **-l/--columns \** : - 超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT, 例如: `-l 5 -b float,double`, 那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如: `-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` 。 - -- **-L/--partial-col-num \ **: - 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据。 - -- **-A/--tag-type \** : - 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如: +| 命令行 | 功能 | +| ---------------------------- | ----------------------------------------------- | +| -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | +| -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | +| -h/--host \ | 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost | +| -P/--port \ | 要连接的 TDengine 服务器的端口号,默认值为 6030 | +| -I/--interface \ | 插入模式,可选项有 taosc, rest, stmt, sml, sml-rest, 分别对应普通写入、restful 接口写入、参数绑定接口写入、schemaless 接口写入、restful schemaless 接口写入 (由 taosAdapter 提供)。默认值为 taosc | +| -u/--user \ | 用于连接 TDengine 服务端的用户名,默认为 root | +| -U/--supplement-insert | 写入数据而不提前建数据库和表,默认关闭 | +| -p/--password \ | 用于连接 TDengine 服务端的密码,默认值为 taosdata | +| -o/--output \ | 结果输出文件的路径,默认值为 ./output.txt | +| -T/--thread \ | 插入数据的线程数量,默认为 8 | +| -B/--interlace-rows \ |启用交错插入模式并同时指定向每个子表每次插入的数据行数。交错插入模式是指依次向每张子表插入由本参数所指定的行数并重复这个过程,直到所有子表的数据都插入完成。默认值为 0, 即向一张子表完成数据插入后才会向下一张子表进行数据插入 | +| -i/--insert-interval \ | 指定交错插入模式的插入间隔,单位为 ms,默认值为 0。 只有当 `-B/--interlace-rows` 大于 0 时才起作用 |意味着数据插入线程在为每个子表插入隔行扫描记录后,会等待该值指定的时间间隔后再进行下一轮写入 | +| -r/--rec-per-req \ | 每次向 TDengine 请求写入的数据行数,默认值为 30000 | +| -t/--tables \ | 指定子表的数量,默认为 10000 | +| -S/--timestampstep \ | 每个子表中插入数据的时间戳步长,单位是 ms,默认值是 1 | +| -n/--records \ | 每个子表插入的记录数,默认值为 10000 | +| -d/--database \ | 所使用的数据库的名称,默认值为 test | +| -b/--data-type \ | 超级表的数据列的类型。如果不使用则默认为有三个数据列,其类型分别为 FLOAT, INT, FLOAT | +| -l/--columns \ | 超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT, 例如: `-l 5 -b float,double`, 那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如: `-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` | +| -L/--partial-col-num \ | 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据 | +| -A/--tag-type \ | 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如: ``` taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16) ``` -如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16)。 +如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16) 注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为: ``` taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\) ``` +| +| -w/--binwidth \ | nchar 和 binary 类型的默认长度,默认值为 64 | +| -m/--table-prefix \ | 子表名称的前缀,默认值为 "d" | +| -E/--escape-character | 开关参数,指定在超级表和子表名称中是否使用转义字符。默认值为不使用 | +| -C/--chinese | 开关参数,指定 nchar 和 binary 是否使用 Unicode 中文字符。默认值为不使用 | +| -N/--normal-table | 开关参数,指定只创建普通表,不创建超级表。默认值为 false。仅当插入模式为 taosc, stmt, rest 模式下可以使用 | +| -M/--random | 开关参数,插入数据为生成的随机值。默认值为 false。若配置此参数,则随机生成要插入的数据。对于数值类型的 标签列/数据列,其值为该类型取值范围内的随机值。对于 NCHAR 和 BINARY 类型的 标签列/数据列,其值为指定长度范围内的随机字符串 | +| -x/--aggr-func | 开关参数,指示插入后查询聚合函数。默认值为 false | +| -y/--answer-yes | 开关参数,要求用户在提示后确认才能继续 |默认值为 false 。 +| -O/--disorder \ | 指定乱序数据的百分比概率,其值域为 [0,50]。默认为 0,即没有乱序数据 | +| -R/--disorder-range \ | 指定乱序数据的时间戳回退范围。所生成的乱序时间戳为非乱序情况下应该使用的时间戳减去这个范围内的一个随机值。仅在 `-O/--disorder` 指定的乱序数据百分比大于 0 时有效| +| -F/--prepare_rand \ | 生成的随机数据中唯一值的数量。若为 1 则表示所有数据都相同。默认值为 10000 | +| -a/--replica \ | 创建数据库时指定其副本数,默认值为 1 | +| -k/--keep-trying \ | 失败后进行重试的次数,默认不重试。需使用 v3.0.9 以上版本| +| -z/--trying-interval \ | 失败重试间隔时间,单位为毫秒,仅在 -k 指定重试后有效。需使用 v3.0.9 以上版本 | +| -v/--vgroups \ | 创建数据库时指定 vgroups 数,仅对 TDengine v3.0+ 有效| +| -V/--version | 显示版本信息并退出。不能与其它参数混用| +| -?/--help | 显示帮助信息并退出。不能与其它参数混用| -- **-w/--binwidth \**: - nchar 和 binary 类型的默认长度,默认值为 64。 - -- **-m/--table-prefix \** : - 子表名称的前缀,默认值为 "d"。 - -- **-E/--escape-character** : - 开关参数,指定在超级表和子表名称中是否使用转义字符。默认值为不使用。 - -- **-C/--chinese** : - 开关参数,指定 nchar 和 binary 是否使用 Unicode 中文字符。默认值为不使用。 - -- **-N/--normal-table** : - 开关参数,指定只创建普通表,不创建超级表。默认值为 false。仅当插入模式为 taosc, stmt, rest 模式下可以使用。 - -- **-M/--random** : - 开关参数,插入数据为生成的随机值。默认值为 false。若配置此参数,则随机生成要插入的数据。对于数值类型的 标签列/数据列,其值为该类型取值范围内的随机值。对于 NCHAR 和 BINARY 类型的 标签列/数据列,其值为指定长度范围内的随机字符串。 - -- **-x/--aggr-func** : - 开关参数,指示插入后查询聚合函数。默认值为 false。 - -- **-y/--answer-yes** : - 开关参数,要求用户在提示后确认才能继续。默认值为 false 。 - -- **-O/--disorder \** : - 指定乱序数据的百分比概率,其值域为 [0,50]。默认为 0,即没有乱序数据。 - -- **-R/--disorder-range \** : - 指定乱序数据的时间戳回退范围。所生成的乱序时间戳为非乱序情况下应该使用的时间戳减去这个范围内的一个随机值。仅在 `-O/--disorder` 指定的乱序数据百分比大于 0 时有效。 - -- **-F/--prepare_rand \** : - 生成的随机数据中唯一值的数量。若为 1 则表示所有数据都相同。默认值为 10000 。 - -- **-a/--replica \** : - 创建数据库时指定其副本数,默认值为 1 。 - -- ** -k/--keep-trying \** : 失败后进行重试的次数,默认不重试。需使用 v3.0.9 以上版本。 - -- ** -z/--trying-interval \** : 失败重试间隔时间,单位为毫秒,仅在 -k 指定重试后有效。需使用 v3.0.9 以上版本。 - -- **-v/--vgroups \** : - 创建数据库时指定 vgroups 数,仅对 TDengine v3.0+ 有效。 - -- **-V/--version** : - 显示版本信息并退出。不能与其它参数混用。 - -- **-?/--help** : - 显示帮助信息并退出。不能与其它参数混用。 ## 配置文件参数详解 @@ -331,21 +263,6 @@ taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\) - **repeat_ts_max** : 数值类型,复合主键开启情况下指定生成相同时间戳记录的最大个数 - **sqls** : 字符串数组类型,指定超级表创建成功后要执行的 sql 数组,sql 中指定表名前面要带数据库名,否则会报未指定数据库错误 -#### tsma配置参数 - -指定tsma的配置参数在 `super_tables` 中的 `tsmas` 中,具体参数如下。 - -- **name** : 指定 tsma 的名字,必选项。 - -- **function** : 指定 tsma 的函数,必选项。 - -- **interval** : 指定 tsma 的时间间隔,必选项。 - -- **sliding** : 指定 tsma 的窗口时间位移,必选项。 - -- **custom** : 指定 tsma 的创建语句结尾追加的自定义配置,可选项。 - -- **start_when_inserted** : 指定当插入多少行时创建 tsma,可选项,默认为 0。 #### 标签列与数据列配置参数 From f0595ffe0efbfd19e6caed70ca2a94124a49e764 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:28:12 +0800 Subject: [PATCH 02/47] docs: adjust format 1 --- .../zh/14-reference/02-tools/10-taosbenchmark.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 73b44b22ed..74324db5cd 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -10,7 +10,7 @@ taosBenchmark 是 TDengine 产品性能基准测试工具,提供对 TDengine taosBenchmark 提供两种安装方式: -- taosBenchmark 是 TDengine 安装包中默认安装组件,TDengine 安装包可参考[ TDengine 安装](../../../get-started/)。 +- taosBenchmark 是 TDengine 安装包中默认安装组件, 安装 TDengine 安装包后即可使用,安装 TDengine 可参考[TDengine 安装](../../../get-started/)。 - 单独编译 taos-tools 并安装, 参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 @@ -89,11 +89,11 @@ taosBenchmark -f -查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) +查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命令行 | 功能 | -| ---------------------------- | ----------------------------------------------- | +| 命令行 | 功能 | +| -------------------------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | | -h/--host \ | 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost | @@ -116,16 +116,16 @@ taosBenchmark -f | -L/--partial-col-num \ | 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据 | | -A/--tag-type \ | 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如: -``` +
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16) -``` +
如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16) 注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为: -``` +
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\) -``` +
| | -w/--binwidth \ | nchar 和 binary 类型的默认长度,默认值为 64 | | -m/--table-prefix \ | 子表名称的前缀,默认值为 "d" | From 2ccb5d1592905af536a2999a3535aa114c4fed7d Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:31:02 +0800 Subject: [PATCH 03/47] docs: adjust format 2 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 74324db5cd..cdfce887a5 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -114,19 +114,7 @@ taosBenchmark -f | -b/--data-type \ | 超级表的数据列的类型。如果不使用则默认为有三个数据列,其类型分别为 FLOAT, INT, FLOAT | | -l/--columns \ | 超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT, 例如: `-l 5 -b float,double`, 那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如: `-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` | | -L/--partial-col-num \ | 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据 | -| -A/--tag-type \ | 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如: - -
-taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16) -
- -如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16) -注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为: - -
-taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\) -
-| +| -A/--tag-type \ | 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如:
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16)
如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16) 注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为:
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\)
| | -w/--binwidth \ | nchar 和 binary 类型的默认长度,默认值为 64 | | -m/--table-prefix \ | 子表名称的前缀,默认值为 "d" | | -E/--escape-character | 开关参数,指定在超级表和子表名称中是否使用转义字符。默认值为不使用 | From bd99e08e86042618afdab16b3e9660ab6dc9a76d Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:34:40 +0800 Subject: [PATCH 04/47] docs: adjust format 2 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index cdfce887a5..4b7221069d 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -94,7 +94,7 @@ taosBenchmark -f ## 命令行参数详解 | 命令行 | 功能 | | -------------------------------------------- | ----------------------------------------------- | -| -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | +| -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | | -h/--host \ | 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost | | -P/--port \ | 要连接的 TDengine 服务器的端口号,默认值为 6030 | @@ -114,7 +114,7 @@ taosBenchmark -f | -b/--data-type \ | 超级表的数据列的类型。如果不使用则默认为有三个数据列,其类型分别为 FLOAT, INT, FLOAT | | -l/--columns \ | 超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT, 例如: `-l 5 -b float,double`, 那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如: `-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` | | -L/--partial-col-num \ | 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据 | -| -A/--tag-type \ | 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如:
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16)
如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16) 注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为:
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\)
| +| -A/--tag-type \ | 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如:
```json taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16)
``` 如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16) 注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为:
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\)
| | -w/--binwidth \ | nchar 和 binary 类型的默认长度,默认值为 64 | | -m/--table-prefix \ | 子表名称的前缀,默认值为 "d" | | -E/--escape-character | 开关参数,指定在超级表和子表名称中是否使用转义字符。默认值为不使用 | From 8b536c384142ae81095f52b0cbc369f33a47e8e9 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:41:10 +0800 Subject: [PATCH 05/47] docs: adjust format 2 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 4b7221069d..92f63be6db 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,9 +92,9 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命令行 | 功能 | +|
命令行
| 功能 | | -------------------------------------------- | ----------------------------------------------- | -| -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | +| -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | | -h/--host \ | 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost | | -P/--port \ | 要连接的 TDengine 服务器的端口号,默认值为 6030 | From 964b871551f7caa779ebe863e6b15cc84f43b600 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:44:20 +0800 Subject: [PATCH 06/47] docs: taosBenchmark adjust format --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 92f63be6db..fd893847b3 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -|
命令行
| 功能 | +|
命令  A行
| 功能 | | -------------------------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | From 97730700a6a8ba4b67fad66f31c0d3359e254c81 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:45:52 +0800 Subject: [PATCH 07/47] docs: taosBenchmark adjust format1 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index fd893847b3..84cf3015b0 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -|
命令  A行
| 功能 | +| 命令行              | 功能 | | -------------------------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | From 1cd22924a5d64cc36f4c44f00c3d12990012b855 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:49:26 +0800 Subject: [PATCH 08/47] docs: taosBenchmark adjust format2 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 84cf3015b0..581492ea3e 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命令行              | 功能 | +| 命令行           A | 功能 | | -------------------------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | From 8f03bcc8c03b234d92e8e7fc5e2ffbda45484f33 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:50:34 +0800 Subject: [PATCH 09/47] docs: taosBenchmark adjust format2 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 581492ea3e..368eeaf829 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命令行           A | 功能 | +| 命令行           A      B      C | 功能 | | -------------------------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | From 503dc28b18b45fa1fdc8b6fb0cbb59f1fd0b80c1 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:53:19 +0800 Subject: [PATCH 10/47] docs: taosBenchmark adjust format3 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 368eeaf829..157600b2e6 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命令行           A      B      C | 功能 | +| 命 令 行 | 功能 | | -------------------------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | From cf4106eed43bcc9965bfd9d9c2964a422512cf38 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:54:41 +0800 Subject: [PATCH 11/47] docs: taosBenchmark adjust format3 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 157600b2e6..f73753fecf 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命 令 行 | 功能 | +| 命令行 | 功能 | | -------------------------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | From ae3f0d2d695f777a240ed2298300e1e0897d0ae1 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 22:57:07 +0800 Subject: [PATCH 12/47] docs: taosBenchmark adjust format3 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index f73753fecf..258011f49a 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,8 +92,8 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命令行 | 功能 | -| -------------------------------------------- | ----------------------------------------------- | +|
命令行
| 功能 | +| ---------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | | -h/--host \ | 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost | From a8f111d97feab81306e24961f38d5c2080718e4f Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 7 Dec 2024 23:13:21 +0800 Subject: [PATCH 13/47] docs: taosBenchmark adjust format3 --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 258011f49a..4bc4607597 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -|
命令行
| 功能 | +| 简写命令行 / 全写命令行 + 命令行参数 | 功能说明 | | ---------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | From 1dfdd62f2a17fe6b278d7ac3581cfe5793b05690 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Mon, 9 Dec 2024 14:40:36 +0800 Subject: [PATCH 14/47] taosBenchmark document update --- .../14-reference/02-tools/10-taosbenchmark.md | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 4bc4607597..41080a71fb 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -4,7 +4,7 @@ sidebar_label: taosBenchmark toc_max_heading_level: 4 --- -taosBenchmark 是 TDengine 产品性能基准测试工具,提供对 TDengine 产品的写入、查询及订阅性能测试,输出性能指标。 +taosBenchmark 是 TDengine 产品性能基准测试工具,提供对 TDengine 产品的插入、查询及订阅性能测试,输出性能指标。 ## 安装 @@ -38,7 +38,7 @@ taosBenchmark ### 使用命令行参数运行 -命令行支持的参数为写入功能中使用较为频繁的参数,查询与订阅功能不支持命令行方式 +命令行支持的参数为插入功能中使用较为频繁的参数,查询与订阅功能不支持命令行方式 示例: ```bash taosBenchmark -d db -t 100 -n 1000 -T 4 -I stmt -y @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 简写命令行 / 全写命令行 + 命令行参数 | 功能说明 | +| 命令行 | 功能说明 | | ---------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | @@ -134,13 +134,26 @@ taosBenchmark -f | -?/--help | 显示帮助信息并退出。不能与其它参数混用| +## 输出性能指标 + +#### 写入指标 + Spent : 耗费的总时间,是开始写入第一个数据开始算起于写入最后一条数据写入结束为至花费的时间, + Output : 写入速度,写入的数据总量 / Spent + Output(Real): 引擎实际写入速度 + +#### 查询指标 + +#### 订阅指标 + + + ## 配置文件参数详解 ### 通用配置参数 本节所列参数适用于所有功能模式。 -- **filetype** : 要测试的功能,可选值为 `insert`, `query` 和 `subscribe`。分别对应插入、查询和订阅功能。每个配置文件中只能指定其中之一。 +- **filetype** : 功能分类,可选值为 `insert`, `query` 和 `subscribe`。分别对应插入、查询和订阅功能。每个配置文件中只能指定其中之一。 - **cfgdir** : TDengine 客户端配置文件所在的目录,默认路径是 /etc/taos 。 - **host** : 指定要连接的 TDengine 服务端的 FQDN,默认值为 localhost。 From f8111bbf2d39d0a46d5f19da516965fe529ae340 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:56:28 +0000 Subject: [PATCH 15/47] build(deps): bump golang.org/x/crypto in /tools/keeper Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.31.0. - [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.31.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tools/keeper/go.mod | 6 +++--- tools/keeper/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tools/keeper/go.mod b/tools/keeper/go.mod index f8edf2709b..00a399768d 100644 --- a/tools/keeper/go.mod +++ b/tools/keeper/go.mod @@ -70,10 +70,10 @@ require ( github.com/ugorji/go/codec v1.2.12 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/arch v0.7.0 // indirect - golang.org/x/crypto v0.21.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/tools/keeper/go.sum b/tools/keeper/go.sum index 8f6e9bd13a..f879c731ba 100644 --- a/tools/keeper/go.sum +++ b/tools/keeper/go.sum @@ -424,8 +424,8 @@ golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -573,8 +573,8 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -583,8 +583,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 3830603b8e73c57a782c65de3da2a02758b71d17 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 15 Dec 2024 12:24:54 +0800 Subject: [PATCH 16/47] submit taosbenchmark doc --- .../14-reference/02-tools/10-taosbenchmark.md | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 41080a71fb..883ee4689b 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -137,15 +137,51 @@ taosBenchmark -f ## 输出性能指标 #### 写入指标 - Spent : 耗费的总时间,是开始写入第一个数据开始算起于写入最后一条数据写入结束为至花费的时间, - Output : 写入速度,写入的数据总量 / Spent - Output(Real): 引擎实际写入速度 + +写入完成后,会在最后两行输出总结性的性能指标,输出格式如下: +``` bash +SUCC: Spent 8.527298 (real 8.117379) seconds to insert rows: 10000000 with 8 thread(s) into test 1172704.41 (real 1231924.74) records/second +SUCC: insert delay, min: 19.6780ms, avg: 64.9390ms, p90: 94.6900ms, p95: 105.1870ms, p99: 130.6660ms, max: 157.0830ms +``` +第一行写入速度统计: + - Spent: 写入总耗时,单位秒,从开始写入第一个数据开始计时到最后一条数据结束,这里表示共花了 8.527298 秒 + - real : 写入总耗时(调用引擎),此耗时已抛去测试框架准备数据时间,纯统计在引擎调用上花费的时间,花费为 8.117379 秒,8.527298 - 8.117379 = 0.409919 秒则为测试框架准备数据消耗时间 + - rows : 写入总行数,为 1000 万条数据 + - threads: 写入线程数,这里是 8 个线程同时写入 + - records/second 写入速度 = `写入总耗时`/ `写入总行数` , 括号中 real 同前,表示纯引擎写入速度 +第二行单个写入延时统计: + - min : 写入最小延时 + - avg : 写入平时延时 + - p90 : 写入延时 p90 百分位上的延时数 + - p95 : 写入延时 p95 百分位上的延时数 + - p99 : 写入延时 p99 百分位上的延时数 + - max : 写入最大延时 +通过此系列指标,可观察到写入请求延时分布情况 #### 查询指标 - +查询性能测试主要输出查询请求速度 QPS 指标, 输出格式如下: +``` bash +complete query with 3 threads and 10000 query delay avg: 0.002686s min: 0.001182s max: 0.012189s p90: 0.002977s p95: 0.003493s p99: 0.004645s SQL command: select ... +INFO: Total specified queries: 30000 +INFO: Spend 26.9530 second completed total queries: 30000, the QPS of all threads: 1113.049 +``` +第一行表示 3 个线程每个线程执行 10000 次查询,后面是查询请求延时百分位分布情况,单位为秒,SQL command 表示执行的是哪个查询语句 +第二行表示总共完成了 10000 * 3 = 30000 次查询总数 +第三行表示查询总耗时为 26.9653 秒,每秒查询率(QPS)为:1113.049 次/秒 #### 订阅指标 - - +订阅性能测试主要输出消费者消费速度指标,输出格式如下: +``` bash +INFO: consumer id 0 has poll total msgs: 376, period rate: 37.592 msgs/s, total rows: 3760000, period rate: 375924.815 rows/s +INFO: consumer id 1 has poll total msgs: 362, period rate: 36.131 msgs/s, total rows: 3620000, period rate: 361313.504 rows/s +INFO: consumer id 2 has poll total msgs: 364, period rate: 36.378 msgs/s, total rows: 3640000, period rate: 363781.731 rows/s +INFO: consumerId: 0, consume msgs: 1000, consume rows: 10000000 +INFO: consumerId: 1, consume msgs: 1000, consume rows: 10000000 +INFO: consumerId: 2, consume msgs: 1000, consume rows: 10000000 +INFO: Consumed total msgs: 3000, total rows: 30000000 +``` +1 ~ 3 行实时输出每个消费者当前的消费速度,msgs/s 表示消费消息个数,每个消息中包含多行数据,rows/s 表示按行数统计的消费速度 +4 ~ 6 行是测试完成后每个消费者总体统计,统计共消费了多少条消息,共计多少行 +第 7 行所有消费者总体统计,msgs 表示共消费了多少条消息, rows 表示共消费了多少行数据 ## 配置文件参数详解 From f62b0ce25a08556b6ac00a9e677bcc2275094f83 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 15 Dec 2024 16:29:22 +0800 Subject: [PATCH 17/47] fix: add taosbenchmark english documents --- docs/en/14-reference/02-tools/09-taosdump.md | 23 +++--- .../14-reference/02-tools/10-taosbenchmark.md | 80 ++++++++++++++++--- docs/zh/14-reference/02-tools/09-taosdump.md | 27 +++---- .../14-reference/02-tools/10-taosbenchmark.md | 19 +++-- 4 files changed, 100 insertions(+), 49 deletions(-) diff --git a/docs/en/14-reference/02-tools/09-taosdump.md b/docs/en/14-reference/02-tools/09-taosdump.md index d336f66c02..83c59276b2 100644 --- a/docs/en/14-reference/02-tools/09-taosdump.md +++ b/docs/en/14-reference/02-tools/09-taosdump.md @@ -4,22 +4,17 @@ sidebar_label: taosdump slug: /tdengine-reference/tools/taosdump --- -taosdump is a tool application that supports backing up data from a running TDengine cluster and restoring the backed-up data to the same or another running TDengine cluster. - -taosdump can back up data using databases, supertables, or basic tables as logical data units, and can also back up data records within a specified time period from databases, supertables, and basic tables. You can specify the directory path for data backup; if not specified, taosdump defaults to backing up data to the current directory. - -If the specified location already has data files, taosdump will prompt the user and exit immediately to avoid data being overwritten. This means the same path can only be used for one backup. -If you see related prompts, please operate carefully. - -taosdump is a logical backup tool, it should not be used to back up any raw data, environment settings, hardware information, server configuration, or cluster topology. taosdump uses [Apache AVRO](https://avro.apache.org/) as the data file format to store backup data. +`taosdump` is a TDengine data backup/recovery tool provided for open source users, and the backed up data files adopt the standard [Apache AVRO](https://avro.apache.org/) + Format, convenient for exchanging data with the external ecosystem. + Taosdump provides multiple data backup and recovery options to meet different data needs, and all supported options can be viewed through -- help. ## Installation -There are two ways to install taosdump: +Taosdump provides two installation methods: -- Install the official taosTools package, please find taosTools on the [release history page](../../../release-history/taostools/) and download it for installation. +-Taosdump is the default installation component in the TDengine installation package, which can be used after installing TDengine. For how to install TDengine, please refer to [TDengine Installation](../../../get started/) -- Compile taos-tools separately and install, please refer to the [taos-tools](https://github.com/taosdata/taos-tools) repository for details. +-Compile and install taos tools separately, refer to [taos tools](https://github.com/taosdata/taos-tools) . ## Common Use Cases @@ -30,6 +25,9 @@ There are two ways to install taosdump: 3. Backup certain supertables or basic tables in a specified database: use the `dbname stbname1 stbname2 tbname1 tbname2 ...` parameter, note that this input sequence starts with the database name, supports only one database, and the second and subsequent parameters are the names of the supertables or basic tables in that database, separated by spaces; 4. Backup the system log database: TDengine clusters usually include a system database named `log`, which contains data for TDengine's own operation, taosdump does not back up the log database by default. If there is a specific need to back up the log database, you can use the `-a` or `--allow-sys` command line parameter. 5. "Tolerant" mode backup: Versions after taosdump 1.4.1 provide the `-n` and `-L` parameters, used for backing up data without using escape characters and in "tolerant" mode, which can reduce backup data time and space occupied when table names, column names, and label names do not use escape characters. If unsure whether to use `-n` and `-L`, use the default parameters for "strict" mode backup. For an explanation of escape characters, please refer to the [official documentation](../../sql-manual/escape-characters/). +6. If a backup file already exists in the directory specified by the `-o` parameter, to prevent data from being overwritten, taosdump will report an error and exit. Please replace it with another empty directory or clear the original data before backing up. +7. Currently, taosdump does not support data breakpoint backup function. Once the data backup is interrupted, it needs to be started from scratch. + If the backup takes a long time, it is recommended to use the (-S -E options) method to specify the start/end time for segmented backup. :::tip @@ -42,7 +40,8 @@ There are two ways to install taosdump: ### taosdump Restore Data -Restore data files from a specified path: use the `-i` parameter along with the data file path. As mentioned earlier, the same directory should not be used to back up different data sets, nor should the same path be used to back up the same data set multiple times, otherwise, the backup data will cause overwriting or multiple backups. +- Restore data files from a specified path: use the `-i` parameter along with the data file path. As mentioned earlier, the same directory should not be used to back up different data sets, nor should the same path be used to back up the same data set multiple times, otherwise, the backup data will cause overwriting or multiple backups. +- taosdump supports data recovery to a new database name with the parameter `-W`, please refer to the command line parameter description for details. :::tip taosdump internally uses the TDengine stmt binding API to write restored data, currently using 16384 as a batch for writing. If there are many columns in the backup data, it may cause a "WAL size exceeds limit" error, in which case you can try adjusting the `-B` parameter to a smaller value. diff --git a/docs/en/14-reference/02-tools/10-taosbenchmark.md b/docs/en/14-reference/02-tools/10-taosbenchmark.md index c41cff49e1..796478bf1a 100644 --- a/docs/en/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/en/14-reference/02-tools/10-taosbenchmark.md @@ -4,35 +4,36 @@ sidebar_label: taosBenchmark slug: /tdengine-reference/tools/taosbenchmark --- -taosBenchmark (formerly known as taosdemo) is a tool for testing the performance of the TDengine product. taosBenchmark can test the performance of TDengine's insert, query, and subscription functions. It can simulate massive data generated by a large number of devices and flexibly control the number of databases, supertables, types and number of tag columns, types and number of data columns, number of subtables, data volume per subtable, data insertion interval, number of working threads in taosBenchmark, whether and how to insert out-of-order data, etc. To accommodate the usage habits of past users, the installation package provides taosdemo as a soft link to taosBenchmark. +TaosBenchmark is a performance benchmarking tool for TDengine products, providing insertion, query, and subscription performance testing for TDengine products, and outputting performance indicators. ## Installation -There are two ways to install taosBenchmark: +taosBenchmark provides two installation methods: -- taosBenchmark is automatically installed with the official TDengine installation package, for details please refer to [TDengine Installation](../../../get-started/). +- taosBenchmark is the default installation component in the TDengine installation package, which can be used after installing TDengine. For how to install TDengine, please refer to [TDengine Installation](../../../get started/) -- Compile and install taos-tools separately, for details please refer to the [taos-tools](https://github.com/taosdata/taos-tools) repository. +- Compile and install taos tools separately, refer to [taos tools](https://github.com/taosdata/taos-tools) . ## Operation ### Configuration and Operation Methods -taosBenchmark needs to be executed in the operating system's terminal, and this tool supports two configuration methods: Command Line Arguments and JSON Configuration File. These two methods are mutually exclusive; when using a configuration file, only one command line argument `-f ` can be used to specify the configuration file. When using command line arguments to run taosBenchmark and control its behavior, the `-f` parameter cannot be used; instead, other parameters must be used for configuration. In addition, taosBenchmark also offers a special mode of operation, which is running without any parameters. - -taosBenchmark supports comprehensive performance testing for TDengine, and the TDengine features it supports are divided into three categories: writing, querying, and subscribing. These three functions are mutually exclusive, and each run of taosBenchmark can only select one of them. It is important to note that the type of function to be tested is not configurable when using the command line configuration method; the command line configuration method can only test writing performance. To test TDengine's query and subscription performance, you must use the configuration file method and specify the type of function to be tested through the `filetype` parameter in the configuration file. +taosBbenchmark supports three operating modes: +- No parameter mode +- Command line mode +- JSON configuration file mode +The command-line approach is a subset of the functionality of JSON configuration files, which immediately uses the command line and then the configuration file, with the parameters specified by the command line taking precedence. **Ensure that the TDengine cluster is running correctly before running taosBenchmark.** ### Running Without Command Line Arguments -Execute the following command to quickly experience taosBenchmark performing a write performance test on TDengine based on the default configuration. - ```bash taosBenchmark ``` -When running without parameters, taosBenchmark by default connects to the TDengine cluster specified under `/etc/taos`, and creates a database named `test` in TDengine, under which a supertable named `meters` is created, and 10,000 tables are created under the supertable, each table having 10,000 records inserted. Note that if a `test` database already exists, this command will delete the existing database and create a new `test` database. +When running without parameters, taosBenchmark defaults to connecting to the TDengine cluster specified in `/etc/taos/taos.cfg `. +After successful connection, a smart meter example database test, super meters, and 10000 sub meters will be created, with 10000 records per sub meter. If the test database already exists, it will be deleted before creating a new one. ### Running Using Command Line Configuration Parameters @@ -46,9 +47,7 @@ The above command `taosBenchmark` will create a database named `test`, establish ### Running Using a Configuration File -The taosBenchmark installation package includes examples of configuration files, located in `/examples/taosbenchmark-json` - -Use the following command line to run taosBenchmark and control its behavior through a configuration file. +Running in configuration file mode provides all functions, so parameters can be configured to run in the configuration file. ```bash taosBenchmark -f @@ -214,6 +213,61 @@ taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\) - **-?/--help**: Displays help information and exits. Cannot be used with other parameters. + +## Output performance indicators + +#### Write indicators + +After writing is completed, a summary performance metric will be output in the last two lines in the following format: +``` bash +SUCC: Spent 8.527298 (real 8.117379) seconds to insert rows: 10000000 with 8 thread(s) into test 1172704.41 (real 1231924.74) records/second +SUCC: insert delay, min: 19.6780ms, avg: 64.9390ms, p90: 94.6900ms, p95: 105.1870ms, p99: 130.6660ms, max: 157.0830ms +``` +First line write speed statistics: +- Spent: Total write time, in seconds, counting from the start of writing the first data to the end of the last data. This indicates that a total of 8.527298 seconds were spent +- Real: Total write time (calling the engine), excluding the time spent preparing data for the testing framework. Purely counting the time spent on engine calls, The time spent is 8.117379 seconds. If 8.527298-8.117379=0.409919 seconds, it is the time spent preparing data for the testing framework +- Rows: Write the total number of rows, which is 10 million pieces of data +- Threads: The number of threads being written, which is 8 threads writing simultaneously +- Records/second write speed = `total write time` / `total number of rows written`, real in parentheses is the same as before, indicating pure engine write speed + +Second line single write delay statistics: +- min: Write minimum delay +- avg: Write normal delay +- p90: Write delay p90 percentile delay number +- p95: Write delay p95 percentile delay number +- p99: Write delay p99 percentile delay number +- max: maximum write delay +Through this series of indicators, the distribution of write request latency can be observed + +#### Query indicators +The query performance test mainly outputs the QPS indicator of query request speed, and the output format is as follows: + +``` bash +complete query with 3 threads and 10000 query delay avg: 0.002686s min: 0.001182s max: 0.012189s p90: 0.002977s p95: 0.003493s p99: 0.004645s SQL command: select ... +INFO: Total specified queries: 30000 +INFO: Spend 26.9530 second completed total queries: 30000, the QPS of all threads: 1113.049 +``` + +- The first line represents the percentile distribution of query execution and query request delay for each of the three threads executing 10000 queries. The SQL command is the test query statement +- The second line indicates that a total of 10000 * 3 = 30000 queries have been completed +- The third line indicates that the total query time is 26.9653 seconds, and the query rate per second (QPS) is 1113.049 times/second + +#### Subscription metrics + +The subscription performance test mainly outputs consumer consumption speed indicators, with the following output format: +``` bash +INFO: consumer id 0 has poll total msgs: 376, period rate: 37.592 msgs/s, total rows: 3760000, period rate: 375924.815 rows/s +INFO: consumer id 1 has poll total msgs: 362, period rate: 36.131 msgs/s, total rows: 3620000, period rate: 361313.504 rows/s +INFO: consumer id 2 has poll total msgs: 364, period rate: 36.378 msgs/s, total rows: 3640000, period rate: 363781.731 rows/s +INFO: consumerId: 0, consume msgs: 1000, consume rows: 10000000 +INFO: consumerId: 1, consume msgs: 1000, consume rows: 10000000 +INFO: consumerId: 2, consume msgs: 1000, consume rows: 10000000 +INFO: Consumed total msgs: 3000, total rows: 30000000 +``` +- Lines 1 to 3 real-time output of the current consumption speed of each consumer, msgs/s represents the number of consumption messages, each message contains multiple rows of data, and rows/s represents the consumption speed calculated by rows +- Lines 4 to 6 show the overall statistics of each consumer after the test is completed, including the total number of messages consumed and the total number of lines +- The overall statistics of all consumers in line 7, `msgs` represents how many messages were consumed in total, `rows` represents how many rows of data were consumed in total + ## Configuration File Parameters Detailed Explanation ### General Configuration Parameters diff --git a/docs/zh/14-reference/02-tools/09-taosdump.md b/docs/zh/14-reference/02-tools/09-taosdump.md index 7afe8721ee..22819ad8cd 100644 --- a/docs/zh/14-reference/02-tools/09-taosdump.md +++ b/docs/zh/14-reference/02-tools/09-taosdump.md @@ -4,26 +4,17 @@ sidebar_label: taosdump toc_max_heading_level: 4 --- -taosdump 是一个支持从运行中的 TDengine 集群备份数据并将备份的数据恢复到相同或另一个运行中的 TDengine 集群中的工具应用程序。 +taosdump 是为开源用户提供的 TDengine 数据备份/恢复工具,备份的数据文件采用标准 [ Apache AVRO ](https://avro.apache.org/) 格式,方便与外界生态交换数据。taosdump 提供多种数据备份及恢复选项来满足不同的数据需求,可通过 --help 查看支持的全部选项。 -taosdump 可以用数据库、超级表或普通表作为逻辑数据单元进行备份,也可以对数据库、超级 -表和普通表中指定时间段内的数据记录进行备份。使用时可以指定数据备份的目录路径,如果 -不指定位置,taosdump 默认会将数据备份到当前目录。 - -如果指定的位置已经有数据文件,taosdump 会提示用户并立即退出,避免数据被覆盖。这意味着同一路径只能被用于一次备份。 -如果看到相关提示,请小心操作。 - -taosdump 是一个逻辑备份工具,它不应被用于备份任何原始数据、环境设置、 -硬件信息、服务端配置或集群的拓扑结构。taosdump 使用 -[ Apache AVRO ](https://avro.apache.org/)作为数据文件格式来存储备份数据。 ## 安装 -taosdump 有两种安装方式: +taosdump 提供两种安装方式: -- 安装 taosTools 官方安装包, 请从[发布历史页面](https://docs.taosdata.com/releases/tools/)页面找到 taosTools 并下载安装。 +- taosdump 是 TDengine 安装包中默认安装组件,安装 TDengine 后即可使用,如何安装 TDengine 可参考[TDengine 安装](../../../get-started/)。 + +- 单独编译 taos-tools 并安装, 参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 -- 单独编译 taos-tools 并安装, 详情请参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 ## 常用使用场景 @@ -31,9 +22,11 @@ taosdump 有两种安装方式: 1. 备份所有数据库:指定 `-A` 或 `--all-databases` 参数; 2. 备份多个指定数据库:使用 `-D db1,db2,...` 参数; -3. 备份指定数据库中的某些超级表或普通表:使用 `dbname stbname1 stbname2 tbname1 tbname2 ...` 参数,注意这种输入序列第一个参数为数据库名称,且只支持一个数据库,第二个和之后的参数为该数据库中的超级表或普通表名称,中间以空格分隔; +3. 备份指定数据库中某些超级表或普通表:使用 `dbname stbname1 stbname2 tbname1 tbname2 ...` 参数,注意这种输入序列第一个参数为数据库名称,且只支持一个数据库,第二个和之后的参数为该数据库中的超级表或普通表名称,中间以空格分隔; 4. 备份系统 log 库:TDengine 集群通常会包含一个系统数据库,名为 `log`,这个数据库内的数据为 TDengine 自我运行的数据,taosdump 默认不会对 log 库进行备份。如果有特定需求对 log 库进行备份,可以使用 `-a` 或 `--allow-sys` 命令行参数。 5. “宽容”模式备份:taosdump 1.4.1 之后的版本提供 `-n` 参数和 `-L` 参数,用于备份数据时不使用转义字符和“宽容”模式,可以在表名、列名、标签名没使用转义字符的情况下减少备份数据时间和备份数据占用空间。如果不确定符合使用 `-n` 和 `-L` 条件时请使用默认参数进行“严格”模式进行备份。转义字符的说明请参考[官方文档](../../taos-sql/escape)。 +6. `-o` 参数指定的目录下如果已存在备份文件,为防止数据被覆盖,taosdump 会报错并退出,请更换其它空目录或清空原来数据后再备份。 +7. 目前 taosdump 不支持数据断点继备功能,一旦数据备份中断,需要从头开始。如果备份需要很长时间,建议使用(-S -E 选项)指定开始/结束时间进行分段备份的方法, :::tip - taosdump 1.4.1 之后的版本提供 `-I` 参数,用于解析 avro 文件 schema 和数据,如果指定 `-s` 参数将只解析 schema。 @@ -45,7 +38,9 @@ taosdump 有两种安装方式: ### taosdump 恢复数据 -恢复指定路径下的数据文件:使用 `-i` 参数加上数据文件所在路径。如前面提及,不应该使用同一个目录备份不同数据集合,也不应该在同一路径多次备份同一数据集,否则备份数据会造成覆盖或多次备份。 +- 恢复指定路径下的数据文件:使用 `-i` 参数加上数据文件所在路径。如前面提及,不应该使用同一个目录备份不同数据集合,也不应该在同一路径多次备份同一数据集,否则备份数据会造成覆盖或多次备份。 +- taosdump 支持数据恢复至新数据库名下,参数是 -W, 详细见命令行参数说明。 + :::tip taosdump 内部使用 TDengine stmt binding API 进行恢复数据的写入,为提高数据恢复性能,目前使用 16384 为一次写入批次。如果备份数据中有比较多列数据,可能会导致产生 "WAL size exceeds limit" 错误,此时可以通过使用 `-B` 参数调整为一个更小的值进行尝试。 diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 883ee4689b..18c954c01e 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -10,7 +10,7 @@ taosBenchmark 是 TDengine 产品性能基准测试工具,提供对 TDengine taosBenchmark 提供两种安装方式: -- taosBenchmark 是 TDengine 安装包中默认安装组件, 安装 TDengine 安装包后即可使用,安装 TDengine 可参考[TDengine 安装](../../../get-started/)。 +- taosBenchmark 是 TDengine 安装包中默认安装组件,安装 TDengine 后即可使用,如何安装 TDengine 可参考[TDengine 安装](../../../get-started/)。 - 单独编译 taos-tools 并安装, 参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 @@ -148,7 +148,7 @@ SUCC: insert delay, min: 19.6780ms, avg: 64.9390ms, p90: 94.6900ms, p95: 105.187 - real : 写入总耗时(调用引擎),此耗时已抛去测试框架准备数据时间,纯统计在引擎调用上花费的时间,花费为 8.117379 秒,8.527298 - 8.117379 = 0.409919 秒则为测试框架准备数据消耗时间 - rows : 写入总行数,为 1000 万条数据 - threads: 写入线程数,这里是 8 个线程同时写入 - - records/second 写入速度 = `写入总耗时`/ `写入总行数` , 括号中 real 同前,表示纯引擎写入速度 + - records/second 写入速度 = `写入总耗时`/ `写入总行数` , 括号中 `real` 同前,表示纯引擎写入速度 第二行单个写入延时统计: - min : 写入最小延时 - avg : 写入平时延时 @@ -159,16 +159,19 @@ SUCC: insert delay, min: 19.6780ms, avg: 64.9390ms, p90: 94.6900ms, p95: 105.187 通过此系列指标,可观察到写入请求延时分布情况 #### 查询指标 + 查询性能测试主要输出查询请求速度 QPS 指标, 输出格式如下: ``` bash complete query with 3 threads and 10000 query delay avg: 0.002686s min: 0.001182s max: 0.012189s p90: 0.002977s p95: 0.003493s p99: 0.004645s SQL command: select ... INFO: Total specified queries: 30000 INFO: Spend 26.9530 second completed total queries: 30000, the QPS of all threads: 1113.049 ``` -第一行表示 3 个线程每个线程执行 10000 次查询,后面是查询请求延时百分位分布情况,单位为秒,SQL command 表示执行的是哪个查询语句 -第二行表示总共完成了 10000 * 3 = 30000 次查询总数 -第三行表示查询总耗时为 26.9653 秒,每秒查询率(QPS)为:1113.049 次/秒 +- 第一行表示 3 个线程每个线程执行 10000 次查询及查询请求延时百分位分布情况,`SQL command` 为测试的查询语句 +- 第二行表示总共完成了 10000 * 3 = 30000 次查询总数 +- 第三行表示查询总耗时为 26.9653 秒,每秒查询率(QPS)为:1113.049 次/秒 + #### 订阅指标 + 订阅性能测试主要输出消费者消费速度指标,输出格式如下: ``` bash INFO: consumer id 0 has poll total msgs: 376, period rate: 37.592 msgs/s, total rows: 3760000, period rate: 375924.815 rows/s @@ -179,9 +182,9 @@ INFO: consumerId: 1, consume msgs: 1000, consume rows: 10000000 INFO: consumerId: 2, consume msgs: 1000, consume rows: 10000000 INFO: Consumed total msgs: 3000, total rows: 30000000 ``` -1 ~ 3 行实时输出每个消费者当前的消费速度,msgs/s 表示消费消息个数,每个消息中包含多行数据,rows/s 表示按行数统计的消费速度 -4 ~ 6 行是测试完成后每个消费者总体统计,统计共消费了多少条消息,共计多少行 -第 7 行所有消费者总体统计,msgs 表示共消费了多少条消息, rows 表示共消费了多少行数据 +- 1 ~ 3 行实时输出每个消费者当前的消费速度,`msgs/s` 表示消费消息个数,每个消息中包含多行数据,`rows/s` 表示按行数统计的消费速度 +- 4 ~ 6 行是测试完成后每个消费者总体统计,统计共消费了多少条消息,共计多少行 +- 第 7 行所有消费者总体统计,`msgs` 表示共消费了多少条消息, `rows` 表示共消费了多少行数据 ## 配置文件参数详解 From 57a0fdcaa497e3ac66b8f32a0ce68eff39228705 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 15 Dec 2024 16:55:14 +0800 Subject: [PATCH 18/47] docs: modif some words --- docs/zh/14-reference/02-tools/09-taosdump.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/09-taosdump.md b/docs/zh/14-reference/02-tools/09-taosdump.md index 22819ad8cd..25f938e914 100644 --- a/docs/zh/14-reference/02-tools/09-taosdump.md +++ b/docs/zh/14-reference/02-tools/09-taosdump.md @@ -4,7 +4,7 @@ sidebar_label: taosdump toc_max_heading_level: 4 --- -taosdump 是为开源用户提供的 TDengine 数据备份/恢复工具,备份的数据文件采用标准 [ Apache AVRO ](https://avro.apache.org/) 格式,方便与外界生态交换数据。taosdump 提供多种数据备份及恢复选项来满足不同的数据需求,可通过 --help 查看支持的全部选项。 +taosdump 是为开源用户提供的 TDengine 数据备份/恢复工具,备份数据文件采用标准 [ Apache AVRO ](https://avro.apache.org/) 格式,方便与外界生态交换数据。taosdump 提供多种数据备份及恢复选项来满足不同需求,可通过 --help 查看支持的全部选项。 ## 安装 From 4d2b7a466fe0bec4f486570b77bff952d1be4802 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 15 Dec 2024 20:47:42 +0800 Subject: [PATCH 19/47] doc: add retry option for taosdump --- docs/en/14-reference/02-tools/09-taosdump.md | 11 +++++++---- docs/zh/14-reference/02-tools/09-taosdump.md | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/en/14-reference/02-tools/09-taosdump.md b/docs/en/14-reference/02-tools/09-taosdump.md index 83c59276b2..54109a8de9 100644 --- a/docs/en/14-reference/02-tools/09-taosdump.md +++ b/docs/en/14-reference/02-tools/09-taosdump.md @@ -104,6 +104,13 @@ Usage: taosdump [OPTION...] dbname [tbname ...] the table name.(Version 2.5.3) -T, --thread-num=THREAD_NUM Number of thread for dump in file. Default is 8. + -W, --rename=RENAME-LIST Rename database name with new name during + importing data. RENAME-LIST: + "db1=newDB1|db2=newDB2" means rename db1 to newDB1 + and rename db2 to newDB2 (Version 2.5.4) + -k, --retry-count=VALUE Set the number of retry attempts for connection or + query failures + -z, --retry-sleep-ms=VALUE retry interval sleep time, unit ms -C, --cloud=CLOUD_DSN specify a DSN to access TDengine cloud service -R, --restful Use RESTful interface to connect TDengine -t, --timeout=SECONDS The timeout seconds for websocket to interact. @@ -111,10 +118,6 @@ Usage: taosdump [OPTION...] dbname [tbname ...] -?, --help Give this help list --usage Give a short usage message -V, --version Print program version - -W, --rename=RENAME-LIST Rename database name with new name during - importing data. RENAME-LIST: - "db1=newDB1|db2=newDB2" means rename db1 to newDB1 - and rename db2 to newDB2 (Version 2.5.4) Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options. diff --git a/docs/zh/14-reference/02-tools/09-taosdump.md b/docs/zh/14-reference/02-tools/09-taosdump.md index 25f938e914..1bbfc0c7ca 100644 --- a/docs/zh/14-reference/02-tools/09-taosdump.md +++ b/docs/zh/14-reference/02-tools/09-taosdump.md @@ -103,6 +103,13 @@ Usage: taosdump [OPTION...] dbname [tbname ...] the table name.(Version 2.5.3) -T, --thread-num=THREAD_NUM Number of thread for dump in file. Default is 8. + -W, --rename=RENAME-LIST Rename database name with new name during + importing data. RENAME-LIST: + "db1=newDB1|db2=newDB2" means rename db1 to newDB1 + and rename db2 to newDB2 (Version 2.5.4) + -k, --retry-count=VALUE Set the number of retry attempts for connection or + query failures + -z, --retry-sleep-ms=VALUE retry interval sleep time, unit ms -C, --cloud=CLOUD_DSN specify a DSN to access TDengine cloud service -R, --restful Use RESTful interface to connect TDengine -t, --timeout=SECONDS The timeout seconds for websocket to interact. @@ -110,10 +117,6 @@ Usage: taosdump [OPTION...] dbname [tbname ...] -?, --help Give this help list --usage Give a short usage message -V, --version Print program version - -W, --rename=RENAME-LIST Rename database name with new name during - importing data. RENAME-LIST: - "db1=newDB1|db2=newDB2" means rename db1 to newDB1 - and rename db2 to newDB2 (Version 2.5.4) Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options. From 705bfdb09ca00782a5efe09a5a4afc456b326adf Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 16 Dec 2024 10:13:07 +0800 Subject: [PATCH 20/47] docs: rename dual.md --- docs/zh/08-operation/{18-dual.md => 18-ha/03-dual.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/zh/08-operation/{18-dual.md => 18-ha/03-dual.md} (100%) diff --git a/docs/zh/08-operation/18-dual.md b/docs/zh/08-operation/18-ha/03-dual.md similarity index 100% rename from docs/zh/08-operation/18-dual.md rename to docs/zh/08-operation/18-ha/03-dual.md From d361221afa3a88f5fd23d32dfadd096443d6248e Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 16 Dec 2024 11:27:55 +0800 Subject: [PATCH 21/47] docs: minor changes --- docs/zh/08-operation/18-ha/03-dual.md | 2 +- docs/zh/08-operation/18-ha/index.md | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 docs/zh/08-operation/18-ha/index.md diff --git a/docs/zh/08-operation/18-ha/03-dual.md b/docs/zh/08-operation/18-ha/03-dual.md index caddb7ab3b..a5abe2609f 100644 --- a/docs/zh/08-operation/18-ha/03-dual.md +++ b/docs/zh/08-operation/18-ha/03-dual.md @@ -1,5 +1,5 @@ --- -title: TDengine 双活系统 +title: 双活系统 sidebar_label: 双活系统 toc_max_heading_level: 4 --- diff --git a/docs/zh/08-operation/18-ha/index.md b/docs/zh/08-operation/18-ha/index.md new file mode 100644 index 0000000000..96c509e878 --- /dev/null +++ b/docs/zh/08-operation/18-ha/index.md @@ -0,0 +1,22 @@ +--- +sidebar_label: HA +title: High availability +--- + +TDengine 作为分布式时序数据库,支持高可用的特性。为适应不同用户场景的需要,TDengine 提供三种方式的高可用方案。 +- 标准三副本方案:高可用性最好,成本也最高 +- 双副本结合 Arbitrator 方案:时序数据的副本数为 2 ,但节点数大于等于 3,可显著降低成本,高可用性较较差 +- 双活方案:可仅部署两个节点,高可用性较好,但有可能丢数据 + +| # | **三副本** | **双副本** | **双活** | +|:--|:----------|:----------|:--------| +| 集群数目 | 部署一个集群 | 部署一个集群 | 部署两个不同集群 | +| 最小节点数 | 三个数据节点 | 两个数据节点,一个仲裁节点 | 两个数据节点 | +| 选主原理 | Raft 协议 | 管理节点仲裁选主 | 无需选主 | +| 同步原理 | Raft 协议 | Raft 协议 | 通过 taosX 进行数据同步 | +| 同步延迟 | 无延迟 | 无延迟 | 依赖 taosX 的同步速度,秒级延迟 | +| 数据安全性 | 无数据丢失 | 无数据丢失 |依赖于 WAL 的保存时长 | +| 数据一致性 | 实时一致性 | 实时一致性 |最终一致性 | +| 高可用性 | 两个副本存活即可提供服务 | 不能处理连续宕机场景,只有一个副本存活时不保证能提供服务 | 一个副本存活即可提供服务 | + + From b19a08c8dd5e4a5630b1bbc58a8d3ab81f2b0bd7 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 11:29:00 +0800 Subject: [PATCH 22/47] fix: adjust superset doc area block --- docs/zh/10-third-party/05-bi/11-superset.md | 23 ++++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 5e6252ced0..2098faf157 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -4,18 +4,19 @@ title: 与 Superset 集成 --- ‌Apache Superset‌ 是一个现代的企业级商业智能(BI)Web 应用程序,主要用于数据探索和可视化。它由 Apache 软件基金会支持,是一个开源项目,它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面,使得创建、分享和可视化数据变得简单,同时支持多种数据源和丰富的可视化选项‌。 -通过 TDengine 的 Python 连接器, ‌Superset‌ 可支持 TDengine 数据源并提供数据展现、分析等功能 +通过 TDengine 的 Python 连接器, ‌Apache ‌Superset‌ 可支持 TDengine 数据源并提供数据展现、分析等功能 -## 安装 Apache Superset -确保已安装 Apache Superset v2.1.0 及以上版本, 如未安装,请到其 [官网](https://superset.apache.org/) 安装 +## 前置条件 +使 TDengine 成为 Apache Superset 数据源,需以下几方面准备工作: +- TDengine 集群已部署并正常运行(企业及社区版均可) +- taosAdapter 已安装并正常运行。细节请参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) +- Apache Superset 已安装(要求 v2.1.0 及以上版本)。安装 Apache Superset 请参考[官方文档](https://superset.apache.org/) -## 安装 TDengine -TDengine 企业版及社区版均可支持,版本要求在 3.0 及以上 - -## 安装 TDengine Python 连接器 +## 安装 +#### 安装 TDengine Python 连接器 TDengine Python 连接器从 `v2.1.18` 开始自带 Superset 连接驱动,安装程序会把连接驱动安装到 Superset 相应目录下并向 Superset 提供数据源服务 Superset 与 TDengine 之间使用 WebSocket 协议连接,所以需另安装支持 WebSocket 连接协议的组件 `taos-ws-py` , 全部安装脚本如下: ```bash @@ -23,7 +24,9 @@ pip3 install taospy pip3 install taos-ws-py ``` -## Superset 中配置 TDengine 连接 +## 配置 + +#### Superset 中配置 TDengine 连接 **第 1 步**,进入新建数据库连接页面 "Superset" → "Setting" → "Database Connections" → "+DATABASE" **第 2 步**,选择 TDengine 数据库连接。"SUPPORTED DATABASES" 下拉列表中选择 "TDengine" 项。 @@ -50,7 +53,7 @@ taosws://root:taosdata@localhost:6041 **第 5 步**,配置好连接串,点击 “TEST CONNECTION” 测试连接是否成功,测试通过后点击 “CONNECT” 按钮,完成连接。 -## 开始使用 +## 使用 TDengine 数据源与其它数据源使用上无差别,这里简单介绍下数据查询: 1. Superset 界面点击右上角 “+” 号按钮,选择 “SQL query”, 进入查询界面 @@ -60,7 +63,7 @@ TDengine 数据源与其它数据源使用上无差别,这里简单介绍下 5. 随后会在下方显示选定表的 SCHEMA 信息 6. 在 SQL 编辑器区域可输入符合 TDengine 语法的任意 SQL 语句执行 -## 示例效果 +## 示例 我们选择 Superset Chart 模板中较流行的两个模板做了效果展示,以智能电表数据为例: From 278b758aae24c2166aae9732132540a4b325c28d Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 11:43:52 +0800 Subject: [PATCH 23/47] fix: adjust some words --- docs/zh/10-third-party/05-bi/11-superset.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 2098faf157..bf7774e3e7 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -10,15 +10,15 @@ title: 与 Superset 集成 ## 前置条件 使 TDengine 成为 Apache Superset 数据源,需以下几方面准备工作: - TDengine 集群已部署并正常运行(企业及社区版均可) -- taosAdapter 已安装并正常运行。细节请参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) -- Apache Superset 已安装(要求 v2.1.0 及以上版本)。安装 Apache Superset 请参考[官方文档](https://superset.apache.org/) +- taosAdapter 已安装并正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) +- Apache Superset v2.1.0 或以上版本已安装。安装 Apache Superset 请参考[官方文档](https://superset.apache.org/) ## 安装 #### 安装 TDengine Python 连接器 -TDengine Python 连接器从 `v2.1.18` 开始自带 Superset 连接驱动,安装程序会把连接驱动安装到 Superset 相应目录下并向 Superset 提供数据源服务 -Superset 与 TDengine 之间使用 WebSocket 协议连接,所以需另安装支持 WebSocket 连接协议的组件 `taos-ws-py` , 全部安装脚本如下: +TDengine Python 连接器从 `v2.1.18` 起带 Superset 连接驱动,安装程序安装此驱动至 Superset 相应目录下并向 Superset 提供数据源服务 +Superset 与 TDengine 之间使用 WebSocket 协议连接,另需安装支持此协议的 `taos-ws-py` 组件, 全部安装脚本如下: ```bash pip3 install taospy pip3 install taos-ws-py From 7605bd90d8cca959c3af5fc7071135c87bb024df Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 12:34:34 +0800 Subject: [PATCH 24/47] fix: simple setup superset driver describle --- docs/zh/10-third-party/05-bi/11-superset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index bf7774e3e7..87f34118e1 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -17,7 +17,7 @@ title: 与 Superset 集成 ## 安装 #### 安装 TDengine Python 连接器 -TDengine Python 连接器从 `v2.1.18` 起带 Superset 连接驱动,安装程序安装此驱动至 Superset 相应目录下并向 Superset 提供数据源服务 +TDengine Python 连接器从 `v2.1.18` 起带 Superset 连接驱动,会安装至 Superset 相应目录下并向 Superset 提供数据源服务 Superset 与 TDengine 之间使用 WebSocket 协议连接,另需安装支持此协议的 `taos-ws-py` 组件, 全部安装脚本如下: ```bash pip3 install taospy From 94977f9983203ec58000d82e08437d5db4e0cadb Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 12:37:10 +0800 Subject: [PATCH 25/47] fix: simple setup superset driver describle1 --- docs/zh/10-third-party/05-bi/11-superset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 87f34118e1..07f8554d03 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -18,7 +18,7 @@ title: 与 Superset 集成 #### 安装 TDengine Python 连接器 TDengine Python 连接器从 `v2.1.18` 起带 Superset 连接驱动,会安装至 Superset 相应目录下并向 Superset 提供数据源服务 -Superset 与 TDengine 之间使用 WebSocket 协议连接,另需安装支持此协议的 `taos-ws-py` 组件, 全部安装脚本如下: +Superset 与 TDengine 之间使用 WebSocket 协议连接,需安装支持此协议的 `taos-ws-py` 组件, 全部安装脚本如下: ```bash pip3 install taospy pip3 install taos-ws-py From 1b366c4898031af6b13db5a5fec84d6c619748da Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 13:31:44 +0800 Subject: [PATCH 26/47] add blank --- docs/zh/10-third-party/05-bi/11-superset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 07f8554d03..e8b4f96a33 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -11,7 +11,7 @@ title: 与 Superset 集成 使 TDengine 成为 Apache Superset 数据源,需以下几方面准备工作: - TDengine 集群已部署并正常运行(企业及社区版均可) - taosAdapter 已安装并正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) -- Apache Superset v2.1.0 或以上版本已安装。安装 Apache Superset 请参考[官方文档](https://superset.apache.org/) +- Apache Superset v2.1.0 或以上版本已安装。安装 Apache Superset 请参考 [官方文档](https://superset.apache.org/) ## 安装 From 6d4b332aa245b0b178ed760c8f3241c56e5422af Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 14:59:49 +0800 Subject: [PATCH 27/47] fix: adjust to docs --- docs/zh/10-third-party/05-bi/11-superset.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index e8b4f96a33..3718fe06d5 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -8,15 +8,14 @@ title: 与 Superset 集成 ## 前置条件 -使 TDengine 成为 Apache Superset 数据源,需以下几方面准备工作: +Apache Superset 连接 TDengine 数据源,需以下几方面准备工作: - TDengine 集群已部署并正常运行(企业及社区版均可) - taosAdapter 已安装并正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) - Apache Superset v2.1.0 或以上版本已安装。安装 Apache Superset 请参考 [官方文档](https://superset.apache.org/) -## 安装 +## 安装 TDengine Python 连接器 -#### 安装 TDengine Python 连接器 TDengine Python 连接器从 `v2.1.18` 起带 Superset 连接驱动,会安装至 Superset 相应目录下并向 Superset 提供数据源服务 Superset 与 TDengine 之间使用 WebSocket 协议连接,需安装支持此协议的 `taos-ws-py` 组件, 全部安装脚本如下: ```bash @@ -24,9 +23,7 @@ pip3 install taospy pip3 install taos-ws-py ``` -## 配置 - -#### Superset 中配置 TDengine 连接 +## 配置 TDengine 数据源 **第 1 步**,进入新建数据库连接页面 "Superset" → "Setting" → "Database Connections" → "+DATABASE" **第 2 步**,选择 TDengine 数据库连接。"SUPPORTED DATABASES" 下拉列表中选择 "TDengine" 项。 @@ -53,7 +50,7 @@ taosws://root:taosdata@localhost:6041 **第 5 步**,配置好连接串,点击 “TEST CONNECTION” 测试连接是否成功,测试通过后点击 “CONNECT” 按钮,完成连接。 -## 使用 +## 开始使用 TDengine 数据源与其它数据源使用上无差别,这里简单介绍下数据查询: 1. Superset 界面点击右上角 “+” 号按钮,选择 “SQL query”, 进入查询界面 @@ -63,7 +60,7 @@ TDengine 数据源与其它数据源使用上无差别,这里简单介绍下 5. 随后会在下方显示选定表的 SCHEMA 信息 6. 在 SQL 编辑器区域可输入符合 TDengine 语法的任意 SQL 语句执行 -## 示例 +## 示例效果 我们选择 Superset Chart 模板中较流行的两个模板做了效果展示,以智能电表数据为例: From 089908867b231b9e7428107621769ff783c26557 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 15:10:49 +0800 Subject: [PATCH 28/47] fix: doc1 ready env --- docs/zh/10-third-party/05-bi/11-superset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 3718fe06d5..23eccbc46c 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -8,7 +8,7 @@ title: 与 Superset 集成 ## 前置条件 -Apache Superset 连接 TDengine 数据源,需以下几方面准备工作: +准备以下环境: - TDengine 集群已部署并正常运行(企业及社区版均可) - taosAdapter 已安装并正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) - Apache Superset v2.1.0 或以上版本已安装。安装 Apache Superset 请参考 [官方文档](https://superset.apache.org/) From 9382d984bdc11210cf74e4166a6fec9e68c57206 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 15:11:40 +0800 Subject: [PATCH 29/47] fix: doc1 ready env --- docs/zh/10-third-party/05-bi/11-superset.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 23eccbc46c..5d6885c2d2 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -8,6 +8,7 @@ title: 与 Superset 集成 ## 前置条件 + 准备以下环境: - TDengine 集群已部署并正常运行(企业及社区版均可) - taosAdapter 已安装并正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) From aa92fe3569bbeafccc8f6faccc05110c6994a460 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 16:17:51 +0800 Subject: [PATCH 30/47] submit english doc --- docs/en/10-third-party/05-bi/11-superset.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/en/10-third-party/05-bi/11-superset.md b/docs/en/10-third-party/05-bi/11-superset.md index aa56648b99..e4ed49706d 100644 --- a/docs/en/10-third-party/05-bi/11-superset.md +++ b/docs/en/10-third-party/05-bi/11-superset.md @@ -9,14 +9,13 @@ Apache Superset provides an intuitive user interface that makes creating, sharin Through the Python connector of TDengine, Superset can support TDengine data sources and provide functions such as data presentation and analysis -## Install Apache Superset - -Ensure that Apache Superset v2.1.0 or above is installed. If not, please visit [official website](https://superset.apache.org/) to install - -## Install TDengine - -Both TDengine Enterprise Edition and Community Edition are supported, with version requirements of 3.0 or higher +## Prerequisites +Prepare the following environment: +- TDengine cluster has been deployed and is running normally (both Enterprise and Community versions are available) +- taosAdapter is installed and running normally, refer to [taosAdapter](../../../reference/components/taosAdapter) +- Apache Superset version 2.1.0 or above is already installed, refre to [Apache Superset](https://superset.apache.org/) + ## Install TDengine Python Connector The Python connector of TDengine comes with a connection driver that supports Superset in versions 2.1.18 and later, which will be automatically installed in the Superset directory and provide data source services. From 08030bac6ee5b387862a13f3785d272d8475e558 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 16:30:27 +0800 Subject: [PATCH 31/47] fix: english doc with superset --- docs/en/10-third-party/05-bi/11-superset.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/10-third-party/05-bi/11-superset.md b/docs/en/10-third-party/05-bi/11-superset.md index e4ed49706d..be3e3aa08d 100644 --- a/docs/en/10-third-party/05-bi/11-superset.md +++ b/docs/en/10-third-party/05-bi/11-superset.md @@ -12,8 +12,8 @@ Through the Python connector of TDengine, Superset can support TDengine data sou ## Prerequisites Prepare the following environment: -- TDengine cluster has been deployed and is running normally (both Enterprise and Community versions are available) -- taosAdapter is installed and running normally, refer to [taosAdapter](../../../reference/components/taosAdapter) +- TDengine is installed and running normally (both Enterprise and Community versions are available) +- taosAdapter is running normally, refer to [taosAdapter](../../../reference/components/taosAdapter) - Apache Superset version 2.1.0 or above is already installed, refre to [Apache Superset](https://superset.apache.org/) ## Install TDengine Python Connector From a5c2df7584a7fc8d347babd80a8e991485e10e4c Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 20 Dec 2024 17:03:56 +0800 Subject: [PATCH 32/47] fix: remove adapter install because already install --- docs/zh/10-third-party/05-bi/11-superset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 5d6885c2d2..1fc2096659 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -11,7 +11,7 @@ title: 与 Superset 集成 准备以下环境: - TDengine 集群已部署并正常运行(企业及社区版均可) -- taosAdapter 已安装并正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) +- taosAdapter 能够正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) - Apache Superset v2.1.0 或以上版本已安装。安装 Apache Superset 请参考 [官方文档](https://superset.apache.org/) From 9488a3f3e4c2641286ddf8401231249ce0097cda Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 20 Dec 2024 17:51:22 +0800 Subject: [PATCH 33/47] docs: ha --- docs/zh/08-operation/18-ha/01-replica3.md | 65 +++++++++++++++++++++++ docs/zh/08-operation/18-ha/02-replica2.md | 60 +++++++++++++++++++++ docs/zh/08-operation/18-ha/03-dual.md | 36 +++++++------ docs/zh/08-operation/18-ha/index.md | 19 ++++--- 4 files changed, 155 insertions(+), 25 deletions(-) create mode 100644 docs/zh/08-operation/18-ha/01-replica3.md create mode 100644 docs/zh/08-operation/18-ha/02-replica2.md diff --git a/docs/zh/08-operation/18-ha/01-replica3.md b/docs/zh/08-operation/18-ha/01-replica3.md new file mode 100644 index 0000000000..43526f526e --- /dev/null +++ b/docs/zh/08-operation/18-ha/01-replica3.md @@ -0,0 +1,65 @@ +--- +title: 三副本方案 +sidebar_label: 三副本方案 +toc_max_heading_level: 4 +--- + + +本节介绍 TDengine 三副本方案的配置与使用。 + +TDengine 的三副本方案采用 RAFT 算法来实现数据的一致性,包括元数据和时序数据。一个虚拟节点组(VGroup)构成了一个 RAFT 组;虚拟节点组的虚拟数据节点(Vnode),便是该 RAFT 组的成员节点,也称之为副本。 + +1. 每个 Vnode 都有自己的角色,它们可以是 Follower(跟随者)、Candidate(候选人)、Leader(领导者)。 +2. 每个 Vnode 都维护了一份连续的日志(Log),用于记录数据写入、变更、或删除等操作的所有指令。日志是由一系列有序的日志条目 (Log Entry) 组成,每个 Log Entry 都有唯一的编号(Index),用于标识日志协商或执行的进度。 +3. Leader 角色的 Vnode 提供读写服务,在故障节点不超过半数的情况下保证集群的高可用性。此外,即使发生了节点重启及 Leader 重新选举等事件后,RAFT 也能够始终保证新产生的 Leader 可以提供已经写入成功的全部完整数据的读写服务。 +4. 每一次对数据库的变更请求(比如 insert),都对应一个 Log Entry。在持续写入数据的过程中,会按照协议机制在每个成员节点上产生完全相同的日志记录,并且以相同的顺序执行数据变更操作,以 WAL 的形式存储在数据文件目录中。 +5. 每一个 Log Entry 携带的 Index,就代表数据变更的版本号;当一个数据写入请求发出后,必定至少过半数节点上完成写入才会把“写入成功”返回给客户端;这部分涉及 Log entry 的两种重要的状态,committed 和 applied。 +6. 只有当过半数的节点把该条 SQL 的写入信息追加到文件系统上的 WAL,并且收到确认消息之后,这条 Log entry 才会被 Leader 认为是安全的;此时该日志进入 committed 状态,完成数据的插入,随后该 Log Entry 便被标记为 applied 的状态。 + +多副本工作原理图 + + +## 方案特点 + +1. 最小配置的服务器节点数为 3 个 +2. 三副本为数据库建库参数,不同数据库可按需选择副本数 +3. 支持单副本与三副本之间切换(前提是节点数量满足需求、各节点可用 vnode 数量/内存/存储空间足够) +4. 支持 TDengine 集群的完整特性,包括:读缓存、数据订阅、流计算等 +5. 支持 TDengine 所有语言连接器以及连接方式 +6. 不支持三副本与双副本之间的切换 +7. 不支持三副本切换为双活,除非另外部署一套实例与当前实例组成双活方案 + +## 集群配置 + +三副本要求集群至少配置三个服务器节点,基本部署与配置步骤如下 +1. 确定服务器节点数量、主机名或域名,配置好所有节点的域名解析:DNS 或 /etc/hosts +2. 各节点分别安装 TDengine 企业版服务端安装包,按需编辑好各节点 taos.cfg +3. 启动各节点 taosd 服务 (其他服务可按需启动:taosadapter/taosx/taoskeeper/taos-explorer) +4. 登入taos CLI,将所有节点添加入集群 create dnode xxxx +5. 创建三个 mnode create mnode on dnode nn + +## 数据库创建 + +创建三副本数据库。DBA 按需创建指定的三副本数据库 + +```sql +create database replica 3 vgroups xx buffer xx ... +``` + +## 修改数据库副本数 + +创建了一个单副本数据库后,希望改为三副本时,可通过 alter 命令来实现,反之亦然 + +```sql +alter database replica 3|1 +``` + +## 常见问题 + +### 1. 创建三副本数据库或修改为三副本时,报错:DB error: Out of dnodes +- 服务器节点数不足:原因是服务器节点数少于三个。 +- 解决方案:增加服务器节点数量,满足最低要求。 + +### 2. 创建三副本数据库或 split vgroup 时,报错:DB error: Vnodes exhausted +- 服务器可用 Vnodes 不足:原因是某些服务器节点可用 Vnodes 数少于建库或 split vgroup 的需求数。 +- 解决方案:调整服务器 CPU 数量、SupportVnodes 数量,满足建库要求。 \ No newline at end of file diff --git a/docs/zh/08-operation/18-ha/02-replica2.md b/docs/zh/08-operation/18-ha/02-replica2.md new file mode 100644 index 0000000000..ee35da21ae --- /dev/null +++ b/docs/zh/08-operation/18-ha/02-replica2.md @@ -0,0 +1,60 @@ +--- +title: 双副本方案 +sidebar_label: 双副本方案 +toc_max_heading_level: 4 +--- + +本节介绍 TDengine 双副本方案的配置与使用。 + +双活是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次发布,建议使用最新版本。 + + +## 方案特点 + +1. 最小配置的服务器节点数为 2+1 个,其中两个数据节点,一个仲裁节点 + - 仲裁节点可与其他应用共用,但需与前两个数据节点在同一网段;该节点占用资源少,仅1~2核 + - 如部署3个以上数据节点,无需单独部署仲裁节点 +2. 双副本为数据库建库参数,不同数据库可按需选择副本数 +3. 支持单副本与双副本之间切换(前提是节点数量满足需求、各节点可用vnode数量/内存/存储空间足够) +4. 支持 TDengine 集群的完整特性,包括:读缓存、数据订阅、流计算等 +5. 支持 TDengine 所有语言连接器以及连接方式 +6. 不支持双副本与三副本之间的切换 +7. 不支持双副本切换为双活,除非另外部署一套实例与当前实例组成双活方案 + +## 集群配置 + +双副本要求集群至少配置三个服务器节点(两个数据节点,一个仲裁节点),基本部署与配置步骤如下: + 1. 确定服务器节点数量、主机名或域名,配置好所有节点的域名解析:DNS 或 /etc/hosts + 2. 各节点分别安装 TDengine 企业版服务端安装包,按需编辑好各节点 taos.cfg + 1. 仲裁节点 SupportVnodes 0 + 2. 数据节点 SupportVnodes 按实际需求配置 + 3. 启动各节点 taosd 服务 (其他服务可按需启动:taosadapter/taosx/taoskeeper/taos-explorer) + 1. 仲裁节点仅需启动 taosd 服务 + 4. 登入taos CLI,将所有节点添加入集群 create dnode xxxx + 5. 创建三个 mnode create mnode on dnode nn + +## 数据库创建 + +创建双副本数据库。DBA按需创建指定的双副本数据库 + +```sql +create database replica 2 vgroups xx buffer xx ... +``` + +## 修改数据库副本数 + +创建了一个单副本数据库后,希望改为双副本时,可通过alter命令来实现。反之亦然 + +```sql +alter database replica 2|1 +``` + +## 常见问题 + +### 1. 创建双副本数据库或修改为双副本时,报错:DB error: Out of dnodes +- 服务器节点数不足:原因是,数据服务器节点数少于两个。 +- 解决方案:增加服务器节点数量,满足最低要求。 + +### 2. 创建双副本数据库或 split vgroup 时,报错:DB error: Vnodes exhausted +- 服务器可用 Vnodes 不足:原因是某些服务器节点可用 Vnodes 数少于建库或 split vgroup 的需求数。 +- 解决方案:调整服务器 CPU 数量、SupportVnodes 数量,满足建库要求。 diff --git a/docs/zh/08-operation/18-ha/03-dual.md b/docs/zh/08-operation/18-ha/03-dual.md index a5abe2609f..ce3bab4241 100644 --- a/docs/zh/08-operation/18-ha/03-dual.md +++ b/docs/zh/08-operation/18-ha/03-dual.md @@ -6,11 +6,12 @@ toc_max_heading_level: 4 本节介绍 TDengine 双活系统的配置和使用。 -1. 部分用户因为部署环境的特殊性只能部署两台服务器,同时希望实现一定的服务高可用和数据高可靠。本文主要描述基于数据复制和客户端 Failover 两项关键技术的 TDengine 双活系统的产品行为,包括双活系统的架构、配置、运维等。TDengine 双活既可以用于前面所述资源受限的环境,也可用于在两套 TDengine 集群(不限资源)之间的灾备场景。双活是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次发布,建议使用最新版本。 +部分用户因为部署环境的特殊性只能部署两台服务器,同时希望实现一定的服务高可用和数据高可靠。本文主要描述基于数据复制和客户端 Failover 两项关键技术的 TDengine 双活系统的产品行为,包括双活系统的架构、配置、运维等。TDengine 双活既可以用于前面所述资源受限的环境,也可用于在两套 TDengine 集群(不限资源)之间的灾备场景。双活是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次发布,建议使用最新版本。 -2. 双活系统的定义是:业务系统中有且仅有两台服务器,其上分别部署一套服务,在业务层看来这两台机器和两套服务是一个完整的系统,对其中的细节业务层不需要感知。双活中的两个节点通常被称为 Master-Slave,意为”主从“或”主备“,本文档中可能会出现混用的情况。 +双活系统的定义是:业务系统中有且仅有两台服务器,其上分别部署一套服务,在业务层看来这两台机器和两套服务是一个完整的系统,对其中的细节业务层不需要感知。双活中的两个节点通常被称为 Master-Slave,意为”主从“或”主备“,本文档中可能会出现混用的情况。 + +TDengine 双活系统的部署架构图如下, 其中涉及到三个关键点: -3. TDengine 双活系统的部署架构图如下, 其中涉及到三个关键点: 1. 由 Client Driver 实现对双系统的 Failover,即主节点宕机时的主从切换 2. 由 taosX 从(当前的)主节点到从节点实现数据复制 3. 由数据订阅的写接口在写入复制过来的数据时在 WAL 中加入特殊标记,由数据订阅的读接口在读取数据时自动过滤掉带有该特殊标记的数据,避免重复复制形成 infinite loop @@ -42,13 +43,13 @@ connection = DriverManager.getConnection(url, properties); 其中的配置属性及含义如下表 -| 属性名 | 含义 | -| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -| PROPERTY_KEY_SLAVE_CLUSTER_HOST | 第二节点的主机名或者 ip,默认空 | -| PROPERTY_KEY_SLAVE_CLUSTER_PORT | 第二节点的端口号,默认空 | +| 属性名 | 含义 | +| ---------------------------------- | --- | +| PROPERTY_KEY_SLAVE_CLUSTER_HOST | 第二节点的主机名或者 ip,默认空 | +| PROPERTY_KEY_SLAVE_CLUSTER_PORT | 第二节点的端口号,默认空 | | PROPERTY_KEY_ENABLE_AUTO_RECONNECT | 是否启用自动重连。仅在使用 WebSocket 连接时生效。true: 启用,false: 不启用。默认为 false。双活场景下请设置为 true | -| PROPERTY_KEY_RECONNECT_INTERVAL_MS | 重连的时间间隔,单位毫秒:默认 2000 毫秒,也就是 2 秒;最小值为 0, 表示立即重试;最大值不做限制 | -| PROPERTY_KEY_RECONNECT_RETRY_COUNT | 每节点最多重试次数:默认值为 3;最小值为 0,表示不进行重试;最大值不做限制 | +| PROPERTY_KEY_RECONNECT_INTERVAL_MS | 重连的时间间隔,单位毫秒:默认 2000 毫秒,也就是 2 秒;最小值为 0, 表示立即重试;最大值不做限制 | +| PROPERTY_KEY_RECONNECT_RETRY_COUNT | 每节点最多重试次数:默认值为 3;最小值为 0,表示不进行重试;最大值不做限制 | ### 约束条件 @@ -73,7 +74,7 @@ taosx replica start 1. 方法一 ```shell - - taosx replica start -f source_endpoint -t sink_endpoint [database...] +taosx replica start -f source_endpoint -t sink_endpoint [database...] ``` 在本机器所在的 taosx 服务中建立从 source_endpoint 到 sink_endpoint 的同步任务。运行该命令成功后,将打印 replica ID 到控制台(后续记为 id)。 @@ -82,6 +83,7 @@ taosx replica start ```shell taosx replica start -f td1:6030 -t td2:6030 ``` + 该示例命令会自动创建除 information_schema、performance_schema、log、audit 库之外的同步任务。可以使用 `http://td2:6041` 指定该 endpoint 使用 websocket 接口(默认是原生接口)。也可以指定数据库同步:taosx replica start -f td1:6030 -t td2:6030 db1 仅创建指定的数据库同步任务。 2. 方法二 @@ -93,9 +95,9 @@ taosx replica start -i id [database...] 使用上面已经创建的 Replica ID (id) 以在该同步任务中增加其它数据库。 注意: -- 多次使用该命令,不会创建重复任务,仅将所指定的数据库增加到相应任务中。 -- replica id 在一个 taosX 实例内是全局唯一的,与 source/sink 的组合无关 -- 为便于记忆,replica id 为一个随机常用单词,系统自动将 source/sink 组合对应到一个词库中取得一个唯一可用单词。 +1. 多次使用该命令,不会创建重复任务,仅将所指定的数据库增加到相应任务中。 +2. replica id 在一个 taosX 实例内是全局唯一的,与 source/sink 的组合无关 +3. 为便于记忆,replica id 为一个随机常用单词,系统自动将 source/sink 组合对应到一个词库中取得一个唯一可用单词。 ### 查看任务状态 @@ -120,8 +122,8 @@ taosx replica stop id [db...] ``` 该命令作用如下: -- 停止指定 Replica ID 下所有或指定数据库的双副本同步任务。 -- 使用 `taosx replica stop id1 db1` 表示停止 id1 replica 下 db1的同步任务。 +1. 停止指定 Replica ID 下所有或指定数据库的双副本同步任务。 +2. 使用 `taosx replica stop id1 db1` 表示停止 id1 replica 下 db1的同步任务。 ### 重启双活任务 @@ -130,8 +132,8 @@ taosx replica restart id [db...] ``` 该命令作用如下: -- 重启指定 Replica ID 下所有或指定数据库的双副本同步任务。 -- 使用 `taosx replica start id1 db1` 仅重启指定数据库 db1的同步任务。 +1. 重启指定 Replica ID 下所有或指定数据库的双副本同步任务。 +2. 使用 `taosx replica start id1 db1` 仅重启指定数据库 db1的同步任务。 ### 查看同步进度 diff --git a/docs/zh/08-operation/18-ha/index.md b/docs/zh/08-operation/18-ha/index.md index 96c509e878..d2597549f9 100644 --- a/docs/zh/08-operation/18-ha/index.md +++ b/docs/zh/08-operation/18-ha/index.md @@ -3,10 +3,13 @@ sidebar_label: HA title: High availability --- -TDengine 作为分布式时序数据库,支持高可用的特性。为适应不同用户场景的需要,TDengine 提供三种方式的高可用方案。 -- 标准三副本方案:高可用性最好,成本也最高 -- 双副本结合 Arbitrator 方案:时序数据的副本数为 2 ,但节点数大于等于 3,可显著降低成本,高可用性较较差 -- 双活方案:可仅部署两个节点,高可用性较好,但有可能丢数据 +TDengine 作为分布式时序数据库,支持高可用特性。默认高可用方案为基于 RAFT 协议的标准三副本方案;为适应不同用户场景的需要,提供基于 RAFT 协议改造的双副本方案;为满足传统双机主备架构的需求,提供基于 WAL 数据同步的双活方案。 + +- 标准三副本方案:时序数据的副本数目为 3,确保了最高的可用性,成本也最高 +- 双副本结合 Arbitrator 方案:时序数据的副本数目为 2,但节点数目至少为 3,以确保高可用性和良好的数据一致性,可显著降低成本;与三副本方案相比,此方案在显著降低成本的同时,依然保持了较高的可用性 +- 双活方案:可仅部署两个节点,高可用性较好,数据一致性弱(最终一致性) + +以下为三种方案的特点: | # | **三副本** | **双副本** | **双活** | |:--|:----------|:----------|:--------| @@ -14,9 +17,9 @@ TDengine 作为分布式时序数据库,支持高可用的特性。为适应 | 最小节点数 | 三个数据节点 | 两个数据节点,一个仲裁节点 | 两个数据节点 | | 选主原理 | Raft 协议 | 管理节点仲裁选主 | 无需选主 | | 同步原理 | Raft 协议 | Raft 协议 | 通过 taosX 进行数据同步 | -| 同步延迟 | 无延迟 | 无延迟 | 依赖 taosX 的同步速度,秒级延迟 | -| 数据安全性 | 无数据丢失 | 无数据丢失 |依赖于 WAL 的保存时长 | -| 数据一致性 | 实时一致性 | 实时一致性 |最终一致性 | -| 高可用性 | 两个副本存活即可提供服务 | 不能处理连续宕机场景,只有一个副本存活时不保证能提供服务 | 一个副本存活即可提供服务 | +| 同步延迟 | 无延迟 | 无延迟 | 依赖于 taosX 的同步速度,秒级延迟 | +| 数据安全性 | 无数据丢失 | 无数据丢失 | 依赖于 WAL 的保存时长 | +| 数据一致性 | RAFT 一致性 | RAFT 一致性 | 最终一致性 | +| 高可用性 | 任一节点宕机不影响服务 | 任一节点宕机不影响服务,但不能处理连续宕机场景 | 一个实例存活即可提供服务 | From 93fefff5e42eeda11195891667090646618d4d36 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sat, 21 Dec 2024 13:46:18 +0800 Subject: [PATCH 34/47] docs: add ha --- docs/zh/08-operation/18-ha/01-replica3.md | 43 +++++++------ docs/zh/08-operation/18-ha/02-replica2.md | 73 +++++++++++++++------- docs/zh/08-operation/18-ha/03-dual.md | 15 +++-- docs/zh/08-operation/18-ha/index.md | 22 +++---- docs/zh/08-operation/Active-Standby.png | Bin 164433 -> 0 bytes docs/zh/08-operation/pic/replica2.png | Bin 0 -> 105706 bytes 6 files changed, 90 insertions(+), 63 deletions(-) delete mode 100644 docs/zh/08-operation/Active-Standby.png create mode 100644 docs/zh/08-operation/pic/replica2.png diff --git a/docs/zh/08-operation/18-ha/01-replica3.md b/docs/zh/08-operation/18-ha/01-replica3.md index 43526f526e..5a16d3f152 100644 --- a/docs/zh/08-operation/18-ha/01-replica3.md +++ b/docs/zh/08-operation/18-ha/01-replica3.md @@ -4,30 +4,17 @@ sidebar_label: 三副本方案 toc_max_heading_level: 4 --- - 本节介绍 TDengine 三副本方案的配置与使用。 TDengine 的三副本方案采用 RAFT 算法来实现数据的一致性,包括元数据和时序数据。一个虚拟节点组(VGroup)构成了一个 RAFT 组;虚拟节点组的虚拟数据节点(Vnode),便是该 RAFT 组的成员节点,也称之为副本。 -1. 每个 Vnode 都有自己的角色,它们可以是 Follower(跟随者)、Candidate(候选人)、Leader(领导者)。 +1. 每个 Vnode 都有自己的角色,它们可以是 Leader(领导者)、Follower(跟随者)、Candidate(候选人)。 2. 每个 Vnode 都维护了一份连续的日志(Log),用于记录数据写入、变更、或删除等操作的所有指令。日志是由一系列有序的日志条目 (Log Entry) 组成,每个 Log Entry 都有唯一的编号(Index),用于标识日志协商或执行的进度。 3. Leader 角色的 Vnode 提供读写服务,在故障节点不超过半数的情况下保证集群的高可用性。此外,即使发生了节点重启及 Leader 重新选举等事件后,RAFT 也能够始终保证新产生的 Leader 可以提供已经写入成功的全部完整数据的读写服务。 4. 每一次对数据库的变更请求(比如 insert),都对应一个 Log Entry。在持续写入数据的过程中,会按照协议机制在每个成员节点上产生完全相同的日志记录,并且以相同的顺序执行数据变更操作,以 WAL 的形式存储在数据文件目录中。 -5. 每一个 Log Entry 携带的 Index,就代表数据变更的版本号;当一个数据写入请求发出后,必定至少过半数节点上完成写入才会把“写入成功”返回给客户端;这部分涉及 Log entry 的两种重要的状态,committed 和 applied。 -6. 只有当过半数的节点把该条 SQL 的写入信息追加到文件系统上的 WAL,并且收到确认消息之后,这条 Log entry 才会被 Leader 认为是安全的;此时该日志进入 committed 状态,完成数据的插入,随后该 Log Entry 便被标记为 applied 的状态。 +5. 只有当过半数的节点把该条写入信息追加到文件系统上的 WAL,并且收到确认消息之后,这条 Log entry 才会被 Leader 认为是安全的;此时该日志进入 committed 状态,完成数据的插入,随后该 Log Entry 便被标记为 applied 的状态。 -多副本工作原理图 - - -## 方案特点 - -1. 最小配置的服务器节点数为 3 个 -2. 三副本为数据库建库参数,不同数据库可按需选择副本数 -3. 支持单副本与三副本之间切换(前提是节点数量满足需求、各节点可用 vnode 数量/内存/存储空间足够) -4. 支持 TDengine 集群的完整特性,包括:读缓存、数据订阅、流计算等 -5. 支持 TDengine 所有语言连接器以及连接方式 -6. 不支持三副本与双副本之间的切换 -7. 不支持三副本切换为双活,除非另外部署一套实例与当前实例组成双活方案 +多副本工作原理参见 [数据写入与复制流程](../../26-tdinternal/01-arch.md#数据写入与复制流程) ## 集群配置 @@ -35,10 +22,26 @@ TDengine 的三副本方案采用 RAFT 算法来实现数据的一致性,包 1. 确定服务器节点数量、主机名或域名,配置好所有节点的域名解析:DNS 或 /etc/hosts 2. 各节点分别安装 TDengine 企业版服务端安装包,按需编辑好各节点 taos.cfg 3. 启动各节点 taosd 服务 (其他服务可按需启动:taosadapter/taosx/taoskeeper/taos-explorer) -4. 登入taos CLI,将所有节点添加入集群 create dnode xxxx -5. 创建三个 mnode create mnode on dnode nn -## 数据库创建 +## 运维命令 + +### 创建集群 + +创建三节点的集群 + +```sql +CREATE dnode port ; +CREATE dnode port ; +``` + +创建三副本的 Mnode,保证 Mnode 高可用 + +```sql +CREATE mnode on dnode ; +CREATE mnode on dnode ; +``` + +### 数据库创建 创建三副本数据库。DBA 按需创建指定的三副本数据库 @@ -46,7 +49,7 @@ TDengine 的三副本方案采用 RAFT 算法来实现数据的一致性,包 create database replica 3 vgroups xx buffer xx ... ``` -## 修改数据库副本数 +### 修改数据库副本数 创建了一个单副本数据库后,希望改为三副本时,可通过 alter 命令来实现,反之亦然 diff --git a/docs/zh/08-operation/18-ha/02-replica2.md b/docs/zh/08-operation/18-ha/02-replica2.md index ee35da21ae..67a071c7e0 100644 --- a/docs/zh/08-operation/18-ha/02-replica2.md +++ b/docs/zh/08-operation/18-ha/02-replica2.md @@ -6,42 +6,57 @@ toc_max_heading_level: 4 本节介绍 TDengine 双副本方案的配置与使用。 -双活是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次发布,建议使用最新版本。 +部分用户期望在保证一定可靠性、可用性条件下,尽可能压缩部署成本。为此,TDengine 提出基于 Arbitrator 的双副本方案,可提供集群中**只有单个服务故障且不出现连续故障**的容错能力。 +双副本选主由高可用的 Mnode 提供仲裁服务,不由 Raft 组内决定。 +1. Arbitrator:仲裁服务,不存储数据,VGroup 因某一 Vnode 故障而无法提供服务时,Arbitrator 可根据数据同步情况指定 VGroup 内另一 Vnode 成为 Assigned Leader +2. AssignedLeader:被强制设置为 Leader 的 Vnode,无论其他副本 Vnode 是否存活,均可一直响应用户请求 -## 方案特点 - -1. 最小配置的服务器节点数为 2+1 个,其中两个数据节点,一个仲裁节点 - - 仲裁节点可与其他应用共用,但需与前两个数据节点在同一网段;该节点占用资源少,仅1~2核 - - 如部署3个以上数据节点,无需单独部署仲裁节点 -2. 双副本为数据库建库参数,不同数据库可按需选择副本数 -3. 支持单副本与双副本之间切换(前提是节点数量满足需求、各节点可用vnode数量/内存/存储空间足够) -4. 支持 TDengine 集群的完整特性,包括:读缓存、数据订阅、流计算等 -5. 支持 TDengine 所有语言连接器以及连接方式 -6. 不支持双副本与三副本之间的切换 -7. 不支持双副本切换为双活,除非另外部署一套实例与当前实例组成双活方案 +![replica2.png](../pic/replica2.png) ## 集群配置 -双副本要求集群至少配置三个服务器节点(两个数据节点,一个仲裁节点),基本部署与配置步骤如下: - 1. 确定服务器节点数量、主机名或域名,配置好所有节点的域名解析:DNS 或 /etc/hosts - 2. 各节点分别安装 TDengine 企业版服务端安装包,按需编辑好各节点 taos.cfg - 1. 仲裁节点 SupportVnodes 0 - 2. 数据节点 SupportVnodes 按实际需求配置 - 3. 启动各节点 taosd 服务 (其他服务可按需启动:taosadapter/taosx/taoskeeper/taos-explorer) - 1. 仲裁节点仅需启动 taosd 服务 - 4. 登入taos CLI,将所有节点添加入集群 create dnode xxxx - 5. 创建三个 mnode create mnode on dnode nn +双副本要求集群至少配置三个节点,基本部署与配置步骤如下: +1. 确定服务器节点数量、主机名或域名,配置好所有节点的域名解析:DNS 或 /etc/hosts +2. 各节点分别安装 TDengine 企业版服务端安装包,按需编辑好各节点 taos.cfg,选择其中一个节点作为仲裁节点,该节点可配置为仅部署 Mnode(将 SupportVnodes 参数设置为 0),除提供仲裁服务之外,不存储时序数据 +3. 启动各节点 taosd 服务 (其他服务可按需启动:taosadapter/taosx/taoskeeper/taos-explorer) -## 数据库创建 +## 约束条件 +1. 最小配置的服务器节点数为 2+1 个,其中两个数据节点,一个仲裁节点;仲裁节点可与其他应用共用,但需与前两个数据节点在同一网段;该节点占用资源少, 仅 1~2 核;如部署 3 个以上数据节点,无需单独部署仲裁节点 +2. 双副本为数据库建库参数,不同数据库可按需选择副本数 +3. 支持 TDengine 集群的完整特性,包括:读缓存、数据订阅、流计算等 +4. 支持 TDengine 所有语言连接器以及连接方式 +5. 支持单副本与双副本之间切换(前提是节点数量满足需求、各节点可用 vnode 数量/内存/存储空间足够) +6. 不支持双副本与三副本之间的切换 +7. 不支持双副本切换为双活,除非另外部署一套实例与当前实例组成双活方案 -创建双副本数据库。DBA按需创建指定的双副本数据库 +## 运维命令 + +### 创建集群 + +创建三节点的集群 + +```sql +CREATE dnode port ; +CREATE dnode port ; +``` + +创建三副本的 Mnode,保证 Mnode 高可用,确保仲裁服务的高可用 + +```sql +CREATE mnode on dnode ; +CREATE mnode on dnode ; +``` + +### 数据库创建 + +创建双副本数据库。DBA 按需创建指定的双副本数据库 ```sql create database replica 2 vgroups xx buffer xx ... ``` -## 修改数据库副本数 +### 修改数据库副本数 创建了一个单副本数据库后,希望改为双副本时,可通过alter命令来实现。反之亦然 @@ -49,6 +64,16 @@ create database replica 2 vgroups xx buffer xx ... alter database replica 2|1 ``` +## 异常情况 + +| 异常场景 | 集群状态 | +| ------- | ------ | +| 没有 Vnode 发生故障: Arbitrator 故障(Mnode 宕机节点超过一个,导致 Mnode 无法选主)| **持续提供服务** | +| 仅一个 Vnode 故障:VGroup 已经达成同步后,某一个 Vnode 才发生故障的 | **持续提供服务** | +| 仅一个 Vnode 故障:离线 Vnode 启动后,VGroup 未达成同步前,另一个 Vnode 服务故障的 | **无法提供服务** | +| 两个 Vnode 都发生故障 | **无法提供服务** | + + ## 常见问题 ### 1. 创建双副本数据库或修改为双副本时,报错:DB error: Out of dnodes diff --git a/docs/zh/08-operation/18-ha/03-dual.md b/docs/zh/08-operation/18-ha/03-dual.md index ce3bab4241..b19b8e8bc5 100644 --- a/docs/zh/08-operation/18-ha/03-dual.md +++ b/docs/zh/08-operation/18-ha/03-dual.md @@ -18,15 +18,14 @@ TDengine 双活系统的部署架构图如下, 其中涉及到三个关键点: 注:下图中仅以一个单机版 TDengine 作为示例,但在实际部署中图中的一个 Host 也可以被任意节点数量的 TDengine 集群代替。 -![Active-Standby.png](./Active-Standby.png) +![Active-Standby.png](../pic/Active-Standby.png) -## 配置 -### 集群配置 +## 集群配置 双活对 TDengine 集群本身的配置没有任何要求,但对要在双活系统之间同步的数据库的 WAL 保留时长有一定要求,WAL 保留时长越大双活系统的容错率越高;如果备节点宕机时长超过主节点上的 WAL 保留时长,必定会导致备节点上有数据缺失;如果备节点宕机时长虽未超过主节点上的 WAL 保留时长,也有一定概率丢失数据,取决于接近的程度以及数据同步的速度。 -### 客户端配置 +## 客户端配置 目前只有 Java 连接器在 WebSocket 连接模式下支持双活,其配置示例如下 @@ -51,11 +50,11 @@ connection = DriverManager.getConnection(url, properties); | PROPERTY_KEY_RECONNECT_INTERVAL_MS | 重连的时间间隔,单位毫秒:默认 2000 毫秒,也就是 2 秒;最小值为 0, 表示立即重试;最大值不做限制 | | PROPERTY_KEY_RECONNECT_RETRY_COUNT | 每节点最多重试次数:默认值为 3;最小值为 0,表示不进行重试;最大值不做限制 | -### 约束条件 +## 约束条件 -1. 应用程序不能使用订阅接口,如果配置了双活参数会导致创建消费者失败。 -2. 不建议应用程序使用参数绑定的写入和查询方式,如果使用应用需要自己解决连接切换后的相关对象失效问题。 -3. 在双活场景下,不建议用户应用程序显示调用 use database,应该在连接参数中指定 database。 +1. 应用程序不能使用订阅接口,如果配置了双活参数会导致创建消费者失败 +2. 不建议应用程序使用参数绑定的写入和查询方式,如果使用应用需要自己解决连接切换后的相关对象失效问题 +3. 在双活场景下,不建议用户应用程序显示调用 use database,应该在连接参数中指定 database 4. 双活的两端集群必须同构(即数据库的命名和所有配置参数以及用户名密码和权限设置等完全相同) 5. 只支持 WebSocket 连接模式 diff --git a/docs/zh/08-operation/18-ha/index.md b/docs/zh/08-operation/18-ha/index.md index d2597549f9..c40dfe448a 100644 --- a/docs/zh/08-operation/18-ha/index.md +++ b/docs/zh/08-operation/18-ha/index.md @@ -5,21 +5,21 @@ title: High availability TDengine 作为分布式时序数据库,支持高可用特性。默认高可用方案为基于 RAFT 协议的标准三副本方案;为适应不同用户场景的需要,提供基于 RAFT 协议改造的双副本方案;为满足传统双机主备架构的需求,提供基于 WAL 数据同步的双活方案。 -- 标准三副本方案:时序数据的副本数目为 3,确保了最高的可用性,成本也最高 -- 双副本结合 Arbitrator 方案:时序数据的副本数目为 2,但节点数目至少为 3,以确保高可用性和良好的数据一致性,可显著降低成本;与三副本方案相比,此方案在显著降低成本的同时,依然保持了较高的可用性 -- 双活方案:可仅部署两个节点,高可用性较好,数据一致性弱(最终一致性) +- 标准三副本方案:时序数据的副本数目为 3,确保了最高的可用性,成本也最高。 +- 双副本结合 Arbitrator 方案:时序数据的副本数目为 2,但节点数目至少为 3,以确保高可用性和良好的数据一致性,可显著降低成本;与三副本方案相比,此方案在显著降低成本的同时,依然保持了较高的可用性。 +- 双活方案:可仅部署两个节点,高可用性较好,数据一致性弱(最终一致性)。 以下为三种方案的特点: | # | **三副本** | **双副本** | **双活** | |:--|:----------|:----------|:--------| -| 集群数目 | 部署一个集群 | 部署一个集群 | 部署两个不同集群 | -| 最小节点数 | 三个数据节点 | 两个数据节点,一个仲裁节点 | 两个数据节点 | -| 选主原理 | Raft 协议 | 管理节点仲裁选主 | 无需选主 | -| 同步原理 | Raft 协议 | Raft 协议 | 通过 taosX 进行数据同步 | -| 同步延迟 | 无延迟 | 无延迟 | 依赖于 taosX 的同步速度,秒级延迟 | -| 数据安全性 | 无数据丢失 | 无数据丢失 | 依赖于 WAL 的保存时长 | -| 数据一致性 | RAFT 一致性 | RAFT 一致性 | 最终一致性 | -| 高可用性 | 任一节点宕机不影响服务 | 任一节点宕机不影响服务,但不能处理连续宕机场景 | 一个实例存活即可提供服务 | +| **集群数目** | 部署一个集群 | 部署一个集群 | 部署两个不同集群 | +| **最小节点数** | 三个数据节点 | 两个数据节点,一个仲裁节点 | 两个数据节点 | +| **选主原理** | Raft 协议 | 管理节点仲裁选主 | 无需选主 | +| **同步原理** | Raft 协议 | Raft 协议 | 通过 taosX 进行数据同步 | +| **同步延迟** | 无延迟 | 无延迟 | 依赖于 taosX 的同步速度,秒级延迟 | +| **数据安全性** | 无数据丢失 | 无数据丢失 | 依赖于 WAL 的保存时长 | +| **数据一致性** | RAFT 一致性 | RAFT 一致性 | 最终一致性 | +| **高可用性** | 任一节点宕机不影响服务 | 任一节点宕机不影响服务,但不能处理连续宕机场景 | 一个实例存活即可提供服务 | diff --git a/docs/zh/08-operation/Active-Standby.png b/docs/zh/08-operation/Active-Standby.png deleted file mode 100644 index f0caab5c55fa4b8a7e874b6629996f754f3f3d99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164433 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%0AoU;dgK-V1-I zB$A*Oy#N==8YLy5i+gC2pnEiQd&JWzw%w4Wj5D%SvUw4-{Rly;IRpVPsG6}W%D{bvNo2Om2)SC^F;Pj+hG zIKk1!X`?Ndx~;04{Tn4&xL=zO4TS^*?g~46sH}7y zEqDQn&wx%n-rcQ%w}r4DehPF}D%s-yW%?z>dHP77JNf+d6qG|b4I9Pz`C-x_F(F}b zaS`}Zis8%3D$FiH#klzRNR$Kskc;MxU%vd5999jKUGAIDi3^8U&(0IUxIJb%=IG^6 zXBP;PjcvxJEyveT2wx+Tu7x@EYJcC$-{WfeBQrAw0Crom?@alaFAEHjM1^SY+VNmX z%4MrgT-j5LXcQwg6@^q5XCHXO+p|1ujfV83k((PEpVY3FgP*m3U`bID&9HNDP{~!3 z&~E0(c_iEew}a6Ns*>w~9zLM{48{HD=1*@y{0J}QGfNTauJ|rVC5Z$z7|RwG{xWEV zn{*GSE!Kkjb5{Ck+sEo^Bo!5SE{aK<07kimi8%p|>4OJISw_3r#y`L|Y`Pm%#D*C7 zNsAwoo<0S__OKs;b0{t$0qzNOK0M15hj`;>?3iyvW*=53ku>Wg)?7|wz^qns7#cSC zJY|lD?4HDy^3r~(^9h!cag471+fYnd+DDjfY+4lb=SEz?e7|pAuC?9@H3k?5pummM z!Z(z0dCU-m2qmhZES6bLz*6L@$y?FTp>u7jf1*+2n?!xCaB3_Y-13(pU=`dwc>U{c zigMO%O=uTC-zfj(wSGL@gt>2lUa6xG&e4CMq356(35?%?EUDRnfdRk{!eAwMF0U%n zW-(39cAR#@aw{sFpFHURF9PUwuuVXuatlav@$t_M4W&{?J(jb4G#)8n(Lu0C_SpEn zE8_G0OAJ{~U19`;P&$~t+YGnKHk}+qWzx*0dCfQtcP6J5zOSH{ezFkL&fDJ%Z?Unt zc`Hx!N;l=2TY5@NqLCkw60%;n+9s^gC3St~Bq;ft{I!{O#xr-QLWLSbQ=Xvp7-T|9 zpbQ`*D@!Bl@&(!qvT8;y+<4#9bo2r@sJq(=yt?(V;#)X4R1_3&!%jm{3tB2zs_B)d z)b>@+tw@JE?Ma)xU{e}BK2bEN(c>nK1S)EulGF_VL)>Wt?vo(w7eL8cTFT`O$Fl7E zXw|*~x^46oCLLsDpi-@t??5LZ5?rwe8v|Nh$4U&d($WAcSZVSD8^Dl2xzTI#^Y!pZ zkt(Dp`Z60MnV%TS7KzUaZV;HL1|U2GAPfdtVUL!U?f^Rma3)D#|0>a4n4hj&q$&Yx z>%O?S&7=-WpHlb+npOt%$Or*nQ%vj}7AfiLEkv_Y3vVApyr6s!WDDq)gMJ`Bm%9if z1p*T#r<#kmLNnnpF~Yu1asPiW0MI!6?d-n3^X*!EuDw%^=|2iB+elgn#HEm}01yQ* zrw(^_<>lmr0gT}3DdKsw9dj3DK$ejR`HkUk+?xL@-71m1n)zoX!6CW8MvUJUb=SY$#Wb8FB2~g2=vPUqmpsR zeumH}&GO9OIOCb7zWyb$lN^AU+iB_Ppg9j6`Pb+E*Y=lZho-3qH<}sYdbjskprr9T znXC8Q2TgynP!aztACRO5Px_!_*x{$3NU$M%Hk8QCv|+lui3;rqg&DVe7ojEa9uEb< zoC?M52$?g*UnKB+qM+4%eREU7d07dvFfjV_Tuse6gWm8at z|CJ^ukHdL|O!mh7yfh|Y-oe+&1Bbk>uI|*d+vxXAy_%0NG1w=amYM)beMQivUx^!-@QvpTJ^G<$j=K> zqZlF5fRY)7y`rJ6uA~64kk3T0O8pdMY({!I%Qyw-7qBh3^=n7|{AnmI-ULto@#DwfxjoXNK{PY| z-`g8WV=^4G<$@CnAa6@MI}KJ6SW{@|gQPp&ty^`_oddf9o*AdUb_#22if_D#Cng>E z9)M&3mIQddPL7UN_V!Iar+biphHh-m=cb5&d_*i{;s5hWA!zlmrEB+xI0GVh;8=ni zA`3Hixw(+d_4M}6lJak?txcmHxN>3KP+5@ZEiZz8KmflOdM@1tTo`nN0t^XO9<0Mo zC-Qip|L?uEID4^G|3Ei4JiMdhV{k0_fafw+q&-z-3+;sG00RXF4jwU=?u(TBL=lWY zHSA5|D%2>BlVgOi7QO;JKVXE>EnD9}klhAT@!uD3Srmpf@~h?Mn!#toPle1h>`myV zf^m2dE&xd#(tJiG3eaa*T)Yp%{mA?;At7Nf0VG}L+aur$RaI8f72zXzNx`Q7_g$OO ziPUzp(Q&;c)^qAV>o`!^Hq>BOfE92OkHO{9YInh0El?G6KT0Sf}#M z!uRZKI_TPiK@n?G|9{_@*zyzIM8XgVDf2X4fEJ8DEH->|ASprJ z#(B99gqa6GZ{Y2{{iqRngvPV*@d{2#*oEL2-saFyQ2?MK_z7-qa1%18z#cRb|G(Xh zh|Ep^*xdE1vOkn3u9N*w?*LBW&Ye4iguCm8*FaTo+S=Y8=ZPw96u39M-P*Yhw%u)G zBKAMTI!ro9O+@lEPE^}x?fBem1!R|L*ndta@|$ZB<$kNHI|qsplu)Ivc4MH?4%`y( z%!sL}{eYU*(eVUlG>fQj`y+T-wzG{AA|l$%@ob4bkZcDuVEKm+52T7>8o+?N{oivA z2vJplJ05nU-_?Fr)6s8h>#-t7H#dU{^Pdova2wQn0O&JB+SvS0cM*G3yApQ>oEE59 z2y$`)l4EpyJPV-qur82mgG{}6#3}=FA-Vte0WW^7x5^an{?@bMm+3;YkWUHbbMmW5;=jTCL?^4j6=i|6GpG*%QY`MyRCxF2Dsn(-#O| zMMH>V{NJ%`eggyr_;qfssOTl5?**SqUapTpQwFx@`Jnut-xHT08Fu>nU zJEJEiv}%x3{Z~NDMbfxH9lwv5460#I{`bY1$XT>B*%RSmi-?Fo_zEzjnVFeeq@1N- zx4K^*Z_h$D;f}^P8Q&JFP~&zJM*zA3a}cQNVBLy~Z6Uc^X4(mlYHV=uH6g4e&yD{( zG)D3rt1c&6{;I06YWX%$)B5gU48EzJ-h1#NWn|iO6_dfI#4P`=MQnTwvMn$?+Sk_y ze7qzxIHlX*UV|BgU<}x_v2NshY$%ARJO6ugW9H}I?%_O#obn%J*(otCt=6a|5N;y4 zy1+?XA1|4L2T)LD6oo$tbr&w}@|O?+0kS9f9eC=6nk4`L&a18U0ymGS_%nLjW=e`4q@9GSJgQfsKfQqQ{Y{w>+tsafdY*4j8;Ayuc0GIXuiw z04y~GTz?@O06B!4AzUw%5do|Jvr(l6KH*JJEb5A7fFuOirCSi+U}MkEE(t$tD)sB} zTR6Dfal-O9NL3<*dmB2DAyoh|Ef{s^mR3yW)^GID25NN`xOT(;Gf+mZQO;F3I5>Ls z9%V&E8&HZ$gY6O)hGED_OZx#VRdux{u&=}RLJ}n7^$*D(O+1910a$J5Xa-jl^g6(S zgS#!Mm=e+aEv$3w|Cy2IHB41gI?(|hP#8Hwc4dQii-U{1YkvtT?0r~w$XhsY;OWQ3%7|L3K}v(R!5HUORgAo*Y~--(a` zONl(}An+k|c`!UZtyih@HsFd8pkwfhaj~%If*q*FfB*J^^3U_UXD>807gVtj0rCO= zvm5!bd&|!iz+YJ<#%U|ktKsM5+-SN!Z-PuOBj-20A9*67#)7uL500kn!;mQ#9bH}c zUkUN?K{#>4&p%QWbFl)82~|D9-pM@ zIsK2_{oP@U8eYubxd`x;1|FcdudhUtEKchg^D(L$E}}WIEyWiR$w%E4kPS><;)i5n zf#-V_X=q^IkG(hFSL5Yn8OwB}Q> zxcHvkkv6xJGvl8GKh_VX)jS|l@$z~jlLOToWOEic)o}60ztBb?Jh0&!F6@91+_80( zW&R2*LF-En(IYXRY*WM>^4a$COWr9|FMwSPEf!$UwjqFl^@OE|a0sI2-u`|`&ppOA z-ka7~?ppUQG^|IYP}_K6HXls855yfXK}NOG`7v+~J`@p#prkq$JXNA#mj_EG)QhOb`+gTPXUn5=?A4+Q9MI0Vi+gt0KgYHwrH{uUTw0Y6eB zTJdpkNN(STK@3RxA(Qdo#YjqCiOrt&!=(e1=_3HO!Z9h5V@GEk^B%!M_6ciNX z*a{mPxPh?LpgjQ39JV1BCuh6mJp>~1(My_Ue&`Kt;{}Ht){3fgX>sveRaF|Nm9@1P zEEQC^dGx-kd>jP6CPmbJ0MeE%)$`Tif&|ad+R~EubcYRrNRegR{PzzSvS7O3#Kahu8lfOH zWD*h+$*T+DmmukiwXW+>=Y)6!sG*iur|j@kQmD>So%{Nd+b}*tRT9D~SR$G`cdCus zZo;i)Z@-N^_%$`!O}sZZZjpt8i-L!b53pLT1}|4RIXSSa&^;k}zEJ@dGN|?BBML%` z0B*#j!Lc#7s|!!*E{G1%P*Dy1FI_X99fNQ9=7+L>qEn4H07K#7!nT0BjERW}{1m7K z&CUMEWkEE1@ZsF!<#hlpoahC(-~l3~qeDUWa<*qac`RkUyk_SINR+1=yNcbR`W(X^<|Zw6D(|UIo|f zxc!IOWEGTw0btvhvg4|144A z$DQ<2>8!Fy;~u=hXLRaG5i)FeV6IxykP+*)5>Ki})+ z!J>mm0z3!^pcasBY?yHhw32{!Fi+!&G&0t1R^$UVVtV@d6pVveNSy3e1y@`6N&)whJ}h99~e9KKdzgF&F8zWI}4`^pw1Up$4wC9dcc;0 z_K&M8KSj-7sAQqW+G9U|ZvJtf{n^)-(7Ob}cQ8T-E>cf_KQ|lOTx5134x$+wf+8bh zoHlS}YquhevPdz0r(&rTr9(xMw1 zx{XL#J&9z80}TBk+t6ABFj0@f4^Vz(1o{}YA+0s@X_{jY_ZPT#h? zW_;;ZuKvPMG$zZ4(1VE4A}ldsZ>z!8Mzkb$g&C8tvkz`n!akmuC}fY!DAf2_JNeYkdp3-s!5 z5We5#x*=o}_Z5#eCie$rX)3>c)B55D=Ss4x1I-A9vzG$@CS9=Q{WNec;1i+E3huhw zq@tEuG-T5{??gyT;Gu^5 zB;CSoTq?Lp+Tr;A3grRY(smd0K!L-osj2Dbca_AY3m#h%k6~s)!ohgcm4Fy%-&ea+ z(1?Ki%Iw9m5NOf9w6~ufA5V^tuK?o+!eS7v->c3VKEX#t@ZLu5NE8Nrc2xz)tHYz~ z?d^r61kCXaOPEH0d zL^^u{(&H>yK0`Azl56(p#*m~b41{u5$Vy$8IV)YTN~m|7<{PG9?{0yLU^v|5lwCS77R|xx@fHB?0T&FJGfj1MXfu=A zIXW_^aWaE|IP2;lFY*o#_*yzu1w1$W3k9I`Dm3F^3Tl1eR6%S2@&EO)|FtG$A>k@s z#cn0xP5Omvu3`LULnI(Vnlo^_*zhSKp+{bDACq)V6HAM4b8!m*meM&y1=}j1r zh=f`=Bz0gk9XXDQRLL2){ufKb%)!Vsi4d9~Ni7qPqG{ZOa@v#$~ zkK_MXPfk~Z(iU=TY`|H!`s0WcQ+*Sz+OK{19jf1SNHFyl` z>)!u zcm~(a-;bskNB(+A!1@vK7C;BblCt^y)l#Y)~YDlnab*J{xT5 z0$wT%iHyO0y1BUtxoCiHLpKn-fKcc#6t>&?#pl0!_SR(rCn}`gL%^}nt>P3E9P6Hp zWss3|O_0TWgn4Z!jj0G>WSd!c0zFX#Dpoo#3m>?(LZWBj{NgLpKJq&u@ z8xv*!$w)UwN8>4KT1GbluTd_wQdzNFg$!%qYo9R>tEtlaN$ac2-74 zlv&xEkj*2ZLP$t9AxT13C=x20?Dc!y&-eWN@tpIVqq^_U=RL0LwJwn5z;%_$TH4y6 z#wT3465}m2%9a;(<{0OC9oI#;vJ z>j;%S{kK!Ocl$cJTVDBT1yDy&yMEbm@;gD<+}UvvQxxMFgz_Te9S9#&UhlJ(tCoYf z)q`$`!v6<^hVBf}c_*k8?k6g|33Xn){k`(eMXd!-4%5?rcxUOyhXl&M4}N{pVZHWU zAWJfUM)#`6!-dSa-ezIS(Wzf_w8vAUOQl2vi4ZbS9Mzi|hK6ZMnGN@eK)2lG%QRUo zyfWpGbKC`C0-;)@o8nKk!1+#DJ-@tbk8=;zQW6i^1HLr7KyCny0$hFldEi3GqQ;HQ zKbO7E-4s`Uw?A!_&ENjZj+PSkB*s7HYTjJUz1GOX^?u5nikJ2Hc@K^n5u=L|$K)AljB1Y# z(8jW6Ni|$nW#Tye*k$RCQG1o)jq4jtw<->EjGB%9c*OAZiGSsa{ASxc3+Mo<0ec=F?dx}zKJ`Za$tAxi zG5)(!$!v)4n2|W+7*Da3vd#zUGp%Fs^oDO8bvp(|e*8&^qGqM0t_@r`mF0I^Df7}U z)R%aHrTcBFzwQmwo`ex@$tba9B_$uFuKB|~?(+p^!h1HH9rhY8FtK`P z9{=dMi=_-5CKV1uj`iL)P*|>q4zXlVwXz~=U+Y?q{9QN6A7mqpFF4 zv1R-6{9=hq6^X^ms3>Xy0fAtZh2fC~$9GXyE9 zXlOj#-SysTkr?k`Nr&#ce`@!AB_~^i2ay z8-11m2x%d2{UL*Pl|(7k)c@>OqAi7gZ!qi>$4Yo3+y*XsD% zFZA>{bmiy>4u8vvW%oNa+jo`Zu04?MM=A<_x5Mq)q(9gbf>eScsUzfgCg~b)`_U{P zJMq&x=7Z4F>gPp1#{clfNlJ)+Fn3D1zRQ@4(?6&AaOv?oPL1;ctp~*=ByL(*ppLl0 zbvRMr`Ho{|(mzS3*$O7<-^s{X*03|2L=jF z05FjkL`g+8=^`1y?l-dPCUpPiI#iazvDE5W$2+Y`Op6j~SR3A*Cy5E$DaSBtBu&sr zN=fB)SkE)3kmJx0(Qcqt;yN5I#6e2ZMVh6(v-><7TP=Y1H;k>XfKzauqcJO2VBnut zk}M9RqwO^sqQoKkAG)jtYw&_E<--LtPwv{Lrf~o?Dr#!4i;6O0lk%EWhW3ztSK0Z| z^Ye{2AqaK@J-x4JSU&br;Q8Mt>R1$azQ&s{KJlr#sEea|zER{=p~j8ak&_L-DGz77 zqP)l$_IZDTx##O27yf;4Gbl*wSXQiu@J$I+Qjaz1i?&Y%zw(Q?+r45-Z;gj*LBDl+ z4q2_N+jD_Hk8iuV^$Ls*4;NzmGnMS7AUpd54L8o=-ZAlrFltY+w6|TJH$TR*+_@2~ zU}|P|R?FmU99^lgFlV_MH*IL+_y$*#&IQvyy1TZzq|ifj?m?du?kY5AgUoh@)!F!k$S1>J|K2LwlP8JAa7oR^ebX!y2| zBlrDEjnQno5TT!_(0%ixpOB`|)V*%~JkLOb~+R%T+XF4o3J zb9-JjVEW8U%3Za8Z##`Dh?oV-B&%IH`|{V?8`BkmR-KoM%^MwLJ;dd7k>_|7S?yDg zl;E3wND8o&@A`ud!l=I`HS1qB7qoht#&i7H-9 z46gJAW)LuB6ckS2g@c2cAlp=nj|QO(j!`U2-sm} zX2Y8Wh>MEK$^>|M!H=^6{z^?r!RUGj{m9r+rUOZN`TRLb*Pkun0qN;R=-oh+Ku3=P zPFJ^I#V70i`}YY62~e0Jp?BLEU=RHnJ&38iK?{NOtu}|;0C{-$T~u1An1HB5qF`gg zOY9HJ@$um#%FwKw^TtEG&$K_*DDJXx*1o|Vz_Lh(5eU<=ZgZcT`EEG0%Q zjQ>z26W*;;@0_KZKD_+1MN=aptZ4e2et^$x;;ck~olJ30@tE>#!0V7@SMB$OR3v6U ze*H>#{1~LVRK)1u(9o$Y;D)Hl_)ec5<=pV3^aAFKYaJ+LtQKebzqoYukHrHY3MC|(tF#s5C#6q+e z4^Iv%!M*$Tp%d%x>r+rtf?{k7+8VSoAk%Ruq1FUeg1Y^O2Y0Ov)6WAXUw2v7kIuHM zXZ%eWxL1B>&x7rkMZ=n<4BuOw$_IOTN^^53C3=pX+FyXD1+-8p6TG@lbsGiwkET`I zL_~}s0r9Qbu55Y$OL;6lX~{DTS1D7MjcAN1>eXJ13XWBbDkC&`u`y&JPF3v#cj zvJzzR9OytdSJwc4e^{*f@Sz}hdioRs<5zk3OEWV8vzwvSwY0RfwVeXA-J7R-7EcX= zKX?a#-h&>7@|K64JtH&Im#Sc8c^O18RO=8Z!lQ9Ur*IhIj;-(CpXBB3v=Z4=hIDh^ z{{5hbF{HZ)Bxy-WH%MF`r>}VFpji>eTVGF*v6`8jB+3g=5aab4zIAz?pMQp(eFT9( z_VB);`p|lwa_&|SRKQr%=)Ul_Y|P9?CnteX8H^N|P=_(Iu$VJ)b8ytRwc&xGdgtNd zDkPHHX(3@hIN+yMXi zeLGe*L+8Y(@4ctDU&x8vetI$^F(_l(?;y71zQ1k4)Kv$F-cxj^c5sy**vLsWZh zASI8CT`!-gP$No@-e+p_78up=9}b3+W=-Sw^z=}*mxr2Km|%fGgCLd`bYjF|HE>+4 z`2+I%dEv_`)XP8&L7ZU2S3^luTT8;u1%^gix(c2_9-hFRU)Y`C{nl4k(Q4BWp5WYU zXaGdwFK~iBlobp3!|8&A%~2OT-riniMMeLB08~6heCL5805(NCiSs&YHgOIjY;3$U zXQqGuX7`(;@!akrX9qyY#KdG`VuD3LDBH{Ng7yKG=^p{6bKIX~(=&`d4lk*As4|{w z7YwVa^0Kjcp`KIW^7~Pt^HNTd;I|0D!EfgIt2y$XUS1I1T!WZWORIk3(NXKhcn&Ek zPZUNdLpEt8=CsHvyzw=0!CWse?2eqeLNwH&8v?3ukYi)L>e9Lf&F`993xa|&_b&x3 zwdH*hV35H%E`x_ABs9M~J&>uitUOJiu8z&kJ-w4F6f`v{8~J2M!}QOD?f8UsAs0Fe zz$Ku=&|L;iHE2Utg}b*lwEig@iJ)`>(|ffr(-ROZ5Lli9Mn}8TlnZDdFYfQk3M~P2 z@8q99$elzp?f=Ww+WI+~QX_cGCB?=4{QQCxII#bLzF?WcQ~(WJ?C;sx8s~`!>Yj-r zzKdiy(fXmt1jn*G`#n899arQ(r{Y@7!M5OJr|_=__BBg7EPGm7dZ@oYk^0BvWqFS}E3 z&ZsS}VsPUIe0UBxr6AkCL{^tvkg%4si;NuvAusQr_?peJW>z1At5;9h_L!d&kKp8_ zj1a9+FmiHQ07B{W_t#~GWg`v~A3MYx;1lC6>G1(|i-{RfFfmX37EW)noQlun%>U$= z@|o5`Gr(xu^Lpi|Uh7X^fpv|W(#@im>{*SE!o+FJ!fj2N{q2qRHf?z{H^cDxXKQCu zz6D?KnR>D2mYOYh)$`Z zd+jva%%=iQ#J56m2@#q6sVc`&C4h>cs0JKr5GXI(>H4=ONQKLNu}us((cvRUN?MJb=oUmOS6}u_Yj(+8$xumgA$3kB!CAhb(WLyfWBcKgAxBk4;Q4 z96tOgI{NbU>u#H?jwaTXk&N3GW z|4~lxyf&;zdcWbo(Q|nkr&7<|daRcZI{tBsIfO0HzUFo>FD;RKz4YW|CIk^OZbK+g zTx_OWT2SEdpE7MugX}_hdQPD{HJC63_F`oN=I+bfZ2Vgakxd;#hRS)U{{`kf8(^5H&1(PsG#Hr#*pni35 z5Rm13+foyt%?tYaI13A%%ngocad-YQ-6qZPdboe7G-G2is8-nq)ZncY-;kPybt^uv6mg<=5LJf#kI8)QQA9 zo=+{4)9gH+UtXh;g;Ln&H72(#!QcWQ^dKeW-=!tAygwO$0}T&T)6$v=#|LRP;ojKu z*k72GGs3?YY9K&D(CltCux{7()`2`$OFj6~K_UVT!niW4*K26M%D%ay(YulEwak?M z>@9SK=pddv`O#No)^x;-Q3)>Xw{Ize-J1xx-7mCx%MHLayoMXwpCEUNm|X!77(om!B;vxA(A#W2p@!pP(c^=ud7F7RhXW-&sxyR1U>hm6WDx@*s;pc#?>*YW8xyTz= zy*8e#hxra&OnHs3^6=ht__AYBPx~7A>F|wn=5H$LJU(_xBSI6?8^}3J@SRt4#K1+Y zy=2=efi4=DzY3RUHl42kt|imlnfpT67isrj_?`mm1!e=97ya79mqjXKDJT-L)7a%!17-#*rF4hFX zLkPwU4ZlGyhjj!M*0ln|>4^zo;^4nPW%9pk29|CJfhc6 z)lkVotF*m2Aqzb^8lii4?+#XbCASA=`$VZ^b%MhJ|B?=q8Hhjhg}^AF8PHHuL&bRw z?bL+}E!T~_u4-!5HV=}sW33X&R5G%lhzN+{KS2F?k`AcF&Jo50coT>NELBxuactco zpyCELGBh|SvpFX}GFiFs;WXqW5EH&bs1Av$0ic$%H$)r87N7v zs6sVC$Us&7#%ISH^O#r{oE;sBM*ulFAl5O?Q)Vo5c{>{H6OnTo83}R*12~Nv8Zu#e zVpSG^81^tZ>j#!oG=AGo`PViU(|0@}Mg=%dT&0D^b@;$=8AwEoihqKe9;Jto_ga=x z<_PCg&lztSQe-zW96KfrhsJa54+2;Y*v=n&^UxFHwZhzv9u3(QGTW((V+&Ytd!asHq+LQg%$P2jZ_sbq67}cJSesO=d%9!56wr% z2@X$8RFtA21u{uSX6B2h+S=QZ6z~$X-yz#*Shr`>Q&L#y=-_??|3)b+{(EtL9)S~f zXusx$9~8Q)s#3JRLdXxn`^EkHBq)qQ?}da=;5)~+GVtjLqVpxFAnyOaCMsv!BzQZA z{9IF@1bS3N6kN~K>G<;H3r_i8zZj1k8AIsGePu9N8F z(N-W#0*4`s83Ju@f) zy%Lm5u-?F90L}**cEFOGe{*D|Zx8O zE%R8hmmxJbup6O;+YAL4{tg$(8=x9kDUsWwS7oD`K)!fE630|41C%b}rW8J48-C!nuLd4-Kkc6t)yf zG_ppVO~9vslEg46g%KtO;=^?bO4Er?S=LCur3 zuWStr2C;%sN35OV!20)vECTX8bR<4oy*?+<9{G7f(0~?*uXW*4Px{X01d1i3DtL2( zBgeJ#4bm@Mz{HmILnT5NS)sj1JZrf+5ra0xzrCcW=z_ZXc6WjIRXsiT;o1i%82=NP z!mYxPzAEUjB7O`!g*hWBPR>y%D@5McwC}{vUcj?mT37%) zhPDV&P-1D6_VCAP+=D(?yBPeS`Wq{P2-q7LwL56?$0Jf1|F;O&*?P2>7ir8v5}oqj zOjCOb=^hL7-Av$lz~b8>wk{^hnfgMRVkJ`hql=6J!ItaQr2_ki1Cco6x~5*6Z@ww3 zj<(p?l`xWh^N04<<8ZHqov{8*Do(p*&mJ<&K>0aX;hpX9i>5*St>W;=RaYo}}Ny*F4*w8WZ$IM&6) z#AHTFG|OD+xSv0J*fo^Md&^h$>_M#_)NUM3(K|GcJcfJCE zUEpa-N~Aj&Q`_tSJrk}C(!~oRfZSl!#XyB$%CdS08G}z8J-{oJg{a}K-+keGvmf;w z5J-Q*JoG9%(`DcJ1q8%a-+-BgP$Dxsdpt%%=G4iPY<>y~3Y$L5GiTq1PpYwOSM51G zb&#VEf%+;>-ag~+e`Q;KGGcnE=vZ?_vbosyY_fBYrCUs~gk>?0hiJcaN7ETs+avn? zub%T?Gg^y~s)YRETH358^W!IFs5QPlQQj`K(kAxZ z0Kh5H>AjfHrnUSFhq#IE5>n6&JS>ISSV7ulv@mf~spko-i;Y zeP=D5Bl?#=gCViZiF7#kPub}!qARIW(x}>ukW_$#{RTmiOB(9xU#DHY%~_$o*oH&m zwceRaT_Tr?dwK4-x#1mt76YzO9PQ;=ES#v8( z+=GtD(w^fwJ1;kPz?o!vR5DCVAW}}nx2Ai{NG!8YEtwdY#i^pZ>|c4{)zv4)b@pt` z8QHNldw~bVTyr`PQoKlJY6qXk)744z_uup%gUz9LAbG7k!%ce9gHu19gN#OWAeMuX z{oSzsglL++Mf#`6h578teJb~<4OL6hEIpXlVpuM+F)`iWxE0(sH(#XO_&F--r=J38 zCaCy_WNvS&?-kPBR+f8c6(*##yR25auFU3dd-e8oep0d6;%ORo``iRU!h`sMA2DTf zJ*J8I)gbky2nf@|wSw*gea;k3yJ-=$6O5Fk@vV*F){t?bzrhr_ezHRzj4aH|8yFZv z#oz8`Y&`4(Ne>S!kZ^xe}ljS3@7?xn5F+= zgC%cd;WT<{ zZmNEast_ZYbGtuOF9T7;|6%jM60+>CpWlNX7tQ8!|JqIezV9^HW%JFf*y+h_7BlfT zL0aO71xGoHS}-Zel=&>>S>R?4JIfAmhygx?IW8e73A9msi@CuFU836Z_Qot2hed|F zd#ON8gm&8uK|+L10G2y#z*+_dNTAtlhtkO43l;l2K{b3o2Zw@&5n{Y;)pnPLtk;M? z!?l+N_aHEQsf+#rj3q>bUweBo9&0e|w3yfmQLqOqT)dHY|JSb{xHkaM73da^0}w}I zlJRv1NN`PYw->k7~;md~_7&j<#VZ4eW<`ZEjc&kFe*FB(#qZz5y>p3HpXZaae9RlGkA% z!EV&4e9HBFyl#EKaQ_QaPfQ0m&jN{TiQcqR`I~b`rd&OIe0&Im-Mwi;w17W>rJ#}} z%BPBp@yK9g#F<<^gMA4`c;+z2j0z(w>yDVuq8R!#1jXjp84tg0e%XBd=utggU0wWX z*SNO7mO1ZWegKh&WaZ@1cKgQ%tJ_`2ouGaHPttF-Op${V0-ah*OAAlh-G|fdco}^3 zp|IjlE*az(gF^$4vAVu)ar5R?ZSBIi&lbt-`t=i+j4wc!L9(*nKkEL!&u&KdTkD$1 zJMGG_A~@HOGMZ7aduCegAtcPnOAHFEhqKZ@>?f67Rb-!XSqncbMOSBVJN;IJG>cgn zdHpY?k)Y#1PcyU3MpKi4zG+v{mBd@}WQj>h$lo=%TEO)+*dtJ)mv1Yyf7^c_eJJKA79O+MX@#y* zjobCrF0+qR&9nqeQE0R1vMI6M{k+@egdaRd(YcR5WxrYYE)?I2M6oxGjJk&c0es1` zQDZu}Xi}5nn3A$GRs^d4oa}7I0Hk*#v)V&GMLoxWA9!F|uiu0Hbv7mNNWzzjO?H`X zY;5dAObfhuZ@}8|@5I}+%rN6Z0pN`~8TkF~2mj& z))`{r6Rs$KyV}RAIo5jIF^$d5#TVAe*yCIAy6IS0!l+d>G*%WD5xX(&N=V8se{m{p zePe_9=ut!W-&v^jP|Cr3hI$NQ*&49nLPA0aY%vy8P*m&?k(QGBXs3z18oD@~gQ=<0 z$k+kTgqf40jlf80WPimIJtP_}6gF^|0>4f7Tp(XDLd?O`0h3UJ zqIQ02GIv;x+}*8`EP9hH7-SO7(tLN$-z?FyPWtrW1E!ynk&_1p1&O==eTF$8WP90&RU`d1119AN812tO%65qqu%ZB|V(lZU4Q7Bc*{zf~t_(#f;GV+#?q4GT05qgK4Flkonx%h8Xd6pljNenJ+` z>O#q>ktdTrf60F$BUZnjU>q`cMM}t*yqu}#iM`Z5LeLX3MH-6lVW(+!^N^B|xLq9X zr2k`)&m5w;i?DOEZp6kRoMC$G@EfwXLR+W)q2mtXfW5~_+?KRBx}JE!&33G9EGI^XQ2^%In*p`c|Mo@DsN`t(|E|L9y^`D*24`S52- z5*;$ers;Z4KOt9f7JEnMLktVXd*tntO&4R!MF(R^%5H+DbCE3H?=E8$(e0pf5T~Nt)U5>)I}Ivy`;7Y6M4!YR)*70}vK!!Xn>H zV#gLU7Q8!?f>M=OAETjyp>7taaChNh3L=+gTC@t8`M1h@XM2fLOSlfhn}z61@L|ZC zhYnf7aJTG?wP^Ak$s4easH=a14HX;|E?_JgeN;M*sj{DQPzmQ5HU1cgHjY5*7zIHg6i?nm+CPrJd+T0tFD5Qedsq5^F}kN#ftnOx(faxxV;_$A)(wx2Ub%YJ-&_2$WHQ`NU<8m0jTSn6YswPB zm(`hy*}elAm?YY51CT}5b&9d(tY1`7kx)`L2q0uptkh53ZGJNV#K@^UC6)XDIeCV4 z(v2%b?oh~lzUUqH!Zv6Jv6*TuvGmfTlW)o#09vp2OhfImt{J)lZtvgam6iZ=?$F>=X0pFjd@TZ>+CIq#u`}ZNe|i~_5qvqY zp)Mecqk%J&f+FUTmQ~IzQ&U1tr>SAjpU$(&noi{JPVag%D^XZe|TTuf8y#Vib~P8K}c z{PE9U_{PM6D)>%s8%>-*(G#!fj z8m&(~CuC@5cD@f(5-cx?iXLcT=GwK3g#KuIy01ipwtaIE(*eS_-)FxK&C;wG_))vk zyzehPYc>~py6)pvOLua$z>Or0jq_WV@3YVB;fQaAs}fjtKTM2(F{e;Jxg5yg@B@Yb z*QNH=tLI=bf^;9j3RQ+iK<83Yrb^GXx2v#GKZUX&Cx;c@=U|?+zRG*W+Pq`DDaK)! zxUXQ^BAUg)<9)ro&DY)+>E)-Dc&!e)<1A*6X+g(}`yc5m1zo>gBvX|#;q|!)e=(Y2 z)Ijp`z6Siwj6e*4HXsG382HE3LweyvJ|Us#W6Sq9B5DE)SqA|rV@!-cfqgtb?iejC zLK#6t&ondGk)W~^as=`RKc*w zpovpbQUYGtFcQ@|23l@JkvRJbuWF zO;*cB`}15|@9Nd={{n?NVPJT?GQYGG9u|hLh8`cEo($R@f$jR5v+DEpw~z7h!#p_b z&8BnmZ+Jvla7fU?lgd3?pdkD`2E616ggDi!>K30$+Xf7-W0RvtT_kf{^r{*jkmGj^%1kfm^a;l_+Oj|XP%m839r0Mp(Ti%zm;?9`KmRAw zA~iL&xm%0us~1Q~*hRZfb8}mO)}iQ}p zB}Nt9)Aii#xrdrSN6;6wb=6I+uHL2(Jz?dB0 zRE$5zUdz=ar$jAb1WcYIj$ zg>jS1x0!{V>*UFxeD{_^skr1ItZx`$Ja(+xO2nc#@$|kzMjC=(JsEp(H?oljj>Y{N zJu?-vWMpUK^7&BQvQm!*(an_cs^2!-I_9K^?PPXaC zeebfaoZ)4Z&||srw(5ah76Knnp~`SQzt<$JMJvsA9|_;S&8Q!P2gi$P4qaDIYE>Nj z?vvB*G$1oKI_1n|_DQ_%Hbcf@IjySwd72-t`L!%)8Iidt=erzkByFTB&WCS>zI&ft5Sk8>nM|4Z|Q2}%b6fC-z zT$p&QPC|~u&rcM0R#YT=kg=oDLd6;8h^oxVN%;EmF)6meoF3HXSiTl*NkE1nvCQp0 z3W*v6Lodt^;~$yq^J&VOKRNzNFpG;|igW_y${UxRl_iZk2{j7Jd8p2(gsB$q9XS-} zJI!^e3nUR1DBz~U!9Rgu;(b9js8?!>?pN2?_+RxLq?@T-yvPi>+U(A@gCD4$?{K{! zFt`eODs1{vVg0*z#XSsV2TT%EkHA-t7@w&}g81vV*7Lw+q&_p&Pih-Sp$S?E_Ag;E zv0kh|F|qh6sfQl&xN#ayFMz7}^l7|c;hyTx!vfT=8GI@V?x-z*DiF1d@lU#n|{pp@oPz|{e)*T zHeN_YQPpx%zxHyya|Ij`3PF)+VLi1E&o3mIa-XAkNbMU;GSd0*(a$$evzNz<8QN_Q zc9F5iDai?{YFtnr6h0p+%JT)Emz}+C0J(9}$Jn*?^k73~hPfA0jbJ4xO-xIJ>mH)I z$k#a}e0+>%8JY=?9%)^^TsH)-+O#Vslq6%791T~^dUVF8#ZY^u+&^$&?0nN1E*YV$ zsFwXPS}{u&UX~jBFA42scYQvP)YU9RNT{Q$=N#n(?3HXf`h?Srny@=0Br@p6L;5zZt^5TX&AAL;iz{TOQ6Lb_uLL9>{h`qcLB?GY~Sr$)@ zdG^!9g8}%Cc$B1^A#A>Nn%a6ld#)1RQ+;pK4;*d0YfehSccJVcYdcT1l$oGc#K!Dj z-SM*}g37HDf2IfT>`Pnw`^WJ30h6u$emlW%J;Tr&-+E{L?{6mN;)bVqyF~a$LjwUz zMCy67#MyE{oZT;c3LEFM$Pipva4#+yZI2mYXF$AzN({IrVyzl_c4Ig-fP;`A;twO@ zvHtwQjzT2@F$1<4Fak)D4+V0x~Dkm!| zRl+&oOrtzm(ZDpcUqJsMjXo2&02eX(k%dKBATwtxQ`M1wF37mr%5{=1WPIF0 zboZy3MAwQNym1gv*dH3Mn62jYLvB34KpT-He2K)i@h@MrU4_ZnpLSRQphau8s$Z%@ z6pqj-I!@5|MG+I2;QNOL9{;|Th+&m`x3M73AnadUWoQe-l^O(`eW193sSwB$C};w- zbJj@CdajLyU3}~@qQZcB_!CBc{W`hvg|Y$l9x!I2pq@8wA>JCf%oJ2q1$lV}W%j8< z_Ori#;}3r;wM&NBMl#he3Wp&+7GBTl>MFEmim7XRk8AvQqp^|Ed=w0_5R?~`Hw&OC zY~?&mpsqhjc+CgYL0s@8huYM{Bqs1pPcYnP{4p__o*b7i_G>^=@7Oyzvxn53>bHO# zbY408i1rGk5f&wS&D=^cw2#W{zxRCkDw2`Jn9kzXA>vQ1sHtOol3+!Ucz*7WRS28k zRG68Q&0%)GdAmpV>4h^iaUK0HRC0WJy3O#!2chIPoLH_ELl|kF)d?-{rv#%twWA-+ zg>g)Fh#W(wgCAt*7%n`DimDYg7PtmT4nIg)Hfg6A?5w6gu-w;btRN_FPr7x=Pmo|* z)Ysf=|?!yFIra9e!jTpIcJgT_CfMYcaYi(^VI(LxEI2fH zI?5$NgEx%c?83eNr%L@@-^E_C^fE8`QHN+=Aa5}(LU>WW&%cpPL3Ms?AB_X#{B(bH zaiG}y^3Q9UL7L1Cl`au|eU0bZ#K1!wXaKVe_N1ye)APuY72Qz;j)^?7xQ>p?%Pd4; zePv}zXgD%JO7z+cyPGqtamW|%Qdmwy&H*q;cs#(7fN4as+mCnT(JHYp#mA&?D&%&< z?-Q-!0tY7=BRDajtia|4?+(pE&eNxA8XC~6c)?13G`#5y;e(j8^qDwS--i#uhJ0?5 zOV#GRQDPH^l7N+Uf<79M0kn+g&MiUU4PaU?zXxPkZtem0cW3rVNlNlYtAH^Eep|D% z?Xmh~$PL1DfLEwNP;7zuEa=6&&6j?cIxe8|CZrWtf|I<02v> zouj=7K`rKQoyJr>JkHlBc!Qi?U44TL%ocMFzh6u1NX^3bMmz*8I%NZ6P7-B&f&>-3 z0BCrCP$Mgm8eOKHC?t#26&vMQ)5Si2meye`z=#cOCc;O?_K0V^ZWYCg)VnInY&4MnC}3^k@eLe#a2N%!-R#!`QFKcBK1LNP{f!zQ` z$AA0DixErlpF$U8{$V;)$Eueu!4FEL(?6T4bfAlvX~oo&Iy@^oPer z)|H)K`k!d3cYb1?Ah>7BIeZrSGPR%eBby&}hJ_u($HQs!`yU8$?{#iqG^+7V&9)Z3 z9Zda7htJ^0S!Nbu%nAmKFmssGrXcgeP*2ZBI1y^m?bT*kFw)NE=I<_0 zeYAPYZ2KQlqxJ=+LA;1JBL^*FZ z(jSmah1sJx_sKFK$bo_ZS_CAr61$KgC+K}f8Ug_tK%{*9UGpw#!c@g{>CRkH|Cqho zpC$M0J7xUwq3Ox(TDjdw)7?4wk||v^>&O0ISb*nEYG?HDaW|(}OPh`of~4i$2IypO zw!vF~o%N5ZDptZGBZv#?tFE-^(-muil@}Q(U5F z20EU>doe>3`tdKlz3}xr29tZHm2mIE$VEUS_<IS^5q z(?6x3kUgQ^7|Nl}rXeH@gH)0A-fj%KNrR?>`Q^D~*A?^Zn={|453u{SfqO#R!6Giz-ue)BvH0o4P3HVt+2 zdq4z=Cf`-U|Jv_t5CaVNlOLpOy!O#@77|A&k)IDJLH79FXUD5Oe89F8MN)P)_e>fx z)4bD{+_xYQs@a&S=zqI^roclseN5J~^rqtY8eQ6v?r|Ls|A7Umh97B0YVCHPR-X=b zwN2}!cx-n_nafuxA(SL8uME>(DYhpRkrHNCyM%?{vc6r6s zTRn%>`uN-*Mt7T7=JxJe-S>)o!}hJ$Q*mBCafSS@7bQpiP%)>vy0pCA-t3j#nceW| z{QbH$l$SGJQHyLKCF0-D)R1b+`?Q4r*mhp=G{I_n+&VTG=fXG&an0tYXMF1kYO*(D zQ_^+iEF^sGbwUJ`J7RFW;Va6@re|9(pSBP=s*xroF|db$oYV}%Ui)NE`c)S8o)*}; zWPfc&tl6eo+G}d6(V6puP?9O*#~uxNkxTkhq7VLwij7scynE&CK^~``7eW6rB`bY^^UOv-&~!cOspWc z@P{#{Q#sm{1iB^}LxR8q60lQl z!I?(t>WB1K<8t$T2GmmaMNs45r(>m^^{?DZnN96aP7skN(+UeOz8HR)4sVvaY3f!t zQ}(354VTaStg64{$*ZFOQ8~#vbwf-0C zoTeKEOmkW~Q?Tqav&S0SgQ$h&`Gt%q5>g!!lDXT|guS~TK=KE72}>gDu#lKOi)ZOP z6~l!T4Q-c0#YciU#M=6{BZQ+TRu>~~Z;kXyl^ZedcTPUvnAWgkWwH5d*8N&j{vNk4 z-rMazmix-ngM1{a2Rwez|C%t|I9BE0ERr^HV3+ZO`x#UuZV%&KTE4v%S`1|h(4-^m z&Fl+GXqyy;J&@UMI;NHS$)}VJ`-#WX4Q83wnG0~q&3>)sJblLbD?FCeVSmSeU-_Q; z;X?bj(wnC<3blEIDI<|t{J!O*&E!0tfzk0}QpnYVZ3l&di}uL-R=wIz`7(7UxA&-ea-~;g=asH&j|+kf=(|HV z`jmg?2fSVX%2OuIZv1Sf+CHZ%kvh4s@|mZ(=hVin_&A%Jo(6*fFAmCW%K^TQYaRRj zoT)<8j*5(e@pyc)ZFbM6p8AxBXC}*}O72|0Yn<@SO6Ag}HjE~{cwzF`uL*CCK3i|s z?4|uRL>KxDlOhrF+u5GodD->*&@sus2q|i>q27Df)^VS_MV{6}sV9EUPcJV{kj$Lm zXm9*muCOiP^muLS@1XcfrVgdxf;*r+oc*@t_s=jW+QH9X7~iTXT%q)3df4*XdY#H=ef0a*PX`E^tGwIv zLY@HYtnhftZ&dNL^BJ`%j&;4Hq+ad(dk~6QCoLmok)ra@afzoXT0(Tue^vJGt}FeM zk1#@ma`z+b?`%rE=Q;ulcG@OI{24uO6=f@Lkq!yjYs+2MMvqC1_Ci+gG!$&$CD6?x z&rA<;b)dK?-Up96&1RAB(wSP#c?h?ThV+s)hI|72Cfkc^2tuYiM22l?5^`Knc;MQ` zzr7~}2CK>3p8t?lr6IN0c~L-m{x5Ck_DnU^Mth2EOj_)<>dGfBiu>x&G-wp$v9haO z@vEb(e`kKKJ4G^p{OcRX(SS?cDAj6nuYA3;u=#st`}o7C4l7XIA76af^x2u+$+Z58 zo_u+JZTrtk{v%P}MipuapXWUnDn3wLO!wKo7hn=bzql08^k5`oHFoc-)kAM_Dz6qs zBYyZ7n!f-AhS7f+q&%H-vf6KKC*P{ANjG6E?W>w-aJbb(w#{PwWw6Nyx=ffme?ve- z>TA-J_PvyO^TIxF$>NEN_Z@nCMMphk(ogOTGM7*HjQ7P@4t%oRxiipYyJB%*vR$;q zwO1q1ep~6|<-UnheG=mbzL09TJw(Ln$-fO@7sK}Mr6JA8=ooRM@-F04dyVk7=%UM2 z)=Ati-=1CyZwrTTKq<4sR&>BtG%35P@?>(CoS+FcA*h4#&W7x|tSswygwK}f*%kNO z9?Jb@^)Gpw@l&x&MsK~JSLF@?aFP%rXNSg{r~3+ha-vdLoa5`I*Hn=QLmPkmvqR$V z^eEf9%JBPEvLS+Vi}YCQnD3+mh=ArA>)<~iq*g$*5CsRQxlX>z*M#jiuyDak0k-QEI8v<5MsZ@)lJNDe$ zwZiNh72{f}s+axckKgLu(6&L@J`HN&fitWu+b5;Z!TWJNOY3YC3J7Zykx2{?8Uq_&YVod*s z3{0`RueyV9XAoPM5_fY%+S;<-y|vkLeQg`HIJ)?qmKY6*#f z_x&SJGsq~vkXc9|A6BMfRTb;N0zgdtCWMVJ1>Ux@dY^yMK72yGBtU$dQ*1|J_59cO zc4gxd4lc^=9t^$ygQbT*c@1t!6}Xif>67A8Ac}N$tt=Y5No2d&w7u@}Ft9HhU{a&@ z53}&CQ^;;3&FQ*lHb$>TEl}OSreLC!l}aGHWOJ22C&q#?fPun^=Bw4Y;?9D+4O z%GMU4@jB?-B95IWiXgkXU`#?kfwsujoF#o5X%xro|k(Pvl}kV{8rQ z1TY=OQBdGeltVg)(I?4m^eik>qocmm5bEHE>iHxUrEgTD2{X$v#_QoU0Yyd1#(vp< zZG7MT@;?PynL3I3p_-D*V&D5u`F}2Txp)1IH4GOj?Vsj%G81xEiwZRf6OHM&A&{NY zrtpjEw#jl}Nk>&DXP_QaXIu21N69Lw^gN50s68R7n3x#Or)6-8dAWTcO+o6#6-waA z&__XLjpg7ySGOPdzq3fdBHJ8Wt@pm#%zeaDcyEE8bd9|*t1r2{RlKj#YL7G-XXsFf zkkauQce-9gu|;*8WKx@2tUH`01?Aqgys=6KZX)~M>>Xd{Idwdt`^_o(zdg%n zL;PbTTyTLyoQF^nPsIPyDPrmn9MR9TUnqC8&WYkgistO_JAY=FI2=`&~qi#sIJ3&VX`d9y|+sMca7(XIl8Qj?ZpeFSMYYw0~tkbD!D9jL|STXd;aL)s34q|*E0Mid+3s8pP2jD#e z9bHf(yrENQfAO1{9b~&O!uewr6>xLB42aHWR#R> z?_mDA%o~RWgsOBhvffwaUrs-^uv3w@^2ylA+9YdQ1v)%@Hi+{G?(es0$|IVo@DBsV zo>3200BC6{a&+jZY>G4WvaL#nCayDxDLKxc_rT)--iLz>CFSV#@dvl!>%8i|7Xc+Kcu86aZDU1Cu+v_duv)hu$(cSNnj(8G1sjO)>8_30X8D@wPd+Fl=r8BH2*HU z_d7N}!NY?`W!$e#>H4X01LC>@;V4LjYq?{+eItg@8cxs5pw_l>a1djp#G=PP55_JO zVrD8Thg-Lj6B34PLiZH@<>KNZ&V$9-fZrfvuQK$(Hbt~<2y2&H!^=`Tk)sfvBGvkE z!j{wdx8Fi?%>1ZL-;8p|QF1VvZ5J_InUeduwR&$cO+Wtp=Gry*Sb_14W>KiEx_A`8Mv|oDM5sSkQ%FvBLKi z4YLaZm@&=>9yy;QB!ihuZnk|DBzLv3PUs68X&+VF?Q7`wp0K#|lV|T}x#4!097mXt z3B8+b#Mp8tB`I;CBS;RJBTZL(=lRb3aFMKd`_^2zpD4IOEA~JC6%$ipYO2@#4@HcY z>78U9$$CZnm#7&22ke2ZC&me5a@V!oV@ynNbWF*}HupeCfXxQE&PR(yoV%loS+$Iu zkqoWJFHgLrmmDD6b8}CXNm<6XCkZ{o{toznq~u%pRTC}KbgMnfyMD*Em?K)Fzs9Gg z-`0>!cK&EM>S+tm`&cTrZCjYpa~2K(xVxAc8HvREXyOyn+O3K584;4Z14woLhW+aq?!-UrYpz)?f5rK_cU?cg@>KLC4i*F5X68c(dO*{hXMXFA~; z@~c$dGz@4QG5+JuWDg`beo=-6_>p!0i#0auS^6CueSg1%+y0psqmfOv&6Z`~_Yuha z3kODM7lmgWN|TpX?+p~kN*v`2Im_~JLNA>7cL(Vk9Br_HJ7VeM?3xR+w z95(heE2&?jE7*UrR;t)&_E#4x3kz|mDSWSS2u4Bf0pd256cj*1A-7kZBRWBiyFI-4 zJfrqI(gT6|I_X=qW@?wUb#(fW+5r1S$^RzK`qus1^&4T5k;l&WeE+_~CP{Lf_VzEF z2y^1e^RY;VhHG#=?z$noU10A(?Es)eGq8pix~L*~PahAE)pJe`{R+IZ$fIChdYPC}titsb$@K92LhgQVc}f>GHq_)z26n7_``3--e#CEv1P9-PmIb2N3(Lnt z8=X))Ab8l+);8>xPcM&cS|o=bTjZHK@{vb!b5!2f9rFIEePg7GAzxrr?KyqQM#8aM z;7WiR6HeAKBxnXUfDj;hgxl{5%|FD+2fs834|X~VP*Y5Fbj0|5T*<^RQ8Z~NGV(v} z;grNToT67QIy9%l?l-98^mtI`^wPMMFZJ%YUGYiGoYqdcyU(%ztd6~JUd9*Sy0c`o zb7yCJ3kM~C{Ap|mB#^DyUrtMyz zt?S4p?D~xn90N5zJJ>1{-oy17*K)tR{~t}~9gy?>{{Ij{$S%^b3Q3X_DJ5A&iX>@} zGSZR}sic9Fby}h%N>-F4sU)dXLRJ(}M$r&OlzxwQpYN|f&N&?FzTfw2T-Wn@j;~jA zI%=081W+?V7?y<~b86;K6H80!ozuR=HH_t(?dh)h*Jhtvy5#{n$Dp%{dSdZTBkc3U z^@8G)+pB9HTrQTLa_jK&*zhAhXT?fX4m4fTD%A=1v%c<^o$E;-jRT5+S>4>aX5G3E zbhL!l6LpD*k@0uq%3M4XGAa8Xq;S`P`u%38KJs3^BV#Wg3Ij22iMop` zFHy~Vw_LI&0w)V-mrwi1%^1F0!)T)IeDCJjrY}FR_`KVzwYF!CuWwv^)cfe$&2uAc z*AF^!JEcl{{n+2SUb@HLud|kY*QeuFj?Hh~{T@dm(!-p7%0%4)hX80tv>94*-K zvLSIkJ{}X($=XL@^t!%PD($A?ao4+pAJjhu9bgFEjx>-WQ9^IRiCXer&|>%$+I^Th z!1YK%xSxbxK~2rLjN2CfX^a`CxMKa|G31w78YFJ@mOPHV*}rA;9LLd-}R)DZajKRh=+ig zOt1)xjGlOG`>0+SQu>3m_JkS<`3tXCp)_}Z9i@#`u%R$6_X6vC(~kx3Sp3ZWvv zrLfpx^Ss;ptMcd18&5X6@2NVx=2otQLS|;=$kVe_l_yP~GWO~e3vF%v#{-wd=6v7r zB;)!Xf#F^qSDi9F*|&!;jOqln%~yxY@TRWSd|&lOPYlho;K4ujPLm#=$=taj^OwVv zMxZ(H)wQfQJ!Cx$W9Ey!|D<4F?SlFtAH)YvoOf$V3?<73=A-lHpO26K_kN(aBnSA$ zOpYWMZ(TcCC1XgQP!B#76cqowyz=#=xN?_I<&uHI$>dP~mG)Hr9+3nzCXT{yIg?bA!mo)fec0(({L0i2^n56tPxJRii*o-mp;ELZQN>dDEUo2=1=UEL1SE3w)Jhf5x?NYyyX${ zqQfU!k8!f<2pH7&`@pwZo7On$9~Lo%U_jvD6T(io`F_8ewvy#c!Si-kbua+u;qT#u4(@|>OZ6+duxxw*R7JAH*TcQ+{Ji%XZ`D8Qc|mN;FFZxMe-Fa51mt2 zskLrp3%7@2+>>4J@A=aSo~t=G%zv2PzL%k2SN#p#Fg$9Qe1K79f|#CIPJNzBl$@WU zZ)HQiWbdA$BkVsqn`g?;nf81^)!x*$Wc}B*n(kR!Z)UyGi`#bN+$IZ*FM!^kXlQBO z;Wh-0q1=XJM;O$1#*tiW(bG&X6!&PDop$=+)}%FAo^3+nqN*w>g*-dhWI~EH2E1s@ zQp$_9+r1jYic5mlUpS$#EFr-G5@*eZPx5^i_#GVIF~=e^Kv!Jv{*Mgtv=O=WYw~Sd z_oK%suPwh+v?}c5h`(*U3VQXvIzw&J0|f~lWD_Kv`+0d==_V*5xOp9IJJ2T5;Qr-# zw~yH#^y{!sRG>;!No8dvvMp;UB9N<1jg7Bue$Jf#zsN}8(sUXI_97D0ldX6!Z$dC# z>vU!H_~Z*?CQP!oJpcG>s+z6Si@sH>Hl~-o@qGO6$ql^R4h~(AH(y`j{(oxI=opCsHRt}GX^};8CEGqp6Vg|#~ZL*rvbo6hF#J`k7uDC) zoP!IsX;WQ&ed<;X|6eA*LS$=|;9?fvsx zm3-W$@WnF|%`OGjM21KgpYqOo{8;u$tg%q zPA1+CIv(=qXYpaa`Oz~r`{v#a^R)?gv%HtqM}FwNehE6ieyPjfZ*Yh3a?CazJEK|k z45(xcDjrYQqS3{ZjR#NTgif>i!w3G!4NG@`Gz_m4S-qsY$7imw)Fy(8r$!r&mnJu! zn0%z6nYFbyzk){ORDQ5`W_yqQV)qW{VIrU%PUYw9jKmg$zlDZNA(BQKE9#5c-lGAJ zf9$Int@Y)NpM?H<|FW1p*+yktlhU%X;frsJ_v(?h^ZLv%lUKqrYWgoC;&<`%QbE^^ zI|M8VT+wK{FI~BUA;zq1sm__MiT^a97# zg+_b^*Ce1WD7k-gS$yd^=-HX^BW*pjoYx~d)(lIR!PJ;n3QgM*{{Y&3V-oN`X_n~F; zi8JMMj4nO5y5*uf;RI1ETM2K0uXgR4ih_azRVv(I?jL}&nDRezyL*OBN*g_a1pzQU zb*eKtTD<=Of$O1O;PF5UuzksyXxA+Rf3_bA>iKR`sh&iVPTIOZ?VbK_`n9Y3CyvVK zKTpD-eRPob_U>8VRZ7>Z@?l@Q1=e@fD)Wylo@3xa&@(NSIh8sIjl_W|UH!=C)Gf;4 zFc@(SB6Kfib4ahXEDLlce1PELHYmngmEZpIK`7TXryd`PP(PU zY_Bu+d-mYL$`nzECFQO1qX@wgrh0<5{!dxV?Tieg2}5#Knx6RV86+WLj5`3&m-M5I zO8k0I+W@}r;HJC(X8Py!pACC+N}E4LSJqdxYkX_fi#-}&J3f8I?44B~N;fv^ltpeUE=+Tvt86m@hu=~+oEgG=V=KAL)3WjbKjH6IB*#)NKKcCtC41T3c%&4zF zlbUCh_%-a5OxvRRI9O+*#x>r%`C)s*-Deahp}!y_?|it`?vJ6Xn08MYUIg#p@B2Vm z9DNo%EnQGh-{Cs>OzB%@dwXF)3f@FXYr?*D=l&M5#{b235Cvl zuF3;W{OsR(Q>ha0_1OjeCT-~8rnw&RNp7$GZ*8)xqOFAWXaFeUSXM#$Q)>L%;G_*3J*hDLfz zs#hU#ho!jS%{1YXsyHTfLWWaQc*U!%JbKFOm)*#H{~Om3A^s!X^55gxw<6k!FNN{7 z2M!}V3&iOE*YG7f7&sL=q=Y`FE^iXfC=n6+2hpR@Zb0S?2?@b(%nQFlIvwtH=d3n+ z%)x-=kZw9>43hk$ebZ@*$)Ra_irnQ>r#6;5!~`EYG{z5F=4frtTUarg#K=tfH&c!C zn@tObiYx64@}cl<%|I9#(_W(h@oar(JMF|)l#6jcOYk9xR0TxV8IARmh+5OZIYhJoVVWrzT8|rd?($_r zrQv)t0cC>DwbitJbLhY;oi?$yJA3FIFjmB2rIbM)VbDlSD02 zWCWorh{uv8SQzq!Hjxu+>(+V_2>L1uWE7G&v^|Bd`p4!YHnU(aN+3Pzem5HXmHr` z`F|pPx?b4fywBr^Q4lCIN@r9-rYxZLj}f81U*4}jATd~4nk3g0%30{?5fPHimx*qo zwnSKR?ARchJ$b*giV>nh`5+RJAl18$23RoYRaV9$0|q6y!C&xmp_vA#4}6z9zhtW= z`Jw5SkX}*rU^^;spDEanhlaNNPb|Qt8fs*_FIEXB5>JS`HnyI`u3%2&T_(tPW2 z_)ACQh1ks7qGBeg%oej28lou};VJ(4$AMIaS^!A%pvp3jj|L7|7oE zI#F=6ua+HPST$#G(@kNe1f6`-xC>hXT4$gkAaXL9gr1hB3j(Rw*LOYBwwbgp>#{z8 zF=!BnAG{U7&gRW^)SbxKIEn_Hy4_vmZd_Lm_N^rrS6Z>{z^H+aADs`9IGm604uhmR z3%g{R^0t@lZXV@MqxKor_x!4?9gb|8Y+QOTTr21dYg_&>@Va?Zogodju2c2;%KjPK zTS366?wShRXo0(3`n1%-B zah&mX%q|V{7$=r%kFDhs(nM8nM)pU9Bx{1COy0Hi-j-16-ZvvXzXWM|Hl z&A`&kKOac0KNTJxIL&F(CQZ`!xC+@WHuqbq5R&p`a~Q0*5ab6#aofYW_wGS>K4((< z^QT(&v^^hk2Lw3J=5`aQ3h6qt8)Rn7Y}b&cKjtBz0Ks4gh;{1JBSvp2WH6AyN8V|m zpJnKL(e=eD#nPW;IL?{jpnPWp%R8dzWU`!+@`G`sqq(fEnsDBAQJhymnWy<3Ki>bW z;^FIt6Ta5g3a=NRElOtbOc`JH2?i*^2BzQ{^nasAQz7FrMnN@8UH!p~sPFfCYs-Oc zOr-&?|QkT0A%Aeyku%7X)Z%$WU{D-h>gE)?pgnO#(9&%35^;1+(Z4HZ!TVZ z`Sn}gqh)o9R1|Y_NkN)i=yv`<#Ci2cZ%QJqQQGb--T2*>=fJAqB z1~(I3tv_8$cT{<0b64`s?*sMsR}EI!dc1Y(>`k9v{xq6Zw&;k5LYe!Y9e-YwoHKeV zI;#53w5)-5UrB#b2`t&P)K#q8U_GD5nb|t(ZxsjIIBxsz`90|f!Gn(+=_g81(<;Q>q&0I*?wjjEkSq>_ zWfkXm>7ROZU19T=?_DxY{42J&j1wp%$gt-|k{vvlB9W8F5>c(Sb&|1SahU(Lf5|q( zUnq$AV%B}@R#RI$Ym&()$4k1UwuT022p;?ZYL%#xWtpRVlnjL@BvM*JpfHipK$#q* zh0$C)JBDlP9U4h$q6F^!Bj6ILZxJJ-vyk_ zp9Bwn5gVtYp(~Pa?*5;nqF{-otsPzT5ivUWAL-rysAm?RhZcTPxo4zDSiDs9ToS*a zt<%ZirERd3K`otXl+$JPIz`j!fE-f+R1>*7od8Tnbs^1?|H}}s*M8ktV~8VoG#^WB zoih2kapg(p_&v8WGS-Ya#&2qBXy`9kz{aQE!oV!ua_RUqzpHfdjYMg1?hsQ%kGFQ{QM+Mch-Tg39`_s%B@7kUvQDebE+lmk-> z>?aBtGgGI&yRpgC-X21Op^?#ACYer74G_Ky1KtF!HEeP$i0~r5RPTVC*#4ZO;o(f9 zrzOXIFD|;bo)jbA`;XO-@=zy3)+y*~jw_qs6vK$Ullk1cbtCFGIGE*Oj@gdunm5*b z(D$k}vgkSJOQ7pu*%pj1@~+<83)}j3)hSaiyeOyc!4m31VxlG{Nvw`^%Z4cDEU7_* zj)jM_(i6&RkIv5;QT9jq+}72z=qvF|&$i9&)ttRKbrzz2Oz)*fNky9oFHpq3_4150 zs`*PzOrEkXxNRi#D44+>1jq5sso2n&?noBxSLmj7kuz0*?tw)p8M#mU5tWD{w2?R| zB*c13!`FN|@Anzn<}N30N)ey7`4WDhuA4W{V!(-+hM8FyGcbg+@t(SZsF~oo|flLrg+K=hptH2*s^_z z_S3z0@BV|UpHKvD-Rdgs?Bs-EWreQpK8q_898^Y2Zi;>=9^I$y6|jn6o{y6xL|Eu? z*UP`LVKEk^K-A&L3=2|Pyqq1?vn%1dxL=C-ogAAlBt&2)iwhs0N9Km2;S)}zJ$F>1lmx?F*%DG4@>`eank93xDN@d0;$k~VX74C5OESooPrah`1SrsW1 zRw7l27c9z5FD;`2!;Fl{0VdLnBB7`OT;e#=_v?u>18$x>8W<`kCIEYac4(jNE9$m% zODFJdoF~6>X;|V_?BXIZ$K%1iv6SMa82z(w8w*}vd9snZfGd)bsS$%xfCAtx1}7LV zty!_cy`^rY+RDrqKO=ivG?bpGl~LekP2NkNF|9=!Q!l81rzgryoDj)Adpitd(<^M&6EXdXb2;Ti#PW5SB> z^0$ig6Q!T6A!DLvc~<;*F$O%*1G^3~tB8*e6SU!!07C+}Q0PEd9H*cVq(27c%I6>D zj#%qYXTtwAQn^z*Volgzb#&~|F688V^48%RA08Sy3<31BXN0a!S=^`V^_m4p)!pD6 zW1>Y)sp3#(iX(%~Oij0;c*Cet_42Y*_kDAl+~h+SV|Xh=7M^SM1N51=IRolq^1|l` zst)-`bioi_>WHqFnpOPxz84iPU*J92*)fhcWB&WkPDPR<%;?RS<@WEkO5KsGJ9@=B z`)yvHe~t~w!Ffv7o}IU{;M3&-uYe z!`Y>U{rdj|x#r0Jva_?FY!qUQ5mpf%I01C%(W*XS8g&afZW$X0@^wf?vu0V08%#+p zolhPPO;KP~D%XnEY_JNEyA@GRLoF{>&Y7`%!U=XcDaizL2x;SrLzB%fBP|=dAfy6H z$F*xN@B4NnkJ;a1sXP<8AY47zH8sa@mEca|P;RWNJ4pznLv({j51FZ5pLg`YBl%2w z$>JR#CieJi3m8@x;!5Faaq0Ql#7Q>BjTXrlEEk16U+*hNt|c#k2S~sd8%tqmUwWd4 zpMPK!!+OS4CCA2RKgo(If{Blaxm?*wlWF1rau|9j4PPQB0h4go?%e{vf-+xvK*HtA zKXR)s7aP%J+eeE5`R@q4B$4>4g@}ujVe0fg^m#UYRkLhKux^=E!^om6^3I2MvRE6a15Jzp5gkc)RyjU#4rO?Ixa$|(W zq13JH`40PAMp6IzG}lhiee~!Nx4_cHi_s!rltZ`y(dn?)kZZ5`c6OhKLg?bDR(F0A zO-O49`Q@OXL#_GvF_bYhxFIyAl(zQ@cMcTq_*cAY?WB0;@-?GHRAjpf)+I%_3;vIt zg{@yqX(vzxoOXdZp|h)r+|g0uy;9nO4aWL@`EhyqJUJUlduQjEu&^Br{RP!UVIi-c z2nnXS9N%vCl0|&3BIaWXqEv(Oh`_P?nE%Xi_smDD3h$N~t_~$fd|{Uv0SyZ^7ee&S zn>MBIs2}OqVl6{u&w3&NNhpFPwtL*clqOZKMUybi%v7F!Av@fP<%t_VJVdeT| z8rm(Zcm!}>UVa^M@tnw=!%cb0{BR#x6-jZPkZ|pHBA@MIB%Y*a0BdfBZ^2lBpRP8t z#NA6gSMIX2eZW$2yUBxR&z{XIgPkWdQY0TWmN+WceG=$Bdq%Ly= zWBSizY$SNUn_Hs#aX?FCj!jdWC!NTEz?8f5d&V!ge|d1;dl#lI6oWSj2nTZHS<&<9 zbhedd|E+A4yPWN7v?`p3AcX1&mbhddV31N<+XiYU)J~c9c@%LvBp6?YV`2oz48b7wDsC5RIC$Gz5n@^QVQt6-Bbe3K_+ZR-Ky-@SQwL# zm9#eFMR|Fjt+L3>*X$9`<+uTdZ-M;y_xEqCI=CF@_XW}f=cc3jp4$lncI_4VeWj}c z*2A^{ttu)h+1vhmT6y%&+oRNi4RG&j;}MONk@*Kiu^0R;Y)VH?d*oF;4%-&8eej&m zr?jzA!3qYmzEh;h1LC{&H~wp}C|>Ji&2n`~aj2t$t1|sHZ7v&xiU8*i4^SDFM{?8v z_p@vDMRooB{X3YmlW!y#m~-2f$jmo7ar(F^#Q;z}uMN+zZEkM7{SmPhB6p+AV9}EhbP4NT_{LINg<>MpyzcatRNfVIUA3uMN6FW=p zHHqdx3h_Un5{H=$-XZ7{uPH*XB1h{)baY7dF5G&yZTsPVUC&ppdygK%_!dB6jNfn1 zEQSsGWA;V;{;*C(l1fC!rAnkc>?}Q~Z0GL<9v*Gt^^>ZOUQt;gvm+(;o{G3o)4&va z^hkSG)0x1)1%`%)=_Wvv@G^NyhTp9`FU{pTa84*W=`=`PWoFZvmfe9}_(R8~cFmIh zwy#RPT2ub}Zzu$tYK@pu>)-c!G&OfsT}qn_;=VKeBi9Zv)x>-?sFU~Z&8*du3}BSC_ve!ZVEk$$uP}<`cBMiy zHnrHb;_{2UybYKiMMg$)hT45S1e!XUN+~6!%>BR$yTMKV)v04vxB91^T98nddh@1N zYq$EKx`fsoDShtwvk?Mdv&h_sr1 z#XoNi30fW`e<{wcKj|F8pp*uQ$_6Z4JgmnVBHiEG)R~V|1jV~OY^xe}71l=}vE!#rqjWS%dMRKE zgu?;RQs<2f?lmc#CwRB{tl1^x-W%0k(?3$6Qojz;15g!{r(fFq{30dwv4wuszhMbs zp(`_Ix2WrR{{?2Ml(5j0$w)`vvVVUrbpa+60xPtvtjB_GTA`N8QVYi|$R`8x2PsAa#i7b*c)8#QYR)&f^)cb8_AjOtT0+_vzDX35^ow zD4qZIhAy5zrC;x!J|2R$PsIGTQgtImGR-OcIvX1~a5ijyD6lzNiav7JU?`SChQ;OD zsT!vGI+j3jFrJpe;1M8{e-k&e$(_5x4p1n8aPXwbX;2T^Q zc4@uk(SWA{#j~FK+3r=@LrqVo$V{1(DB$xcQu~DT}(=%rP&h$4BQ5IS+K*L?&KszR`W% zpK}uf-`-OxhRclq6^-b`iG^ilreHW^lEbOuc;P}dP7u1`u-SYhy?*uaMdwiEq9G-3|K7_wIr;>T2zUA8f7$H3wt$=&TO@-Q*PD4Oh!kKcExMt*}?21?=7Rh8F>Ki)k; zYnVp>&=IvU0RQ{=E5FDrf7!_M@BpL$#)@n6#4c3jHxmPrfuZ z0&`=6FKYed~TC-Q}G6PfdZ*D%}GIYM?XAc|1)%w^} zjbE^GYe}>>{UuOJC0Tn+Vlc8ql`JJy`1uDLpCS(Xe4yfu>CwYHtQdB%(D_Yu-lCku z!g0r0gQ$%J98?NIi}3E}zp$g}C-0|^?_F0&+kXV(G!C^~uB|Ne?o*-pR zW-;aD=uQfyJ$ZrFaOKKK{}!X1LETc$mDS?C!i0;UO&}NgF|Io4(W5=ItX8fJC2lIf zt!KY^V~!oo>7Z!oE9%RsYnreWP%pIo(&{~`8;yG2ZATg)vSg^%9+4&XTZ;=%;F*Kf zYue45C|^PjA7;jY{SLQ(3Cf((&+jt#tWp|&ggoE$fML1N*&z|bpnwfBmz=Vv+?J;` zT+hbF?mL;^oRL(pR`{$V#I{@sSw` zyY^jIWKhmQNzsYL8(h5eCbhhD6d)DUTd(H#D0=?ikttkV)UYHf(Q2ruJVu_wM+uRh z_7_P6W57>&ITgnjj+^OJ@wnC+F`-n5AO1pN!GHUR)Yq;ud7?E{uXw(cKI%E|I@47XH~)( zf(D0y7R)H=0S>HoOj59B1=a#wh@YNxt#JTv|IUpI;sYfESg158e3^Rtw@&NVC*KuZ z4JIa~;pEAexb7&jK;9WuvAd@3sJ*MIKJR(vjT^j}nbW4Z!aKpR3QPc>p3=`Fh7ae^ z*WT``63B#xi9HA98?ri$Jo~(`htfL(j8x`G8buW7s~~^_b=RSK=K55R!cgz9 zAIrj5$}U*eYp{<)&ua^Xf?yrzbMnn;Xo_XpN^C#3b9ZWra(0icfedRLerczixlPaH*fA>|2#}HeH`0ctGBP*V>Rbl zi9h;`mAf@?cyHmr5{++Z^zS37>r%I2zwImTG17+No77XWyK0<5Sn+=)HD&tQrwvm_ z#3v|+R8!~Cf;DjU4gxV-9`{7>Z?Q(N0g&(^bdb`jc!!sPvR(_ld<_1G_zZ&;|5VbQ z!eGGqTd(rEZS(nNfOEx)?R?-$0zSwZ>v>sZIG93#h z3CM;Jqk`0qs4XZtKKa#|(0my^f>j0N*qDD))lOjgiwlu6N~)Tj&o-wDMKNRiS(=)C zo|vnws?zT+qSSA?+Kc!n8)*!_4jux!{H?xzliKU<;r)v>RWA@_##ykWF%;`MXfkcD z4%G%ubUwgUXt!>!uN*d6)OleiPV_K}%~^*cj1FTDdmmbhx>LoMni_XFvhcfv`TvU- z$}3zt|H}3|UC8aXaM?TQklegOy<#0;$(^?*b zADrvf&;H@`{<+s+`()Gj0Q7kwvWhUY$Nh*C#u=Cnh#}ZuUWvNS=enJ%Oj$+^wciPj zzMr2zT~d6cLB5N)t=}N2KKeFdUUEeP15~>2-PzyW=JmGpQ)fgvIWqC#x7OGh?U{MV zR?;KWzgN4>a^axQv$cqcI1-^fL%p$kLPxhHN4rKIM1dLN3(Y(!or*e7`AI+Mi(Ecs z15fr|7FrdlJ7kh@VZUuD2$J;pOBhGurYIV@d+%SNVA3=H5`U5_2{%`eHw}}JfGMui-js_u+bJDyl-s69 z9&GcvdVK$9rV|3eul?mRlItVP47c(6}DWvV{Uz7De^v(>C^Fw0^A_=DQuJhk7 z%Ic5LZQeCYN5B6sx_MdCWRdCnuW5_eM5>Oql99i^?m8xT17x*ozTAB--;sIo`0+y~ zg-t$76UK`5(9_U+ps@A!pxsa7N4=I*?q|25SH3GB@29#f^-0RAN+wke6tWnI3PGAR zRt7gmKNzIPcHidiNx2*pBz&&uDsjtYu80*fL2S4`(k)0kiuk0@)ov!y-mAG#feGZp z;$lKvg?iao@eYk9jw@QhJ#_zR`D>ruA2_gQ?_Tn~UQBYz*qijlb=8}52JH79{`kfv?O_R*ht!rYrGI-Vbye8h%pH|Vi4EI z{~l0*=3(Xc8VxW)B=qUMd_N8sT>_BY*rh<6HZt6_!!1nLW0Gg5p>ubUh{1RIbE1rh ze>s^yi}jhzk(sfPN|UB$S?pSGbIW?`rgmTOuKmMVyajJwE9Se5|d zUrb?EAGk);<|?ovdUKW}FPmOfM<<)k|B(LK|EoT>Z!c*Z-p3bu0YwQ0)S~u|8#ift zwfgBRue|u+r{A%V^`g2;e_BMfbxIwY*ZuD3=Q>VG=IFw|8&p?YxE)H$P+=N_R+0kz zaSutM64^h@H@}(*B%G!5CYyFI%5$wKD(WYX8RP72K7V^A<%QXvS=}o@QrrN!AZi{V zW9Z2f-2lr3aid3;S}F6nyTAb&K7MQo)MKe;y^;tKfC$?^#_2W*6lIp7H#@*VL7eBQW-8ls48Bv@yz35H3h8`i-h~&&w}|lS&@MJIBUyOfq^KZkb@Ja@gX-9SYHQbJm8T7g zKVD;O`o(?Lk^D6&_Q8b75&|Yw9^*E|etxoLO0D-MwUZ3OckQ~xD1CJwY9IQ1G2h=X z&JueP-U>mPW)zrf!5qnJ<=+@Jafs2V982m}5Q!oPr4`78)4MFA`K{B$xl{Vm%0geF zlH9XrPxz`_muoh|C-?31q%?j0h8@u#i=TZyzeCP2WyPAM3OYL0=I?$!nC5M-+-maX zjfjtjo`fHe9glKO_~ca&FKxc`r}y7Jr&PxHsf^XFTDG=_xw4q=T*;@Sw(otK^*Z3s zfhLzxqh2uJUMgLBI`;|<1vMPmNaweCW`Ta3Gpl_4?^bN;lLJ!0 zl9nE;9s;8y7w;Wj2(@)G_k0I?KsXO09g9J&0R9r)+6nwV3kPcv#<688k$C9xn2VugjpNz(PKtYlKvM~nz(JwUZMw(uEX&ujIV92>@g z6UL3>l+_y(6n@`w{FHqXHEwD}A^J<&tCqeDtjb&VZGO7=$xQv#A7;ynsH{>EN2NVN zOjJxt;l{=I7xrUY&-wQh4L2L!d~NUn<1MLAV;M^1h#bpKOL!@5)dWd|JXFY$n7jtq zzN)ISVG*Jd!Ny+`SYAk&bJY2Ta=a=DHH)fa#d+cF9k-Mv5cb& zyH$u8jEyrh=V%_wukIu2%Nqif**wQn+geUy=!g+(ROkQMrSh)~}zwYNaaijcge<1Fj3}B?03+X(ABd-o9`_Ots19yz|4&#CB&8`^RKt z`Er7#TUuL%{loPLvc`1B!Th<>%!f8A9JCU8BQu@s+=q7mGg)Te;mud<-5sADkO z9+mlOeD|p{Hl_?T8=(56#NGR>HZv;oHEYNSk9(px_@Fe|n0@^XCrsbEr{UA52kWkL zJo7Ou9GA>cLUAa2Zty|Br3r8xjx9WAtO%fjw}RTp{;6^hTWNY-Tx_nJQ$5?LAUZX6 z^!N%oLP%o9m$IUo~3BTuT1=p??W*`^il+juao$lRG!PZg_^JP1YcT?oxwn<-|9Jysc*O z5}yKX8y+*-$p6tnXv0}2Q6cwQ_Up}^BdgS3RM&XX_IND?{4|(&k_?10lCD8YpfVy_$go3+i=6F z5qQExfgBK!i`7O>q0Kw>=soJ-N9+nDd4;{K z1$4gl!-sqJDS&f{d$%|^ghxh}qw>YL`9vY)>w=d(!YW4^&hA^B^Q7mJ=RvaXdJgEH zbjRlBn3L}Vv%4F=T$YlvJo=56zfQ4PKi%OXR_dnhHPgo4v%M1>`YmJ090MCkTTi!k zYrBP#eiDJX2ag;9EZfPQ2aNdb8$DCkebIAP<&9&DZ&mw@Ul;cBc5Ca7NJDjyD^i~U z7|@pL=;+X~Qk-$_O^oXEC@bpUFaMlA-E;hRjvsrpo4jvvX^)w!uYCd0Fw0U%dYt|D zTV37AE^{j`%BR>zYincSatj$ZAQ>RLDbH^$wGW|QgwT;t`#(-(wCweScH{nJ7 z`u3%pg$)HJYN@PX-AsGJO`Az+bmq)m@*Kz&0u!OWYzHry-z%Td0i!G=IQ&7hbhHBn zN;BgbT=VknwwnV-wPme!^%79!SsDzo{ABBOGlu9$_8+{wd|%@B5w`Q3{b zVNp>`$F^?1IWe&B{=faqedG7o#Ksd4V99JCJ-rP!1izs9tsrVlR{}*@Jv3bO2EmOw zUp{hbfBVZ$ZdfHJb`Qvu?gBLT>eUdr15AOlJL;Wb!o=@%g7k%{8bU8O%hSlCgvO5B zGlp3jH0y$uc&QPTgN3o%F<4c<*wbh^=Uih(@I+F7h_S@!x^QL&8A0tqh`HPuWNiV-X=_l<}w&Ss60Lx1} zw_y7tS+{KjwHZ!7|9o>o(Yu~t`Q@=sHWJ2Y5XXTN~HIwjjTJK{7iWS z%oTy2A-tQ%k5vLM?X3=;=^_oHXGy;-ef7nEn}UjXR2K8(ngo35agI7eJ0Vw-(x z#eAhc<~EW6^4;aDe<;|E{Y*&)Vg%d_4z4-FG5jj5_ z(Y4nu&)I&id}8B$jSx6E;K&@d$EO3oUN@H>I@B&K^%Iq(oq3G7g_L+Nn9Tt#g$IG* zJ+)&Vn(1h1DIHtrBAu3;ye_4jpII|^miwPyNsq;Rq2{LV{i`nZV&>P1{B_r%Jj6(e z2f&azZoAh{$c!U=ff8i<*Rbb9IQB;dPw1MEl~q=rF8!QF&SZFaT=@ojCLf@AoGTpQ zIX2%aGtwX##y!D(mnjN0j*pLs+qnuxUFbsGCh`ncS?^6{esKdos$&x+6?;!kl0v>rBxdHs+&Y_sY+=4 zQO@c-_e4=w%kNstiKa`|9d$&497{@?dU~mM*0#5fUk!fljTzZIOFV3B-Q7qTqh0&0-rDcc zw{sn)_h_?K@7;ijPg85_Kj`$jnT?Sp@d@I|C+atd`7Sgx6l8`MjTN=qYKAngef=#m zYgANnQOJ3QtAfi4<6)Knlha7`-qD9B?riri;lQeSZXcj9zV806_~4WMzkPqEaD7DK zS;PCtMYlvB$L-ND- zAGHCjDkhD>!RYz>8rT%`ahO1Y;Pm+M!51vMiG=kOiY{iMYh#U3mN2D~J0TKC&krIi zem#3)LUAu$336DF+z4Idj(Q8^=3R8e7X<$hoLqWs*u|@JuazxXkvc-Tb3wK;%^`y|^c2d@YO7HZo}Crf00i2}!>Rjfq;z za8-z{U?zem!J@0d5W>39LtY=M2DQEJeI^GHB}L@RHXUW{d|#JIkJ48+n3V0`kY3=p?vMTH zQ}z)K_NG~XPmRAgzve#&?a=NGnvaS{crKY4b-IVhu0q{jw?ntK{*v>RWACLAXwF)~ zqo`U?hdDVZhprvs6W*<5Jpe6o0D=hrlsJ2hl@RmOdoTO1DNyLb5lkQ!un(%z7;t1T z<`q3@l*eHHI}X|BXAsTP|*^a~i2;26pf7qTTPCQ`7EBc+)(jVD3! zp?!*;pF~JCr;Q*0BvH<-W}%**uelO76ZcgdVMDWXkPaX5ZjUSfK!t%?n_27F?)k?zd{=o_-UyYQvz%`-sm;T%cb(aW2<*@S{4h2-G{bFFuc^(Ub^)I zbVw^Jt7Y}qe_tN$m-Ee5k_hGbpZ;jLRLxzwG{huvT&KQ-KFeeA;=bWUsVON@4S54w zJU+Q+nzrtYJ^9vjOH}&&l#k+NJv|aS?v=$gx0|<`PK&D7G#e2A5T5;oEJS?H3s8&yg^L%Po0{-< zU|zM!(Q%vt{U)kbDS7>n--}DyD}JrNIOXui7$C5yl7_}c1=Hta{pfs@Rt4EcJlS|> z`&Tp61#JC{j6E>6v7>UsK7~mt7*Rt5*GVJA8S#5Xvu0_YN<==##|vVu6c@HT^X*18 z(h=yvIDfdOKNNoH4kw!PjU*FdaL${^`_ZrZ?%$8Bh>j93YmVa!E!?PpP8_qa%p&R) zr%P1COg7cNxGD8D+J$T8O3hn`Ywn*bM`WX`o7>qB$4lMC?44FGyYkTe%*DtxYH{Tq ze+*yRr?0h3?p>S}vf4wb)2{q^ujU1rw;bxyblu$DkxNpcQ~C+I%Hm?K1GvIjS^ora zvy9Ay5f#XYSRkB7Cr*^XOJHEeVTF6IAfa(aFUBbC?c2A#_Qx`crHtVWty#Xq#if8H zvS<Ju&TmgeMw0y`1ibU-X<|r`wBoamrRzb%W-xZk^t^!Qe@Jy}RWa2W{(cRI&Be zm0kS@Ws7P@CR{LNvYe(4L)6BJ-NT_J+uJ(Um>B^5*cAkm2nTVQWLnIz#BIq#2a_Hd zQcWMkRY4D_8hIJOdEL6Rbo_B~R1JK=DM24cK}NPLkHbXQs%R>H5zuU5Z}CQWL5WfT zJZ!(0{L1zf^X&5`6ZORMT~Tvy*s#6&LH{!M_AXY$5Ya&(M}r3GPIxlm^RMsU<^P%( z@0mN{#A?<)to{NnQJ>Z+>8 zFJ3@(n6vrL#yY!&2&nt_2Q*??axmO>9@!<>w>C4I5METc0o4TRp_biq%56`58~l~z z=*C9x&yPl{I%U|GjO5YtnZot(m4n^Mgj2h6O<%FE*>aPD9=Wet)m(DE9C~D7^>yNKoi3My3p4V#h^juAlOinq77lQF0aOf_fD+N77DX6l4jJbT8< z<75EzBM2&a5EZTp@GxEkRU57`tY?Bb0tJf%=Cey!K)eda3D{* zxpWan+M-1sKff%WHxGM)r3qv~;tja4iv(nyu_M^i|0rg&vu0tA8(rS}WC&!JAXj!k|#s_G*8Hpff!k-7RYX5Gu>1b~ zJ!aGtQs}VjgpjE4BKS(^+R%Q(6K9$Dtru8Bu}=N9WSn8V&=3K>y?rYq{~wbD`aLPW-n0AuZri$v^y?wu z=F@}67uqGWFxY<(tuf2zr`@nU*c%(!qcJji5z%PWC{ z1?z)iA;ofvt^`IVN;QukW1I5)Q%Mw^2C7f)I~g3;xlnlAh*T;1pw#W!vxoJ71JwV* z!*Ox}=D|9SIToKprj?GG+6wHuA|e*nk5Ac=N}Wv)Ok(#p`;8-?b2)Ozrlq8uSU3)9 zrIpwAh@mz=|aImKk+Zi?0qvVC4YgC=f z!u-S=%4&bUwAzET>pX_gj*i7}{(wK_;qJ~ z?ax8V2MD+L{NQ{Tb4{cJFe-ie)TCK-!gM20BmfxGNueZKrCRX9oN3vkwLFd+rc4-o zkfWc5roeB7m^>MC3{x|$mW7x-1ziAr8#%JBq2Vp`tKslT9@qZlUXPixC#>$tx<6Cc zX$T>nZ{EIWQJ=_$fD(J>^5i`9Gl&>~QhDcm#^Q2gk&{3H#fo6dW1d%+ z_Xd+dWM8aIsyOBTG!%}#r4Yjq2 zWwo?^sLa@zy?giW55`j9{%g>M%>ChqV8>3G@;}FD?(CsrqL#`pnRirHcEDA5+<&x? z^=Bu0SsH>qie)9GVw(M;k3`jhqmLLiYrSHs%mkE)ub z^oit7E?YKm#s(JkwQEN=Kh-1Sc%|Y{-lE-xUodJ};jov)Vkywk@KD`xw$X8^UI5Pp z7bz<*-}KsjZ9>_x#Bul6O$)6|zIDqyp^VKv>vV`jU1Ou*DaX8Z;X<*H>hAl_q^Cz3 z#?E{6?$xW`_=I9PkLn5D6i7q!79wPbl{9^K??zLXTlrVsA^$;ardsm5XV2W*nm1fA zTM`^c00q|}f~kU?JS?Dl5psItO6Zdo=G5l#QVUP#J&6?vew z*jvdgen{A0jdZQw*jY_Z^U+#b%$>%%UPe8dETkEx?Je z;${c`0Rx8N|C$|DxG@wJ6wv75KyvvPOsrX9G+cg+ICl0 zm}c0mb4i>{t_jLphYp3hvaN-kYHB(pr23NC6|CznVkFYk1lfu&%tl!yP+M_*+O>=R zXtUft1{y~*DgjPupkBW|S!mbX=D9hr)Kg#JeTrY0eG&;QT@jb0i_0~7ZgjS&i~taj zTo&(s7O7rw-SF-$oAJGE=c>ivak174^mJSZe5$HI>`Sr#d=g#@%tvjYERWLivB=HUoaw{{& zivh2k1q)uh$yY+4M00I!+P2-#c=hVlD_0Jax@I88gRM;87FcYqck^Vvild9mQO5!M zZOy4l?%wq=Nj#^wL`q4xT_VXrkYAUQ4!sj+@0iop9M8(Mr z7tH!XLDpP3>c1^cPEf?<^T#5tyAE^}Hf2r0JAnYg_ypPse*sc=!LLP=LJ@teGz~b& z=foahGD2=`fGy6nm6dC+n9<^qAL%E76bP_POq6WK3D)jtxC!wSf@XgG8tcc2!N^B2 z8pkh3*UsC?XoSA~b#vZv&E)5i-nAox19q1zlDLnt(T2A&rbwIJZa~w;e36oB)6a@7 zvsx{V*yqoO<-0Nhw^IeQMYFlRZRMoU8pV&#Ollms4cHU&7c7{mt`6jIym~oox_xu2 zK73#xOT%Q?F~(0%{zyIqT>dwQIWv~b%+r18%BR)E4$4)@w3>QsAu32o!ewn#Xj9mc zY#Qz%OcX`Cchf^D_lR4~edrL%U+tJ>JMwJ-2@77;Xs=Qn>awY)NU>d?v=<60en&kT z4mn(!w)FYfeR5)c>&4^`SBQ+siaK!@8j6_Iw0lZdkPx?J7Z0B6HG*fPx|Sk0!QzUO zqa!kS+L5s-#gY5;{j0{?X)1=-4!v%UIlqpE#x23~q4E_7HU%1L?D=M|ip})SZ1{b2 zc1D(^WWe6eDc%Lmb-`oxt;~-t@_YYx%jLp#4;0p4idA@N^>kp;-3hClMeYh=0cIz; zI8}Rh&-R)mooZzK-&1l2IQY0Q`3V%( zn6*%UK+Xv3Ynf1np>|kk=;}|hJ6&DBx3(@_v}lvFbHcqpVzF>=@l{4YK&f=1$5J^z z+OxvxF-sFD(>TvyymoHdvSs?(E1T{up3bG9(^j}le+-tJL(0b{T)hgbStv~8LMC>9~qQp~1ZvChXvYD4V%6Nk*kLs5LRY8gnXZQ`rRU57g8!xEvuVx$tJW z!nQ?&MDaP{y8eGOeRn+7egFR<=_uupa!_(qQc+e)gifermL#KW5-Mb`tYlmowjv41 zCcA7ZBS}J5B`Z5Cv)}V{e}DeCANS*`>vGQL^B%9)^Yt7m+?M!sC!i6vvSNOF%coLU zU%PM2^+6Y0O3_OLhJ_N(P?!v{ESRr?+uzpI+#dj209e;gS5e>l03$#&+PPzg^obK- ztbtGv60$kIxe#u!H*ZEwY=>XLxm``i6r@*cZ+s*xW;_sfeiN7;-T3a~8E;;m&nJX= zeID#6zFYD5$zz5?^dV-sm%hqoo)_wS%#AS>jEgW7|2NvWkf4rU6M~x=G~Yq`;)IB; zKy}sCk%kI0F=(fDprQQ!y>e*AS(<0@%(FJja?gYQjfoxS>cf(rQMiuW@}ED#a8mkS zwr+ZaoNw*b7uT~)4`_ld`SaV)@$V-v?Coq#65}F)RB6S{?Rd%2KfJBtsXYHK38BVE z?F_2m(7BgNCN2{1IE{1ETRxK!p?({NQyHRC_>Ba0e&n zS;*)^LNNBkVYu(qs zb%&J!ef2adK8@&)A0HJaZ1nTqF<0~9!$fLQl830vo3g}2AKn0Ths@R3F+kUFdqHWu zm1fSxJ^JH^C@|Z>cYHJRNJL44Ei<-Ra}5rOdu}g!zIic2ld` z72g)V%4ZIJ_x9q;lpFRV6e2MF-Pm(jY0y(vf4^Tm_90#tuxWWm(mDfY;mzJ@ZNC6o zV?Q9x>_%6C&_7EF9bOW=CjJ8UKyL|)v0LY)&JFgIy{CAD2=H4rO$EHhXG?4)izJTZ zhpo)+d1vEcS{EnZean}X-!tFslpKj+TV#a@S6}qsum4@z%l7`S`<&Vn2YQMxYgBpU zWZm-+9iOr(n*?S4-S?;8D=gQRA155_{xtrOsUj%5kt(ySASl~tc5stHeN(i5pkPXD za#OTTe#D(M&W%%_vtGaE@z5gw9{xErG~*;Kx_ghmp_$JqUS#&@U=R$d()&9npclaf zj}ybv`DTiAH=I218X%o|^Tr*3qW9nC-Y0i!Z#}-(pY==9z@TVydHVu|f$gDS;<_gi z$F0vr2zAv{8m9S2t-h3=b$AmSa&%F~Ik)uI?{h{EJ8l_`7WnPa-9Udfp!$qg(cydC z{)YY-$C{A`e`WUV68hR7O-H%RcDJ{Am-I)?g;~9}wi_4UY$H`PZPG~96j#BAe)JxS ztd9MHV8tXQDIoq}wDT*Evw!nN2pi=2P;sLAfHKyKi1qE?r z;k1X$5R@3aTA*=gBVj)D*TXYwcadlJhNpmqZEZ!59qWKs@hS%eUNF4-_uqRWST*p+ z#p`aAA%VRR!&K~FTt_H-Bg4Y7t5*P2IZ4O0b?S`2D~1)b-zJU@xAj)u`%yL`udNm9 z6!IwMYM^dbMxibhJe0rVj3hpZtDbr`GmsdYu1VTz|%Wwd_(>JEC!!7`8N9edTw!$V0Jgva53YN!USUv-<%6sOug<)Z@mewrdf2yb zN1jM|#)}tVH=#qsv4FMY2(8?XxS_F5)zZ^MLq-i>+_Tq5+pTUo-a0*eUH`eBNW)U= zFH^(OD~-zB+Ru}JnIDQ}kA(tRk`W?-U`&auWFJEDc^zCXx;N3`aZUS zFvv~LW7(b(z3%9{UK8ytS$!(J-)T(~RiiRZy*9 zngt84eQfvE-~ml@B3;7(x!z26a%>C+jkqSUgv`54BEW9yNLN8|rWbWvV%KXll0c+j zzJXIMud}$qr$MF!yXNm$tDuV3p;si#`^RY!ji9MUE-(C2734$Yv9?Cf0+zzcW2 zLx_D^&p6LGP~x$baC~KqoFFfRK1fY=RWq>#>@%7n2*Mw#5J-N63u8&R@`%PZL9Yy? z7WDt(VrTeKHJ@0Zf#eb zNz2R}JYb!4{%q^3PAdmg36a~OtOXZx@QbTCszW^o1-c>*dO{053!RbmoNj8>A_NAxeV?X(- z(uDUyhD`ypf-u^$87Cq|OojWJ7}exFE~muLEiKc2CtQK}N>f^*Ir(?rzI;aAqU*_* zf)8CLzqoR~#pJ^A87WeLsA&Bis)^=i^L-w4go&Uw&2t4!4wwwkjD#^1N5Ktff+pL8 zaOCvqyKQAN*>q-7r+01j71=(m;8vArF~)n-o^&jVQ|!{JQLxA}e8T0@-WTRpT+Pyf zhaK#b1uUtuhT_~vX)~MB^xw6SLZ|j^csPKVbaYtx)xDDemGV-lZ#1>D7mDE%+Tk|V z`p7cmfT*ASI^&0bCFLn*{7>P{LX2|Ku6GqFO!-;*YLcR^v(L$Hy$qZQwB%+ zx0v3Jw7vQ^{<~W`|3>M+IOdyb0JApw8DTvkrwNHCxm;tsBw~c%<%a;)D>v-AS-q&h z_W($-BSQo8zJf_q!E*n&zozId(L!SjGf`+>$E;MKu4wDQr3YMYMP#GMYp^S5nB`s0 zYKIFi&?Xo< zCZaTx2rF^ap_*_&Lgt&SPm{jQoc*`0e}-r0=TT>8Xy+JVWQZXNw5WhL`S_^t6)&;B zH+q&zjBY|ura^wUH|RxVW<44A0_IYB$psA)j?qB}3Z{en_+yFK&L}68>R77qeF=|= zdD&(O5je_>S(g)~jK`<}$=5Ppw=HsqC{DD{tlVI(1ah<6;%}J5S>}HQ!A}|>7~rBk zdl)Ei`Nne<3RhBla=fj(TkxL;5gAsODD5z;!K4v^?Y09-(3?m~UgPHeVcCyi08$9y zlQSPnB|dm>0;CS$BSt;1Uq2pyU`ieYUW+4B2E%8Naj}1~lfdY0yd^Fvc^SYX4vp|| zn8?(4yd5&ny+k0$5vPUcXJ&hfB;MAZ-LaE3=_qHoj%noc(<0I}Lrjn5`EIaG24ue@ z$o^ehy8=GN1s}8X4a)1?ecevyJbF}^5*i=Bi+U!j{kDVSwSD$77p!$A{w9LoPL+@7LouLSKaIvBmqfneqAp z9qNPV-MAa}Rq!!)IO$5LSeN&N4-&vhh}g&B+l=Yf_xZ>8)V4Ec0+epD1w2;xz$7wl zSa-j7jc4Tk;~$0z6(=i(T#HnAwl;8dPhnat~1cu(@2&(OQ zqwoIkO1N3Ke5^&4LGXU>ojZ3tqwa>`1E>GU#5mUuuE$Z2KXQk-yjj!fYzqr}-gYpq z?SH zTVauj0_o6!a6VsP?HEnP#l$Qj?06M-Bo14!&6L3H!*Fb51nbty#T`{8(4XXFtX4o! zbI=S9G#%}Oun3lUzaYJW*IwCN#*L)pWZP3?83w_ylUHd4BhC^MEmRxAbvXQivLV`~ z9bk-wI2R%qIOLB$ZZQ5>g%dr+I%YZtiraYk+01 zloT!WFe(ZW%d}xEE()3)4jW&O)1h+;zUFD`o4L8To}b?@Rk)5K4k9!76z%PAPXxli zEj1PAi;>T=)sx2UFe(~*n-5$FenMT?LAZoy`Qb3gL-Upr=Mt#TwUYvFI;gRodn1ML zB$46KFtdY)Co?tm`^+MaAPhxujQm}U|BIP)FGj%dko8qZ1%N-()#cWO$IvJT?AZa> zgPu@m-8B#H%-XjNvf9w_;y2qL9A%>d6@v@U-UnykM|Om3bDa~&uL%hhOzSW?8NF|? z3NL9|l>%#15RPD|h|V7j01(-`D4-Rr2*PyIx1Wdwbib(Q}VJfl$m9^9%o!iGQ|g$Gxh!8TcZ_gIZ&EmTbAM z!aZlH3}xAsGB;;B_j?onU9Uk>DAO~N?Ka6>YabGP-^rh@H&hw?m2Mi%Z&G5P^mIxm z;cnq29V5%9YI2H-jK;~%0dM;^9l9!X%yD`qhv|q9lS20WA4x)Izvf=MuBjc#6s_GFj+UW>BA+>zCGmVfYe3RbIK-- z{weMGukvf;g+_)ahKH@qg{xH>V{{}U6^Rjav=FWo-&A!^{ns#ahER|2%1Y-roQYx;Dsp(C(oB~?Kt9HV5gZPy9xvch#-!8Ep&ePw_M?{3PK;qz9=bhKaRw) zQufHodV*t!_7pO2w5oec0a9XgP*+=vb6h*39Ja9t4Y-A20a7&oYp}uXET|4E;MNiF z#Bh?Jod@CWTlHc^@^XEHNiHqn&SHr@dZXVDSPSI!OqZ{Xmfu&{?69`te5j4>T!t1% z5nWmvOjv5ITP*Wo;)mZFF$BoDc5@wYVf^H|_x*1Iak-)K8YWL=c0>QQRX;fnDR}Ay zc7>b`uNnmuh@3lju1;06JWw##K6#SP@m7xXmQp{%C_FYm%;Mpn!`+Afr(x8!Hc?x{ zNtHCP>H1v8KS6i%U+L;nU^_E+ktTud&-Uy`q4ig{w9JCC)LY6aoaC~u12`S_NvYX) zU)x0{EB~kVr-jAi&zl>&CYG`?nWF#W>*#~^T=;c*_m!Yb_VBPs7}c7YnCx&FkYdWY z)wj0hxHK=+vpi_W|3p4kiG2OsvKmobMR;njyObzn8DhC1%D=OufJ*qVBME$mjkY3C~+2 z^r7EnOPzH=)$DyyuBG*L04D2RUE7Nr59V{*FJZ2L`6jKvtt0c38P^+EiqA0-jIz$6zu@7KEN=dHT4R`y?=xNskhBaVSb;=N^@8GsXGc*1ut`EAP z?sK2lAY0>lR8;hb9||nYu3bw#v*$Q+3E)^#WW4s)bLBJ+aLh1WS5E(tIZ-*rIBUI0 zxv*uPqg3jH`lyce&#EP{$6ltvYjL$jYCZP*ZfvV5JP|hjb7F+&tAwJl>r`|+(vlk` zZPH)V@&_s^>kf?vWZ&dU^hkYPoOdyaJLO(9@8`WEBatk;REwB8X3LUR+qF-%AqX$H zt0z#XE?3)lI<6(sp;Q~vq38pYdln9?hAX4lTwDP((4I>H9wXo zZXOZFVi764-JM`@J6m5(}Q5mcACTj_M>OW8unxVm-}l8CPp33+=Tbb4JF!;tMXi!S(x?;&-tEsAjY73+`x5fF<`qUz`TH2TA0i!UK&O@Bh3^XaI{HYW0xNAu)w%^_5$;ROoA&z=_3Usm+TM32)Ntx;(<1JYn&zKNT2mL3|2J8nz?j| zBfc4F%NX5(WnphW7#|3`QC`AX`IDMqLUj|msAN8Us!Cq-JT^(Q4kGXbL?>|a@Z(_l z`i|Tbe6P~iz?;c%YnCL@PvgM@jf4l46pHlrI%(vsBIwEIlH52-TeK)x7<#t)GHTUFy4A+fRrdR}$tMP8*9M8^fFzWR;ERqM{AS66xin zyT9ONJJ#ZhU)uPQS<$S{#7tSS&i?4uE!E^}yLHzcCo+8h&Wa0$U4cn}rw(3#pTd$@ z4If=mW?jh|(rT9{=2W^goUG9@ zbdMMyd2Fv1E||V0;U-&s0khz4z86||^OxBLH$6(deOhQ&d#-HtuNF@K9G63kK6kq4 zQ(@7GI9Gz2XU;$}-(|*bk&_;AWolV^dE!S@_SibG6Hjk5wo+%>`g3%=e`GLIGi1M_ ze}}#WRoJMmuFYNatfu^PIo_xH2OC~)l-aBOAm>N;o5Ps*`6t)uZf?ufko4h{7YJ6j zxT)R!@Xxa}1@MRN-MZ)gaP1C-NkMp>hC88x&ougTOF?EL$%kp%@K#dco-fsHyHA{W z^0xoT=OgF0FIXg08nU0PPE?9X?(9`(-0E+L(J+JbN$oSk-3S;9)qztQLcGjS9bEWz$q+RB|BjZcTCUI=kZ+-2~?d`Lq4$Zz3r zw%8r4+wLKT9RoE?gwgvZFgb?Gktnk@&$k~GDgFAfNb!QkMG*;!?Ht>Uv=-SoSU5&0+<)Rr zH3Q|qJK3A#7e*7S`JiUgzj$#kXV`yRLZwTcxeF(2Y8Wu)yeH3WmM#`W85k;^S!$X#CW^$+3BjkKz~l}Ton`fUcw zl#bJ2%+g>RL&NX?tL`tJ?Ydi_ch<;%Yo7A8Be8MFt-x2ZcMu)Z-Nq|U4bVOMfUiSg zEavqdk#|S4Uq4GPNL9@w|1k8>HX!P0dzX2XPsr zC=w9-^7QqXUnQ=k54T>B$n4DCb6i4jkDG-_)Uy}BW0O*^f%loqx;Pw?Q#2f9@RyMD zNK7$6e_@674KMuF@1|?n=01LDH-YQ7Y2rC#lMA%1*B|MJyZ*WN?NXFlNs(5N1AGeHmM?mfPtjVU`y+ zBk0r9nlaHpu>|#Ax1XQ`ZU6g`GJ<296C@UoInMicryC zc_p3GZGi*z(S|#_`PmiUb+w8K9t&YB{HP$}8*YQ%_PTFHa?XBg;I?7Wlto81(so zzoCF_VY!z1N6gKj;Sn{f>w6n{*NJ+E_XuULH1D%tT5}&?7|F?~>s%3qM1*_m(9rl@ zN+3&xySKa3KgdxxT2yr!5d9rAztTkjc-gMG?faF?g3Ty!WQvi2B7{Q4EH3UpV z-fiiPSK)~4>6TxR&gqn;Jz0XZuvFrlhz~Y3A5nvN+x|8evw!yeZ1r-3OF2PGX`im` z`>Zp^HnjJ_cQ8y(OcYON%DV?j`rKB{= z-9=y5e6;B$H)CF9b(=eOG4rE3s3jh~-?Lp(gZ;?0&!I2FsAatSC2paq3;f0Xo3%JP zSwyidBS>FBivhZ3iqLq|KzN zsg8yyvN$d@z8df~3#TJiuMl z(;M+P>i6u+lm?ry_x=N~YR?Z5yrOC5lgY92`+-Tp)N3LNkGR*T0y)i+Xy})k?3k{|MnFWD{RGI@r%TxCHdT9AoxX!pnIx z)E35e7eI+LF)8Y3yDVT2g5Hsk+nF*pW_7;8r;I37HUCIaCQ?^@ z9(L(F(yy*V0fV`#_@k|Mt5qN=rTg6%VU@AWN?6Nx5|I zpYAzvgj0cYqfus6E-BB4-U~QIe$OqJ{u>`_p!0`ICA8B6a5oUst+VVL1!g@rB%D@@S~5u zW_Ggb?D~ChOCZ0}$&eF}-z1jn*?bYv1EC#mjr_)iss<#gwEf_Z;x+cO7B{0lYIr%b z$2VVkshGxnoxjNifs9W)eyiR%jcp0V8Z|ZQ^C+jUfb!CYy|vr+`c&rckc`3slQj&hS5 zd;1<-xpsB2=~L8;;d@M*UE}YH@RK!&b+&XjS^i}=>q~Y!>Y=iG&rYr# zVGSwAH~IBg7GyskVMAMlE{-)iI$Ivl_qDu6MOvPmQ(4K%PV;Uu^H85=El2T`9^-&sSGJ zc?7Co&?Ogmn+9#(e>yWvZy-X^T-bZ z^VaFJ5u{b;%Wj2@CoeX>jC(D0muagnDP(eccKL38>ELT-zy4m$O5#+0k-9sZsL0Uc z{zkwzDm86g>FlJeK=8DEa1%1&-7n2 zNf>j+bZ|m4GTdQOSU&S)60CY$Q)Te(qlG&_OwiKa4t;mWpR#cgN-hfz^TPL>6%(p9 zqQ!W)ZN5oUm=&*HEVp_b@HET%Ri|U}HMa|=%}zhjnKYI9>{aPY60NRo+D)3JH|XVa zqH{kbGm701HW*t8lV#xD1_2oe?q=rZ;9r%^f4vUP zx0L6a8z>`)mQrcedV42Z#>rsnI~~F6w7Eo!5S45*x6`+*zE)1SioE;l5=rarD{DsW zmG=^C=@K6KiQ{Esk|e4?U`#m&v9a4dTv)!E5G7_pv8Vq~Wj{BhUvTcpEz{)E*w{ne zfAfvHiEGZft@PO>!R&if9A!LSrU#XHNjqfR{s7&dot>2@>LYCjpj_YTgd;pU7oAk= zCRB0<6es>GfyfI!T;H=i=F&hz^Hs+z{d@IYTD+%q@9R$6t7P5HJSB_V_4w$uRhA?H zD$%e`LiI$?F+xM2%b-%%nr8}6!&3Q$uFinJZe=?R$Uip{oI1u-4OVrU)8@8(nJX|I z?z83KsS9g5#hX^Y!!sk#WUX(YX<=ra8Y9N*0J}FrG6(JVT*aMr2$x2-pRpU9Ccx5% z0|CO~Yg>2S-Wn)XHlTj2>jAIhkkco7JXj1#AWowNLxIx-n?Rb58X`2zJb?H2J4F8# zk`>PCcrsM!KL4$sfuQXsc-Q{K7bjuvS<07F^<$r_3rv$k(`0WdG;OJS+x;^1s%&!G z{Gz9%_Aw?|AdBG&Le_jz=y}gb%(=KfD7qJVj&Dka~7x`Z;b{7Wnrn3xg z{+A5%16dViNLxbUs}1N2pt2AXU~lml_POQd;D>~58kHUFYQJ32HtPb~n>)^H)B><8 zg`5CfYzT#8A3T_DIlXIOXejZTS?fAsA5MO*>J3Pz zFW`#$6JOuT*3EL|j@t1%M?8;S`1@vb2T$F*D=OFX-ODasE!fF6bNn*5Q`NsD!tLCd z1K%+O4iC?V2oNc(fG@(8ZX+cQ9~9(o%xZIkK7ROnZSe8*^fcggD044eT0m4M1izxt z)3vsWoj9=y?`0&`e6-BhDwT`i!Jbgtf?1k^!FoY1F>zboVTOwSx5}PfbdGyB#f-Z; z9(^<(eB(GFlxDq3Fvv0N;)KTq8{x*A&>+mSR zbHUbh#<(2}7;ti+g2AygH#euJz03VX+Mg=R>zI^7Lud>a^v7wL@8w*8fUfu<8 zl9N8c)ZzqYT^Oyw7a2_s3y}!o-U!kUcI~=LE8x5o8f~9w`x`3rZ>0uM!xAerGTM2m zLPZ~384`D!-zE97{xHP3#wJhpzr)Bvu=D>YZjIw87%G6eDBdce#glQ5FJA~^=MQj~ zz3fZkdFCX2M}63fL9k4Sx^pE9PA@5> zy+5TG{;WSBo=A-TzOhK#Fqrj}q~tLdXD3l#NMIv`P7#IarjCJF{6zJ%*sC+c-zEo6 zQ{EeFxcuHiG3Z$;1(z~w$TXr?SJK))A z#@6UT_% zP}HG%X;b7t6`_FJ)z!7neW3?;1M);{ot%#G^AGCwEq#$)ZIz|j+$=6ORgM5ZB7{D? z$Y2N$5ReJa@N)#!M2~Qut9s@a=5<;)f68_C&fbj_o=Uzu#sDd_1~<~Fy|{QCF%W}G zuL(}iU^SDRyq$8D%(`QKw*E*a9|uq6g$4t;&95yCc&eluS*ABBsa@e>Wj~H=3FMn0 z$%2RrKI)*b8Le`F#N#e)po_AhS$c-K)D&tN3VnVG9ZAFr;p(anhLTBP62#_+@;TZ!NjO?RovV@Y{qP%!i)RmDlw1lg`s7 zYiCCSloQ)yEVfqtnIKJM?eymL9kbdn!yKtYGHx82e(a|zlAysI|KaR^Dx$wa#tSFI z!oyTUyjLxUd1$D5i!q5BrH-l_{ZZq)cQ+lUJ96e| zrse%@|ESG%kasd}3M4z^Q0A(ypdI7Hb0IA_H>vepPQ!=7xV>#b*2W@enr2BAI` zlNqq!d5!}NL#cT#>EYJ5p&NJpp)Jh4Pqhx~=DT$MN;R5EnD>fjNn_+^_F>#$3QC%k z$M2fQZexUOhJQgLgbq0|SC(?5TS5?OJol?qs1_4D>_QgVm5;eoTjMk$Lq0>>@fU(( zq-j*4f<*B4UYYp6m~wjH@|yprJ0iJY~St^V_~^F-es_E2N*AZm&^aUqNE46>Ny79 zFuAI&bw^gvE^x~DbPdVCBp(HrPHc^7dGVH3A;9@ts6jatS#owWPX#P38IE$tdG&Gp zob)B->-0cVb1TK&!UD9Y-TvAAeyqlwQ$8(AgvQO|MJ3ta&O2Yb3?Gt*McTMbWa4u< z#l#Q)+WKeJ!?S(F{``9bkOJiSq8~qg^_p&j!Ipo$%HaNnwg?gx8%_#tUNHK@iLQ63 z97rlSm0-9dQX!>l;cVR-dgf{b&On5VWJ54*r~c0<8j(8?^&+F{()sf+`7`kSR}=V> zp21w}cu%D10LlyLID)aX8sF}zWkJukQ6#Eh;Z|=Zgb#uC_L*Do!X`HQQQmdJN7K#D z<@KriR6_pT+Woa^Xol6OgK~O%?cli+>&pAu@dOfkpSO=TnTeq-`(Iq?b#gzf5OL$e za!yo0;9W~g4)_l^_3@}tdx4)5;YVQ!)%PVi_VOg8tb;BfP`p-L{ zEzJIxcNkFGWYx@^gGH)^ySXJzmO0Zlj5AjM}p!jGb00| z>wKXbZ6BPf?0(5H||! zZc&fI76)XN)-PWqs&75jM+Z?6IKZ|LI{b%a@>^c$NZ(|@4S~PM8oDME3|prSs0pbW zEBBvn5ESeVVJnGOy6vxI8! zxr_A*;*qt}1*^puwkdml7JFmB&q?^kWaye$V;!BK6PNJtvFYkPkwKoS+fk^!z!To^jQHT}gAKLY-tGF4HTfuUQoN#C-s^ z1qh-6BMV*8`}gp9L~`0{;I@M(J_H+p3p%lBe_3QnTQm2OiAZ=Bz1+Xc=04GzHE0_@ zbMC^Lj#<}T$6bP4Rv8x2KUOrD^PRKX3e3`Ttn&)1xyYMXE=96gv+o|3;)c3!yof2Rgp*VEbQX$(W|g@oLOu9XPVWjDNCd{|_PKnG;Dz8oMb zE8KADB1{3$jujT3+w%}F4J>bDDNuYx#l-ON&}_pBNtf*kvf8wZ(tk*St&O%sF);@Z z`lX4SoEOA?ke;FN?J_6!$;yMOgltpDAFQm#zVmPjZXp@d2Qk-mKm-GBZqj*3_ra#M zDR_iK3?ecBsxU`@?TTQiMC=Y3J;St}OcbLWT6QB2(p)%A?;w-2m4fP{bq1*@^ z#eqr%O_UQ{|2hnpLCk`h2>&RJmOL8H|L9s~Gds48PyhMj+3g=uiQ{Q(*}NH;N_pOa zV!R&cJ>kjd32J)TkcfHf$mq|X$fp0G=x6qyc%l5c+W*f5z<+rsqVM?le&CpcTpV-I zUNxE&SoDq@Y1b}KfYgv@;~L2k3-5f{hDU<|I)##e*AE*{3GEw>)V#LCS_tF98G}&N z(t_=d3={M4l9?I1={4@?-mT2qrxA>^od4SFfOrRadD{gFCYdklo9gg;MxwF|L;{JWFiME6B z5QcMdLZY(#`GOiee7a}85gNS=$lqADgH6D(b*phWa;#AQ~BjY|YtK*x^uj}M>T58GeW$t(WI{QSI@u@8jcd zaLK^83Z?n3)#20VFJ`8khWTzKkk0YL_do#gZat#H!ompDn)_&VWn}NU2&h6Hl5(v&Md9z- zmBy^+STT0e#v=P^r+&`ko_9kt5Fo?%9OjEK@I13eG&;EHVe|Hzc6ME*j)$o)a&jId zgW>CtuM;A&1*g}>ja6jaD2D)XqVy>)?zD-ykS06l;tndJt?lndbEJ!h?)rEBPFIp) zqm?7#4pH?7$u|J(FpdKu8Fy6?BVTu6^9GK?SHOnuMtOlt6HpF5%G&g|lJ$1(f1ct*eUFpm< z4N^*iEs!fR>Clg(-k+gS+4|gJK)u;`<;kSmT@nBinYBO0Y42oQ=RiiH*$fbIKs%}cRw{xZd`YRAOB1D&Ajy4ow{MW`d?%B8rj{{Wm|zh1 zuP&43hn+k)F2%*gc#)9T6BB3=l%Q$@a)Rl`bs4JItu^7;CX_;+f2v`y%@qg3SzKrk z#3Dve0;v%=-S9wvDt+Dg?Y%Jb>sSyF;)_d4Kzh-!HnBVQG?ngmZ*MQ)$#W5c?-93r z-~g2cwJVw|k7*7$QvA+a!xEy?4 z8ng|Aa&eU|eU3=dZ|ri|0)gp{io35b9(j6`lQ$M#eg8pE&<=w%1sb@Inyp{^`uc2- zuuHuCP`=t#4h6^$^lms=P!8kJbVH3#Yh!pqFI~6*!wHmrWdQ!+W&(c>Ze|3-Gswgr ze)JwE9@r!>v?<4m0$m!rGbR~Dx4BFb{AzJw!#l|umRB|Rwqn2VKVmvyNT^t$`&Z=c z027kNhey;oh_A!L?}QtXBpkX!5(Q4i45aE_9A#0s{vO*rdyNuDw=FJV^vK z7=Fd@z;uKo6Gm|`eG(V{3?>My-@}!B@52eHVZe%S5TyPPMff4>WFQ_ddg4H+2skl2 zIXSTDfj*KZ%GdLMv0x8OA|) zZg6!KW44?7buq7VrBSR|@M_s>NaFw*fQYn*4fO{uDc_HP6a@ldK*d~54ygn6F0V6P zD-C87EwfE?&!0c1iRaK2z(xucfQ2}MICe-mSlQaLo!ksBUbTOHUg*ZILBO4`wbLuK z(T5@#RS0s5QHa73`KRq7&3i$6*X73C_{0m0^CR{pkOma%^}_Z8nxg1v$RLZZwI&0_ z0lEfudv1o?xhZ~nyfs9Dqt3sPKb@Kqr*!6wfhS@?l~h%sIIw|FM)eYrlA+~_=v@?Z z`}Xby;}}O$bUarnKG~jiw!Tx&^^cMuSPX=zvnAj$WE=RolzPRQl;X z?B`+6MHN7lUSHqUR86f*mmo?tN5hLE4!0fd`1xBx99lW9MvydM6bptnzc21ip{r$j zyrh*eb6LQksDi$I=~++klKfv${Z4QL!gOnCxHIM(m<)h=3x_~Neu2}?c8@_N{uyhX zOY0ZpAcRSl^;2Iz1p$<570b%ry~$k-So1spW>gNENKVvzzr6aC%< z!*(rhp>>L5N1mvBGq?zk1dw2J{eZ{A=Lt(~Hy z9&W|Ly30bt;-{t%L`_Sp#w`g%31$Gc#Ve5ZBS&v?WTcX8=d(l^D+SG5g>3xjJ%H;h zb%8LY0X!W%2;ga;YeO&v#UI=lAz&Lgfr*)y-*qGeIXvG-Q&m@Vb?K&R+B)+nDk_F4 znF2Zj7eTC9IuBvDnB++0%Gwd{z3s;g1txn)F!MwvPuu9+*gQ^doI_|JVIGByRN0sz zFm`ABOuvehw(+a9TK#x}%qlF#N9SC&JM1=qlz`%bjqgNFKF~3 z%yqF(aARW|;2K9X**)0PJ31ox^$-lF($nEs_;~cu`m5FM))>fRs)5ylM+*;|`)>~C zww0lRJ9Ov+BxDdZhR!^uBe2x26TEF9c`*(8C2%?R?nOO*H$z+?5J|^x&g}VxW({d) z6i|-;v0E`Cb9F7nkp@4%&`=gf@!(tX@-+~=Sf>!N>@xIAw;Q`b0Src1W(dto49qAT zR1Y805{@hQ%);k9O1Qc##Nma->x&6NJ2YB~^N1P35!D%(G~nvM510nuRCf@Bv;IB#9O$Hh?hzTh zvE68b>9i!3)4U`kOk4Mq9D(ZztWscJekd~U9OE5H!_xaZX*4Rhk&K}NgkKO20Ad10 z7C62+*x9v{`{;rgtA(*Q4}^dD{F#}B1rgPV*D=9g#WuqGq^WgabR=a@G;S1TR&I&X z?QZ{q08-q?sKdd_T^q}5E;@9y>!Bb9-8eVl=mpXewDb_FP=|I9HU+ggIt)rX72HZf zWq@N3Wd=Sz$lw`T+*`NiK{XVuj5U4)7L412E@kKpjE&(rWVDX>QWN0TQ7w!b?gSMw zP+W3&w@qet*47!C2L>1iw^Bj;LimF)G_c`HonEY6+Y+?WaOB+>pmN6{jdhQr45S`l0;pyA9>81v-cDH#ZfOrUTCl}aNrG)YXPU zW}P>5fgQHhSQsr9Cgo$u0)zvDQO+@70g(KEvCKzZNAAb11AXl1oD14NAc^?B@Rh`y zWZwuln&u}9$Da8p1VX+{O}(6BR10|_;yGX&0@tpFHOv;UR-_~)v5_ELcG!LC{p`X5 zM9*M)L0mea`8@_zuy}{A4x*Tz&yRH+X*hs9PUPa{)i#Nl>|frfGHKI^@pKIN|_b7)OL{dwW}3t-^e9 z$)%K5#D&Ptq1!((7lv<6=0|;EAWZ8_VQn(-3xHn~3o5sY9TjAdUlCUfIHe7BNLSxl zL5qdpfdjd4wI&e(_jYEN{R4fD+5QX|P_`DnTa@iVrB>nLv% z)UvuifY5iWK|stX1$VlNWn-^nO?i8JBh0Dm8*9`-pv-7xaXeygVo0q(+$m}6JAP=O zKD!)|K6v;XSDXxSL7^*vLvoH%0NwNv!gjv-SeT&UmKC%c&g){L{44FxCaB-MI)&f0 z@}0%=jFOTLU|SfG?TdHwCY3mhb4l64N(hoc%(M_s&+CgT3Dhq%O*jl3r;wJHy-Ajh z+Hvx!AXW(Y$iSV`fk#(@UPu`S0oi%!$8bU2V2mq;V&% zmVZ!rFgZGk`qZeDga!?OX_1)WVLB{vd@(DkXF(%!C}IO=@NPqw+HlJ*(@^R`0_8bQ z6It1K5`b?9q?2H_6_ku@9;3i#Mc2Hnv^_yPLJ!IR=q%rZ9dLTW+pu$A`gRBgL^yol z*@>Lxd+)TjVgEl zKITk*5RK*QY&L$gOSWs}>%W3DAbEtAI*Ps$EBG{V=Lr`Ck#^)pA^Z$hhS(^PLb?*t z(t4Vjvltz9@vLaX%M!lD=Dpm|al;1OZFBRK9@B9MmGP6lMHH#uC~YoZzP3PN-&l** zEJccrN|ZXbu5*?Mb~MbcmX=&frC^s1&Vw%FY{Ds4LiRf#&Y<^7+$jr3Aq-(X-ElUZk0-ja89gWvc% zr*Csk#XT)=GU+2&Dut#joCSapizlbCWR&QSZ+Fc;aBJSR(_KByk`p!Ob|5rS=dgQW zrs{hip3la?p1&W(KR)4##$!E&9W@q!g_xLn;b3{bMGVvd_|#0S7pW|+oi7yxT@t7V z_+K>OEL>>-j%%<@@Ux0ZAok`e)X!TF&|Fg7R;J(LsFGc32}O9qdiu(9hu?%fe(d)9 z=X*qOgeb0yzbjc&_6N3HfB}#&^~A9kI&qpU1N9vO$%L|D)qt0Rhlo=ewHKrol@^x? z+e>F*xu^d5HQ)ic2Y=+o7V%Jvu@gVwUq60S~@Xm*u|t>=`c&}TK_}I?mFs7xKjj$h7L_T z5fgBo;*PjlVvplFXT6oK>r{l0QiQQ^XF*vTH{J{!@;#))#AX(U;!%02q5%f}ij5AB zfGwj3nl~JOl8JD0bJ^ui&%X0srecKOt6>aZrtWMUsPXR@f_=ooSFa zFuGpy!NYWm_cm#!4QRL>)Fvlp=Rc3le$Z^Xn;G4ycB1RZT-k-vixk&4LO#P4?T2n)~LXtf~ zsOPA+O;(=uX`oj1(C-jsX7xPB(1)R~9geG}pJp6$mu>dj-= zFMktM7EReYKas{!(riBVYAE9;BjMYPqHr5R#f;JH=wJG%WCjcdD2p{qk(R+*{X{wKP(7rs^c;Ko%scP+nr>i2S#6fkIK#mL=9ML{t=(OO01mo-PH`DFcQSJk>La`Pv<%nFWNx0Az6**z+D<$P( z_=CTjn)=>#Xh<)Xwd`O}tu3O+z<-2``q!^Z$Z7Mb%>ESOLfQUD@5IjiEZrpz|2`z) zFgG5!aNLI`&zKcP>k$H|@L)3l8wEK>G`c1vE}Yv(aK!carYQAhQ!3Foc(+|%Qi_;g zWWvR`b{GV>VEhbTZGA(-ZWy@5zz^gXo;uzVd`=oZvJsVFtP96<4100q_JQ#ap)?R| zl!)jg-QC|{4+ypmZ|HZf8jJjIrt!k z_kC<~w@yh;uGuIplThyYdeh}m$Li#`6oK_hG0Di#;s$q9#=>*I&rKY@S3-Yx@%MaCzD6hfC>|-L#J^n zV?p54Vcr0tp=wIMvxnq5)5#lsR-U8FZkEo!;#F zMB)d`HSr@?A(zW?hXUa;ZV`a>($bI5|B~I$bV#<@lw-0$Cu6H|KUS~JouOm@r4QG1 zpwUCE_51g4kbS`h*3I~Wru){N3*kz08Alg{PcDsYa zeBWwM-`;)uQ2)boR97%!TfFe02kL%Q)?M*rAQlhKGEu^Ag`K}MWsNWm2wio%GvI1d<60NaVf21lLX^2Ve0kwS#@ zbi7oGF0UZE8Q|g|*8ElmGkbMGCGW&ekbUqsQcDkI8@LWmNwC0SWX zD%m5l$zGKeQf5gANm8M*M=2vKNeJ1iB72o_{f?{d@9+QTuje`c_`be(_Z`>uInVR+ zdB2bMG1@Dm2h)(Y*7>aj7ScvaHLR)ZOR}l2;js_&8()z`83bO3w-0_d_!1hx3uB5X z-iCS}ws_SAI~tV#$dVwXi{YN5S}{g24k--~f48ix%&()5BO;1X`oL@*a~&oFJk!`! zvGXRL?+T)_D_pho@4~lroN%O63|r~D>6jnn)Z=a^=e|~rc{e(eubpj!D!i+}`0*dIX>1~zO=T--wUm0bJo*FTyPj{r$NoT!15a_WAMy5=***at6v zo|@ihPid&wdUE8oU$Ab_wm*zR6b3F*vL>Qzz!0Db9Y%+g>N}^3bz1gU3Y@N+Kfjv-6mDGesLUNJe_LTw zM+!|palQX;e7xVvU?|E)n$R2LUd}|OVy3C*|0_OGK%w8Wg-RTW{SII+SiE(DB@-XV9~M*8kK+sTg`HZM>1Tw&5a-sP_{S ze;?X5LXelIyX_@ST()DnJq}O!X6J7oK7{o;7*{D*+Lhl{6eLAQV!d$=V01MsVc|=t zQkwMl^B%~{%Y%1i{)h3eUzs0odCswab-=jXCmgl&_{iv--sLG9$>q`CQ7JUnwkj#o zNmA?(-+4Twv~;u2X1yC(QK=e{noqx-Ywv3vO`eQk=7|)E@+~^*9PO)?rd^H)7a3)R zp5K4Cm%*NT5$X+e%6_TV{tlj8ks43hI}4s)vL~+I4oFCj zDY2g@1aw_t4a8- zJ7_x%4Iuxbp3~aiSAsdZw#W_jZi71~hFYK#8lCN5^bwc(Q|if2wSbx-aI`K=`;3R2 zh^!6qg&(!5Dr$|1iC>r?&UW3>E!DFzGc^2m(Xj${Kzy?|+-8Sr!17kgYO4riAQJj- zTJPYR75^NtF&=&nGTd#50Pz(@{{ zustjVp6g?K92aO;BpC2-Tc6rSOADj9d98pyXJ%JM09hz!IC~{+HugcMh+#ZXE{v)A z!4ra5jn;9C{GHi_+Bi7R#HFr{9MH{hi-CC@1yUUl0P6p;sFDhj!wYeN!HGt!-;9c2UnM5?xFwyz1dg!qniYjbSTJ>%^ECmxb@G zsK7An21;bW3m_egh}#H! zpc~9iOjPPE_UzqTv%nWPAkP=yNXq-dt1|R?6r2p=pIjm$2&dM?>a=P`LoL|XqL}SY zDxK8Lt{!vq)bH}Yf1T5E2Um)@LhZez*&~HEMLl~__%Sm4TvV1@=bk;pS>_>0KYejG zBO@9aPs|Nb4Z#G$LiAFJ%gJYNUwyjdwP%T~h1NtwHZ}ib)HS63RGD}pU7_{zB!s^x zak12x^}zTQJYD4Lb+xxI9?GeeF+a%8!onAgrG~`ym3Cx4Mq(t&FKTttbMNn8shEZ^hZ6-dfq`S|=Wgnvo3|8YX_-fL4d?($ zT9J>Hm;7CG(&4QpT)ARqWiZa2`ff{~`E)uq`MoD#EA@{|juu0(&WZZ-G-`+K4{o4RD(3 z>bAM>+iG66e2oatm*ox;sb&6{M&lnTk}_T+n=o7)eB3lJ5K%y|a3CVw(9PW)!_rD* z-@wgnbS~b3i6G51?aF3;6QGb_ zSfQt9VQGmuLey|MQy)d(TOLgb4BL^{jr>GBb@zKl)7g#uRhFu9Wo|7FN_y(6ZP#b3 zYhL9vjf_u7*eBs+f_%lHTyF$mU}^^p3^Oh^L&dkIk;utN)+AYx9^E6hry2bqwuox- zGnfqneV37uK{U6dTwh9(`9_WUyVXrM-jvW$c&2ntEJ7j%&0Mw~0N`+e34;8D?c$V6MV;}v7m31r`&S7HLI-0dr=LpAM=<~j$A%9k!3&5T(b)bqAO<>JQc!^E zE!r_bzN&v8)ghYDjFOV`56Te`R~SItKqBKmoEqmUPS#t>^O(W-Nbi<=PvCIE*M?B5 z-S%85Ct=2r@wk4SNI5&hD>(%^U=Vq8Wb&Upm)?EIGk~u~&`BxWjlRxa0ko(Hu9E{*t`ay_JX2e@HQG5??$fF(({9~IppuBV z{nb?3krI6$6@%-m)rU`fdU=@X#!&eWvV-I*TTd@!m~qeegt9K>Nn=jn1f-gBeLgKUsf-3BAnY;C#YZW%EO$d0%qH&MPOdPhn?LxQJDl2$mb=A z54_jo4;%Fb)}KhxZiy4sDR0}f@R$Vwy^a0Sgs%RwwP z7|L!`?g`E=!&?3|lW{-tt(mX!#Vab-@kvpbgQe1g{T>u?EEH)QKvH5^@06d5Tb{n6 zuR`ppdlE+_R&`%F8gaP(AzCNizTNc)ABm1)OlDzg!>|T{5OBkS-GuM=;9$f7yRFyH zWR_d^hvI+=3PKFX6j*u)mmBfwb0`9-4UH9v_a@Mz88|x9_6rILXngVzZSP22azyGd zhNmRD9|DVk@Bx7PXdy~{UEa!Pv)1~${50DK@tob!Oh-Pd@$tOs%`UE4UE`FSBtrOr zizAHm7?`{YwycawILI9-GPL`%SIdD*8;t&r{d>ef(H;ik&d1Ns;DI-a-G5~e6pMtM zYlMvmT|^cxX%QE+uxv1r)WZo3g)WZearCuVzwpMN-nrSV2FdRgzl*O{@UXvl7#S_u zwf-&CBvL1ezQxzKR?w97@27y|5%1!m3d|=>)&SE# zyt{DG#-OL8y}f|p)+K%6bOD1$5HC9!UE2`%w)yul0y9Yu!A&ppPf?-fK|3?J-`$L^ zG@!oE9VDtoWg186_Gx-u6leVkPD~(_;IZViBVd#WtPczp^wfPevSxms^t)|E%+q`^atk}bq8h2LqNTc%LLu`k%V}jrsupHWCEjTJi*JJIbUPQS zr(SPyD`uys*FimY{yYk)bUl7RFR=%-NPQMUlSD)Y-Hua#_6<(@SmD>NVRcpj4cXjiBVYl6_HLfn+Ji|Y75(!~8BEm|&nQSM@XLwI@tDSgu={!Y z5oL-73FXWOhc0DnsGshh>l-HB`^65rZ}WafQs}b=uY^m*#sG;Bqg)% z-hGwWdSkTyKF$T{qY%mY+Gzx2jV(R045xc1vWIt@l=DcjevbW*%lT5j8b8G_?Z-(3 zh5@O!*4Jm`RLa!Fob(BH0C<|CCOYDKy*`h?m0ERj`b-#NOYkUStA>4R3F>>4+W>}9 zN&^ijEj{jR*-NOQX8^v853+M7)IL^+_k4($W<1F4+$zG_>3AXeoYVYNvqJkFiBdZH zJw^p(wpTaq6W53vSscE}BN<8mVXr(v7VHBhVUkfZM-6$MMVu$XJHgYJ_FTC$&TP5u z*<>M-D(b}P)<*KyQOF%Y69?k zbqo#5(bYm;foc@;gkLDK1UmbswI+K*=-Vdeu!W)ImFT+=t|S%>Uit8F7^*vV_g%8j6?gEDZgaNEfi8k)S;o3nk_Hiq7%UoXG@`0Q!e<%Cn!{3&2Hbgvt2WU|*}{jD6m z&b03RZw=n6Q{XZ8m~jiK>||^iRq;}~p!@SrOhJQ1=6hSI3tnFpdWUOgL&i4OURJ(v z;mM)>SI?^HdG5j-+LD?1Cwns6vPSQt$l8;2HGD&8A4fUU#u9Dft(2sW*?M$)a?wQv zJG~70ju6k{2Tg3XU*l@*4r^||a_ZT!Bze_yS{@4e3OZHyQ>u(|Y^-`h1SMG#*?pJt z9Sn!f$TJKBH>)v5WM*V=1A0Ptjy4O<#7L8Pq1Qto?*=%GVV7ps&I8js6-&#?>L)!K zQnjwnzK9V{w6_iseV+bMT8>*-=(ziMLh_Zz9Zkjd;?up4h@uYV`Y7w4$7MT`Y9S*mT})}-8P+AKXb&YmZDZ9%Gs3Dw1hjl4RSNbo6$X<U6uE1$BEcfR-s+nDhk~LSh4yT(%RMDWjc=WI4dh!!|gyEB~y|5+4^AHg2yJCJIwGv+{z9=M`D@4bnV^pN8q# zb>*E*jKiU3|MH%-l~q$AOItyse$p-abk?@3i*Apz_~&2ErCSW{wj8~2;zXyTk*h0t z8X4O@FcwIPr!xn44e6N$XtI)#M;K7pL9&X<6@4cN4}ih;J5^f7=_=5DwYveB8u_F# z@%KN9=o;ydrN4`_|2bCCqrs8Q*Weew>iYQzr8wYWmlD!8xvbFqKIC}5W@21y!meG@ zz4-@tyyBa!B5rFP-LpgMC%c@@A2ml389>Tm%4J3>0nM1qq>LV zIrj_77s6f4T!wrXDN}YnXsX$n!muYhY|kEMHt)k=Dkd_g<~g2fPx)2$oaV~nqOCZ+ z1?S7=-ATrBZfo5YNkvn=khcS5Na}FtD=G`uUCNufrpK>(TC=yps}9cczlDWt+!d#L`Ttp8X&{({W|4+v9nU39&l^*8XM(~Nh&;yy!g7y|D!`u#C+Jvdug`t0$Kse4$K`L z3!d(FE|6zVoIYD^2iYp=GGHKWm{gYB$IqHyRImSOmQio8`lLgU-YSE2@Z0Zs33igbq3?&=rYQ8mHad*<_CZk`#iKo#{s-EsvK*lUuQAL($(fbK^_GE>fRzJH$vv@L8fTqGlLPTg*ZeyJIo$aR!^^1)v=rGb^>-r4N zRXP~tdVl^($H4G7Ogl0v%H3m0!+_UQlezT?3+K?=r}AMzcj#|FX((k(;K@{#Q%{)cUOo5e_%b2b;QDnQaX^+`zoM`t_v&stk>X8V@6#lrqj7 zQR9Bk&0xl$yYtM!jM{oWMTrKLCr6J;9T7N_*xJ?m!%ga&(g5GiCnl~vdxdxi&`&xzlEs=rnPBJ0wY@0=>y>SF7r*Y8Oja z{cJt`U^J>yw&C=5Tt$vwJLE*a$cYXx7)o18?>_Eb8luOI0h_97j)dZ&BV$$3RppZp zPHZu{8F7;~HrUI|kG8D$xR}@|gP}taNWV??g;~RM4)9|lU2m5|Bv%RQ>KsZBvVO!X zAKAmm)nDOv%1uwhOEp`R=QP(Rkiz^I={VU=J&B8@Rx0+If81=t&BhaXSg~8GM=d;D zeQUU6lzAjeWUTn~x9&3Q7A^m|*vi4GBoBu|x7YU`pVndzYYkc{7WH3=UjttrHDs8oF`A63m4rB$Co4yZ8NO)YEFh;wv79I4-{FKq|X<>|trKEaX z17w%kU}gB=0hhL^S;I`0E4#1DtZ-dac`0u|bBq5P6os}zh9wWhBVFQj6kU$Ey1snr z*x6@qdwJsx@wYL}FDcKd&*PCk7s67h%_PGzeZ>;UMEwGpI4@V8pWn4>uKTSBzv+nf zs6gFqHhVi#Ou*u;)4ao9J}&mm>5qH453}?mAVpIAa^X(K>P#vMMXI`^JG+VF#P!py z_urkP-Ak17pDQ}SeWKIB(C>4HgnfawV#mnt$-cq}5%<|fbso#iQ#5Q-;JJUFo^iz-vU}E!Wlh5+q__#}zoSDzMCnWTIxbe{M*x%Q$` zNST7Hjbwt2YoJCx*)NcXBO#ACMt+m6?n#htR5V@oAtf#rwte>wv#^yXSt}Z9`06UY zG+6E%b6TLKQK9m1A_@$04#w$3=}-?hL^O0*jB07JEShKF;nrz5cq+T?S6=Dk-2PJ2 zf{(xsRG!2Q|LC}Nu~EGN5l6~j-p7vB3p*O>{CHhQ`)1F(U}v-Jt;bs+Zy+e}@=J4Z z^CX+I)g3g~;EKjyF81o1dMVW_lrqjDOn2>5*4}iJe64;20ZMo@-=7pqi=oTUx)h(s zFL&Vf`0v?SXT`7}`kV568A1wq$Dg;0zkr4z>(L_=@Gg-8d(f z`zC2v^r7lRXbw$?>IuoQ#OEysN10c>P5&+pimP$JLMD8NF|DSnlD2QviiG^i;mKFJ zclDy5MG;>@Mb2|FlLu%zwX^dCe}}`@JWd|TlMj()qmBQ*bp9dlA&rf(diI1DeD(Do z`d*vP*DfaQXHe}oNp;X;WoIWgT-%goL^QRs4GD4%y7Tg7OkSAN`pQ={Yd_1cr(YK{ z56KVdu)6!U?A~D;ktNzCK1FVi>94@wOJj1k6W+dL*2y{UQ%d3+kB?bqS!ZQFK0}II z-s`}`xnEL}M{!?DYATU5z5Z6L^Popq+wA52-2QS#e(H5&|Ao#P${LsR1}A5`+p;w8 z>c{PPdg^#t8A2n0^vyOB=ZW1VmZuU#V?|$JG%9nX_j1b1o?q0?vy_yiRHRR2WP}w5RWD$0Kwk>rPUVK;IoEispMu8QW6rdhL0WX{`J#K#iHA+i^QF}5 z>yJY(3KXJq`#qIW*5*E8_ps#y`Pm!)tzo4AkZJWH8(XD=XEy(j3t(Q*wdZ2e15Io9 z3ki**-@i}099jN4Qr#6X&M?Gqj)(XBUUzW6k7>1wNi$OId?J5vm{LLPX^Gn}UGezSAW)p&xww9Dw(oPF<&SZUPKMIP=? z+-yb8aRn7qE{ADe&Hobvf2x$k^R4GL6HFwjB6nOlC1kvwe%SF=gvZmXwy|9wc5eJh zW(63Ooug}Iryp+wgafbsP|^^3=W8Oh^mlvw#y65HuWh_57ZXivGCBNY;V1p`22pd~ zxDqe_%N8T=G9y^{8qTWnv2hpNW=DhfT=@!Nztcnuq!kx z)F}DpF!V!*@0FCj%n6xwZa?%)42nC>C|?s%WJ$A7%G%fZggP@w)S)o2@{H4RPUz;d z+-7{oL@$Qcz1rk$`EMCKF{B|&xF??&>%pQCJ7RNKsmpH4u~0K0-xBi7)VfQxY-^^B3eFU?yhb_aW1>Kyort~!BdEw)4ixo zR!sH7WTM`P4Xw?~`z+>h-u4HAnyjYCErViIBXquvy=rNzU#S)|y-#<_mG2Zw(j~EE z?i7)}tYvV(G(5YrM5Y~5PiR3aN4oxk2Fo>!7X!W166ab9ebWsDQ|XQolk+GGeR=~p zEdN9@T%)g76W>H2|MKeeHS77M%Kph%rV8#{S>wr|iZZk5a{oe^rg2Vko;Ie=z^a@7 z)ye)2`Ii~+3yd@mQvL_C4zwJ$W+#u4*gq;m)Oq$QQZj@rB>ZGZu~!}QYzq0axZjl? zsMQW$9JoNWFK$o}FC8u_!aZ1!`oAlZQhfa%C<$)1a8p-k;L)NBBDw>CufJcQq;M1n zWdH45DEl#snn90aWWxX6d)BRge*m2}ek);(UhxDW(DDY!n-&+xfXPQ$it-Y%WlpNY zhx)1WTo{SuW&?swe#5>IS+5p<6s5@i?~72q8GU=3^9q_KPL*k6e)7#{{+;0DJ7Uhv zT*eF*PqW6e=;?w{s^q z?T+Dlo;$d=QE0HqHj_o@DDuUJhVazx4+;*^OcFeDEGMg}$U20NaOgG;@uD78D%Hq{ z+uLua2OX}p3f1G|{NQ_o;uJ-LCu%?y7ezAz17_hFfd7L|4?F*@&`iJw#VRf6WxK7c z9_huz#wW)-Xwc!WsuNSuQ9j5S>~)15|K3F*2sXP^W^6yq-! zrm^Q;+Lf}L$DaM? zMqUten$pt-WBtOY4whFuVtiN6)P%hL;@0qea*%u{lXzY03Hb~*?jiQm%I_@)eF~=< zR8(o>gFt?K+HR}(;az~;zkC1ISmj(P86k-79rJv4{*mLyLGFDI0(RV&ID6J(+pf=? zb*-?{8+MVT*iWNyLv@5Rt?Nfge2@EG#yI7mlgGrx3JVJ0FRACX*+2nEVhgMl1O=ZT zeCjka1!Q1PYt%jKrlEqN?y;4q&4+n8gH*!y3yS&K>->HpD3!s*ef5I#Nyd1T9au7{+t<3!UT5+)hKgr8RJn3xwK=J1clbR_SCc1-GOG_P z(k%R_t1~Q*r5lp-qY?_3Ze&Xfr#k82KGhu)emVG^-BIHT|L21_e{5a_|GQ&Q2!c)+ ztoxHM3-J{>Z&nl)f1nPJjfq*Z>ngBsvub-?GwRZO&Z$?bB#FTEhVbIvDI9ERha)Ve<;LqyCf&N=p!}G!7W#$u=fgP*4O&c^xt|0D1 zrwz3NO{n?Db;4V=T;e>*Fk30A>4LqmfzO#gZ7Q?VeumP=Qd$oKZ0ArSYc2po|#EjD(Y z_HUMP=FSKb^|jx`kP*afe7BtYRj+WL+TV{JC|~{DZ4;rAm4dEn%QRmgamD+51Z9}B zTxB7ds!3mdWnDSze=kf6CW|QSvm~OpUDJ)4KGD+1I&zt7_?9t|{+x8JF~*S4DbI#1 zy$H{1y5Tmx*Bqv#B&K`9#rORE4>+_rx68!k*1B0*9mB~Q@I?h-8xSUF{=$8aKy7W$A^8aAy?H~F+ZdLs zTt2gjK*fPk2JAnf>44S5<)hxqFW{O7tCA6~N{APJxc&L|>45bzi_;~DOiyX>o&l`a zWtZY(4;2H<$H3`E%~vA@6C70G|438Wxw+zr8vXNL|7KG#u2X!;zJKf1tq^gcNAfEK z`8Otp;YQWKE5APZ0M0mFt&v@u^yr?7TsV3hJakAyT^%fPhFHJpqy4T`K406-(|#|K>>@8-ya*n7d3~iG zKV~$7&>7p=efi-g-EsiN*#{1Q(o^~HVIZ9ghzgmWpZ`8puzC7+XY$P#v|khod0lpW zvCEVSbi!yj)%G*Q){i7!RO7=eQt;3r&~GF9Ul|Gs!vnFt9%Lm1xAqn}8iSeCAWM+{ zbn#I}lF#wD@s}FB5n*BX?%%)geIJ@9{9rbkP!FC|%m4v1V~ z66Q`CyloSUxFJwfGe+=$i2^zkuqmOtB+KOTU*H^ZtO!}L($hm5r@%)tSHekNbSxJh zpqo3FU^sj!^u03}op8FNq4tz>Q&LjGP`S#4dCwkxxFdZ02zD7bGE;B@mCyUrG1!C{ zbO;RaUBFLEYF4JArx*mw#JVMA_uUidNT6ix!kslRxYz4&S1l7{NBk=gokD5$!qjow zjvXLss;a4h(fkIM6g3tBvvqhz&hp1c=3{X|@v}bE_-~gb5d10Y{b#7QZM#@t8{g}& z+;{KJ9S)-z3KT>bkAwnRx`6oCV#}Ag)h1zhTd2jvNd4c=v&>(WW>bI z=5~Ty0J|8ZS&$aGkS6*uITAKUc!fZG#hcM&H4h~LiD38#rdO*7ly?*< zB_~j+4ITAW3^NqMk72A6l?ir+X7kbKT;im%k`jy(z!%B@PtW7cYO-2p_^n%{Acfxu zi5!9m15;V)7FZ|fojr>*K`>6Vv)Y~;zmWyebkND*c?Ui_eae?RpdNMlJJcZfK`EJxr5^!9-VNH>t>PS0}4V_wJZ4 z9(A>cVYs2t^4hEPbVWAnbu6H8!G+VLsBTjHc>oepu<~;Vs)V~5zzc2uc#w>KPEUIr zPliHa#w`gq3r{+93QkUWIXUXNoh|mai(f&|4I?ZVP-#&iUjFv2TkR8z&>h7~99=at zf+Nb`%QOGZ5OoSIoN(SmoJtQ|+h}IfF(~YQFsNZb! z4W!ijC4iX$UXX89qb{Hb7QB8<(ub3tiNE@O zW>!{6r7j_p6Pa8+zuZd<|{-3VgtH-sw*oG5)(u^AOQ_6r$3j>G*ycQd{BU?!-+@VI$p36>~3ahAOwmSX`c zp#fmlR72^FuUf;f)<;{Uy<^L)&N2IL7}=1_#_W5JwVXv{2Cdwm?@$cB-qpfPcpE@6 z&qT=c<;x$+Vl5(J2jsPpc>lf{-&v4oR%fK)466$^A^3fO6>)xUyY2+NH%WX8aawM6 zHms@40s`Jx6HnHjugJ9rzsb(dt;BFh^%7oWpH+w+u?wmFfG(P;6!AEJuN6U@-@)Tv zsXVrRV=ms;lS-(g6w^L5H}eD)_fCO20p|Z0mDWw5ch~Pp>lZbouYk~R8&>z z1vJshCB(r%>bJ?lH^9*#)mKb_u5ebUwM|bIAT) z_|joqjS2xY`YoF`BX#8jrltu{20R#lc2%$SmPI^{ zgLa|z>(jG2<&FZ;Dj=V8N2`EO`&?guvwGBJad{aGU87`8Dw$zPGpM1lCisG>AI-OR$G+AQC53A7mq{D453n8@dLq6!M$ zH^stwCob+ao-=^#CmsH)m!|n`X5K2^6u8zdlv( zC25JST%l!?aKf{PvkC+<7<1r>h4B&``PO?zMu5fr#4!cO7O+!Mo9y0NgR>OYV94U- zRH6$)-CNXCadn~t+)9*tX=!j^lUg2>h(cWwe)~4lx&G6dnnI``z#z4?ErlWYHqZa6 z1j0b@iI?oJrAL{3t#0~50D|%c_YqoG_}`(N02~hT8`cCmB<#`P1J==wk;zLmQEgSZkG!#sAV^f+B!NCA+v`UDFn8t>f3(kW$S?vV#es0 zZ?I3syL#T&(C`5V6?R>`{qg;1zxeVq~DCsj5=Y3f17-O;Kg_s=cEFjMFN01JY*8ikW!77uO`=9lY2q#l z(=@SjDHZnreb<3;l6S(PEyp6HdlocWKF&`GJIqEsxHG+pAiZjmWqo0NXm$0=#BxdA zhh#Z*)-l=t0jCsn_~mBNEca80KE$@3^7<%i@u>OrJ1e`KJU7Uj!x9J_5{LR&gj9=4 z^!7fsj&xU@`VZ45B(UJY6PaG{YT3VD)3#QVyPLvvHq?JZt=V-8@ZIaTfttGAb6st5 z{H1=^cK`0g|Lw-|C(`%WrHDN9TGFtNmSJMw=jl#DbQP>-g<7p8+I+^DDxM0G|JRzM zcejwcCm6FsP}Y8)Wt-Ze7SEWusy4y@ znI>8$D9)i!Jr_H(P_vGFd4J!gucV;v7ZQ1gr&(7XEch!IR2=Q1r(3`i+M96basqcSvbO z(KA%uim(0 z?;>eo;g(4X+Z3@# z&r7GK5yy*K%{71}9UUFLy~&NE=rHhqQH|HvtC|zBSIYn4TeT6#VFghXiU4E?!G##Y zqRHK40lLEnE`r$$!%5gSLsc|Qoo)L;57V z`^S>t8*@5lWVo#P0_%(v4!M++6xpb}igcSciFNoDhip{_Qiw-_7TM z1ncQ6wM|5H#x`)gopu!pP8}Qmq7H?WJO{8e(xsICZ@eMD|No&spk6C8B@oD1Rh1O< i{-6Dj|2IF_9Fva0w#~IwlpCZ^p?XqN>4l=n_5Tm_r{M_z diff --git a/docs/zh/08-operation/pic/replica2.png b/docs/zh/08-operation/pic/replica2.png new file mode 100644 index 0000000000000000000000000000000000000000..985f7b35c4cbf2b151ffe4298e010d250bc8d1d3 GIT binary patch literal 105706 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

>Mw(;~hL& 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 Date: Sat, 21 Dec 2024 18:45:50 +0800 Subject: [PATCH 35/47] docs: update ha --- docs/zh/08-operation/18-ha/01-replica3.md | 26 +++++++++++------------ docs/zh/08-operation/18-ha/02-replica2.md | 17 +++++++-------- docs/zh/08-operation/18-ha/03-dual.md | 6 ++---- docs/zh/08-operation/18-ha/index.md | 8 +++---- 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/docs/zh/08-operation/18-ha/01-replica3.md b/docs/zh/08-operation/18-ha/01-replica3.md index 5a16d3f152..fee19a0afe 100644 --- a/docs/zh/08-operation/18-ha/01-replica3.md +++ b/docs/zh/08-operation/18-ha/01-replica3.md @@ -4,24 +4,22 @@ sidebar_label: 三副本方案 toc_max_heading_level: 4 --- -本节介绍 TDengine 三副本方案的配置与使用。 +TDengine 的三副本方案采用 RAFT 算法来实现数据的一致性,包括元数据和时序数据。一个虚拟节点组(VGroup)构成了一个 RAFT 组;VGroup 中的虚拟节点(Vnode),便是该 RAFT 组的成员节点,也称之为副本。 -TDengine 的三副本方案采用 RAFT 算法来实现数据的一致性,包括元数据和时序数据。一个虚拟节点组(VGroup)构成了一个 RAFT 组;虚拟节点组的虚拟数据节点(Vnode),便是该 RAFT 组的成员节点,也称之为副本。 - -1. 每个 Vnode 都有自己的角色,它们可以是 Leader(领导者)、Follower(跟随者)、Candidate(候选人)。 -2. 每个 Vnode 都维护了一份连续的日志(Log),用于记录数据写入、变更、或删除等操作的所有指令。日志是由一系列有序的日志条目 (Log Entry) 组成,每个 Log Entry 都有唯一的编号(Index),用于标识日志协商或执行的进度。 -3. Leader 角色的 Vnode 提供读写服务,在故障节点不超过半数的情况下保证集群的高可用性。此外,即使发生了节点重启及 Leader 重新选举等事件后,RAFT 也能够始终保证新产生的 Leader 可以提供已经写入成功的全部完整数据的读写服务。 -4. 每一次对数据库的变更请求(比如 insert),都对应一个 Log Entry。在持续写入数据的过程中,会按照协议机制在每个成员节点上产生完全相同的日志记录,并且以相同的顺序执行数据变更操作,以 WAL 的形式存储在数据文件目录中。 -5. 只有当过半数的节点把该条写入信息追加到文件系统上的 WAL,并且收到确认消息之后,这条 Log entry 才会被 Leader 认为是安全的;此时该日志进入 committed 状态,完成数据的插入,随后该 Log Entry 便被标记为 applied 的状态。 +1. 每个 Vnode 都有自己的角色,可以是 Leader(领导者)、Follower(跟随者)、Candidate(候选人)。 +2. 每个 Vnode 都维护了一份连续的日志,用于记录数据写入、变更、或删除等操作的所有指令。日志是由一系列有序的日志条目组成,每条日志都有唯一的编号,用于标识日志协商或执行的进度。 +3. Leader 角色的 Vnode 提供读写服务,在故障节点不超过半数的情况下保证集群的高可用性。此外,即使发生了节点重启及 Leader 重新选举等事件后,RAFT 协议也能够始终保证新产生的 Leader 可以提供已经写入成功的全部完整数据的读写服务。 +4. 每一次对数据库的变更请求(比如数据写入),都对应一条日志。在持续写入数据的过程中,会按照协议机制在每个成员节点上产生完全相同的日志记录,并且以相同的顺序执行数据变更操作,以 WAL 文件的形式存储在数据文件目录中。 +5. 只有当过半数的节点把该条日志追加到 WAL 文件,并且收到确认消息之后,这条日志才会被 Leader 认为是安全的;此时该日志进入 committed 状态,完成数据的插入,随后该日志被标记为 applied 的状态。 多副本工作原理参见 [数据写入与复制流程](../../26-tdinternal/01-arch.md#数据写入与复制流程) ## 集群配置 -三副本要求集群至少配置三个服务器节点,基本部署与配置步骤如下 +三副本要求集群至少配置三个服务器节点,基本部署与配置步骤如下: 1. 确定服务器节点数量、主机名或域名,配置好所有节点的域名解析:DNS 或 /etc/hosts -2. 各节点分别安装 TDengine 企业版服务端安装包,按需编辑好各节点 taos.cfg -3. 启动各节点 taosd 服务 (其他服务可按需启动:taosadapter/taosx/taoskeeper/taos-explorer) +2. 各节点分别安装 TDengine 服务端安装包,按需编辑好各节点 taos.cfg +3. 启动各节点 taosd 服务,其他服务可按需启动(taosadapter/taosx/taoskeeper/taos-explorer) ## 运维命令 @@ -43,7 +41,7 @@ CREATE mnode on dnode ; ### 数据库创建 -创建三副本数据库。DBA 按需创建指定的三副本数据库 +创建三副本的数据库 ```sql create database replica 3 vgroups xx buffer xx ... @@ -51,7 +49,7 @@ create database replica 3 vgroups xx buffer xx ... ### 修改数据库副本数 -创建了一个单副本数据库后,希望改为三副本时,可通过 alter 命令来实现,反之亦然 +创建了单副本数据库后,如果希望改为三副本时,可通过 alter 命令来实现,反之亦然 ```sql alter database replica 3|1 @@ -65,4 +63,4 @@ alter database replica 3|1 ### 2. 创建三副本数据库或 split vgroup 时,报错:DB error: Vnodes exhausted - 服务器可用 Vnodes 不足:原因是某些服务器节点可用 Vnodes 数少于建库或 split vgroup 的需求数。 -- 解决方案:调整服务器 CPU 数量、SupportVnodes 数量,满足建库要求。 \ No newline at end of file +- 解决方案:调整服务器 CPU 数量、SupportVnodes 配置参数,满足建库要求。 \ No newline at end of file diff --git a/docs/zh/08-operation/18-ha/02-replica2.md b/docs/zh/08-operation/18-ha/02-replica2.md index 67a071c7e0..7f3eb2fe5c 100644 --- a/docs/zh/08-operation/18-ha/02-replica2.md +++ b/docs/zh/08-operation/18-ha/02-replica2.md @@ -4,9 +4,7 @@ sidebar_label: 双副本方案 toc_max_heading_level: 4 --- -本节介绍 TDengine 双副本方案的配置与使用。 - -部分用户期望在保证一定可靠性、可用性条件下,尽可能压缩部署成本。为此,TDengine 提出基于 Arbitrator 的双副本方案,可提供集群中**只有单个服务故障且不出现连续故障**的容错能力。 +部分用户期望在保证一定可靠性、可用性条件下,尽可能压缩部署成本。为此,TDengine 提出基于 Arbitrator 的双副本方案,可提供集群中**只有单个服务故障且不出现连续故障**的容错能力。双副本方案是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次发布,建议使用最新版本。 双副本选主由高可用的 Mnode 提供仲裁服务,不由 Raft 组内决定。 1. Arbitrator:仲裁服务,不存储数据,VGroup 因某一 Vnode 故障而无法提供服务时,Arbitrator 可根据数据同步情况指定 VGroup 内另一 Vnode 成为 Assigned Leader @@ -18,15 +16,16 @@ toc_max_heading_level: 4 双副本要求集群至少配置三个节点,基本部署与配置步骤如下: 1. 确定服务器节点数量、主机名或域名,配置好所有节点的域名解析:DNS 或 /etc/hosts -2. 各节点分别安装 TDengine 企业版服务端安装包,按需编辑好各节点 taos.cfg,选择其中一个节点作为仲裁节点,该节点可配置为仅部署 Mnode(将 SupportVnodes 参数设置为 0),除提供仲裁服务之外,不存储时序数据 -3. 启动各节点 taosd 服务 (其他服务可按需启动:taosadapter/taosx/taoskeeper/taos-explorer) +2. 各节点分别安装 TDengine **企业版**服务端安装包,按需编辑好各节点 taos.cfg +3. 可选择其中一个节点仅提供仲裁服务(部署 Mnode),将 SupportVnodes 参数设置为 0,表示不存储时序数据;该占用资源较少,仅需 1~2 核,且可与其他应用共用 +4. 启动各节点 taosd 服务,其他服务可按需启动(taosadapter/taosx/taoskeeper/taos-explorer) ## 约束条件 -1. 最小配置的服务器节点数为 2+1 个,其中两个数据节点,一个仲裁节点;仲裁节点可与其他应用共用,但需与前两个数据节点在同一网段;该节点占用资源少, 仅 1~2 核;如部署 3 个以上数据节点,无需单独部署仲裁节点 +1. 最小配置的服务器节点数为 2+1 个,其中两个数据节点,一个仲裁节点 2. 双副本为数据库建库参数,不同数据库可按需选择副本数 3. 支持 TDengine 集群的完整特性,包括:读缓存、数据订阅、流计算等 4. 支持 TDengine 所有语言连接器以及连接方式 -5. 支持单副本与双副本之间切换(前提是节点数量满足需求、各节点可用 vnode 数量/内存/存储空间足够) +5. 支持单副本与双副本之间切换(前提是节点数量满足需求、各节点可用 Vnode 数量/内存/存储空间足够) 6. 不支持双副本与三副本之间的切换 7. 不支持双副本切换为双活,除非另外部署一套实例与当前实例组成双活方案 @@ -50,7 +49,7 @@ CREATE mnode on dnode ; ### 数据库创建 -创建双副本数据库。DBA 按需创建指定的双副本数据库 +按需创建双副本数据库 ```sql create database replica 2 vgroups xx buffer xx ... @@ -58,7 +57,7 @@ create database replica 2 vgroups xx buffer xx ... ### 修改数据库副本数 -创建了一个单副本数据库后,希望改为双副本时,可通过alter命令来实现。反之亦然 +创建了单副本数据库后,希望改为双副本时,可通过 alter 命令来实现,反之亦然 ```sql alter database replica 2|1 diff --git a/docs/zh/08-operation/18-ha/03-dual.md b/docs/zh/08-operation/18-ha/03-dual.md index b19b8e8bc5..20565bd562 100644 --- a/docs/zh/08-operation/18-ha/03-dual.md +++ b/docs/zh/08-operation/18-ha/03-dual.md @@ -1,11 +1,9 @@ --- -title: 双活系统 -sidebar_label: 双活系统 +title: 双活方案 +sidebar_label: 双活方案 toc_max_heading_level: 4 --- -本节介绍 TDengine 双活系统的配置和使用。 - 部分用户因为部署环境的特殊性只能部署两台服务器,同时希望实现一定的服务高可用和数据高可靠。本文主要描述基于数据复制和客户端 Failover 两项关键技术的 TDengine 双活系统的产品行为,包括双活系统的架构、配置、运维等。TDengine 双活既可以用于前面所述资源受限的环境,也可用于在两套 TDengine 集群(不限资源)之间的灾备场景。双活是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次发布,建议使用最新版本。 双活系统的定义是:业务系统中有且仅有两台服务器,其上分别部署一套服务,在业务层看来这两台机器和两套服务是一个完整的系统,对其中的细节业务层不需要感知。双活中的两个节点通常被称为 Master-Slave,意为”主从“或”主备“,本文档中可能会出现混用的情况。 diff --git a/docs/zh/08-operation/18-ha/index.md b/docs/zh/08-operation/18-ha/index.md index c40dfe448a..d482646ddd 100644 --- a/docs/zh/08-operation/18-ha/index.md +++ b/docs/zh/08-operation/18-ha/index.md @@ -1,13 +1,13 @@ --- -sidebar_label: HA -title: High availability +sidebar_label: 高可用 +title: 高可用 --- TDengine 作为分布式时序数据库,支持高可用特性。默认高可用方案为基于 RAFT 协议的标准三副本方案;为适应不同用户场景的需要,提供基于 RAFT 协议改造的双副本方案;为满足传统双机主备架构的需求,提供基于 WAL 数据同步的双活方案。 - 标准三副本方案:时序数据的副本数目为 3,确保了最高的可用性,成本也最高。 -- 双副本结合 Arbitrator 方案:时序数据的副本数目为 2,但节点数目至少为 3,以确保高可用性和良好的数据一致性,可显著降低成本;与三副本方案相比,此方案在显著降低成本的同时,依然保持了较高的可用性。 -- 双活方案:可仅部署两个节点,高可用性较好,数据一致性弱(最终一致性)。 +- 双副本结合 Arbitrator 方案:时序数据的副本数目为 2,但节点数目至少为 3,以确保高可用性和良好的数据一致性,可显著降低成本。与三副本方案相比,此方案在显著降低成本的同时,依然保持了较高的可用性。 +- 双活方案:可仅部署两个节点,高可用性较好,数据一致性较弱(最终一致性)。 以下为三种方案的特点: From 3a5ed28b2a963751d0c7e01d204454e7eaed86b5 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 21 Dec 2024 21:51:03 +0800 Subject: [PATCH 36/47] fix: remove de word for taosadapter doc --- docs/zh/10-third-party/05-bi/11-superset.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/10-third-party/05-bi/11-superset.md b/docs/zh/10-third-party/05-bi/11-superset.md index 1fc2096659..337fc53825 100644 --- a/docs/zh/10-third-party/05-bi/11-superset.md +++ b/docs/zh/10-third-party/05-bi/11-superset.md @@ -11,7 +11,7 @@ title: 与 Superset 集成 准备以下环境: - TDengine 集群已部署并正常运行(企业及社区版均可) -- taosAdapter 能够正常运行。详细参考 [taosAdapter 的使用手册](../../../reference/components/taosadapter) +- taosAdapter 能够正常运行。详细参考 [taosAdapter 使用手册](../../../reference/components/taosadapter) - Apache Superset v2.1.0 或以上版本已安装。安装 Apache Superset 请参考 [官方文档](https://superset.apache.org/) From f49e7c276fd975234b6b9ed4cc6a6cb4db0c901f Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sat, 21 Dec 2024 23:20:28 +0800 Subject: [PATCH 37/47] docs: taosBenchmark add query mixed mode doc --- .../14-reference/02-tools/10-taosbenchmark.md | 23 ++++++------------- .../14-reference/02-tools/10-taosbenchmark.md | 11 +++++++-- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/docs/en/14-reference/02-tools/10-taosbenchmark.md b/docs/en/14-reference/02-tools/10-taosbenchmark.md index 796478bf1a..048592968f 100644 --- a/docs/en/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/en/14-reference/02-tools/10-taosbenchmark.md @@ -385,21 +385,6 @@ Parameters related to supertable creation are configured in the `super_tables` s - **repeat_ts_max** : Numeric type, when composite primary key is enabled, specifies the maximum number of records with the same timestamp to be generated - **sqls** : Array of strings type, specifies the array of sql to be executed after the supertable is successfully created, the table name specified in sql must be prefixed with the database name, otherwise an unspecified database error will occur -#### tsma Configuration Parameters - -Specify the configuration parameters for tsma in `super_tables` under `tsmas`, with the following specific parameters: - -- **name**: Specifies the name of the tsma, mandatory. - -- **function**: Specifies the function of the tsma, mandatory. - -- **interval**: Specifies the time interval for the tsma, mandatory. - -- **sliding**: Specifies the window time shift for the tsma, mandatory. - -- **custom**: Specifies custom configuration appended at the end of the tsma creation statement, optional. - -- **start_when_inserted**: Specifies when to create the tsma after how many rows are inserted, optional, default is 0. #### Tag and Data Column Configuration Parameters @@ -477,6 +462,11 @@ For other common parameters, see Common Configuration Parameters. Configuration parameters for querying specified tables (can specify supertables, subtables, or regular tables) are set in `specified_table_query`. +- **mixed_query** "yes": `Mixed Query` "no": `Normal Query`, default is "no" +`Mixed Query`: All SQL statements in `sqls` are grouped by the number of threads, with each thread executing one group. Each SQL statement in a thread needs to perform `query_times` queries. +`Normal Query `: Each SQL in `sqls` starts `threads` and exits after executing `query_times` times. The next SQL can only be executed after all previous SQL threads have finished executing and exited. +Regardless of whether it is a `Normal Query` or `Mixed Query`, the total number of query executions is the same. The total number of queries = `sqls` * `threads` * `query_times`. The difference is that `Normal Query` starts `threads` for each SQL query, while ` Mixed Query` only starts `threads` once to complete all SQL queries. The number of thread startups for the two is different. + - **query_interval** : Query interval, in seconds, default is 0. - **threads** : Number of threads executing the SQL query, default is 1. @@ -487,7 +477,8 @@ Configuration parameters for querying specified tables (can specify supertables, #### Configuration Parameters for Querying Supertables -Configuration parameters for querying supertables are set in `super_table_query`. +Configuration parameters for querying supertables are set in `super_table_query`. +The thread mode of the super table query is the same as the `Normal Query` mode of the specified query statement described above, except that `sqls` is filled all sub tables. - **stblname** : The name of the supertable to query, required. diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 18c954c01e..4cb21c9efe 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -372,7 +372,8 @@ INFO: Consumed total msgs: 3000, total rows: 30000000 查询场景下 `filetype` 必须设置为 `query`。 `query_times` 指定运行查询的次数,数值类型 -查询场景可以通过设置 `kill_slow_query_threshold` 和 `kill_slow_query_interval` 参数来控制杀掉慢查询语句的执行,threshold 控制如果 exec_usec 超过指定时间的查询将被 taosBenchmark 杀掉,单位为秒;interval 控制休眠时间,避免持续查询慢查询消耗 CPU ,单位为秒。 +查询场景可以通过设置 `kill_slow_query_threshold` 和 `kill_slow_query_interval` 参数来控制杀掉慢查询语句的执行,threshold 控制如果 exec_usec 超过指定时间的查询将被 taosBenchmark 杀掉,单位为秒; +interval 控制休眠时间,避免持续查询慢查询消耗 CPU ,单位为秒。 其它通用参数详见[通用配置参数](#通用配置参数)。 @@ -380,6 +381,11 @@ INFO: Consumed total msgs: 3000, total rows: 30000000 查询指定表(可以指定超级表、子表或普通表)的配置参数在 `specified_table_query` 中设置。 +- **mixed_query** : 查询模式,取值 “yes” 为`混合查询`, "no" 为`正常查询` , 默认值为 “no” + `混合查询`:`sqls` 中所有 sql 按 `threads` 线程数分组,每个线程执行一组, 线程中每个 sql 都需执行 `query_times` 次查询 + `正常查询`:`sqls` 中每个 sql 启动 `threads` 个线程,每个线程执行完 `query_times` 次后退出,下个 sql 需等待上个 sql 线程全部执行完退出后方可执行 + 不管 `正常查询` 还是 `混合查询` ,执行查询总次数是相同的 ,查询总次数 = `sqls` 个数 * `threads` * `query_times`, 区别是 `正常查询` 每个 sql 都会启动 `threads` 个线程,而 `混合查询` 只启动一次 `threads` 个线程执行完所有 SQL, 两者启动线程次数不一样。 + - **query_interval** : 查询时间间隔,单位是秒,默认值为 0。 - **threads** : 执行查询 SQL 的线程数,默认值为 1。 @@ -390,7 +396,8 @@ INFO: Consumed total msgs: 3000, total rows: 30000000 #### 查询超级表的配置参数 -查询超级表的配置参数在 `super_table_query` 中设置。 +查询超级表的配置参数在 `super_table_query` 中设置。 +超级表查询的线程模式与上面介绍的指定查询语句查询的 `正常查询` 模式相同,不同之处是本 `sqls` 使用所有子表填充。 - **stblname** : 指定要查询的超级表的名称,必填。 From efdead1f7d01125da3d8b6c554821ae8ab116c7f Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 22 Dec 2024 11:46:26 +0800 Subject: [PATCH 38/47] fix: taosBenchmark -A -b argument describle --- docs/zh/14-reference/02-tools/10-taosbenchmark.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 4cb21c9efe..6608d1c7e8 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 命令行 | 功能说明 | +| 支持命令行参数 短参数/长参数 | 功能说明 | | ---------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \

| TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | @@ -111,10 +111,10 @@ taosBenchmark -f | -S/--timestampstep \ | 每个子表中插入数据的时间戳步长,单位是 ms,默认值是 1 | | -n/--records \ | 每个子表插入的记录数,默认值为 10000 | | -d/--database \ | 所使用的数据库的名称,默认值为 test | -| -b/--data-type \ | 超级表的数据列的类型。如果不使用则默认为有三个数据列,其类型分别为 FLOAT, INT, FLOAT | +| -b/--data-type \ | 指定超级表普通列数据类型, 多个使用逗号分隔,默认值: "FLOAT,INT,FLOAT" 如:`taosBenchmark -b "FLOAT,BINARY(8),NCHAR(16)"`| +| -A/--tag-type \ | 指定超级表标签列数据类型,多个使用逗号分隔,默认值: "INT,BINARY(24)" 如:`taosBenchmark -A "INT,BINARY(8),NCHAR(8)"`| | -l/--columns \ | 超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT, 例如: `-l 5 -b float,double`, 那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如: `-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` | | -L/--partial-col-num \ | 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据 | -| -A/--tag-type \ | 超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如:
```json taosBenchmark -A INT,DOUBLE,NCHAR,BINARY(16)
``` 如果没有设置标签类型,默认是两个标签,其类型分别为 INT 和 BINARY(16) 注意:在有的 shell 比如 bash 命令里面 “()” 需要转义,则上述指令应为:
taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\)
| | -w/--binwidth \ | nchar 和 binary 类型的默认长度,默认值为 64 | | -m/--table-prefix \ | 子表名称的前缀,默认值为 "d" | | -E/--escape-character | 开关参数,指定在超级表和子表名称中是否使用转义字符。默认值为不使用 | @@ -224,7 +224,7 @@ INFO: Consumed total msgs: 3000, total rows: 30000000 - **name** : 数据库名。 -- **drop** : 插入前是否删除数据库,可选项为 "yes" 或者 "no", 为 "no" 时不创建。默认删除。 +- **drop** : 数据库已存在时是否删除重建,可选项为 "yes" 或 "no", 默认为 “yes” #### 流式计算相关配置参数 From 80f44677fc7815eb31ad81fe8eb0059d4bb257e4 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 22 Dec 2024 12:04:41 +0800 Subject: [PATCH 39/47] fix: doc build error --- .../14-reference/02-tools/10-taosbenchmark.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/zh/14-reference/02-tools/10-taosbenchmark.md b/docs/zh/14-reference/02-tools/10-taosbenchmark.md index 6608d1c7e8..44dab0ad5f 100644 --- a/docs/zh/14-reference/02-tools/10-taosbenchmark.md +++ b/docs/zh/14-reference/02-tools/10-taosbenchmark.md @@ -4,13 +4,13 @@ sidebar_label: taosBenchmark toc_max_heading_level: 4 --- -taosBenchmark 是 TDengine 产品性能基准测试工具,提供对 TDengine 产品的插入、查询及订阅性能测试,输出性能指标。 +taosBenchmark 是 TDengine 产品性能基准测试工具,提供对 TDengine 产品写入、查询及订阅性能测试,输出性能指标。 ## 安装 taosBenchmark 提供两种安装方式: -- taosBenchmark 是 TDengine 安装包中默认安装组件,安装 TDengine 后即可使用,如何安装 TDengine 可参考[TDengine 安装](../../../get-started/)。 +- taosBenchmark 是 TDengine 安装包中默认安装组件,安装 TDengine 后即可使用,参考 [TDengine 安装](../../../get-started/) - 单独编译 taos-tools 并安装, 参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 @@ -22,7 +22,7 @@ taosBenchmark 支持三种运行模式: - 无参数模式 - 命令行模式 - JSON 配置文件模式 -命令行方式是 JSON 配置文件的功能子集,当即使用了命令行,又使用了配置文件,命令行指定的参数优先。 +`命令行方式` 为 `JSON 配置文件方式` 功能子集,两者都使用时,命令行方式优先。 **在运行 taosBenchmark 之前要确保 TDengine 集群已经在正确运行。** @@ -33,22 +33,22 @@ taosBenchmark 支持三种运行模式: taosBenchmark ``` -在无参数运行时,taosBenchmark 默认连接 `/etc/taos/taos.cfg` 中指定连接的 TDengine 集群。 -连接成功后,会创建智能电表示例数据库 test,超级表 meters, 子表创建 1 万,每子表 1 万条记录,如果 test 库已存在,会先删除再新建。 +在无参数运行时,taosBenchmark 默认连接 `/etc/taos/taos.cfg` 中指定的 TDengine 集群。 +连接成功后,会默认创建智能电表示例数据库 test,创建超级表 meters, 创建子表 1 万,每子写入数据 1 万条,若 test 库已存在,默认会先删再建。 ### 使用命令行参数运行 -命令行支持的参数为插入功能中使用较为频繁的参数,查询与订阅功能不支持命令行方式 +命令行支持的参数为写入功能中使用较为频繁的参数,查询与订阅功能不支持命令行方式 示例: ```bash taosBenchmark -d db -t 100 -n 1000 -T 4 -I stmt -y ``` -此命令表示使用 `taosBenchmark` 将创建一个名为 `db` 的数据库,并建立默认超级表 `meters`,子表 100 ,并使用参数绑定(stmt)方式为每张子表插入 1000 条记录。 +此命令表示使用 `taosBenchmark` 将创建一个名为 `db` 的数据库,并建立默认超级表 `meters`,子表 100 ,使用参数绑定(stmt)方式为每张子表写入 1000 条记录。 ### 使用配置文件运行 -配置文件方式运行提供了全部功能,所以参数都可以配置在配置文件中运行 +配置文件方式运行提供了全部功能,所有命令行参数都可以在配置文件中配置运行 ```bash taosBenchmark -f @@ -92,7 +92,7 @@ taosBenchmark -f 查看更多 json 配置文件示例可 [点击这里](https://github.com/taosdata/taos-tools/tree/main/example) ## 命令行参数详解 -| 支持命令行参数 短参数/长参数 | 功能说明 | +| 命令行参数 | 功能说明 | | ---------------------------- | ----------------------------------------------- | | -f/--file \ | 要使用的 JSON 配置文件,由该文件指定所有参数,本参数与命令行其他参数不能同时使用。没有默认值 | | -c/--config-dir \ | TDengine 集群配置文件所在的目录,默认路径是 /etc/taos | @@ -138,14 +138,14 @@ taosBenchmark -f #### 写入指标 -写入完成后,会在最后两行输出总结性的性能指标,输出格式如下: +写入结束后会在最后两行输出总体性能指标,格式如下: ``` bash SUCC: Spent 8.527298 (real 8.117379) seconds to insert rows: 10000000 with 8 thread(s) into test 1172704.41 (real 1231924.74) records/second SUCC: insert delay, min: 19.6780ms, avg: 64.9390ms, p90: 94.6900ms, p95: 105.1870ms, p99: 130.6660ms, max: 157.0830ms ``` 第一行写入速度统计: - Spent: 写入总耗时,单位秒,从开始写入第一个数据开始计时到最后一条数据结束,这里表示共花了 8.527298 秒 - - real : 写入总耗时(调用引擎),此耗时已抛去测试框架准备数据时间,纯统计在引擎调用上花费的时间,花费为 8.117379 秒,8.527298 - 8.117379 = 0.409919 秒则为测试框架准备数据消耗时间 + - real : 写入总耗时(调用引擎),此耗时已抛去测试框架准备数据时间,纯统计在引擎调用上花费的时间,示例为 8.117379 秒,8.527298 - 8.117379 = 0.409919 秒则为测试框架准备数据消耗时间 - rows : 写入总行数,为 1000 万条数据 - threads: 写入线程数,这里是 8 个线程同时写入 - records/second 写入速度 = `写入总耗时`/ `写入总行数` , 括号中 `real` 同前,表示纯引擎写入速度 From 1f4c206c0753595cbb7b527b95cd84815b55b2f3 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 22 Dec 2024 12:24:05 +0800 Subject: [PATCH 40/47] fix: taodump doc --- docs/zh/14-reference/02-tools/09-taosdump.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/02-tools/09-taosdump.md b/docs/zh/14-reference/02-tools/09-taosdump.md index 1bbfc0c7ca..6a4df44f25 100644 --- a/docs/zh/14-reference/02-tools/09-taosdump.md +++ b/docs/zh/14-reference/02-tools/09-taosdump.md @@ -11,7 +11,7 @@ taosdump 是为开源用户提供的 TDengine 数据备份/恢复工具,备份 taosdump 提供两种安装方式: -- taosdump 是 TDengine 安装包中默认安装组件,安装 TDengine 后即可使用,如何安装 TDengine 可参考[TDengine 安装](../../../get-started/)。 +- taosdump 是 TDengine 安装包中默认安装组件,安装 TDengine 后即可使用,可参考[TDengine 安装](../../../get-started/) - 单独编译 taos-tools 并安装, 参考 [taos-tools](https://github.com/taosdata/taos-tools) 仓库。 From da3ad2c414157e04ea3f66be849be41d59b4da43 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Sun, 22 Dec 2024 12:29:45 +0800 Subject: [PATCH 41/47] fix: taodump doc for en --- docs/en/14-reference/02-tools/09-taosdump.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/14-reference/02-tools/09-taosdump.md b/docs/en/14-reference/02-tools/09-taosdump.md index 54109a8de9..75747f2f57 100644 --- a/docs/en/14-reference/02-tools/09-taosdump.md +++ b/docs/en/14-reference/02-tools/09-taosdump.md @@ -6,15 +6,15 @@ slug: /tdengine-reference/tools/taosdump `taosdump` is a TDengine data backup/recovery tool provided for open source users, and the backed up data files adopt the standard [Apache AVRO](https://avro.apache.org/) Format, convenient for exchanging data with the external ecosystem. - Taosdump provides multiple data backup and recovery options to meet different data needs, and all supported options can be viewed through -- help. + Taosdump provides multiple data backup and recovery options to meet different data needs, and all supported options can be viewed through --help. ## Installation Taosdump provides two installation methods: --Taosdump is the default installation component in the TDengine installation package, which can be used after installing TDengine. For how to install TDengine, please refer to [TDengine Installation](../../../get started/) +- Taosdump is the default installation component in the TDengine installation package, which can be used after installing TDengine. For how to install TDengine, please refer to [TDengine Installation](../../../get-started/) --Compile and install taos tools separately, refer to [taos tools](https://github.com/taosdata/taos-tools) . +- Compile and install taos tools separately, refer to [taos tools](https://github.com/taosdata/taos-tools) . ## Common Use Cases From aa9bab4f3d57cf0a4aec160b999beb88f105262e Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 23 Dec 2024 10:29:05 +0800 Subject: [PATCH 42/47] Update 02-management.md --- docs/zh/06-advanced/06-TDgpt/02-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/06-advanced/06-TDgpt/02-management.md b/docs/zh/06-advanced/06-TDgpt/02-management.md index b37c39944f..6803c5d356 100644 --- a/docs/zh/06-advanced/06-TDgpt/02-management.md +++ b/docs/zh/06-advanced/06-TDgpt/02-management.md @@ -110,7 +110,7 @@ SHOW ANODES; taos> show anodes; id | url | status | create_time | update_time | ================================================================================================================== - 1 | 192.168.0.1:6090 | ready | 2024-11-28 18:44:27.089 | 2024-11-28 18:44:27.089 | + 1 | 192.168.0.1:6090 | ready | 2024-11-28 18:44:27.089 | 2024-11-28 18:44:27.089 | Query OK, 1 row(s) in set (0.037205s) ``` From 0ca9054e60d09ca7b485e4269509a1139307bf54 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 23 Dec 2024 10:34:21 +0800 Subject: [PATCH 43/47] Update 02-management.md --- docs/zh/06-advanced/06-TDgpt/02-management.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/06-advanced/06-TDgpt/02-management.md b/docs/zh/06-advanced/06-TDgpt/02-management.md index 6803c5d356..d977e25dc3 100644 --- a/docs/zh/06-advanced/06-TDgpt/02-management.md +++ b/docs/zh/06-advanced/06-TDgpt/02-management.md @@ -66,7 +66,7 @@ pidfile = /usr/local/taos/taosanode/taosanode.pid # uWSGI log files logto = /var/log/taos/taosanode/taosanode.log -# wWSGI monitor port +# uWSGI monitor port stats = 127.0.0.1:8387 # python virtual environment directory, used by Anode @@ -86,7 +86,7 @@ log-level = DEBUG **提示** 请勿设置 `daemonize` 参数,该参数会导致 uWSGI 与 systemctl 冲突,从而导致 Anode 无法正常启动。 -上面的示例配置文件 `taosanode.ini` 只包含了使用 Anode 提供服务的基础配置参数,对于 uWSGI 的其他配置参数的设置及其说明请参考 [uWSGIS官方文档](https://uwsgi-docs-zh.readthedocs.io/zh-cn/latest/Options.html)。 +上面的示例配置文件 `taosanode.ini` 只包含了使用 Anode 提供服务的基础配置参数,对于 uWSGI 的其他配置参数的设置及其说明请参考 [uWSGI 官方文档](https://uwsgi-docs-zh.readthedocs.io/zh-cn/latest/Options.html)。 Anode 运行配置主要是以下: - app-log: Anode 服务运行产生的日志,用户可以调整其到需要的位置 From 589b36d7fc44de76631a3d909516f4beb1e73556 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 23 Dec 2024 10:38:06 +0800 Subject: [PATCH 44/47] Update index.md --- docs/zh/06-advanced/06-TDgpt/04-forecast/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/06-advanced/06-TDgpt/04-forecast/index.md b/docs/zh/06-advanced/06-TDgpt/04-forecast/index.md index 3981fff8c6..71b97aa996 100644 --- a/docs/zh/06-advanced/06-TDgpt/04-forecast/index.md +++ b/docs/zh/06-advanced/06-TDgpt/04-forecast/index.md @@ -41,7 +41,7 @@ algo=expr1 "} ``` -1. `column_expr`:预测的时序数据列。与异常检测相同,只支持数值类型列输入。 +1. `column_expr`:预测的时序数据列,只支持数值类型列输入。 2. `options`:预测函数的参数。字符串类型,其中使用 K=V 方式调用算法及相关参数。采用逗号分隔的 K=V 字符串表示,其中的字符串不需要使用单引号、双引号、或转义号等符号,不能使用中文及其他宽字符。预测支持 `conf`, `every`, `rows`, `start`, `rows` 几个控制参数,其含义如下: ### 参数说明 From 6a0206d3171daa3990407e649b3763f05e8d21cb Mon Sep 17 00:00:00 2001 From: "pengrongkun94@qq.com" Date: Mon, 23 Dec 2024 10:57:35 +0800 Subject: [PATCH 45/47] fix some case error --- source/libs/parser/src/parInsertStmt.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/libs/parser/src/parInsertStmt.c b/source/libs/parser/src/parInsertStmt.c index 37d7b2f431..74fac463f1 100644 --- a/source/libs/parser/src/parInsertStmt.c +++ b/source/libs/parser/src/parInsertStmt.c @@ -509,6 +509,9 @@ int32_t qBindStmtTagsValue2(void* pBlock, void* boundTags, int64_t suid, const c STag* pTag = NULL; for (int c = 0; c < tags->numOfBound; ++c) { + if (bind == NULL) { + break; + } if (bind[c].is_null && bind[c].is_null[0]) { continue; } From 5ba7de5844867bd2e978506bfba5a56991d20b84 Mon Sep 17 00:00:00 2001 From: xiao-77 Date: Mon, 23 Dec 2024 15:37:26 +0800 Subject: [PATCH 46/47] Doc(cfg):support dyn alter disable create file. --- docs/en/26-tdinternal/01-arch.md | 33 +++++++++++++++++++-- docs/zh/26-tdinternal/01-arch.md | 50 +++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/docs/en/26-tdinternal/01-arch.md b/docs/en/26-tdinternal/01-arch.md index 55c56a7681..ef689e0b74 100644 --- a/docs/en/26-tdinternal/01-arch.md +++ b/docs/en/26-tdinternal/01-arch.md @@ -328,8 +328,35 @@ In addition to precomputation, TDengine also supports various downsampling stora ### Multi-Level Storage and Object Storage -By default, TDengine stores all data in the /var/lib/taos directory. To expand storage capacity, reduce potential bottlenecks caused by file reading, and enhance data throughput, TDengine allows the use of the configuration parameter `dataDir` to enable the cluster to utilize multiple mounted hard drives simultaneously. +By default, TDengine saves all data in /var/lib/taos directory, and the data files of each vnode are saved in a different directory under this directory. In order to expand the storage space, minimize the bottleneck of file reading and improve the data throughput rate, TDengine can configure the system parameter "dataDir" to allow multiple mounted hard disks to be used by system at the same time. In addition, TDengine also provides the function of tiered data storage, i.e. storage on different storage media according to the time stamps of data files. For example, the latest data is stored on SSD, the data older than a week is stored on local hard disk, and data older than four weeks is stored on network storage device. This reduces storage costs and ensures efficient data access. The movement of data on different storage media is automatically done by the system and is completely transparent to applications. Tiered storage of data is also configured through the system parameter "dataDir". + +dataDir format is as follows: + +``` +dataDir data_path [tier_level] [primary] [disable_create_new_file] +``` + +Where `data_path` is the folder path of mount point, and `tier_level` is the media storage-tier. The higher the media storage-tier, means the older the data file. Multiple hard disks can be mounted at the same storage-tier, and data files on the same storage-tier are distributed on all hard disks within the tier. TDengine supports up to 3 tiers of storage, so tier_level values are 0, 1, and 2. When configuring dataDir, there must be only one mount path without specifying tier_level, which is called special mount disk (path). The mount path defaults to level 0 storage media and contains special file links, which cannot be removed, otherwise it will have a devastating impact on the written data. And `primary` means whether the data dir is the primary mount point. Enter 0 for false or 1 for true. The default value is 1. A TDengine cluster can have only one `primary` mount point, which must be on tier 0. And `disable_create_new_file` means whether to prohibit the creation of new file sets on the specified mount point. Enter 0 for false and 1 for true. The default value is 0. Tier 0 storage must have at least one mount point with disable_create_new_file set to 0. Tier 1 and tier 2 storage do not have this restriction. + +Suppose there is a physical node with six mountable hard disks/mnt/disk1,/mnt/disk2, ..., /mnt/disk6, where disk1 and disk2 need to be designated as level 0 storage media, disk3 and disk4 are level 1 storage media, and disk5 and disk6 are level 2 storage media. Disk1 is a special mount disk, you can configure it in/etc/taos/taos.cfg as follows: + +``` +dataDir /mnt/disk1/taos 0 1 0 +dataDir /mnt/disk2/taos 0 0 0 +dataDir /mnt/disk3/taos 1 0 0 +dataDir /mnt/disk4/taos 1 0 1 +dataDir /mnt/disk5/taos 2 0 0 +dataDir /mnt/disk6/taos 2 0 0 +``` + +Mounted disks can also be a non-local network disk, as long as the system can access it. + +You can use the following command to dynamically modify dataDir to control whether disable_create_new_file is enabled for the current directory. + +``` +alter dnode 1 "/mnt/disk2/taos 1"; +``` + +Note: Tiered Storage is only supported in Enterprise Edition -Additionally, TDengine offers tiered data storage functionality, allowing users to store data from different time periods in directories on different storage devices. This facilitates the separation of "hot" data (frequently accessed) and "cold" data (less frequently accessed), making full use of various storage resources while saving costs. For example, data that is recently collected and requires frequent access can be stored on high-performance solid-state drives due to their high read performance requirements. Data that exceeds a certain age and has lower query demands can be stored on mechanically driven hard disks, which are relatively cheaper. -To further reduce storage costs, TDengine also supports storing time-series data in object storage systems. Through its innovative design, in most cases, the performance of querying time-series data from object storage systems is close to half that of local disks, and in some scenarios, the performance can even be comparable to local disks. Additionally, TDengine allows users to perform delete and update operations on time-series data stored in object storage. diff --git a/docs/zh/26-tdinternal/01-arch.md b/docs/zh/26-tdinternal/01-arch.md index 7091ca9661..242adb11b0 100644 --- a/docs/zh/26-tdinternal/01-arch.md +++ b/docs/zh/26-tdinternal/01-arch.md @@ -323,10 +323,52 @@ TDengine 采用了一种数据驱动的策略来实现缓存数据的持久化 除了预计算功能以外,TDengine 还支持对原始数据进行多种降采样存储。一种降采样存储方式是 Rollup SMA,它能够自动对原始数据进行降采样存储,并支持 3 个不同的数据保存层级,用户可以指定每层数据的聚合周期和保存时长。这对于那些关注数据趋势的场景尤为适用,其核心目的是减少存储开销并提高查询速度。另一种降采样存储方式是 Time-Range-Wise SMA,它可以根据聚合结果进行降采样存储,非常适合于高频的 interval 查询场景。该功能采用与普通流计算相同的逻辑,并允许用户通过设置watermark 来处理延时数据,相应地,实际的查询结果也会有一定的时间延迟。 -### 多级存储与对象存储 +### 多级存储 -在默认情况下,TDengine 将所有数据存储在 /var/lib/taos 目录中。为了扩展存储容量,减少文件读取可能导致的瓶颈,并提升数据吞吐量,TDengine 允许通过配置参数dataDir,使得集群能够同时利用挂载的多块硬盘。 +说明:多级存储功能仅企业版支持,从 2.0.16.0 版本开始提供。 -此外,TDengine 还提供了数据分级存储的功能,允许用户将不同时间段的数据存储在不同存储设备的目录中,以此实现将“热”数据和“冷”数据分开存储。这样做可以充分利用各种存储资源,同时节约成本。例如,对于最新采集且需要频繁访问的数据,由于其读取性能要求较高,用户可以配置将这些数据存储在高性能的固态硬盘上。而对于超过一定期限、查询需求较低的数据,则可以将其存储在成本相对较低的机械硬盘上。 +在默认配置下,TDengine 会将所有数据保存在 /var/lib/taos 目录下,而且每个 vnode 的数据文件保存在该目录下的不同目录。为扩大存储空间,尽量减少文件读取的瓶颈,提高数据吞吐率 TDengine 可通过配置系统参数 dataDir 让多个挂载的硬盘被系统同时使用。 -为了进一步降低存储成本,TDengine 还支持将时序数据存储在对象存储系统中。通过其创新性的设计,在大多数情况下,从对象存储系统中查询时序数据的性能接近本地硬盘的一半,而在某些场景下,性能甚至可以与本地硬盘相媲美。同时,TDengine 还允许用户对存储在对象存储中的时序数据执行删除和更新操作。 +除此之外,TDengine 也提供了数据分级存储的功能,将不同时间段的数据存储在挂载的不同介质上的目录里,从而实现不同“热度”的数据存储在不同的存储介质上,充分利用存储,节约成本。比如,最新采集的数据需要经常访问,对硬盘的读取性能要求高,那么用户可以配置将这些数据存储在 SSD 盘上。超过一定期限的数据,查询需求量没有那么高,那么可以存储在相对便宜的 HDD 盘上。 + +多级存储支持 3 级,每级最多可配置 128 个挂载点。 + +TDengine 多级存储配置方式如下(在配置文件/etc/taos/taos.cfg 中): + +``` +dataDir [path] +``` + +- path: 挂载点的文件夹路径 +- level: 介质存储等级,取值为 0,1,2。 + 0 级存储最新的数据,1 级存储次新的数据,2 级存储最老的数据,省略默认为 0。 + 各级存储之间的数据流向:0 级存储 -> 1 级存储 -> 2 级存储。 + 同一存储等级可挂载多个硬盘,同一存储等级上的数据文件分布在该存储等级的所有硬盘上。 + 需要说明的是,数据在不同级别的存储介质上的移动,是由系统自动完成的,用户无需干预。 +- primary: 是否为主挂载点,0(否)或 1(是),省略默认为 1。 +- disable_create_new_file: 是否禁止创建新文件组,0(否)或 1(是),省略默认为 0。 + +在配置中,只允许一个主挂载点的存在(level=0,primary=1),例如采用如下的配置方式: + +``` +dataDir /mnt/data1 0 1 0 +dataDir /mnt/data2 0 0 0 +dataDir /mnt/data3 1 0 0 +dataDir /mnt/data4 1 0 1 +dataDir /mnt/data5 2 0 0 +dataDir /mnt/data6 2 0 0 +``` + +您可以使用以下命令动态修改 dataDir 的 disable 来控制当前目录是否开启 disable_create_new_file 。 +``` +alter dnode 1 "/mnt/disk2/taos 1"; +``` + +:::note + +1. 多级存储不允许跨级配置,合法的配置方案有:仅 0 级,仅 0 级+ 1 级,以及 0 级+ 1 级+ 2 级。而不允许只配置 level=0 和 level=2,而不配置 level=1。 +2. 禁止手动移除使用中的挂载盘,挂载盘目前不支持非本地的网络盘。 +3. 多级存储目前不支持删除已经挂载的硬盘的功能。 +4. 0 级存储至少存在一个 disable_create_new_file 为 0 的挂载点,1 级 和 2 级存储没有该限制。 + +::: \ No newline at end of file From 112754d2c5a20cd540339fb49675a6ff55fabd69 Mon Sep 17 00:00:00 2001 From: xiao-77 Date: Mon, 23 Dec 2024 15:39:16 +0800 Subject: [PATCH 47/47] Fix merge errors. --- docs/zh/26-tdinternal/01-arch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/26-tdinternal/01-arch.md b/docs/zh/26-tdinternal/01-arch.md index 242adb11b0..9cc1ef6f02 100644 --- a/docs/zh/26-tdinternal/01-arch.md +++ b/docs/zh/26-tdinternal/01-arch.md @@ -323,7 +323,7 @@ TDengine 采用了一种数据驱动的策略来实现缓存数据的持久化 除了预计算功能以外,TDengine 还支持对原始数据进行多种降采样存储。一种降采样存储方式是 Rollup SMA,它能够自动对原始数据进行降采样存储,并支持 3 个不同的数据保存层级,用户可以指定每层数据的聚合周期和保存时长。这对于那些关注数据趋势的场景尤为适用,其核心目的是减少存储开销并提高查询速度。另一种降采样存储方式是 Time-Range-Wise SMA,它可以根据聚合结果进行降采样存储,非常适合于高频的 interval 查询场景。该功能采用与普通流计算相同的逻辑,并允许用户通过设置watermark 来处理延时数据,相应地,实际的查询结果也会有一定的时间延迟。 -### 多级存储 +### 多级存储与对象存储 说明:多级存储功能仅企业版支持,从 2.0.16.0 版本开始提供。