Creare procedura per bilanciamento carico server

di il
0 risposte

Creare procedura per bilanciamento carico server

Salve   ho questo progetto da reallizzare :A fronte di un’analisi dei dati della CDN e dell’uso fatto dai clienti dei film memorizzati
nella CDN, questa funzionalità propone piani di allocazione dei contenuti sui
server al fine di non sovraccaricare il traffico di richieste di visualizzazione dei film.
 studiare e implementare una funzionalità che stimi i potenziali
sovraccarichi di un server, e suggerisca spostamenti di contenuti da un server
per non sovravvaricarlo, indicando un server di destinazione.

abbiamo pensato che possiamo assegnare a rotazione un utente  attivo a ogni server della stessa nazione fino alla capacità massima , in questo modo il carico sarà equamente distribuito all 80% del suo carico per ogni server. i server per nazione sono 5.
questa la procedura:
DELIMITER //

CREATE PROCEDURE BilanciamentoCarico()
BEGIN
 DECLARE done INT DEFAULT FALSE;
 DECLARE userId VARCHAR(255);
 DECLARE nationId INT;
 DECLARE serverId INT;
 DECLARE serverCapacity DECIMAL(10, 2);
 DECLARE currentServerIndex INT DEFAULT 1;

 DECLARE cur CURSOR FOR
   SELECT un.UtenteCodiceAlfanumerico, un.Nazione, un.ServerID, un.capacita
   FROM utenti_nazione_server un
   INNER JOIN utenti u ON un.UtenteCodiceAlfanumerico = u.CodiceAlfanumerico
   WHERE u.Attivo = 1;

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

 OPEN cur;

 read_loop: LOOP
   FETCH cur INTO userId, nationId, serverId, serverCapacity;
   IF done THEN
     LEAVE read_loop;
   END IF;

   -- Qui inseriamo la logica per assegnare il server all'utente nella tabella servercdn_utilizzatipernazione
   -- Assumiamo che la tabella servercdn_utilizzatipernazione abbia una colonna auto-incrementale `ID`

   -- Verifica se l'utente ha già un server assegnato
   SELECT COUNT(*) INTO @userServerCount
   FROM servercdn_utilizzatipernazione
   WHERE UtenteCodiceAlfanumerico = userId AND Nazione = nationId;

   IF @userServerCount = 0 THEN
     -- Inserisci l'assegnazione del server all'utente nella tabella servercdn_utilizzatipernazione
     INSERT INTO servercdn_utilizzatipernazione (ServerID, UtenteCodiceAlfanumerico, Nazione, CapacitaUsata, ContatoreUtenti)
     VALUES (serverId, userId, nationId, serverCapacity, 1);

     -- Aggiorna la capacità utilizzata nella tabella servercdn_utilizzatipernazione
     UPDATE servercdn_utilizzatipernazione
     SET CapacitaUsata = CapacitaUsata + serverCapacity,
         ContatoreUtenti = ContatoreUtenti + 1
     WHERE ServerID = serverId AND Nazione = nationId;
   END IF;

   SET currentServerIndex = currentServerIndex % 5 + 1;
 END LOOP;

 CLOSE cur;
END;
//

DELIMITER ;

e queste le tabelle interessate
'CREATE TABLE `utenti_nazione_server` ( `UtenteCodiceAlfanumerico` varchar(255) NOT NULL, `Nazione` int NOT NULL, `ServerID` int NOT NULL, `capacita` decimal(10,2) DEFAULT NULL, `carico` int DEFAULT NULL, PRIMARY KEY (`UtenteCodiceAlfanumerico`,`Nazione`,`ServerID`), KEY `Nazione` (`Nazione`), CONSTRAINT `utenti_nazione_server_ibfk_1` FOREIGN KEY (`Nazione`) REFERENCES `nazione` (`ID`) ) 

'CREATE TABLE `utenti` ( `CodiceAlfanumerico` varchar(255) NOT NULL, `Nome` varchar(255) DEFAULT NULL, `Cognome` varchar(255) DEFAULT NULL, `Email` varchar(255) DEFAULT NULL, `Password` varchar(255) DEFAULT NULL, `Nazione` int DEFAULT NULL, `DataNascita` date DEFAULT NULL, `Attivo` tinyint DEFAULT NULL, PRIMARY KEY (`CodiceAlfanumerico`), KEY `Nazione` (`Nazione`), CONSTRAINT `utenti_ibfk_1` FOREIGN KEY (`Nazione`) REFERENCES `nazione` (`ID`) )

 'CREATE TABLE `servercdn_utilizzatipernazione` ( `ID` int NOT NULL AUTO_INCREMENT, `ServerID` int DEFAULT NULL, `UtenteCodiceAlfanumerico` varchar(255) DEFAULT NULL, `Nazione` int DEFAULT NULL, `CapacitaUsata` decimal(5,2) DEFAULT NULL, `ContatoreUtenti` int DEFAULT NULL, `Timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`ID`) ) 

'CREATE TABLE `servercdn` ( `Posizione` varchar(255) DEFAULT NULL, `LarghezzaBanda` int DEFAULT NULL, `CapacitaMassima` int DEFAULT NULL, `Nazione` int DEFAULT NULL, `ID` int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`ID`), KEY `Nazione` (`Nazione`), CONSTRAINT `servercdn_ibfk_1` FOREIGN KEY (`Nazione`) REFERENCES `nazione` (`ID`) )
la procedura ha questo risultato: 
User # ID ServerID UtenteCodiceAlfanumerico Nazione CapacitaUsata ContatoreUtenti Timestamp 911 6 CDE901 2 400.00 4 2023-08-11 00:14:48 912 1 FGH123 1 300.00 3 2023-08-11 00:14:48 913 6 IJK456 2 300.00 3 2023-08-11 00:14:48 914 6 MNO345 2 200.00 2 2023-08-11 00:14:48 915 1 STU901 1 200.00 2 2023-08-11 00:14:48 916 11 YZA567 3 200.00 2 2023-08-11 00:14:48

 tutti gli utenti attivi vengono inseriti ma i server assegnati non ruotano.

qualcuno può darmi un consiglio o corregre la procedura per assegnare a rotazione gli utenti attivi a server della stessa nazione (che sono 5)   in modo da distribuire il carico sino all'80% della capacità dei server

Devi accedere o registrarti per scrivere nel forum
0 risposte