RockyLinux 9 单机部署 TiDB 实践

2023年2月7日 1116点热度 1人点赞 0条评论

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();

耗子

练习时长 4 年半的个人程序员 喜欢PHP、Go、Vue 和 Python Music~

文章评论

Loading...