TiDB 是一个很吊的 NewSQL 数据库,具体有多吊就不重复介绍了,官网自己去看。这篇文章主要记录我部署 TiDB 的过程。
TiDB 官方文档地址:https://docs.pingcap.com/zh/tidb
一、依赖安装
需要安装两个依赖包,不然后面部署的时候会报错:
dnf install numactl libnsl -y
二、安装 TiUP
TiUP 是 TiDB 推荐的包管理工具,首先安装之。
这里我新建 tidb
用户,进行后续的操作。
# 创建并切换到 tidb 用户
groupadd tidb
useradd -s /usr/bin/bash -g tidb tidb
su - tidb
# 安装 TiUP
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
# 重载环境变量
source .bash_profile
三、初始化 TiDB 集群配置文件
我这里使用 2 实例 TiDB、3 实例 TiKV,运行后占用约 6G 内存,你也可以根据自己服务器情况做相应调整。
写入下方配置内容到 topology.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: "/home/tidb/tidb-deploy"
data_dir: "/home/tidb/tidb-data"
# # Monitored variables are applied to all the machines.
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
server_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: 127.0.0.1
tidb_servers:
- host: 127.0.0.1
port: 4000
status_port: 10080
deploy_dir: "/home/tidb/tidb-deploy/tidb-4000"
log_dir: "/home/tidb/tidb-deploy/tidb-4000/log"
numa_node: "0"
- host: 127.0.0.1
port: 4001
status_port: 10081
deploy_dir: "/home/tidb/tidb-deploy/tidb-4001"
log_dir: "/home/tidb/tidb-deploy/tidb-4001/log"
numa_node: "0"
tikv_servers:
- host: 127.0.0.1
port: 20160
status_port: 20180
config:
server.labels: { host: "logic-host-1" }
- host: 127.0.0.1
port: 20161
status_port: 20181
config:
server.labels: { host: "logic-host-2" }
- host: 127.0.0.1
port: 20162
status_port: 20182
config:
server.labels: { host: "logic-host-3" }
monitoring_servers:
- host: 127.0.0.1
grafana_servers:
- host: 127.0.0.1
四、部署 TiDB 集群
使用以下命令,开始运行部署,注意需要输入 root
密码。
tiup cluster deploy tidb-test v6.5.0 ./topology.yaml --user root -p
此处部署的是截止文章撰稿前的最新版本 6.5.0
,集群名称设置为 tidb-test
五、启动 TiDB 集群
首先检查部署是否成功:
tiup cluster display tidb-test
成功后即可启动集群
tiup cluster start tidb-test --init
注意启动后将会输出数据库 root
密码,密码只显示一次,务必妥善保存。
若启动遇到问题,请根据报错内容查看对应日志分析解决。
成功启动后可运行下述命令验证集群运行状态
tiup cluster display tidb-test
六、phpMyAdmin SQL 报错问题
TiDB 默认开启了 MySQL5.7+ 的 ONLY_FULL_GROUP_BY
,这在 phpMyAdmin 上会报错。
解决方法是运行下述 SQL 全局关闭 ONLY_FULL_GROUP_BY
特性。
set @@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
set @@SESSION.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
SET @@global.tidb_enable_clustered_index=OFF;
七、安装 WordPress SQL 报错问题
新装 WordPress 会报错 utf8mb4_unicode_520_ci
不存在,解决方法是编辑 wp-includes/class-wpdb.php 文件,将:
if ( $this->has_cap( 'utf8mb4_520' ) && 'utf8mb4_unicode_ci' === $collate ) {
$collate = 'utf8mb4_unicode_520_ci';
}
修改为:
if ( $this->has_cap( 'utf8mb4_520' ) && 'utf8mb4_unicode_ci' === $collate ) {
$collate = 'utf8mb4_unicode_ci';
}
之后再进行安装,就不会报错了。
另外还需要在 phpMyAdmin 运行下述 SQL 解决 SQL_CALC_FOUND_ROWS 报错的问题
SET @@global.tidb_enable_noop_functions=1;
这样操作以后,WordPress 的分页计算会失效,可以使用下述代码解决:
<?php
/**
* Plugin Name: Fix WordPress Slow Queries
* Description: Fix WordPress Slow Queries
* Author: Mahdi Akrami
* Version: 1.0.0
*/
class FIX_WP_SLOW_QUERY {
public static function init() {
/**
* WP_Query
*/
add_filter( 'found_posts_query', [ __CLASS__, 'add_found_rows_query' ], 999, 2 );
add_filter( 'posts_request_ids', [ __CLASS__, 'remove_found_rows_query' ], 999 );
add_filter( 'posts_pre_query', function ( $posts, \WP_Query $query ) {
$query->request = self::remove_found_rows_query( $query->request );
return $posts;
}, 999, 2 );
add_filter( 'posts_clauses', function ( $clauses, \WP_Query $wp_query ) {
$wp_query->fw_clauses = $clauses;
return $clauses;
}, 999, 2 );
}
public static function remove_found_rows_query( $sql ) {
return str_replace( ' SQL_CALC_FOUND_ROWS ', '', $sql );
}
public static function add_found_rows_query( $sql, WP_Query $query ) {
global $wpdb;
$distinct = $query->fw_clauses['distinct'] ?? '';
$join = $query->fw_clauses['join'] ?? '';
$where = $query->fw_clauses['where'] ?? '';
$groupby = $query->fw_clauses['groupby'] ?? '';
$count = 'COUNT(*)';
if ( ! empty( $groupby ) ) {
$count = "COUNT( distinct $groupby )";
}
return "
SELECT $distinct $count
FROM {$wpdb->posts} $join
WHERE 1=1 $where
";
}
}
FIX_WP_SLOW_QUERY::init();
文章评论