futriix/futriix GOSSIP инструкция.txt

204 lines
7.1 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()