TiDB的搭建与维护过程

发布时间 2023-11-09 09:43:43作者: 济南小老虎

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