TiDB的搭建与维护过程


背景

总结一下TiDB的搭建以及简单维护过程.

目标: 简单快速的创建TiDB数据库,以及进行备份恢复等工作.

TiDB 简介

TiDB(全称:Ti Distributed Database)是一款开源的分布式数据库系统,
由PingCAP公司开发。它是一种基于分布式架构的新型关系数据库,
融合了传统关系数据库的ACID特性和分布式数据库的可扩展性、高可用性和分布式事务特性。 TiDB以MySQL协议为基础,与MySQL兼容,可以无缝替代传统的关系型数据库。
它的最大不同是它的存储和计算部分是分离的,存储节点称为TiKV,计算节点称为TiDB。
TiKV是以分布式的方式将数据存储在多个节点上,而TiDB负责存储计划的解析与执行。
这种架构使得TiDB具备了良好的水平扩展性和高并发处理能力。 TiDB拥有强大的分布式特性,支持数据的自动分片与迁移,
可以根据负载自动扩容与缩容,从而实现了无需停机的横向扩展。
它还支持跨数据中心的数据复制,保证了数据的高可用性和容灾能力。
此外,TiDB还具备分布式事务的支持,可以提供全局的事务一致性。 除了以上特性,TiDB还集成了一些高级功能,
如分布式查询优化、在线数据扩容、自动故障转移等,以满足复杂的业务需求。 总之,TiDB是一个具备分布式特性、高可用性和水平扩展能力的开源分布式数据库系统,
为用户提供了一种全新的数据库解决方案。

环境准备

1. 机器名
2. ssh互信
3. /etc/hosts
4. ulimit配置
5. selinux设置
5. 防火墙设置
6. 其他设置
7. 关闭透明大页
8. 修改IO调度器
9. 创建用户/ssh互信
10.挂载磁盘等.
11.内核参数优化

部分环境准备内容

1. 用户相关
useradd tidb
passwd tidb
visudo
tidb ALL=(ALL) NOPASSWD: ALL ssh-keygen
ssh-copy-id tidb@tidb01 su - tidb
ssh-copy-id tidb@tidb01 2. 部分设置
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
临时关闭
setenforce 0
查看状态
getenforce ulimit 的设置
vi /etc/security/limits.conf
tidb hard nproc 65536
tidb soft nproc 65536
tidb soft nofile 1000000
tidb hard nofile 1000000
tidb soft stack 32768
tidb hard stack 32768
临时设置
ulimit -HSn 65536
检查
ulimit -a

内核参数相关

vim /etc/sysctl.conf

kernel.sysrq=0
net.ipv4.ip_forward=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.tcp_syncookies=1
kernel.dmesg_restrict=1
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
net.ipv4.tcp_syncookies=0 vm.swappiness=0
vm.vfs_cache_pressure=200
vm.dirty_background_ratio=5
vm.dirty_ratio=10
vm.dirty_expire_centisecs=1500
vm.dirty_writeback_centisecs=300 net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 2000 65000
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 4096

文件系统相关

关闭swap
swapoff -a
永久关闭swap
vi /etc/fstab
删除 swap一行. 挂载其他硬盘
mkdir -p {/data1,/data2,/data3} 初始化卷
fdisk -l |grep "/dev"
查看为挂载的硬盘
然后执行
fdisk /dev/vdb 等磁盘初始化
选择 n 新建分区. P 分区. w写入就可以. lsblk 查看带挂载的信息
mkfs.ext4 /dev/vdb1
mkfs.ext4 /dev/vdc1
mkfs.ext4 /dev/vdd1 开机自动挂载的设置
vim /etc/fstab中新增加 /dev/vdb1 /data1 ext4 defaults,noatime,nodiratime,nodelalloc 0 0
/dev/vdc1 /data2 ext4 defaults,noatime,nodiratime,nodelalloc 0 0
/dev/vdd1 /data3 ext4 defaults,noatime,nodiratime,nodelalloc 0 0 修改一下文件属主:
chown tidb:tidb /data1 -R
chown tidb:tidb /data2 -R
chown tidb:tidb /data3 -R

文件调度器与透明大页

修改磁盘调度器模式
注意 需要改 /etc/rc.d/rc.local 可执行权限
chmod 700 /etc/rc.d/rc.local
cat /sys/block/vda/queue/scheduler 永久设置 关闭透明大页
vi /etc/rc.d/rc.local if test -f /sys/kernel/mm/transparent_hugepage/enabled;then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag;then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
echo none > /sys/block/vda/queue/scheduler
echo none > /sys/block/vdb/queue/scheduler
echo none > /sys/block/vdc/queue/scheduler
echo none > /sys/block/vdd/queue/scheduler
# 可以将 echo none 也添加进来 none 是centos8 的叫法 查看方式
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/block/vda/queue/scheduler
# 需要重启后验证

安装部分软件

yum install numactl sysstat ntp  -y

关闭防火墙
systemctl disable firewalld && systemctl stop firewalld
systemctl disable cockpit.socket && systemctl stop cockpit.socket ntpdate ntp.aliyun.com
crontab -e
1 */4 * * * ntpdate ntp.aliyun.com systemctl enable --now crond

检查项目合计

systemctl status firewalld
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/block/vda/queue/scheduler
ulimit -a
getenforce

安装过程

上传安装包到 一台机器

比如我使用的版本是 7.2 第一步安装软件

cd tidb-community-toolkit-v7.2.0-linux-amd64
执行命令:
./local_install.sh
然后进行处理一下:
source /root/.bash_profile # 注意离线安装的话 需要 toolkit和server 放到一起不然会提示缺少很多component
# 在线与离线安装的命令基本上一样.
# 最大的不同点是 mirror 是本地的文件,还是外部的地址.

配置文件

global:
user: "tidb"
ssh_port: 22
deploy_dir: "/deploy/tidb"
data_dir: "/data1" server_configs:
pd:
replication.enable-placement-rules: true pd_servers:
- host: 172.16.39.101
- host: 172.16.39.102
- host: 172.16.39.103
tidb_servers:
- host: 172.16.39.101
- host: 172.16.39.102
- host: 172.16.39.103
tikv_servers:
- host: 172.16.39.101
- host: 172.16.39.102
- host: 172.16.39.103
tiflash_servers:
- host: 172.16.39.103
data_dir: /data2,/data3
cdc_servers:
- host: 172.16.39.101
- host: 172.16.39.102
- host: 172.16.39.103
monitoring_servers:
- host: 172.16.39.103
grafana_servers:
- host: 172.16.39.103
alertmanager_servers:
- host: 172.16.39.103

在线安装

curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

安装 tiup 

 source /root/.bash_profile 

 tiup mirror show 

安装 cluster
tiup install cluster
升级到最新
tiup update --self && tiup update cluster
tiup update --all 升级所有.
执行一下检查 tiup cluster check ./tidb_cluster.yaml --user tidb -i /home/tidb/.ssh/id_rsa 查看 tidb的版本:
tiup list tidb
进行安装: 最新的稳定是 7.2.0 20230629.
tiup cluster deploy erptidb v7.2.0 ./tidb_cluster.yaml --user tidb -i /home/tidb/.ssh/id_rsa 启动命令为:
tiup cluster start erptidb --init 建立本地的 仓库的方法
tiup mirror clone tidb-community-server-7.2.0-linux-amd64 7.2.0 --os=linux --arch=amd64
arm的话 可以直接使用.
tiup mirror clone tidb-community-server-7.2.0-linux-amd64 7.2.0 --os=linux --arch=arm64 设置镜像的路径:
tiup mirror set /shared_data/tiup
tiup mirror set https://tiup-mirror.example.com/

默认监控信息

http://172.16.39.102:2379/dashboard
默认用户 root 密码为空
http://172.16.39.103:3000/
默认用户 admin 密码 admin 登录数据库以及修改密码:
mysql -u root -p -P 4000 -h 172.16.39.101
默认是空密码 回车就可以登录.
show databases;
set password for 'root'@'%' = 'Test20131127' ;
flush privileges ;

tiup的部分运维操作

tiup cluster list
# 查看集群列表
tiup cluster start $cluster_name
# 启动集群
tiup cluster start ${cluster-name} -R pd
# 单独启动组件
tiup cluster start $cluster_name -N 1.2.3.4:2379,1.2.3.5:2379
# 单独重启某几台机器上面的特定组件.
tiup cluster display $cluster-name
# 查看集群状态
tiup cluster stop $cluster-name
# 关闭集群
tiup cluster stop ${cluster-name} -N 1.2.3.4:4000,1.2.3.5:4000
# 关闭tidb组件 注意 4000 也是 mysql客户端使用的端口.
tiup cluster clean ${cluster-name} --all
# 清理所有的数据

TiDB快速处理参数硬件参数的方法

useradd tidb
echo Test20131127 | passwd --stdin tidb
sed -i '/tidb/d' /etc/sudoers
echo "tidb ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config sed -i '/^tidb/d' /etc/security/limits.conf
echo "tidb hard nproc 65536
tidb soft nproc 65536
tidb soft nofile 1000000
tidb hard nofile 1000000
tidb soft stack 32768
tidb hard stack 32768" >> /etc/security/limits.conf scp /etc/sysctl.conf /etc/sysctl.conf_$(date +%Y%m%d%H%M)
cat > /etc/sysctl.conf <<EOF
kernel.sysrq=0
net.ipv4.ip_forward=1
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.tcp_syncookies=1
kernel.dmesg_restrict=1
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
net.ipv4.tcp_syncookies=0 vm.swappiness=0
vm.vfs_cache_pressure=200
vm.dirty_background_ratio=5
vm.dirty_ratio=10
vm.dirty_expire_centisecs=1500
vm.dirty_writeback_centisecs=300 net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 2000 65000
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 4096
vm.max_map_count=262144
EOF
sysctl -p cat > /etc/systemd/system/cpupower.service <<EOF
[Unit]
Description=CPU powersave [Service]
Type=oneshot
ExecStart=/usr/bin/cpupower -c all frequency-set -g performance [Install]
WantedBy=multi-user.target
EOF systemctl enable --now cpupower swapoff -a
scp /etc/fstab /etc/fstab_$(date +%Y%m%d%H%M)
sed -i '/swap/d' /etc/fstab
# 需要注意这个命令一定要注意安全 必须测试完再重启, 先备份文件 sed -i '/scheduler/d' /etc/rc.d/rc.local
sed -i '/transparent_hugepage/d' /etc/rc.d/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo none > /sys/block/vda/queue/scheduler
echo none > /sys/block/vdb/queue/scheduler
echo none > /sys/block/vdc/queue/scheduler " > /etc/rc.d/rc.local chmod 777 /etc/rc.d/rc.local systemctl disable firewalld && systemctl stop firewalld
systemctl disable cockpit.socket && systemctl stop cockpit.socket yum install -y ntpdate cat >/etc/cron.d/ntpdate <<EOF
1 */4 * * * ntpdate ntp.aliyun.com
EOF systemctl enable --now crond

创建时建议手工介入的脚本

挂载新的硬盘
mkdir /data01 /data02
fdisk /dev/vdb
fdisk /dev/vdc
mkfs.ext4 /dev/vdb1
mkfs.ext4 /dev/vdc1
然后挂载新的硬盘 # 方式2
mkdir /data01 /data02
parted /dev/vdc mklabel gpt
parted /dev/vdc mkpart primary ext4 2048s 100%
parted /dev/vdb mklabel gpt
parted /dev/vdb mkpart primary ext4 2048s 100%
mkfs.ext4 /dev/vdb1
mkfs.ext4 /dev/vdc1 echo "/dev/vdb1 /data01 ext4 defaults,noatime,nodiratime,nodelalloc 0 0
/dev/vdc1 /data02 ext4 defaults,noatime,nodiratime,nodelalloc 0 0" >> /etc/fstab 注意可以给将目录廷加上对应的用户权限
chown tidb:tidb /data01 -R
chown tidb:tidb /data02 -R

参数优化部分-需要根据配置单独的配置进行优化

server_configs:
tidb:
log.file.max-days: 1
log.level: error
performace:
max-procs: 4
server-memory-quota: 4G
allow-expression-index: true
tikv:
log.file.max-days: 1
log.level: error
readpool.unified.max-thread-count: 8
storage.block-cache.capacity: 3G
pd:
replication.enable-placement-rules: true
tidb_dashboard: {}
tiflash:
performance.max-procs: 4
tiflash-learner: {}
pump: {}
drainer: {}
cdc: {}
kvcdc: {}
grafana: {}

其他配置

SET GLOBAL tidb_ignore_prepared_cache_close_stmt=on;
SET GLOBAL tidb_enable_fast_analyze=1 ;
SET GLOBAL tidb_rc_read_check_ts=on ;
SET config pd `replication.max-replicas`=1;
SET config tikv `txn-local-latches`=false;
set config tikv `raftstore.apply-pool-size` = 16 ;
set config tikv `raftstore.store-pool-size` = 16 ;
SET GLOBAL tidb_auto_analyze_start_time='01:00 +0000' ;
SET GLOBAL tidb_auto_analyze_end_time='03:00 +0000' ;
SET config tikv `log.level` = 'CRITICAL';
SET config pd `log.level` = 'error';
SET GLOBAL sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SET GLOBAL tidb_server_memory_limit = "8GB";
SET GLOBAL tidb_mem_quota_query = 1<< 30;
SET GLOBAL tidb_multi_statement_mode='ON' ;
SET GLOBAL tidb_enable_tiflash_read_for_write_stmt=ON;
set GLOBAL tidb_max_tiflash_threads = 4 ;
set @@global.tidb_disable_txn_auto_retry = 0;
set @@global.tidb_retry_limit = 10;
set GLOBAL tidb_partition_prune_mode = `dynamic`;
set global tidb_enable_noop_functions=1 ;
set global sql_require_primary_key=off; # 注意以下参数与分区表冲突
set GLOBAL tidb_scatter_region=true ;

下载与安装之二

curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
/root/.bash_profile
tiup cluster check /deploy/tidb_cluster.yaml --user tidb -i /home/tidb/.ssh/id_rsa tiup cluster deploy erptidb v6.5.3 /deploy/tidb_cluster.yaml --user tidb -i /home/tidb/.ssh/id_rsa
# 启动命令为:
tiup cluster start erptidb --init 使用mysql登录并且修改密码
alter user root@'%' identified by 'SomePassword' ; tiup install br:v6.5.3 安装备份恢复软件
tiup install ctl:v6.5.3 增加环境变量 便于后续处理 cat > /etc/profile.d/tidb.sh <<EOF
export PATH=$PATH:/root/.tiup/components/br/v6.5.3:/root/.tiup/components/ctl/v6.5.3
EOF
source /etc/profile.d/tidb.sh

备份恢复数据库

备份
now=`date +%Y%m%d%H`
export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin
ssh root@192.168.255.65 "mkdir -p /data/minio/data/tidb25574${now}"
time /root/.tiup/components/br/v7.2.0/br backup full -f '*.*' -f '!information_schema.*' -f '!emetrics_schema.*' --pd "192.168.254.72:2379" --storage "s3://tidb25574${now}" --s3.endpoint "http://192.168.255.65:9000" --send-credentials-to-tikv=true --log-file backupfull.log 恢复 可以单个数据库, 单个表回复, 也可以完整恢复
注意恢复时 数据库建议是空的. export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin
/root/.tiup/components/br/v7.2.0/br restore db --db ERPDATA_ZZ_DEV_0001 --pd "192.168.254.72:2379" --storage "s3://tidb255742023100823" --s3.endpoint "http://192.168.255.65:9000" --send-credentials-to-tikv=true --log-file restore

计划任务备份与处理

crontab -e 

1 23 * * * /deploy/br

清理方式
find /minio/data -maxdepth 1 ! -path "/minio/data/.minio.sys" -mtime +5 -exec rm -rf {} \; 设置计划任务:
1 4 * * * /deploy/diskclean

TiDB的搭建与维护过程的更多相关文章

  1. mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

    文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...

  2. 深入理解Fabric环境搭建的详细过程

    博主之前的文章都是教大家怎么快速的搭建一个Fabric的环境,但是其中大量的工作都隐藏到了官方的脚本中,并不方便大家深入理解其中的过程,所以博主这里就将其中的过程一步步分解,方便大家! 前面的准备工作 ...

  3. mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)

    继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...

  4. 深入理解Fabric环境搭建的详细过程(转)

    前面的准备工作我就不用多说了,也就是各种软件和开发环境的安装,安装好以后,我们git clone下来最新的代码,并切换到v1.0.0,并且下载好我们需要使用的docker镜像,也就是到步骤6,接下来我 ...

  5. git的本质是资源库和版本(资源)目录的维护过程

    仓库的本质: 资源+索引. 对git而言,添加到暂存区的过程是,将单个资源的修改副本保存到资源库,同时维护暂存区目录的过程. git的本质是资源库和版本目录的维护过程. 一.要素 1.资源 2.副本 ...

  6. vue-cli3.0 脚手架搭建项目的过程详解

    1.安装vue-cli 3.0 ? 1 2 3 npm install -g @vue/cli # or yarn global add @vue/cli 安装成功后查看版本:vue -V(大写的V) ...

  7. Nginx搭建反向代理服务器过程详解

    一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...

  8. Nginx 搭建反向代理服务器过程详解

    1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet ...

  9. CentOS7使用yum详细搭建zabbix3.2过程

    本文引用于:http://blog.csdn.net/s3275492383/article/details/62417210 一.准备搭建环境: 1.系统:CentOS7 2.默认有使用linux服 ...

  10. Docker 企业级镜像仓库 Harbor 的搭建与维护

    目录 一.什么是 Harbor 二.Harbor 安装 2.1.Harbor 安装环境 2.2.Harbor安装 2.3 配置HTTPS 三.Harbor 的使用 3.1.登录Harbor并使用 3. ...

随机推荐

  1. 超详细教程:SpringBoot整合MybatisPlus

    摘要:本文为大家带来SpringBoot整合MybatisPlus的教程,实现SpringBoot项目中依赖数据模块进行数据操作,并进行简单测试. 本文分享自华为云社区<SpringBoot整合 ...

  2. 带你了解数仓安全测试的TLS协议

    摘要:SSL/TLS协议是业界常用的加密通信协议,通过该协议可以完成通信双方身份认证,会话密钥协商,通信内容加密和完整性保护. 本文分享自华为云社区<GaussDB(DWS)安全测试之TLS协议 ...

  3. VRAR产业峰会暨第二届华为VR开发应用大赛颁奖典礼在和平区成功举办!

    摘要:近日,由沈阳市和平区人民政府和华为技术有限公司主办的VRAR产业峰会暨第二届华为VR开发应用大赛颁奖典礼在沈阳君悦酒店圆满举办. 12月29日,由沈阳市和平区人民政府和华为技术有限公司主办的VR ...

  4. 火山引擎入选《2022 爱分析 · DataOps 厂商全景报告》,旗下 DataLeap 产品能力获认可

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 2 月 9 日,国内领先的数字化市场研究与咨询机构爱分析发布了<2022 爱分析·DataOps 厂商全景报 ...

  5. SpringBoot Kafka SSL接入点PLAIN机制收发消息

    applycation.yml spring: # https://developer.aliyun.com/article/784990 kafka: bootstrap-servers: XXXX ...

  6. .NetCore 接口请求耗时记录

    通过日志,记录每个接口请求的耗时情况 结合  <logger name="*" level="Trace" writeTo="tracefile ...

  7. 【django-Vue】项目day01 pip永久换源 虚拟环境搭建 项目前后端创建 项目目录调整

    目录 昨日回顾 1 企业项目类型 2 企业项目开发流程 3 路飞项目需求 4 pip永久换源 5 虚拟环境搭建 5.1 使用pycharm创建虚拟环境 5.2 通用方案创建虚拟环境 6 luffy项目 ...

  8. 2021 年如何学习 Android,一位 5 年中大厂老哥跟你聊聊

    本文首发我的微信公众号:程序员徐公 大家好,我是程序员徐公,加上实习,有五年中大厂经验.今天,我们一起来聊一聊如何自学 Android. 光阴似箭,日月如梭,时间真的过得飞快. 加上实习,从事 And ...

  9. 可用性库存(CO09)排除库存地点增强

    1.业务需求 1.1.业务背景 1.2.对应方案: 2.测试BAPI 首先运行事务代码CO09,查看结果 运行BAPI_MATERIAL_AVAILABILITY 3.增强实现 3.1.增强思路 3. ...

  10. Codeforce 318A - Even Odds(数学水题)

    Being a nonconformist, Volodya is displeased with the current state of things, particularly with the ...