futriix/Черновик Readme.txt

224 lines
7.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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