224 lines
7.9 KiB
Plaintext
224 lines
7.9 KiB
Plaintext
1. Пример Lua скрипта для управления кластером (lua-scripts/cluster.lua)
|
||
|
||
-- cluster.lua - Пример управления GOSSIP кластером
|
||
|
||
-- Функция для добавления узла в кластер
|
||
function add_node(address, port)
|
||
local result = futriix.gossip_add_node(address, port)
|
||
if result then
|
||
print("Node " .. address .. ":" .. port .. " added successfully")
|
||
else
|
||
print("Failed to add node: " .. tostring(result))
|
||
end
|
||
end
|
||
|
||
-- Функция для удаления узла из кластера
|
||
function remove_node(node_id)
|
||
local result = futriix.gossip_remove_node(node_id)
|
||
if result then
|
||
print("Node " .. node_id .. " removed successfully")
|
||
else
|
||
print("Failed to remove node: " .. tostring(result))
|
||
end
|
||
end
|
||
|
||
-- Функция для просмотра списка узлов
|
||
function list_nodes()
|
||
local nodes = futriix.gossip_list_nodes()
|
||
if nodes then
|
||
print("Cluster nodes (" .. #nodes .. "):")
|
||
for i, node in ipairs(nodes) do
|
||
local status = "Alive"
|
||
if node.status == "Suspect" then
|
||
status = "Suspect"
|
||
elseif node.status == "Dead" then
|
||
status = "Dead"
|
||
end
|
||
print(string.format(" %d. %s (%s:%d) - %s", i, node.id, node.address, node.port, status))
|
||
end
|
||
else
|
||
print("Failed to get nodes list")
|
||
end
|
||
end
|
||
|
||
-- Функция для переконфигурации кластера
|
||
function reconfigure_cluster(nodes_table)
|
||
local result = futriix.gossip_reconfigure(nodes_table)
|
||
if result then
|
||
print("Cluster reconfigured successfully")
|
||
else
|
||
print("Failed to reconfigure cluster: " .. tostring(result))
|
||
end
|
||
end
|
||
|
||
-- Регистрируем глобальные функции
|
||
futriix = futriix or {}
|
||
futriix.add_node = add_node
|
||
futriix.remove_node = remove_node
|
||
futriix.list_nodes = list_nodes
|
||
futriix.reconfigure_cluster = reconfigure_cluster
|
||
|
||
print("GOSSIP cluster management functions loaded:")
|
||
print(" futriix.add_node(address, port)")
|
||
print(" futriix.remove_node(node_id)")
|
||
print(" futriix.list_nodes()")
|
||
print(" futriix.reconfigure_cluster(nodes_table)")
|
||
|
||
|
||
2. Примеры использования в Lua интерпретаторе
|
||
|
||
|
||
-- Загрузка скрипта управления кластером
|
||
dofile("lua-scripts/cluster.lua")
|
||
|
||
-- Просмотр текущих узлов кластера
|
||
futriix.list_nodes()
|
||
|
||
-- Добавление новых узлов в кластер
|
||
futriix.add_node("192.168.1.100", 7946)
|
||
futriix.add_node("192.168.1.101", 7946)
|
||
futriix.add_node("192.168.1.102", 7946)
|
||
|
||
-- Просмотр обновленного списка узлов
|
||
futriix.list_nodes()
|
||
|
||
-- Удаление узла из кластера
|
||
futriix.remove_node("192.168.1.102:7946")
|
||
|
||
-- Переконфигурация всего кластера
|
||
local new_nodes = {
|
||
{"10.0.0.1", 7946},
|
||
{"10.0.0.2", 7946},
|
||
{"10.0.0.3", 7946}
|
||
}
|
||
futriix.reconfigure_cluster(new_nodes)
|
||
|
||
3. Пример HTTP API для управления кластером
|
||
|
||
Добавьте в src/server.rs следующие маршруты:
|
||
|
||
async fn start_http_server(&self) -> Result<(), Box<dyn std::error::Error>> {
|
||
use warp::Filter;
|
||
|
||
let db = self.db.clone();
|
||
|
||
// Маршрут для добавления узла
|
||
let add_node = warp::path!("gossip" / "nodes")
|
||
.and(warp::post())
|
||
.and(warp::body::json())
|
||
.and_then(move |node: HashMap<String, String>| {
|
||
let db = db.clone();
|
||
async move {
|
||
let address = node.get("address").unwrap_or(&"".to_string()).clone();
|
||
let port: u16 = node.get("port").unwrap_or(&"7946".to_string()).parse().unwrap_or(7946);
|
||
|
||
let db_lock = db.lock().await;
|
||
match db_lock.gossip_add_node(&address, port) {
|
||
Ok(_) => Ok(warp::reply::json(&serde_json::json!({"status": "success"}))),
|
||
Err(e) => Ok(warp::reply::json(&serde_json::json!({"status": "error", "message": e})))
|
||
}
|
||
}
|
||
});
|
||
|
||
// Маршрут для удаления узла
|
||
let remove_node = warp::path!("gossip" / "nodes" / String)
|
||
.and(warp::delete())
|
||
.and_then(move |node_id: String| {
|
||
let db = db.clone();
|
||
async move {
|
||
let db_lock = db.lock().await;
|
||
match db_lock.gossip_remove_node(&node_id) {
|
||
Ok(_) => Ok(warp::reply::json(&serde_json::json!({"status": "success"}))),
|
||
Err(e) => Ok(warp::reply::json(&serde_json::json!({"status": "error", "message": e})))
|
||
}
|
||
}
|
||
});
|
||
|
||
// Маршрут для просмотра узлов
|
||
let list_nodes = warp::path!("gossip" / "nodes")
|
||
.and(warp::get())
|
||
.and_then(move || {
|
||
let db = db.clone();
|
||
async move {
|
||
let db_lock = db.lock().await;
|
||
match db_lock.gossip_list_nodes() {
|
||
Ok(nodes) => Ok(warp::reply::json(&serde_json::json!({"status": "success", "nodes": nodes}))),
|
||
Err(e) => Ok(warp::reply::json(&serde_json::json!({"status": "error", "message": e})))
|
||
}
|
||
}
|
||
});
|
||
|
||
let routes = add_node.or(remove_node).or(list_nodes);
|
||
|
||
println!("{} on port {}", Colour::White.paint("HTTP server starting"), self.config.server.port);
|
||
warp::serve(routes).run(([127, 0, 0, 1], self.config.server.port)).await;
|
||
|
||
Ok(())
|
||
}
|
||
|
||
4. Примеры HTTP запросов
|
||
|
||
# Добавление узла
|
||
curl -X POST http://localhost:8080/gossip/nodes \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"address": "192.168.1.100", "port": 7946}'
|
||
|
||
# Просмотр всех узлов
|
||
curl http://localhost:8080/gossip/nodes
|
||
|
||
# Удаление узла
|
||
curl -X DELETE http://localhost:8080/gossip/nodes/192.168.1.100:7946
|
||
|
||
5. Пример автоматической конфигурации кластера (lua-scripts/auto-cluster.lua)
|
||
|
||
-- auto-cluster.lua - Автоматическая настройка кластера при запуске
|
||
|
||
-- Функция для автоматического обнаружения узлов
|
||
function auto_discover_nodes()
|
||
print("Starting automatic cluster discovery...")
|
||
|
||
-- Предопределенные узлы для подключения
|
||
local initial_nodes = {
|
||
{"192.168.1.100", 7946},
|
||
{"192.168.1.101", 7946},
|
||
{"192.168.1.102", 7946}
|
||
}
|
||
|
||
for _, node in ipairs(initial_nodes) do
|
||
local address, port = node[1], node[2]
|
||
print("Adding node: " .. address .. ":" .. port)
|
||
local success = futriix.gossip_add_node(address, port)
|
||
if success then
|
||
print("✓ Node added successfully")
|
||
else
|
||
print("✗ Failed to add node: " .. tostring(success))
|
||
end
|
||
end
|
||
|
||
print("Cluster auto-discovery completed")
|
||
end
|
||
|
||
-- Запускаем автоматическое обнаружение при загрузке
|
||
auto_discover_nodes()
|
||
|
||
|
||
6. Команды для управления через консоль субд
|
||
|
||
|
||
-- Быстрые команды для повседневного использования
|
||
|
||
-- Создать быстрый бэкап
|
||
futriix.create_backup("quick_save")
|
||
|
||
-- Просмотреть все бэкапы
|
||
futriix.list_backups()
|
||
|
||
-- Создать индекс для часто используемого поля
|
||
futriix.create_idx("fast_search", "timestamp")
|
||
|
||
-- Добавить пользователя с правами только для чтения
|
||
futriix.add_acl_rule("viewer", "ReadOnly", {"logs", "reports"})
|
||
|
||
-- Проверить может ли пользователь писать в базу
|
||
futriix.check_permission("viewer", "logs", "write")
|