[CF-RS] Recueil d'avis - Sauvegarde régulière et optimisée du Serveur vers la BDD

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
TyxLePirate
Messages : 6
Inscription : 02 Juil 2018 10:41
Localisation : Bordeaux
Contact :

[CF-RS] Recueil d'avis - Sauvegarde régulière et optimisée du Serveur vers la BDD

Message par TyxLePirate » 02 Juil 2018 11:20

Bien le bonjour !

Dans le cadre d'un projet de MMORPG d'un studio sur lequel j'interviens, je voudrais collecter quelques avis sur une problématique particulière : Celle de la sauvegarde des données du serveur vers la base de données.
Tout d'abord, voici l'état du projet actuel :

Ce qui est actuellement fonctionnel
Actuellement, nous avons déja un serveur et un client fonctionnel : Les joueurs peuvent se connecter, se déplacer, voir les autres clients, s'equiper , se désequiper, voir les parties d'inventaires abandonnées par d'autres joueurs, ouvrir/fermer des portes...
Lorsqu'un joueur se déconnecte, et se reconnecte, il reviens dans l'état ou il était lors de sa dernière connexion, et vois le reste de la map a jour (les portes ouvertes sur le serveur sont bien ouvertes pour lui, les personnages sont équipés comme de leur côté, ect...)
Nous avons également déjà conçue et hébergé une base de donnée avec toutes les tables correspondant aux données que nous souhaitons sauvegarder.

La problématique
La problématique est la suivante : Une fois que le serveur est éteins, si on le rallume, tout est réinitialisé. Il nous faut donc envoyer régulièrement des informations vers cette base de donnée en question.
Cependant, je me vois mal requêter la base a chaque frame côté serveur chaque fois qu'un personnage bouge d'un millimétre, et ce multiplié par le nombre de joueur.
Il me faut donc trouver une solution pour mettre en place un système de sauvegarde régulier en sauvegardant le plus d'informations possibles, et ce de manière optimisé afin de ne pas bombarder continuellement la base de requêtes.
Pour cela, j'ai déjà envisagé quelques solutions

Les solutions envisagées
Ce que j'ai envisagé de mettre en place, c'est donc une API en PHP faisans le lien entre le serveur et la BDD, avec un cycle de sauvegarde régulier. Au moment de cette sauvegarde, toutes les infos necessaires sont envoyés sur cette API (Position des joueurs, leurs caracteristiques, des monstres, contenu des inventaires, items positionnés sur la Map ect...)

La ou j'ai besoin d'avis
- Pensez vous que cette première solution envisagée est viable ? Si oui, quelle fréquence serait adaptée ?
- Toujours concernant la solution envisagée, comment faire si jamais le serveur s'eteins pour X raison hors du temps de sauvegarde ? (c'est a dire, sauvegarder au moment de l'extinction, décidée ou non ).
- Avez vous en tête une meilleure solution à proposer plus adaptée à la situation ?


Voila, c'est a peu prés tout :)

Je remercie d'avance tous ceux qui voudront bien participer a cet échange d'avis ! :-D

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [CF-RS] Recueil d'avis - Sauvegarde régulière et optimisée du Serveur vers la BDD

Message par Autodidactelife » 04 Juil 2018 14:52

Bonjour,

Moi même j'avais commencer à faire un jeu multijoueur et je faisais comme ça:

À la déconnexion du joueur ou à la fermeture du serveur je prenais les positions de tout les joueurs pour les updates dans la BDD. (Je comptais à 100% sur mes anti cheat pour que cette valeur ne soit pas une valeur abusif)

Dès qu'une valeur était changer (exemple le joueur gagne de l'argent) vu que c'est évidemment le serveur qui l'envoie, je m'étais à jour directement côté serveur.

Si le jeu est gros et qu'il y à beaucoup de joueur la seule solution sera de faire des sauvegardes tout les X temps, exemple Dofus sauvegarde leurs serveurs tout les 3h.

Et une copie général des sauvegardes (backup) est faite le mardi.

Cordialement

Ps: Si le serveur s'éteins hors du temps X bah tu rollback. Dofus le fait fréquemment, en cas de faille, de triche ta seule solution si tu n'arrive pas à contenir la tricherie tu es obligé de rollback avant ou à un moment où tu arrives à stopper l'action de triche.

Avatar de l’utilisateur
TyxLePirate
Messages : 6
Inscription : 02 Juil 2018 10:41
Localisation : Bordeaux
Contact :

Re: [CF-RS] Recueil d'avis - Sauvegarde régulière et optimisée du Serveur vers la BDD

Message par TyxLePirate » 05 Juil 2018 10:21

Merci de ton avis et pour ces informations très utiles Autodidactelife ! :)
Je prends note de tous ca !

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [CF-RS] Recueil d'avis - Sauvegarde régulière et optimisée du Serveur vers la BDD

Message par Farstone » 05 Juil 2018 15:11

Salut, effectivement dofus sauvegarde toutes les 3h, néanmoins, si un crash du serveur survient entre temps, les données ne sont pas perdue car il y a des sécurités. La solution pour sauvegarder efficacement c'est d'avoir des serveurs stable, et un système de sauvegarde de secours. Si les serveurs sont géré par l'entreprise même, c'est pas vraiment un soucis, tu va devoir structurer toutes les données qui vont devoir être sauvegardé, par exemple si un joueur se déconnecte, tu garde en cache c'est données jusqu’à la save.

Le meilleur moyen pour éviter des pertes de données si le serveur crash, c'est d'avoir une api externe qui, en plus de la base de donnée sauvegarde les informations des joueurs en bytes comme le recevrais le serveur, mais il ne doit pas les désérialiser. Si un crash survient tu va devoir lui apprendre à désérialiser chaque type de données, à les reconnaître et les stocker dans une base de données de secours au cas ou il y est un problème pendant le processus, si tout marche bien sur le jeu avec la bdd de secours (à toi de lui apprendre comment reconnaître que tout marche bien) tu peux ensuite l'utiliser comme bdd principal.
Il existe plein de façons différente d'envisager la chose, aucune d'elle n'est parfaite entre les perte de performance ou de bande passante, ça n'est pas juste une question de base de donnée mais aussi de networking. Tu est dans la partie la plus fondamental d'un mmo sur le quel repose tout le reste, aucune erreur n'est permis, alors prend ton temps pour faire des test et en parler avec t'es collègues en réunion :)

L'exemple de Autodidacte est très bien quand il s'agit de serveur dédié fournit au joueurs (100, 200 joueurs), car il ont tendance à les faire crasher souvent donc ça simplifie la choses, mais je ne suit pas sur qu'un mmo accueillant plusieurs millier de joueurs puissent sauvegarder ça en temps réel.
Si tu veux une sauvegarde en temps réel, privilégie l'utilisation de la bdd directement en c# et en local (meilleur temps de réponse, aucune bande passante requise), en utilisant une bdd online comme mysql tu pourras toujours faire des requêtes à distance.
Si tu veux du différé, peux être que utiliser Php est une meilleur solution mais je ne l'ai jamais utilisé personnellement (le temps de réponse et la bande passante vont être lourd). Après tout dépend de comment tu veux répartir les différent serveurs sur t'es machines. D'ailleurs, quel api de networking utilise tu ? Tout ça risque d'être compliqué si tu utilise UNET :lol:
Bref, a mon avis fait des test, expérimente avec les outils que tu a, et surtout essaie de trouver des ressources d'autre développeur ayant travaillé sur des mmo comme WoW et autres. Bonne journée et bonne chance pour ton projet :hello:

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [CF-RS] Recueil d'avis - Sauvegarde régulière et optimisée du Serveur vers la BDD

Message par Autodidactelife » 05 Juil 2018 16:12

Twiixy a écrit :
05 Juil 2018 15:11
Salut, effectivement dofus sauvegarde toutes les 3h, néanmoins, si un crash du serveur survient entre temps, les données ne sont pas perdue car il y a des sécurités. La solution pour sauvegarder efficacement c'est d'avoir des serveurs stable, et un système de sauvegarde de secours. Si les serveurs sont géré par l'entreprise même, c'est pas vraiment un soucis, tu va devoir structurer toutes les données qui vont devoir être sauvegardé, par exemple si un joueur se déconnecte, tu garde en cache c'est données jusqu’à la save.

Le meilleur moyen pour éviter des pertes de données si le serveur crash, c'est d'avoir une api externe qui, en plus de la base de donnée sauvegarde les informations des joueurs en bytes comme le recevrais le serveur, mais il ne doit pas les désérialiser. Si un crash survient tu va devoir lui apprendre à désérialiser chaque type de données, à les reconnaître et les stocker dans une base de données de secours au cas ou il y est un problème pendant le processus, si tout marche bien sur le jeu avec la bdd de secours (à toi de lui apprendre comment reconnaître que tout marche bien) tu peux ensuite l'utiliser comme bdd principal.
Il existe plein de façons différente d'envisager la chose, aucune d'elle n'est parfaite entre les perte de performance ou de bande passante, ça n'est pas juste une question de base de donnée mais aussi de networking. Tu est dans la partie la plus fondamental d'un mmo sur le quel repose tout le reste, aucune erreur n'est permis, alors prend ton temps pour faire des test et en parler avec t'es collègues en réunion :)

L'exemple de Autodidacte est très bien quand il s'agit de serveur dédié fournit au joueurs (100, 200 joueurs), car il ont tendance à les faire crasher souvent donc ça simplifie la choses, mais je ne suit pas sur qu'un mmo accueillant plusieurs millier de joueurs puissent sauvegarder ça en temps réel.
Si tu veux une sauvegarde en temps réel, privilégie l'utilisation de la bdd directement en c# et en local (meilleur temps de réponse, aucune bande passante requise), en utilisant une bdd online comme mysql tu pourras toujours faire des requêtes à distance.
Si tu veux du différé, peux être que utiliser Php est une meilleur solution mais je ne l'ai jamais utilisé personnellement (le temps de réponse et la bande passante vont être lourd). Après tout dépend de comment tu veux répartir les différent serveurs sur t'es machines. D'ailleurs, quel api de networking utilise tu ? Tout ça risque d'être compliqué si tu utilise UNET :lol:
Bref, a mon avis fait des test, expérimente avec les outils que tu a, et surtout essaie de trouver des ressources d'autre développeur ayant travaillé sur des mmo comme WoW et autres. Bonne journée et bonne chance pour ton projet :hello:
Comme j'ai préciser dans mon message, l'exemple de la sauvegarde en direct n'est valable que pour des petits jeux en ligne et pour avoir vécu des crashs de serveur sur Dofus (ils ont eu à un moment plusieurs pannes), la seule solution était uniquement le rollback. Quand j'étais joueur je peux dire que c'était une joie d'avoir un spam de rollback en moins de 2 semaine :D
Sans compter les rollback dû aux failles & tricheries.

Il me semble que Minecraft également, en cas de crash du serveur c'est un rollback. Les crashs étant sensé être rare c'est pas si gênant que ça quand on en à pas 3-4 en 2 semaines (je troll un peu).
Sachant que Minecraft n'a pas de base de donnée mais tout est enregistré en fichier.

Répondre

Revenir vers « (C#) CSharp »