作者: 江湖有缘 原文来源:https://tidb.net/blog/359d4e00
引言
在当今数据驱动的互联网应用中,数据库的性能与可扩展性已成为系统架构中的关键一环。WordPress 作为全球最流行的网站内容管理系统之一,传统上依赖于 MySQL 等单机数据库,面临高并发和大数据量场景时存在明显瓶颈。TiDB
作为一款兼容 MySQL 协议的分布式数据库,具备水平扩展、强一致性和高可用等特性,为 WordPress 的高性能部署提供了全新可能。通过将 WordPress 与 TiDB 结合,不仅能够提升系统的稳定性和响应速度,还能轻松应对业务增长带来的数据挑战,展现出卓越的技术适应力与前瞻性优势。
一、TiDB 介绍
1.1 TiDB 简介
TiDB 是由 PingCAP 公司自主设计、研发的开源分布式关系型数据库,它是一款同时支持在线事务处理(OLTP)与在线分析处理(OLAP)的融合型分布式数据库产品。TiDB 的目标是为用户提供一站式 OLTP、OLAP、HTAP 解决方案,特别适合高可用、强一致要求较高、数据规模较大的各种应用场景。
1.2 主要特点
-
一键水平扩缩容
:存储计算分离架构,可按需对计算和存储分别进行在线扩容或缩容。 -
金融级高可用
: 数据多副本存储,通过 Multi-Raft 协议同步事务日志,确保数据强一致性及高可用性。 -
实时 HTAP
:提供行存储引擎 TiKV 和列存储引擎 TiFlash,通过 Multi-Raft Learner 协议保证数据强一致性,解决资源隔离问题。 -
云原生的分布式数据库
: 专为云环境设计,使用 TiDB Operator 实现公有云、私有云、混合云中的自动化部署。 -
兼容 MySQL 协议和生态
:完全兼容 MySQL 协议和常用功能,应用迁移成本低,并提供数据迁移工具辅助迁移过程。
1.3 核心应用场景
- 金融行业场景
- 满足金融行业对数据一致性、系统可靠性和高可用性的严格要求。
- 海量数据及高并发的 OLTP 场景
- 针对数据快速增长的需求,采用计算存储分离架构,支持大规模并行处理。
- 实时 HTAP 场景
- 结合 TiKV 和 TiFlash 引擎,实现交易处理和数据分析在同一系统内高效执行。
- 数据汇聚、二次加工处理的场景
- 适用于企业级数据整合与报表生成,简化ETL流程,提高数据处理效率。
1.4 TiDB架构介绍
以下这些组件共同构成了 TiDB 强大、灵活、可扩展的分布式数据库架构。
-
📌 TiDB Server :SQL 层组件,负责接收客户端连接,解析和优化 SQL,并生成分布式执行计划。它本身不存储数据,将实际的数据读写请求转发给底层的 TiKV 或 TiFlash 存储节点。
-
📌 PD (Placement Driver) Server :集群的元信息管理模块,负责存储拓扑结构、调度数据分布、分配事务 ID,是整个集群的“大脑”。PD 支持高可用部署,建议部署奇数个节点以保证容错能力。
-
📌 TiKV Server :分布式事务型键值存储引擎,负责实际数据的存储与事务处理。数据按 Region 分布存储,支持多副本自动复制和故障转移,为 TiDB 提供强一致性和高可用性的底层存储支持。
-
📌 TiFlash :列式存储引擎,作为 TiKV 的扩展节点,专为分析型查询加速设计。通过实时同步 TiKV 数据,提供高效的 OLAP 查询能力,实现 HTAP 场景下的资源隔离与混合负载处理。
二、实践环境介绍
2.1 部署环境要求
✅ 部署主机要求
:在开始部署 TiDB 集群之前,请确保部署主机满足以下条件:
要求项 | 说明 |
---|---|
操作系统 | 推荐安装 CentOS 7.3 及以上版本 |
网络连接 | 需支持互联网访问,用于下载 TiDB 及相关软件包 |
用户权限 | 使用部署主机的 root 用户及密码 |
防火墙配置 | 关闭防火墙 或开放 TiDB 集群节点间所需端口 |
支持架构 | 支持 x86_64(AMD64) 和 ARM 架构 |
2.2 本地环境规划
本次实践基于个人测试环境搭建,具体信息如下:
主机名 | IP 地址 | 操作系统版本 | Docker 版本 | 部署项目 |
---|---|---|---|---|
jeven01 | 192.168.3.88 | Ubuntu 22.04.1 LTS | 28.1.1 | TiDB 数据库/WordPress |
2.3 本次实践介绍
🔍 说明: 以下内容为个人学习与测试环境的部署实践,非生产环境使用。如需在正式环境中部署,请根据实际需求谨慎调整配置。
✅ 实践目标
-
模拟生产环境部署在单机环境下模拟部署 TiDB 生产集群,体验真实集群架构与部署流程。
-
基于 Docker 环境搭建 使用 Docker 容器化技术快速构建 TiDB 集群及相关服务,提升部署效率与环境隔离性。
-
部署 WordPress 对接 TiDB 搭建 WordPress 网站服务,并将其数据库后端连接至 TiDB,验证其兼容性与可用性。
⚠️ 注意事项
- 本实践仅供学习与测试使用,不适用于生产环境直接套用。
- 所有操作应在具备相关知识基础上进行,确保理解每一步的作用与影响。
- 建议在测试环境中完整验证后再考虑向生产迁移。
三、部署Docker环境
3.1 配置Docker软件源
安装
Docker
之前,我们先安装 HTTPS传输工具及必要组件。
apt install -y apt-transport-https ca-certificates curl gnupg lsb-release software-properties-common
执行以下命令,添加阿里云 GPG 密钥。
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg
执行以下命令,开始配置阿里云 Docker 软件源。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
使用
apt update
命令,更新软件源。
root@jeven01:~# apt update
Hit:1 https://mirrors.aliyun.com/ubuntu jammy InRelease
Hit:2 https://mirrors.aliyun.com/ubuntu jammy-security InRelease
Hit:3 https://mirrors.aliyun.com/ubuntu jammy-updates InRelease
Hit:4 https://mirrors.aliyun.com/ubuntu jammy-backports InRelease
Hit:5 https://mirrors.aliyun.com/docker-ce/linux/ubuntu jammy InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
194 packages can be upgraded. Run 'apt list --upgradable' to see them.
3.2 安装Docker
执行以下命令,安装Docker核心组件。
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.3 配置镜像加速
执行以下命令,快速配置Docker镜像加速。可以自行添加多个Docker镜像加速源,确保后续可以成功拉取Docker镜像。
mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
"registry-mirrors": ["https://80c84f5330e14908928ca78944e61dc4.mirror.swr.myhuaweicloud.com"]
}
EOF
执行以下命令,配置Docker开机自启。
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
3.4 检查Docker版本
检查Docker版本,可以看到当前安装的版本为
28.1.1
。
root@jeven01:~# docker -v
Docker version 28.1.1, build 4eba377
检查Docker compose版本,当前安装版本为
2.35.1
。
root@jeven01:~# docker compose version
Docker Compose version v2.35.1
3.5 检查Docker状态
检查Docker服务状态,确保Docker服务正常运行。
systemctl status docker
四、部署TiDB单机集群
4.1 下载并安装TiUP
TiUP 是 TiDB 官方提供的组件管理工具,支持一键部署、升级和管理 TiDB 集群及各类组件。 它简化了从本地测试到生产环境的全流程运维操作,是 TiDB 生态中不可或缺的高效管理工具。我们执行以下安装脚本,安装TiUP工具。
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
4.2 声明环境变量
TiUP
安装完成后,系统会提示显示用于配置环境变量的 Shell Profile 文件的绝对路径,如下所示:
将该路径复制后,使用
source
命令加载配置文件,使环境变量立即生效。
source /root/.bashrc
4.3 安装cluster组件
执行
tiup cluster
命令用于安装并管理 TiDB 集群的生命周期操作组件。
tiup cluster
4.4 修改sshd服务连接数限制
为支持多机模拟部署,需以 root 用户身份将
/etc/ssh/sshd_config
中的MaxSessions
参数调整为 20 以提升 SSH 连接数限制。
vim /etc/ssh/sshd_config
MaxSessions 20
修改sshd服务的配置文件后,重启sshd服务。
systemctl restart sshd
4.5 创建并编辑 topo.yaml文件
创建TiDBd部署目录,如下所示:
mkdir -p /data/tidb/{data,deploy} && cd /data/tidb
在部署目录下创建并编辑拓扑配置文件,我们命名为
topo.yaml
。
vim topo.yaml
topo.yaml配置文件可参考以下模版,注意将host的IP地址替换为自己服务器的IP地址。
# # 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: "/data/tidb/deploy"
data_dir: "/data/tidb/data"
# # Monitored variables are applied to all the machines.
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
server_configs:
tidb:
instance.tidb_slow_log_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.3.88
tidb_servers:
- host: 192.168.3.88
tikv_servers:
- host: 192.168.3.88
port: 20160
status_port: 20180
config:
server.labels: { host: "logic-host-1" }
- host: 192.168.3.88
port: 20161
status_port: 20181
config:
server.labels: { host: "logic-host-2" }
- host: 192.168.3.88
port: 20162
status_port: 20182
config:
server.labels: { host: "logic-host-3" }
tiflash_servers:
- host: 192.168.3.88
monitoring_servers:
- host: 192.168.3.88
grafana_servers:
- host: 192.168.3.88
4.6 开始部署TiDB集群
执行以下命令,通过 tiup list tidb 命令来查看当前支持部署的 TiDB 版本,这里我们安装的版本为v8.5.1。
tiup list tidb
TiDB集群部署的参考命令示例如下所示,注意替换集群名称和TiDB版本。
tiup cluster deploy <cluster-name> <version> ./topo.yaml --user root -p
这里我们执行以下命令,开始部署TiDB集群。其中提示输出部署服务器的root账号密码,输入”y”及 root 密码即可完成部署。
tiup cluster deploy cluster_tidb v8.5.1 ./topo.yaml --user root -p
4.7 启动TiDB集群
执行以下命令,启动TiDB集群。
tiup cluster start cluster_tidb --init
TiDB集群部署完毕后,会输出root账号的初始密码,我们记录与保存该初始密码。
五、TiDB数据库的基本配置与管理
5.1 安装MySQL数据库
在ubuntu系统中,我们执行以下命令,快速安装MySQL数据库
apt install mysql-server -y
启动MySQL数据库,并设置开机自启。
systemctl start mysql
systemctl enable mysql
5.2 访问 TiDB 数据库
执行以下命令,访问TiDB 数据库,注意-p后面的是刚才复制的初始密码。
mysql -h 192.168.3.88 -P 4000 -u root -pTy7^e5q*4c68j9_-Cx
5.3 访问Grafana监控页面
访问
Grafana
监控页面:http://{服务器IP地址}:3000,将IP替换为自己服务器IP地址,默认用户名和密码均为 admin。如果无法访问到该页面,注意本地防火墙是否关闭或者放行相关端口。
5.4 访问TiDB Dashboard监控页面
访问集群 TiDB Dashboard 监控页面:http://{pd-ip}:2379/dashboard,默认用户名为 root,密码为刚才复制的初始密码。
六、TiDB数据库操作部分
6.1 创建用户
执行以下命令,创建数据库用户tidb,密码也为tidb。
CREATE USER 'tidb'@'%' IDENTIFIED BY 'tidb';
由于是测试环境,我们将该账号授予所有数据库的所有权限.
GRANT ALL PRIVILEGES ON *.* TO 'tidb'@'%';
刷新权限,如下所示:
FLUSH PRIVILEGES;
6.2 查询字符集和排序规则
- 查询所有支持的字符集
mysql> SHOW CHARACTER SET;
+---------+-------------------------------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+-------------------------------------+-------------------+--------+
| ascii | US ASCII | ascii_bin | 1 |
| binary | binary | binary | 1 |
| gbk | Chinese Internal Code Specification | gbk_chinese_ci | 2 |
| latin1 | Latin1 | latin1_bin | 1 |
| utf8 | UTF-8 Unicode | utf8_bin | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_bin | 4 |
+---------+-------------------------------------+-------------------+--------+
6 rows in set (0.00 sec)
- 查询特定字符集支持的所有排序规则
mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';
+--------------------+---------+-----+---------+----------+---------+---------------+
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+--------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_0900_ai_ci | utf8mb4 | 255 | | Yes | 0 | NO PAD |
| utf8mb4_0900_bin | utf8mb4 | 309 | | Yes | 1 | NO PAD |
| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 | PAD SPACE |
| utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | PAD SPACE |
+--------------------+---------+-----+---------+----------+---------+---------------+
5 rows in set (0.01 sec)
mysql>
6.3 创建数据库
在创建数据库时,DEFAULT CHARACTER SET utf8mb4 和 COLLATE utf8mb4_0900_ai_ci 用于指定数据库的默认字符集和排序规则,确保其能够正确存储和检索包括中文、表情符号等在内的多种语言字符。这两个参数至关重要,必须根据当前数据库版本支持的字符集和排序规则进行配置,否则在安装 WordPress 或迁移数据库时,可能会因兼容性问题导致失败。
CREATE DATABASE wordpress
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
七、部署WordPress服务
7.1 下载wordpress镜像
执行以下命令,拉取wordpress镜像。
docker pull wordpress
7.2 创建部署目录
执行以下命令,创建部署目录。
mkdir -p /data/wordpress/data && cd /data/wordpress
7.3 创建容器
执行以下命令,创建wordpress容器。
docker run -d --name my_wordpress --restart always -v /data/wordpress/data:/var/www/html -e WORDPRESS_DB_HOST=192.168.3.88:4000 -e WORDPRESS_DB_USER=tidb -e WORDPRESS_DB_PASSWORD="tidb" -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_CHARSET=utf8mb4 -e WORDPRESS_DB_COLLATE=utf8mb4_0900_ai_ci -p 8167:80 wordpress
建议使用docker compose方式创建wordpress容器,我们新建及编辑docker-compose.yaml文件,内容如下:
vim docker-compose.yaml
version: '3.9'
services:
wordpress:
image: wordpress
ports:
- '8167:80'
environment:
- WORDPRESS_DB_COLLATE=utf8mb4_0900_ai_ci
- WORDPRESS_DB_CHARSET=utf8mb4
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_DB_PASSWORD=tidb
- WORDPRESS_DB_USER=tidb
- WORDPRESS_DB_HOST=192.168.3.88:4000
volumes:
- '/data/wordpress/data:/var/www/html'
restart: always
container_name: my_wordpress
🐳 WordPress 容器环境变量说明
环境变量名 | 值 | 说明 |
---|---|---|
WORDPRESS_DB_COLLATE |
utf8mb4_0900_ai_ci |
设置数据库默认排序规则(Collation),确保与 TiDB 数据库配置一致。 |
WORDPRESS_DB_CHARSET |
utf8mb4 |
设置数据库字符集,用于支持中文、Emoji 等多语言内容。 |
WORDPRESS_DB_NAME |
wordpress |
指定 WordPress 使用的数据库名称,需提前在 TiDB 中创建好。 |
WORDPRESS_DB_PASSWORD |
tidb |
连接数据库的用户密码,对应数据库用户的密码。 |
WORDPRESS_DB_USER |
tidb |
用于连接数据库的用户名,需具备对目标数据库的访问权限。 |
WORDPRESS_DB_HOST |
192.168.3.88:4000 |
指定数据库主机地址和端口,指向 TiDB Server 的 IP 和 MySQL 协议端口。 |
📌 其他关键配置说明
配置项 | 值 | 说明 |
---|---|---|
image |
wordpress |
使用的 Docker 镜像名称,默认为官方最新版。 |
ports |
'8167:80' |
将容器的 80 端口映射到宿主机的 8167 端口,可通过 http://localhost:8167 访问。 |
volumes |
/data/wordpress/data:/var/www/html |
挂载本地目录作为 WordPress 网站文件的持久化存储。 |
restart |
always |
容器退出时自动重启,保障服务持续运行。 |
container_name |
my_wordpress |
自定义容器名称,方便管理和查看日志。 |
- 创建wordpres容器
执行以下命令,创建wordpres容器
docker compose up -d
7.4 修改wp-config.php文件
编辑 WordPress 的 wp-config.php 文件,确保以下配置:
vim data/wp-config.php
/** Database charset to use in creating database tables. */
define('DB_CHARSET', 'utf8mb4');
/** The database collate type. Don't change this if in doubt. */
define('DB_COLLATE', 'utf8mb4_0900_ai_ci');
7.5 重启容器
执行以下命令,重启wordpress容器。
docker compose restart
7.6 检查容器状态
检查wordpress容器状态,确保容器正常启动。
root@jeven01:/data/wordpress# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e09d2cad6b58 wordpress "docker-entrypoint.s…" 16 minutes ago Up 30 seconds 0.0.0.0:8167->80/tcp, [::]:8167->80/tcp my_wordpress
八、访问WordPress网站
8.1 访问WordPress初始页
本地电脑浏览器输入:http://<服务器IP地址>:8167,将IP替换为自己服务器IP地址。进入到WordPress的初始配置页面
8.2 设置系统语言
在wordpress初始配置页中,我们选择系统语言为“简体中文”,点击“继续”。
8.3 设置站点信息
WordPress站点信息,可参考如下填写:
站点标题
:myweb用户名
:admin密码
:自定义填写邮箱
:自定义填写(这里测试使用admin@qq.com)- 可根据需要自定义修改站点配置,填写完毕后,点击“
安装WordPress
”。
8.4 登录WordPress后台管理
安装完成后,会提示初始化WordPress安装成功,如下所示:
点击“登录”,输入刚才设置的账号密码,进入到WordPress后台管理页面。
九、WordPress文章显示问题解决
9.1 显示报错
当我们在wordpres添加文章后,发现文章列表无法显示,我们通过在 wp-config.php 文件,添加以下代码启用调试:
// 启用调试模式
define('WP_DEBUG', true);
// 将调试信息记录到日志文件
define('WP_DEBUG_LOG', true);
// 不在前端显示调试信息
define('WP_DEBUG_DISPLAY', false);
发现报错日志,如下所示:
root@jeven01:/data/wordpress# tail data/wp-content/debug.log
OR wp_posts.post_status = 'private')))
ORDER BY wp_posts.post_date DESC
LIMIT 0, 20 made by WP_Posts_List_Table->prepare_items, wp_edit_posts_query, wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts
[28-May-2025 13:47:29 UTC] WordPress database error function SQL_CALC_FOUND_ROWS has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions for query SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1 AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish'))
ORDER BY wp_posts.post_date DESC
LIMIT 0, 20 made by WP_Posts_List_Table->prepare_items, wp_edit_posts_query, wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts
报错分析:TiDB 对 SQL_CALC_FOUND_ROWS 的实现是 "noop"(无操作),默认不生效。错误日志明确提示:
function SQL_CALC_FOUND_ROWS has only noop implementation in tidb now,
use tidb_enable_noop_functions to enable these functions
WordPress 核心和插件(如评论系统、文章查询)广泛使用 SQL_CALC_FOUND_ROWS 实现分页计数(如 SELECT SQL_CALC_FOUND_ROWS ... + SELECT FOUND_ROWS())。
9.2 解决办法
wordpress-tidb-plugin插件:此插件解决了TiDB不提供SQL_CALC_FOUND_ROWS function的问题。一旦这个插件被激活,WP_Query中使用SQL_CALC_FOUND_ROWS的部分将被COUNT(*)函数替换。非常感谢此插件开发者帮助我们解决此问题。
下载插件完成后,我们在wordpress后台插件管理后,手动添加上传该插件。
插件安装完成后,我们启动该插件。
9.2 解决问题
回到文章列表模块,可以看到已经成功显示文章列表。
9.3 添加文章
在WordPress后台管理页面中,点击左侧菜单栏文章——添加文章,进入文章编辑页面。
在文章编辑器中,我们编辑文章标题和文章内容后,点击“发布”,即可完成文章发布。
9.4 浏览文章
在文章列表中,我们点击刚才发布的文章,即可浏览文章。
9.5 访问WordPress网站
浏览器重新访问:http://<服务器IP地址>:8167(将IP替换为自己服务器IP地址),我们可以看到以下博客效果。
9.6 查看系统资源占用
在单机环境下完成 TiDB 测试集群与 WordPress 应用的部署后,系统运行过程中,TiDB 的 CPU 和内存使用率始终维持在较低水平,充分展现了其出色的资源利用效率与卓越的性能表现。
十、实践体验与总结
本次 TiDB 与WordPress的集成实践验证了分布式数据库在传统应用场景中的强大兼容性。通过针对性解决SQL_CALC_FOUND_ROWS等语法差异问题,成功实现文章列表的高效查询与展示,体现了TiDB对复杂SQL的灵活适配能力。其水平扩展特性显著提升了数据吞吐量,尤其在流量激增时仍保持稳定响应。未来 TiDB 有望成为动态网站背后更通用的分布式存储解决方案。