Upload files to "/"
This commit is contained in:
parent
8dff43e7e0
commit
cbbab67507
203
futriix GOSSIP инструкция.txt
Normal file
203
futriix GOSSIP инструкция.txt
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
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()
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user