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> { 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| { 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")