This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

运维文档

本章介绍 HoraeDB 的运维相关的操作,包括表相关操作,设置访问黑名单,已经如何监控 HoraeDB。未来还会介绍集群扩容,容灾相关:

1 - 监控

HoraeDB 支持使用 Prometheus 和 Grafana 做自监控。

Prometheus

Prometheus 是非常流行的系统和服务监控系统。

配置

把下面的配置保存到 prometheus.yml 文件中。比如,在 tmp 目录下,文件地址为 /tmp/prometheus.yml

有两个 HoraeDB http 服务启动在 localhost:5440localhost:5441

1
2
3
4
5
6
7
8
global:
  scrape_interval: 30s
scrape_configs:
  - job_name: horaedb-server
    static_configs:
      - targets: [your_ip:5440, your_ip:5441]
        labels:
          env: horaedbcluster

Prometheus 详细配置见这里

运行

你可以使用 docker 来运行 Prometheus。Docker 镜像在这里可以找到。

docker run \
    -d --name=prometheus \
    -p 9090:9090 \
    -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus:v2.41.0

更多 Prometheus 安装方法,参考这里

Grafana

Grafana 是一个非常流行的可观察性和数据可视化平台。

运行

你可以使用 docker 来运行 Grafana。Docker 镜像在这里可以找到。

docker run -d --name=grafana -p 3000:3000 grafana/grafana:9.3.6

默认用户密码是 admin/admin.

运行上面命令后,grafana 可以用浏览器打开 http://127.0.0.1:3000。

更多 Grafana 安装方法,参考这里

配置数据源

  1. 将光标悬停在配置(齿轮)图标上。
  2. 选择数据源。
  3. 选择 Prometheus 数据源。

注意: Prometheus 的 url 需要填写成这样 http://your_ip:9090, your_ip 换成本地地址。

更详细的配置可以参考这里

导入监控页面

页面 json

HoraeDB 指标

当导入完成后,你可以看到如下页面:

Panels

  • tps: 集群写入请求数。
  • qps: 集群查询请求数。
  • 99th query/write duration: 查询写入的 99% 分位数。
  • table query by table: 表查询请求数。
  • 99th write duration details by instance: 写入耗时的 99% 分位数。
  • 99th query duration details by instance: 查询耗时的 99% 分位数。
  • 99th write partition table duration: 分区表查询耗时的 99% 分位数。
  • table rows: 表的写入行数。
  • table rows by instance: 实例级别的写入行数。
  • total tables to write: 有数据写入的表数目。
  • flush count: HoraeDB flush 的次数。
  • 99th flush duration details by instance: 实例级别的 flush 耗时的 99% 分位数。
  • 99th write stall duration details by instance: 实例级别的写入停顿时间的 99% 分位数 。

2 - 系统表

查询 Table 信息

类似于 Mysql’s information_schema.tables, HoraeDB 提供 system.public.tables 存储表信息。

system.public.tables 表的列如下 :

  • timestamp([TimeStamp])
  • catalog([String])
  • schema([String])
  • table_name([String])
  • table_id([Uint64])
  • engine([String])

通过表名查询表信息示例如下:

1
2
3
4
5
curl --location --request POST 'http://localhost:5000/sql' \
--header 'Content-Type: application/json' \
-d '{
    "query": "select * from system.public.tables where `table_name`=\"my_table\""
}'

返回结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    "rows":[
        {
            "timestamp":0,
            "catalog":"horaedb",
            "schema":"public",
            "table_name":"my_table",
            "table_id":3298534886446,
            "engine":"Analytic"
        }
}

3 - 表操作

HoraeDB 支持标准的 SQL,用户可以使用 Http 协议创建表和读写表。更多内容可以参考 SQL 语法

创建表

示例如下

1
2
3
4
5
curl --location --request POST 'http://127.0.0.1:5000/sql' \
--header 'Content-Type: application/json' \
-d '{
    "query": "CREATE TABLE `demo` (`name` string TAG, `value` double NOT NULL, `t` timestamp NOT NULL, TIMESTAMP KEY(t)) ENGINE=Analytic with (enable_ttl='\''false'\'')"
}'

写数据

示例如下

1
2
3
4
5
curl --location --request POST 'http://127.0.0.1:5000/sql' \
--header 'Content-Type: application/json' \
-d '{
    "query": "INSERT INTO demo(t, name, value) VALUES(1651737067000, '\''horaedb'\'', 100)"
}'

读数据

示例如下

1
2
3
4
5
curl --location --request POST 'http://127.0.0.1:5000/sql' \
--header 'Content-Type: application/json' \
-d '{
    "query": "select * from demo"
}'

查询表信息

示例如下

1
2
3
4
5
curl --location --request POST 'http://127.0.0.1:5000/sql' \
--header 'Content-Type: application/json' \
-d '{
    "query": "show create table demo"
}'

Drop 表

示例如下

1
2
3
4
5
curl --location --request POST 'http://127.0.0.1:5000/sql' \
--header 'Content-Type: application/json' \
-d '{
    "query": "DROP TABLE demo"
}'

查询表路由

示例如下

1
curl --location --request GET 'http://127.0.0.1:5000/route/{table_name}'

4 - 集群运维

集群运维接口的使用前提是,HoraeDB 部署为使用 HoraeMeta 的集群模式。

运维接口

注意: 如下接口在实际使用时需要将 127.0.0.1 替换为 HoraeMeta 的真实地址。

  • 查询表元信息 当 tableNames 不为空的时候,使用 tableNames 进行查询。 当 tableNames 为空的时候,使用 ids 进行查询。使用 ids 查询的时候,schemaName 不生效。
curl --location 'http://127.0.0.1:8080/api/v1/table/query' \
--header 'Content-Type: application/json' \
-d '{
    "clusterName":"defaultCluster",
    "schemaName":"public",
    "names":["demo1", "__demo1_0"],
}'

curl --location 'http://127.0.0.1:8080/api/v1/table/query' \
--header 'Content-Type: application/json' \
-d '{
    "clusterName":"defaultCluster",
    "ids":[0, 1]
}'
  • 查询表的路由信息
curl --location --request POST 'http://127.0.0.1:8080/api/v1/route' \
--header 'Content-Type: application/json' \
-d '{
    "clusterName":"defaultCluster",
    "schemaName":"public",
    "table":["demo"]
}'
  • 查询节点对应的 Shard 信息
curl --location --request POST 'http://127.0.0.1:8080/api/v1/getNodeShards' \
--header 'Content-Type: application/json' \
-d '{
    "ClusterName":"defaultCluster"
}'
  • 查询 Shard 对应的表信息 如果 shardIDs 为空时,查询所有 shard 上表信息。
curl --location --request POST 'http://127.0.0.1:8080/api/v1/getShardTables' \
--header 'Content-Type: application/json' \
-d '{
    "clusterName":"defaultCluster",
    "shardIDs": [1,2]
}'
  • 删除指定表的元数据
curl --location --request POST 'http://127.0.0.1:8080/api/v1/dropTable' \
--header 'Content-Type: application/json' \
-d '{
    "clusterName": "defaultCluster",
    "schemaName": "public",
    "table": "demo"
}'
  • Shard 切主
curl --location --request POST 'http://127.0.0.1:8080/api/v1/transferLeader' \
--header 'Content-Type: application/json' \
-d '{
    "clusterName":"defaultCluster",
    "shardID": 1,
    "oldLeaderNodeName": "127.0.0.1:8831",
    "newLeaderNodeName": "127.0.0.1:18831"
}'
  • Shard 分裂
curl --location --request POST 'http://127.0.0.1:8080/api/v1/split' \
--header 'Content-Type: application/json' \
-d '{
    "clusterName" : "defaultCluster",
    "schemaName" :"public",
    "nodeName" :"127.0.0.1:8831",
    "shardID" : 0,
    "splitTables":["demo"]
}'
  • 创建 HoraeDB 集群
curl --location 'http://127.0.0.1:8080/api/v1/clusters' \
--header 'Content-Type: application/json' \
--data '{
    "name":"testCluster",
    "nodeCount":3,
    "ShardTotal":9,
    "enableSchedule":true,
    "topologyType":"static"
}'
  • 更新 HoraeDB 集群
curl --location --request PUT 'http://127.0.0.1:8080/api/v1/clusters/{NewClusterName}' \
--header 'Content-Type: application/json' \
--data '{
    "nodeCount":28,
    "shardTotal":128,
    "enableSchedule":true,
    "topologyType":"dynamic"
}'
  • 列出 HoraeDB 集群
curl --location 'http://127.0.0.1:8080/api/v1/clusters'
  • 修改 enableSchedule
curl --location --request PUT 'http://127.0.0.1:8080/api/v1/clusters/{ClusterName}/enableSchedule' \
--header 'Content-Type: application/json' \
--data '{
    "enable":true
}'
  • 查询 enableSchedule
curl --location 'http://127.0.0.1:8080/api/v1/clusters/{ClusterName}/enableSchedule'
  • 更新限流器
curl --location --request PUT 'http://127.0.0.1:8080/api/v1/flowLimiter' \
--header 'Content-Type: application/json' \
--data '{
    "limit":1000,
    "burst":10000,
    "enable":true
}'
  • 查询限流器信息
curl --location 'http://127.0.0.1:8080/api/v1/flowLimiter'
  • HoraeMeta 列出节点
curl --location 'http://127.0.0.1:8080/api/v1/etcd/member'
  • HoraeMeta 节点切主
curl --location 'http://127.0.0.1:8080/api/v1/etcd/moveLeader' \
--header 'Content-Type: application/json' \
--data '{
    "memberName":"meta1"
}'
  • HoraeMeta 节点扩容
curl --location --request PUT 'http://127.0.0.1:8080/api/v1/etcd/member' \
--header 'Content-Type: application/json' \
--data '{
    "memberAddrs":["http://127.0.0.1:42380"]
}'
  • HoraeMeta 替换节点
curl --location 'http://127.0.0.1:8080/api/v1/etcd/member' \
--header 'Content-Type: application/json' \
--data '{
    "oldMemberName":"meta0",
    "newMemberAddr":["http://127.0.0.1:42380"]
}'

5 - 黑名单

增加黑名单

如果你想限制某个表的查询,可以把表名加到 read_block_list 中。

示例如下:

1
2
3
4
5
6
7
curl --location --request POST 'http://localhost:5000/admin/block' \
--header 'Content-Type: application/json' \
-d '{
    "operation":"Add",
    "write_block_list":[],
    "read_block_list":["my_table"]
}'

返回结果:

1
2
3
4
{
  "write_block_list": [],
  "read_block_list": ["my_table"]
}

设置黑名单

设置黑名单的操作首先会清理已有的列表,然后再把新的表设置进去。

示例如下:

1
2
3
4
5
6
7
curl --location --request POST 'http://localhost:5000/admin/block' \
--header 'Content-Type: application/json' \
-d '{
    "operation":"Set",
    "write_block_list":[],
    "read_block_list":["my_table1","my_table2"]
}'

返回结果:

1
2
3
4
{
  "write_block_list": [],
  "read_block_list": ["my_table1", "my_table2"]
}

删除黑名单

如果你想把表从黑名单中移除,可以使用如下命令:

1
2
3
4
5
6
7
curl --location --request POST 'http://localhost:5000/admin/block' \
--header 'Content-Type: application/json' \
-d '{
    "operation":"Remove",
    "write_block_list":[],
    "read_block_list":["my_table1"]
}'

返回结果:

1
2
3
4
{
  "write_block_list": [],
  "read_block_list": ["my_table2"]
}