2916dce148
数据库: PostgreSQL, Oracle 搜索引擎: Elasticsearch 消息队列: RocketMQ, Kafka 服务治理: Nacos 分布式协调: ZooKeeper, Etcd 容器化: Docker, Docker Compose 日志监控: Logstash, Kibana, Prometheus, Grafana, Zabbix, Syslog 新增分类: 搜索引擎、消息队列、服务治理、分布式协调、容器化、日志监控 更新 README 组件矩阵与侧边栏计数
255 lines
7.4 KiB
JavaScript
255 lines
7.4 KiB
JavaScript
export const etcdSchema = {
|
||
id: 'etcd',
|
||
name: 'Etcd',
|
||
icon: 'Connection',
|
||
category: '分布式协调',
|
||
description: '分布式键值存储,用于配置共享和服务发现',
|
||
format: 'yml',
|
||
fileName: 'etcd.conf.yml',
|
||
groups: [
|
||
{
|
||
title: '节点配置',
|
||
fields: [
|
||
{
|
||
key: 'name',
|
||
label: '节点名称',
|
||
type: 'text',
|
||
default: 'etcd-0',
|
||
tip: '集群中每个节点的唯一名称',
|
||
},
|
||
{
|
||
key: 'dataDir',
|
||
label: '数据目录',
|
||
type: 'text',
|
||
default: '/var/lib/etcd',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: '客户端通信',
|
||
fields: [
|
||
{
|
||
key: 'listenClientUrls',
|
||
label: '监听客户端地址',
|
||
type: 'text',
|
||
default: 'http://0.0.0.0:2379',
|
||
tip: '客户端连接地址,多个用逗号分隔',
|
||
},
|
||
{
|
||
key: 'advertiseClientUrls',
|
||
label: '对外通告客户端地址',
|
||
type: 'text',
|
||
default: 'http://localhost:2379',
|
||
tip: '通知客户端使用的地址',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: '节点间通信',
|
||
fields: [
|
||
{
|
||
key: 'listenPeerUrls',
|
||
label: '监听节点间地址',
|
||
type: 'text',
|
||
default: 'http://0.0.0.0:2380',
|
||
tip: '集群内部通信地址',
|
||
},
|
||
{
|
||
key: 'initialAdvertisePeerUrls',
|
||
label: '对外通告节点间地址',
|
||
type: 'text',
|
||
default: 'http://localhost:2380',
|
||
},
|
||
{
|
||
key: 'initialCluster',
|
||
label: '初始集群配置',
|
||
type: 'text',
|
||
default: 'etcd-0=http://localhost:2380',
|
||
placeholder: 'node1=http://ip1:2380,node2=http://ip2:2380',
|
||
tip: '格式: name1=url1,name2=url2',
|
||
},
|
||
{
|
||
key: 'initialClusterState',
|
||
label: '初始集群状态',
|
||
type: 'select',
|
||
options: [
|
||
{ label: 'new (新建集群)', value: 'new' },
|
||
{ label: 'existing (加入已有集群)', value: 'existing' },
|
||
],
|
||
default: 'new',
|
||
},
|
||
{
|
||
key: 'initialClusterToken',
|
||
label: '集群令牌',
|
||
type: 'text',
|
||
default: 'etcd-cluster',
|
||
tip: '防止集群间误加入',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: 'TLS 安全',
|
||
fields: [
|
||
{
|
||
key: 'enableTls',
|
||
label: '启用 TLS',
|
||
type: 'switch',
|
||
default: false,
|
||
tip: '生产环境建议开启',
|
||
},
|
||
{
|
||
key: 'certFile',
|
||
label: '证书文件路径',
|
||
type: 'text',
|
||
default: '/etc/etcd/server.crt',
|
||
dependsOn: { key: 'enableTls', value: true },
|
||
},
|
||
{
|
||
key: 'keyFile',
|
||
label: '私钥文件路径',
|
||
type: 'text',
|
||
default: '/etc/etcd/server.key',
|
||
dependsOn: { key: 'enableTls', value: true },
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: '压缩与存储',
|
||
fields: [
|
||
{
|
||
key: 'autoCompactionMode',
|
||
label: '自动压缩模式',
|
||
type: 'select',
|
||
options: [
|
||
{ label: 'periodic (按时间)', value: 'periodic' },
|
||
{ label: 'revision (按修订版本)', value: 'revision' },
|
||
],
|
||
default: 'periodic',
|
||
tip: '定期压缩历史数据以释放空间',
|
||
},
|
||
{
|
||
key: 'autoCompactionRetention',
|
||
label: '自动压缩保留',
|
||
type: 'text',
|
||
default: '1h',
|
||
tip: 'periodic 模式: 1h/1d; revision 模式: 版本数',
|
||
},
|
||
{
|
||
key: 'quotaBackendBytes',
|
||
label: '后端存储配额 (字节)',
|
||
type: 'number',
|
||
min: 0,
|
||
max: 8589934592,
|
||
default: 8589934592,
|
||
tip: '8GB,0 表示不限制',
|
||
},
|
||
{
|
||
key: 'maxRequestBytes',
|
||
label: '最大请求大小 (字节)',
|
||
type: 'number',
|
||
min: 1048576,
|
||
max: 15728640,
|
||
default: 1572864,
|
||
tip: '1.5MB',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
title: '性能与调试',
|
||
fields: [
|
||
{
|
||
key: 'heartbeatInterval',
|
||
label: '心跳间隔 (毫秒)',
|
||
type: 'number',
|
||
min: 50,
|
||
max: 3000,
|
||
default: 100,
|
||
tip: '建议为 electionTimeout 的 1/5~1/10',
|
||
},
|
||
{
|
||
key: 'electionTimeout',
|
||
label: '选举超时 (毫秒)',
|
||
type: 'number',
|
||
min: 500,
|
||
max: 30000,
|
||
default: 1000,
|
||
tip: '建议为 heartbeatInterval 的 5~10 倍',
|
||
},
|
||
{
|
||
key: 'enablePprof',
|
||
label: '开启 pprof',
|
||
type: 'switch',
|
||
default: false,
|
||
tip: '调试时开启,生产环境建议关闭',
|
||
},
|
||
],
|
||
},
|
||
],
|
||
}
|
||
|
||
export function generateEtcdYml(config) {
|
||
const lines = []
|
||
lines.push(`# Etcd 配置文件 - 由 ConfTemplate 生成`)
|
||
lines.push(`# 生成时间: ${new Date().toLocaleString('zh-CN')}`)
|
||
lines.push(``)
|
||
|
||
// 节点配置
|
||
lines.push(`# 节点配置`)
|
||
lines.push(`name: '${config.name}'`)
|
||
lines.push(`data-dir: '${config.dataDir}'`)
|
||
lines.push(``)
|
||
|
||
// 客户端通信
|
||
lines.push(`# 客户端通信`)
|
||
const listenClientUrls = config.listenClientUrls.split(',').map((u) => u.trim())
|
||
lines.push(`listen-client-urls: '${listenClientUrls.join(',')}'`)
|
||
const advertiseClientUrls = config.advertiseClientUrls.split(',').map((u) => u.trim())
|
||
lines.push(`advertise-client-urls: '${advertiseClientUrls.join(',')}'`)
|
||
lines.push(``)
|
||
|
||
// 节点间通信
|
||
lines.push(`# 节点间通信`)
|
||
const listenPeerUrls = config.listenPeerUrls.split(',').map((u) => u.trim())
|
||
lines.push(`listen-peer-urls: '${listenPeerUrls.join(',')}'`)
|
||
const initialAdvertisePeerUrls = config.initialAdvertisePeerUrls.split(',').map((u) => u.trim())
|
||
lines.push(`initial-advertise-peer-urls: '${initialAdvertisePeerUrls.join(',')}'`)
|
||
lines.push(`initial-cluster: '${config.initialCluster}'`)
|
||
lines.push(`initial-cluster-state: '${config.initialClusterState}'`)
|
||
lines.push(`initial-cluster-token: '${config.initialClusterToken}'`)
|
||
lines.push(``)
|
||
|
||
// TLS 安全
|
||
if (config.enableTls) {
|
||
lines.push(`# TLS 安全`)
|
||
lines.push(`client-transport-security:`)
|
||
lines.push(` cert-file: '${config.certFile}'`)
|
||
lines.push(` key-file: '${config.keyFile}'`)
|
||
lines.push(` client-cert-auth: true`)
|
||
lines.push(` trusted-ca-file: '/etc/etcd/ca.crt'`)
|
||
lines.push(`peer-transport-security:`)
|
||
lines.push(` cert-file: '${config.certFile}'`)
|
||
lines.push(` key-file: '${config.keyFile}'`)
|
||
lines.push(` client-cert-auth: true`)
|
||
lines.push(` trusted-ca-file: '/etc/etcd/ca.crt'`)
|
||
lines.push(``)
|
||
}
|
||
|
||
// 压缩与存储
|
||
lines.push(`# 压缩与存储`)
|
||
lines.push(`auto-compaction-mode: '${config.autoCompactionMode}'`)
|
||
lines.push(`auto-compaction-retention: '${config.autoCompactionRetention}'`)
|
||
lines.push(`quota-backend-bytes: ${config.quotaBackendBytes}`)
|
||
lines.push(`max-request-bytes: ${config.maxRequestBytes}`)
|
||
lines.push(``)
|
||
|
||
// 性能与调试
|
||
lines.push(`# 性能与调试`)
|
||
lines.push(`heartbeat-interval: ${config.heartbeatInterval}`)
|
||
lines.push(`election-timeout: ${config.electionTimeout}`)
|
||
lines.push(`enable-pprof: ${config.enablePprof}`)
|
||
lines.push(`logger: 'zap'`)
|
||
lines.push(`log-outputs: ['stderr']`)
|
||
|
||
return lines.join('\n')
|
||
}
|