[转帖]TiDB 6.1 单机环境 On openEular 2003 SP3

tidb,单机,环境,on,openeular,sp3 · 浏览次数 : 0

小编点评

**生成内容时需要带简单的排版** **1. 概述** * 经过验证,用最简单的方式验证了 openEular 2003 SP3 系统下 TiDB 的部署安装和简单的功能验证。 *由于环境所限,没有经过更多的功能测试和性能测试,在充分的使用和验证后,再行文贡献给大家。 **2. 内存不足** * **goroutine 1 [running]:runtime/debug.Stack() ** * **/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/bootstrap.go:1461github.com/pingcap/tidb/session.initBindInfoTable({0x42f39c0, 0xc001078480})** **3. 开Eular 2003 SP3 系统下 TiDB 的部署安装** * **/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/tidb-server/main.go:202 +0x4ca** **4. 安装和功能验证** * **/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/tidb-server/main.go:296 +0x114main.main()** * **/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/tidb-server/main.go:202 +0x4ca** **5. 最简单的方式验证** * **/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/tidb-server/main.go:296 +0x114main.main()** * **/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/BootstrapSession({0x42b5ff0, 0xc000b825a0})**

正文

https://tidb.net/book/book-rush/best-practice/other-practice/tidb61-on-openEular2003
复制

 

背景

最近对国产操作系统很感兴趣,也有一些场景需要验证落地,官方支持银河麒麟 V10(X86,ARM),统信 UOS 等国产操作系统,但上述系统不是开源操作系统,使用上存在一些障碍,经过朋友推荐,选择华为的 openEular 进行验证测试。

image.png

目前 openEular 的 LTS 版本主要是 2003 和 2203 两个版本,2003 是 gcc 7+ 和 python 2.X 的环境,2203 是 gcc 10+ 和 python 3.X 的环境,理论上讲 2003 更接近目前所使用的 CentOS 7,兄弟组用 2203 编译 Doris 也遇到一些问题,因此选择 openEular 2003 SP3 进行测试。本次测试主要验证功能,分为部署过程测试和基本 SQL 查询测试,不做性能测试。openEular 同时支持 X86 和 ARM 架构,TiDB 也支持上述两种架构,本次测试中采用 X86_64 架构硬件设备进行测试。

本文使用 TiDB 6.1 作为测试版本,验证结果不保证可复现在 6.X 之前的版本上。

阅读受益

本文参照官方文档操作,验证 TiDB 运行在 openEular 上的可行性,为有选型需求的同学做一些参考。

本文记录了整个部署过程中的标准输出,对于只是想了解 TiDB 部署安装过程的同学,有一定参考价值。

经过本文的验证,在 openEular 部署使用 TiDB 与在 Centos 7 部署使用 TiDB 基本一致。部署过程中遇到的问题见最后的错误排查。

单机环境部署

部署环境

openEular 2003 SP3 4C8G Vmware 虚拟机 x86_64 环境

系统组件准备

由于系统的原因,需要提前安装以下组件:

yum -y install bc
复制
 

集群拓扑

最小规模的 TiDB 集群拓扑:

实例个数IP配置
TiKV 3 192.168.180.140 修改端口
TiDB 1 192.168.180.140 默认配置
PD 1 192.168.180.140 默认配置
TiFlash 1 192.168.180.140 默认配置
Monitor 1 192.168.180.140 默认配置

部署过程

  1. 下载并安装 TiUP:
[root@localhost tidb]## curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed100 6968k  100 6968k    0     0   600k      0  0:00:11  0:00:11 --:--:-- 1129kWARN: adding root certificate via internet: https://tiup-mirrors.pingcap.com/root.jsonYou can revoke this by remove /root/.tiup/bin/7b8e153f2e2d0928.root.jsonSuccessfully set mirror to https://tiup-mirrors.pingcap.comDetected shell: bashShell profile:  /root/.bash_profile/root/.bash_profile has been modified to add tiup to PATHopen a new terminal or source /root/.bash_profile to use itInstalled path: /root/.tiup/bin/tiup===============================================Have a try:     tiup playground===============================================
复制
 
  1. 声明全局环境变量:
[root@localhost tidb]## source /root/.bash_profile
复制
 
  1. 安装 TiUP 的 cluster 组件:
[root@localhost tidb]## tiup clustertiup is checking updates for component cluster ...timeout!The component `cluster` version  is not installed; downloading from repository.download https://tiup-mirrors.pingcap.com/cluster-v1.10.1-linux-amd64.tar.gz 8.28 MiB / 8.28 MiB 100.00% 1.05 MiB/sStarting component `cluster`: /root/.tiup/components/cluster/v1.10.1/tiup-clusterDeploy a TiDB cluster for production......Use "tiup cluster help [command]" for more information about a command.
复制
 
  1. 调大 sshd 服务的连接数限制:
[root@localhost tidb]## sed -i 's/##MaxSessions 10/MaxSessions 20/g' /etc/ssh/sshd_config[root@localhost tidb]## service sshd restartRedirecting to /bin/systemctl restart sshd.service
复制
 
  1. 创建并启动集群 创建配置文件 topo.yaml:
## ## Global variables are applied to all deployments and used as the default value of## ## the deployments if a specific deployment value is missing.global: user: "tidb" ssh_port: 22 deploy_dir: "/tidb-deploy" data_dir: "/tidb-data"## ## Monitored variables are applied to all the machines.monitored: node_exporter_port: 9100 blackbox_exporter_port: 9115server_configs: tidb:   log.slow-threshold: 300 tikv:   readpool.storage.use-unified-pool: false   readpool.coprocessor.use-unified-pool: true pd:   replication.enable-placement-rules: true   replication.location-labels: ["host"] tiflash:   logger.level: "info"pd_servers: - host: 192.168.180.140tidb_servers: - host: 192.168.180.140tikv_servers: - host: 192.168.180.140   port: 20160   status_port: 20180   config:     server.labels: {host: "logic-host-1"} - host: 192.168.180.140   port: 20161   status_port: 20181   config:     server.labels: {host: "logic-host-2"} - host: 192.168.180.140   port: 20162   status_port: 20182   config:     server.labels: {host: "logic-host-3"}tiflash_servers: - host: 192.168.180.140monitoring_servers: - host: 192.168.180.140grafana_servers: - host: 192.168.180.140
复制
 

部署集群:

[root@localhost tidb]## tiup cluster deploy tidb61 v6.1.0 ./topo.yaml --user root -ptiup is checking updates for component cluster ...Starting component `cluster`: /root/.tiup/components/cluster/v1.10.1/tiup-cluster deploy tidb61 v6.1.0 ./topo.yaml --user root -pInput SSH password:+ Detect CPU Arch Name  - Detecting node 192.168.180.140 Arch info ... Done+ Detect CPU OS Name  - Detecting node 192.168.180.140 OS info ... DonePlease confirm your topology:Cluster type:    tidbCluster name:    tidb61Cluster version: v6.1.0......Attention:    1. If the topology is not what you expected, check your yaml file.    2. Please confirm there is no port/directory conflicts in same host.Do you want to continue? [y/N]: (default=N) y+ Generate SSH keys ... Done+ Download TiDB components+ Download TiDB components+ Initialize target host environments+ Deploy TiDB instance+ Copy certificate to remote host+ Init instance configs+ Init monitor configs+ Check statusEnabling component pdEnabling component tikvEnabling component tidbEnabling component tiflashEnabling component prometheusEnabling component grafanaEnabling component node_exporterEnabling component blackbox_exporterCluster `tidb61` deployed successfully, you can start it with command: `tiup cluster start tidb61 --init`
复制
 

启动集群:

[root@ecs-5842 ~]## tiup cluster start tidb61 --inittiup is checking updates for component cluster ...Starting component `cluster`: /root/.tiup/components/cluster/v1.10.1/tiup-cluster start tidb61 --initStarting cluster tidb61.........Started cluster `tidb61` successfullyThe root password of TiDB database has been changed.The new password is: '5%thkE=sL6^-1382wV'.Copy and record it to somewhere safe, it is only displayed once, and will not be stored.The generated password can NOT be get and shown again.
复制
 

查看集群状态:

[root@ecs-5842 ~]## tiup cluster display tidb61tiup is checking updates for component cluster ...timeout!Starting component `cluster`: /root/.tiup/components/cluster/v1.10.1/tiup-cluster display tidb61Cluster type:       tidbCluster name:       tidb61Cluster version:    v6.1.0Deploy user:        tidbSSH type:           builtinDashboard URL:      http://192.168.0.141:2379/dashboardGrafana URL:        http://192.168.0.141:3000ID                   Role        Host           Ports                            OS/Arch       Status   Data Dir                    Deploy Dir--                   ----        ----           -----                            -------       ------   --------                    ----------192.168.0.141:3000   grafana     192.168.0.141  3000                             linux/x86_64  Up       -                           /tidb-deploy/grafana-3000192.168.0.141:2379   pd          192.168.0.141  2379/2380                        linux/x86_64  Up|L|UI  /tidb-data/pd-2379          /tidb-deploy/pd-2379192.168.0.141:9090   prometheus  192.168.0.141  9090/12020                       linux/x86_64  Up       /tidb-data/prometheus-9090  /tidb-deploy/prometheus-9090192.168.0.141:4000   tidb        192.168.0.141  4000/10080                       linux/x86_64  Up       -                           /tidb-deploy/tidb-4000192.168.0.141:9000   tiflash     192.168.0.141  9000/8123/3930/20170/20292/8234  linux/x86_64  Up       /tidb-data/tiflash-9000     /tidb-deploy/tiflash-9000192.168.0.141:20160  tikv        192.168.0.141  20160/20180                      linux/x86_64  Up       /tidb-data/tikv-20160       /tidb-deploy/tikv-20160192.168.0.141:20161  tikv        192.168.0.141  20161/20181                      linux/x86_64  Up       /tidb-data/tikv-20161       /tidb-deploy/tikv-20161192.168.0.141:20162  tikv        192.168.0.141  20162/20182                      linux/x86_64  Up       /tidb-data/tikv-20162       /tidb-deploy/tikv-20162Total nodes: 8
复制
 

测试 TiKV 和 TiFlash 查询

生成基础环境

[root@ecs-5842 ~]## tiup install bench[root@ecs-5842 ~]## tiup bench tpch prepare -p 5%thkE=sL6^-1382wVtiup is checking updates for component bench ...Starting component `bench`: /root/.tiup/components/bench/v1.10.1/tiup-bench tpch prepare -p 5%thkE=sL6^-1382wVcreating nationcreating regioncreating partcreating suppliercreating partsuppcreating customercreating orderscreating lineitemgenerating nation tablegenerate nation table donegenerating region tablegenerate region table donegenerating customers tablegenerate customers table donegenerating suppliers tablegenerate suppliers table donegenerating part/partsupplier tablesgenerate part/partsupplier tables donegenerating orders/lineitem tablesgenerate orders/lineitem tables doneFinished
复制
 

下载并安装一下 rpm 包:

mysql-community-client-5.7.35-1.el7.x86_64.rpm                mysql-community-common-5.7.35-1.el7.x86_64.rpm                mysql-community-libs-5.7.35-1.el7.x86_64.rpm                  
复制
 
[root@ecs-5842 ~]## rpm -ivh mysql-community-*warning: mysql-community-client-5.7.35-1.el7.x86_64.rpm: Header V3 DSA/SHA256 Signature, key ID 5072e1f5: NOKEYVerifying...                          ################################################################## [100%]Preparing...                          ################################################################## [100%]Updating / installing...   1:mysql-community-common-5.7.35-1.e################################################################## [33%]   2:mysql-community-libs-5.7.35-1.el7################################################################## [67%]   3:mysql-community-client-5.7.35-1.e################################################################## [100%]
复制
 

TiKV 查询

[root@ecs-5842 ~]## mysql -h 192.168.0.141 -P 4000 -u root -pEnter password:Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 421Server version: 5.7.25-TiDB-v6.1.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatibleCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use test;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> SELECT    ->     l_orderkey,    ->     SUM(->         l_extendedprice * (1 - l_discount)    ->     ) AS revenue,    ->     o_orderdate,    ->     o_shippriority    -> FROM    ->     customer,    ->     orders,    ->     lineitem    -> WHERE    ->     c_mktsegment = 'BUILDING'    -> AND c_custkey = o_custkey    -> AND l_orderkey = o_orderkey    -> AND o_orderdate < DATE '1996-01-01'    -> AND l_shipdate > DATE '1996-02-01'    -> GROUP BY    ->     l_orderkey,    ->     o_orderdate,    ->     o_shippriority    -> ORDER BY    ->     revenue DESC,    ->     o_orderdate    -> limit 10;+------------+-------------+-------------+----------------+| l_orderkey | revenue     | o_orderdate | o_shippriority |+------------+-------------+-------------+----------------+|    5828933 | 386117.1688 | 1995-12-03  |              0 ||    1648647 | 373096.8642 | 1995-12-06  |              0 ||    1364641 | 352640.6056 | 1995-12-19  |              0 ||    3949606 | 347750.4435 | 1995-12-23  |              0 ||    4792161 | 347715.0509 | 1995-12-30  |              0 ||    4340739 | 347490.5251 | 1995-12-06  |              0 ||    1609574 | 342497.8886 | 1995-12-31  |              0 ||    3076934 | 338202.3259 | 1995-12-24  |              0 ||    3232933 | 337349.2536 | 1995-12-26  |              0 ||    2345058 | 335142.6104 | 1995-12-31  |              0 |+------------+-------------+-------------+----------------+10 rows in set (1.71 sec)
复制
 

TiFlash 查询

mysql> ALTER TABLE test.customer SET TIFLASH REPLICA 1;Query OK, 0 rows affected (0.07 sec)mysql> ALTER TABLE test.orders SET TIFLASH REPLICA 1;Query OK, 0 rows affected (0.08 sec)mysql> ALTER TABLE test.lineitem SET TIFLASH REPLICA 1;Query OK, 0 rows affected (0.08 sec)mysql> SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'test' ;+--------------+------------+----------+---------------+-----------------+-----------+----------+| TABLE_SCHEMA | TABLE_NAME | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS |+--------------+------------+----------+---------------+-----------------+-----------+----------+| test         | customer   |       79 |             1 |                 |         1 |        1 || test         | orders     |       81 |             1 |                 |         1 |        1 || test         | lineitem   |       83 |             1 |                 |         1 |        1 |+--------------+------------+----------+---------------+-----------------+-----------+----------+3 rows in set (0.00 sec)mysql> SELECT    ->     l_orderkey,    ->     SUM(->         l_extendedprice * (1 - l_discount)    ->     ) AS revenue,    ->     o_orderdate,    ->     o_shippriority    -> FROM    ->     customer,    ->     orders,    ->     lineitem    -> WHERE    ->     c_mktsegment = 'BUILDING'    -> AND c_custkey = o_custkey    -> AND l_orderkey = o_orderkey    -> AND o_orderdate < DATE '1996-01-01'    -> AND l_shipdate > DATE '1996-02-01'    -> GROUP BY    ->     l_orderkey,    ->     o_orderdate,    ->     o_shippriority    -> ORDER BY    ->     revenue DESC,    ->     o_orderdate    -> limit 10;+------------+-------------+-------------+----------------+| l_orderkey | revenue     | o_orderdate | o_shippriority |+------------+-------------+-------------+----------------+|    5828933 | 386117.1688 | 1995-12-03  |              0 ||    1648647 | 373096.8642 | 1995-12-06  |              0 ||    1364641 | 352640.6056 | 1995-12-19  |              0 ||    3949606 | 347750.4435 | 1995-12-23  |              0 ||    4792161 | 347715.0509 | 1995-12-30  |              0 ||    4340739 | 347490.5251 | 1995-12-06  |              0 ||    1609574 | 342497.8886 | 1995-12-31  |              0 ||    3076934 | 338202.3259 | 1995-12-24  |              0 ||    3232933 | 337349.2536 | 1995-12-26  |              0 ||    2345058 | 335142.6104 | 1995-12-31  |              0 |+------------+-------------+-------------+----------------+10 rows in set (0.40 sec)
复制
 

查看执行计划: image.png 经过分析发现,查询走的 tiflash,因为出现 ExchangeSender 和 ExchangeReceiver 算子,表明 MPP 已生效。

错误排查

sudo 权限

当遇到如下错误时:

Error: executor.ssh.execute_failed: Failed to execute command over SSH for 'tidb@192.168.0.141:22' {ssh_stderr: We trust you have received the usual lecture from the local SystemAdministrator. It usually boils down to these three things:    ##1) Respect the privacy of others.    ##2) Think before you type.    ##3) With great power comes great responsibility.sudo: no tty present and no askpass program specified, ssh_stdout: , ssh_command: export LANG=C; PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin /usr/bin/sudo -H bash -c "test -d /tidb-deploy || (mkdir -p /tidb-deploy && chown tidb:$(id -g -n tidb) /tidb-deploy)"}, cause: Process exited with status 1
复制
 

需要添加 sudo 权限:

visudotidb ALL=(ALL) NOPASSWD: ALL
复制
 

内存问题

当发现以下错误时:

goroutine 1 [running]:runtime/debug.Stack()    /usr/local/go/src/runtime/debug/stack.go:24 +0x65runtime/debug.PrintStack()    /usr/local/go/src/runtime/debug/stack.go:16 +0x19github.com/pingcap/tidb/session.mustExecute({0x42f39c0?, 0xc001078480?}, {0x3dd5b11?, 0x145e707?}, {0xc0016c9780?, 0x37741a0?, 0x1?})    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/bootstrap.go:2087 +0x8agithub.com/pingcap/tidb/session.insertBuiltinBindInfoRow(...)    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/bootstrap.go:1461github.com/pingcap/tidb/session.initBindInfoTable({0x42f39c0, 0xc001078480})    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/bootstrap.go:1457 +0xb1github.com/pingcap/tidb/session.doDDLWorks({0x42f39c0, 0xc001078480})    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/bootstrap.go:1941 +0x2c9github.com/pingcap/tidb/session.bootstrap({0x42f39c0?, 0xc001078480?})    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/bootstrap.go:445 +0x2abgithub.com/pingcap/tidb/session.runInBootstrapSession({0x42b5ff0, 0xc000b825a0}, 0x3e27620)    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/session.go:2941 +0x1ffgithub.com/pingcap/tidb/session.BootstrapSession({0x42b5ff0, 0xc000b825a0})    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/session/session.go:2829 +0x216main.createStoreAndDomain()    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/tidb-server/main.go:296 +0x114main.main()    /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/tidb-server/main.go:202 +0x4ca
复制
 

可能是内存不足,由原有的 8G 扩展到 32G 后,问题没有复现。

总结

经过以上验证,用最简单的方式验证了 openEular 2003 SP3 系统下 TiDB 的部署安装和简单的功能验证。由于环境所限,没有经过更多的功能测试和性能测试,在充分的使用和验证后,再行文贡献给大家。

与[转帖]TiDB 6.1 单机环境 On openEular 2003 SP3相似的内容:

[转帖]TiDB 6.1 单机环境 On openEular 2003 SP3

https://tidb.net/book/book-rush/best-practice/other-practice/tidb61-on-openEular2003 背景​ 最近对国产操作系统很感兴趣,也有一些场景需要验证落地,官方支持银河麒麟 V10(X86,ARM),统信 UOS 等国产操作

[转帖]在 TiDB 中正确使用索引,性能提升 666 倍

https://tidb.net/book/tidb-monthly/2022/2022-04/usercase/index-666 背景​ 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行。 这个规模不算

[转帖]tidb数据库5.4.3和6.5.3版本性能测试对比

https://tidb.net/blog/5454621f 一、测试需求: 基于历史原因,我们的业务数据库一直使用5.4.3,最近由于研发提出需求:需要升级到6.5.3版本,基于版本不同,需要做个压力测试已验证2个版本之间的性能差异。 二、测试目的: 验证tidb数据库5.4.3和6.5.3版本性

[转帖]tidb集群部署

http://blog.itpub.net/29785807/viewspace-2789852/ 一.安装规划 1 2 3 4 5 6 使用15台服务器 5台tidb服务器:每台3个tidb实例+1个pd+1个pump 10台tikv服务器:每台4个tikv实例 drainer_servers 安

[转帖]使用 TiUP 升级 TiDB

本文档适用于以下升级路径: 使用 TiUP 从 TiDB 4.0 版本升级至 TiDB 7.1。 使用 TiUP 从 TiDB 5.0-5.4 版本升级至 TiDB 7.1。 使用 TiUP 从 TiDB 6.0-6.6 版本升级至 TiDB 7.1。 使用 TiUP 从 TiDB 7.0 版本升级

[转帖]TiKV 多副本丢失以及修复实践

https://tidb.net/blog/ad45bad9#6%E6%80%BB%E7%BB%93 1实验目的 随着tidb使用场景的越来越多,接入的业务越来越重要,不由得想试验下tidb组件的高可用性以及故障或者灾难如何恢复,恢复主要涉及的是pd组件和tikv组件,本文主要涉及tikv组件, p

[转帖]TIKV扩容之刨坑填坑​

01 背景 某tidb集群收到告警,TIKV 节点磁盘使用率85%以上,联系业务无法快速删除数据,于是想到扩容TIKV 节点,原先TIKV 节点机器都是6TB的硬盘,目前只有3TB的机器可扩,也担心region 均衡后会不会打满3TB的盘,PD 调度策略来看应该是会根据不同存储机器的资源配置和使用情

[转帖]002、体系结构之TiDB Server

TiDB Server 1、TiDB总览1.1、TiDB Server架构1.2、TiDB Server 主要功能: 2、SQL语句处理语句的解析和编译SQL层协议层上下文解析层逻辑优化器物理优化器本地执行器分布式执行器 3、如何将表的数据转成kv形式4、在线DDL相关模块5、GC机制与相关模块6、

[转帖]Tiup 常用运维操作命令干货

https://zhuanlan.zhihu.com/p/356031031 **导读**> 作者:杨漆> 16年关系型数据库管理,从oracle 9i 、10g、11g、12c到Mysql5.5、5.6、5.7、8.0 到TiDB获得3个OCP、2个OCM;运维路上不平坦,跌过不少坑、熬过许多夜。

[转帖]tidb之旅——tidb架构选择

https://zhuanlan.zhihu.com/p/641650168 前言 从4月份开始利用tidb改造了我们公司bi系统。这个过程中,我感觉到了tidb的强大。也打算记录一下整个改造过程。我打算从4个方面来记录这个改造过程。tidb架构选择,dm工具的使用——这两个部分还是tidb6.5.