Upload files to "internal/cluster"
This commit is contained in:
1036
internal/cluster/raft_coordinator.go
Normal file
1036
internal/cluster/raft_coordinator.go
Normal file
File diff suppressed because it is too large
Load Diff
123
internal/cluster/types.go
Normal file
123
internal/cluster/types.go
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Safronov Grigorii
|
||||||
|
*
|
||||||
|
* Licensed under the CDDL, Version 1.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
*
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* https://opensource.org/licenses/CDDL-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Файл: internal/cluster/types.go
|
||||||
|
// Назначение: Общие типы данных для кластерных операций с поддержкой временных меток
|
||||||
|
|
||||||
|
package cluster
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
// NodeInfo представляет информацию об узле для координатора
|
||||||
|
type NodeInfo struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
IP string `json:"ip"`
|
||||||
|
Port int `json:"port"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
LastSeen int64 `json:"last_seen"`
|
||||||
|
JoinedAt int64 `json:"joined_at"` // Время присоединения узла к кластеру
|
||||||
|
UpdatedAt int64 `json:"updated_at"` // Время последнего обновления статуса
|
||||||
|
Version uint64 `json:"version"` // Версия информации об узле
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClusterStatus представляет статус кластера
|
||||||
|
type ClusterStatus struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
TotalNodes int `json:"total_nodes"`
|
||||||
|
ActiveNodes int `json:"active_nodes"`
|
||||||
|
SyncingNodes int `json:"syncing_nodes"`
|
||||||
|
FailedNodes int `json:"failed_nodes"`
|
||||||
|
ReplicationFactor int `json:"replication_factor"`
|
||||||
|
LeaderID string `json:"leader_id"`
|
||||||
|
Health string `json:"health"`
|
||||||
|
CreatedAt int64 `json:"created_at"` // Время создания кластера
|
||||||
|
UpdatedAt int64 `json:"updated_at"` // Время последнего обновления статуса
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClusterHealth представляет информацию о здоровье кластера
|
||||||
|
type ClusterHealth struct {
|
||||||
|
Nodes map[string]*NodeHealth `json:"nodes"`
|
||||||
|
OverallScore float64 `json:"overall_score"`
|
||||||
|
Recommendations string `json:"recommendations"`
|
||||||
|
CheckedAt int64 `json:"checked_at"` // Время проверки здоровья
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeHealth представляет здоровье отдельного узла
|
||||||
|
type NodeHealth struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
LatencyMs int64 `json:"latency_ms"`
|
||||||
|
LastCheck int64 `json:"last_check"`
|
||||||
|
LastSuccess int64 `json:"last_success"` // Время последнего успешного heartbeat
|
||||||
|
LastFailure int64 `json:"last_failure"` // Время последней ошибки
|
||||||
|
FailureCount int `json:"failure_count"` // Счётчик ошибок
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeRequest представляет запрос от одного узла к другому
|
||||||
|
type NodeRequest struct {
|
||||||
|
Type string `json:"type"` // replicate, query, sync, heartbeat
|
||||||
|
Data []byte `json:"data"` // Данные запроса
|
||||||
|
FromNode string `json:"from_node"` // ID узла-отправителя
|
||||||
|
RequestID string `json:"request_id"` // Уникальный ID запроса
|
||||||
|
Timestamp int64 `json:"timestamp"` // Время отправки запроса
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShardInfo представляет информацию о шарде
|
||||||
|
type ShardInfo struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Nodes []string `json:"nodes"` // ID узлов, содержащих шард
|
||||||
|
LeaderNode string `json:"leader_node"` // Лидер шарда
|
||||||
|
Status string `json:"status"` // active, syncing, offline, rebalancing
|
||||||
|
CreatedAt int64 `json:"created_at"` // Время создания шарда
|
||||||
|
UpdatedAt int64 `json:"updated_at"` // Время последнего обновления
|
||||||
|
LastRebalanced int64 `json:"last_rebalanced"` // Время последней перебалансировки
|
||||||
|
DocumentCount int64 `json:"document_count"` // Количество документов в шарде
|
||||||
|
SizeBytes int64 `json:"size_bytes"` // Размер шарда в байтах
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReplicationLogEntry представляет запись в журнале репликации
|
||||||
|
type ReplicationLogEntry struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Timestamp int64 `json:"timestamp"`
|
||||||
|
SourceNode string `json:"source_node"`
|
||||||
|
TargetNode string `json:"target_node"`
|
||||||
|
Operation string `json:"operation"` // replicate, sync, snapshot
|
||||||
|
Database string `json:"database"`
|
||||||
|
Collection string `json:"collection"`
|
||||||
|
DocumentID string `json:"document_id"`
|
||||||
|
Status string `json:"status"` // pending, success, failed
|
||||||
|
DurationMs int64 `json:"duration_ms"`
|
||||||
|
Error string `json:"error,omitempty"`
|
||||||
|
Details map[string]interface{} `json:"details,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeJoinedAt возвращает человекочитаемое время присоединения узла
|
||||||
|
func (n *NodeInfo) NodeJoinedAt() string {
|
||||||
|
if n.JoinedAt == 0 {
|
||||||
|
return "not joined"
|
||||||
|
}
|
||||||
|
return time.UnixMilli(n.JoinedAt).Format("2006-01-02 15:04:05.000")
|
||||||
|
}
|
||||||
|
|
||||||
|
// LastSeenAt возвращает человекочитаемое время последнего контакта
|
||||||
|
func (n *NodeInfo) LastSeenAt() string {
|
||||||
|
if n.LastSeen == 0 {
|
||||||
|
return "never"
|
||||||
|
}
|
||||||
|
return time.UnixMilli(n.LastSeen).Format("2006-01-02 15:04:05.000")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUptime возвращает время жизни узла в кластере
|
||||||
|
func (n *NodeInfo) GetUptime() time.Duration {
|
||||||
|
if n.JoinedAt == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return time.Duration(time.Now().UnixMilli() - n.JoinedAt) * time.Millisecond
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user