Comment font les « grands » : Azure, Google…

Quand on s’intéresse aux architectures sous-jacentes des solutions Cloud, on remarque deux points communs:

  • Le peu de chiffres qu’on trouve donnent le vertige (oui oui, 1 Péta = 1000 Téra…)
  • Très peu d’informations sont divulgués sur l’aspect technique

Il se trouve que Google & Azure ont récemment lâchés quelques informations, surtout sur le réseau 🙂
Facebook est un peu en avance et communique davantage.

Microsoft Azure

Pour Azure, Voici des slides de Maître Russinovich (cliquer sur l’image pour ouvrir le PowerPoint (29 diapos)):

2015-06-19_14-37-27

Fait le plus marquant: ils utilisent des FPGA (processeurs programmables) pour gérer la couche réseau (40GbE/s).

Les dernières infos les plus intéressantes que j’avais eu étaient pendant les TechEd en 2012, toujours de Mark. La vidéo est encore en ligne:

  • ~10 personnes pour administrer 100 000 serveurs physiques!
  • Démonstration d’une interface d’administration Azure,
  • Vue graphique des racks avec les VM,
  • Démonstration de self healing de la plateforme,
  • Explications sur le bug du 29 février, avec la ligne de commande qui a tout planté

Google

Il semble tout indexer, sauf le contenu de son architecture technique (avec un robots.txt super efficace 😉
Techcrunch a collecté des informations intéressantes, également sur la gestion du réseau (SDN):

http://techcrunch.com/2015/06/17/google-pulls-back-curtain-on-its-data-center-networking-setup/

En 2009, ils avaient publié une visite d’un de leur datacenter, avec l’aspect d’un serveur dans un conteneur:

2015-06-19_14-56-27

Facebook

Ils sont un peu plus bavard, ça doit être dans leur DNA…:

https://code.facebook.com/posts/360346274145943/introducing-data-center-fabric-the-next-generation-facebook-data-center-network

Figure 2:

Un serveur Facebook (un ancien modèle je pense):

Le vide à l’arrière n’est pas juste pour visualiser, c’est vaiment un « trou »:

Office365

Les informations les plus présentes concernent la messagerie Exchange:

  • Pas de sauvegarde,
  • Réplication 3 + 1 Lag à 8 jours (qui descend à 0 en cas de problèmes)
  • JBOD pour le stockage (1 banque par disque dur).
  • Optimisations via Exchange 2016

Office 365 est indépendant d’Azure, même si certains services y sont hébergés et que la fusion est pour moi en approche.

Amazon

  • Ils utilisent Xen pour la virtualisation,
  • Ils font leur propres serveurs,
  • Basé sur des technos open source

Conclusions

Ils ont des besoins hors normes, mais ils ont aussi les moyens en conséquences:

  • Maîtrise complète de toute la chaîne: datacenter, réseau, serveurs, OS, hyperviseur, applications, répartiteurs de charges, moteurs SQL
  • Développements dans les couches basses : SDN, FPGA…
  • Code source (et personnes pour le faire évoluer): Windows pour Microsoft, Linux pour Google,Facebook et Amazon
  • Ils s’appuient sur des projets Open source (OpenFlow, memcache, Hadoop…) mais en ont des extensions propriétaires
  • S’il le juge utile, ils peuvent dépenser des moyens colossaux sur certains sujets (comme Google avec son SDN logiciel).

Tout cela leur donne une indépendance forte vis à vis des autres entreprises et leur rachats éventuels part des concurrents. Certains sujets sont certainement plus économique par rapport à la volumétrie (par exemple en économisant $50 par serveur, x300 000)

Là où pour nous c’est parfois le top du top (géo cluster, DRP, LB), c’est le minimum syndical pour eux. Une fois cette barrière levée, un nouveau boulevard s’ouvre avec la montée en charge.

Nouvelles

Comme vous pouvez le voir, je viens de changer le thème du site… Après pas mal d’années de bons et loyaux services, Le thème Mystique vient de me générer des memory fault suite à la mise à jour de WordPress… J’espère que ce nouveau thème vous plaira autant que le précédent !

Je viens aussi de migrer récemment l’architecture afin de valider des hypothèses. L’air de rien, ce blog implique maintenant 8 VM:

  • 2 Load balancer sous Zen load balancer
  • 2 Frontaux Web (Apache/PHP…)
  • 2 noeuds GlusterFS (système de fichiers distribué) (contient le site WordPress)
  • 2 noeuds cluster MariaDB Galera (base WordPress)

Le tout sous un seul serveur physique sous VMware, l’idée est de valider le fonctionnement des composants 🙂

 

Microsoft Project – livrable – fichiers srchui.dll et jscript.dll

Depuis Microsoft Project 2010 et 2013, en utilisant le menu de gestion des livrables, vous obtenez:

23-03-2014 12-09-39Ce message qui semble venir d’outre tombe de la version 2003 apparaît au lieu du panneau latéral.

Inutile de les chercher sur votre machine, vous ne les avez certainement pas.

C’est en fait un problème avec la zone « Internet » de internet explorer, même si votre serveur Project est dans la zone « intranet ».

La zone internet ne doit pas être avec le curseur au maximum en haut, sinon les livrables Project ne fonctionnent plus.

26-03-2014 07-43-13

Le tout même sur Windows Server 2012 R2 + Project 2013 SP1 + IE 11 complètement à jour…

 

 

RDP 2012(R2) – session collection – profile disk – 800391163

En créant une collection de session sous Windows 2012/2012R2, et en spécifiant un partage pour stocker les profils, vous rencontrez l’erreur 800391163:

rdp2012_session_profile_disk_800391163

Lors de la configuration, un des serveurs RDP va créer le modèle de profil avec sont compte local système:

rdp2012_session_profile_disk_procmon

En détail:

rdp2012_session_profile_disk_procmon2

Bien que vous ayez donné les droits NTFS aux comptes ordinateurs, cela ne passe toujours pas.

Il faut donner « everyone » en « full control » au niveau du partage, « change » ne suffit pas:

rdp2012_session_profile_disk_share

Et voilà une affaire de résolue ^^

Spécialiste Microsoft, un avenir sombre ?

Cet article fait partie d’une série. Voici le premier !

 

J’imagine que l’actualité Microsoft ne vous aura pas échappée depuis quelques mois, et que Microsoft n’est plus seulement un « éditeur de logiciel ».

Bien que cet article porte particulièrement sur l’offre phare Office 365 de Microsoft, quelques nouvelles inquiétantes :

  • Microsoft soucieux d’apprendre comment Yammer (qui ne fait que du SaaS) fait pour livrer aussi souvent des nouveautés. L’intégration complète avec SharePoint et pour la version office365 pour l’instant.
  • Fin des abonnements Technet. Le « remplacement » proposé est d’utiliser les versions d’évaluations. On a tous le temps de réinstaller toute notre plateforme de test à intervalle régulière, c’est sûr. Sinon y a toujours MSDN, mais l’abonnement est autour de 6000€ pour avoir les mêmes droits. Pétition ici.
  • Windows 8.1/2012R2 est RTM mais n’est accessible qu’aux fabricants de matériels. Exit les Technet (qui l’ont encore), les MSDN et autres. Tout ce beau monde l’aura…en même temps que tout le monde.
  • Doublement du stockage sur Office 365 pour le même prix.
  • Fin des certifications MCM. Microsoft ne reconnaitra plus de « gourous » sur ses produits.

Microsoft a bien saisi les avantages de fournir du SaaS plutôt que de vendre ses solutions. Sauf que ce dernier a toujours reposé sur des partenaires pour compléter leurs offres et promouvoir leurs produits… Et des ingénieurs pour les déployer.

Bien que tout cela mette du temps avant d’impacter les admins/ingénieurs/experts/architectes utilisant fortement les technologies Microsoft, il vaut peut-être mieux anticiper un plan B « au cas où ».

Internet Information Services (IIS) Manager. Bad Data. (Exception from HRESULT: 0x80090005)

Symptômes:

Lorsque vous accédez à la console IIS ou aux pools d’applications, vous avez l’erreur suivante:

Bad Data. (Exception from HRESULT: 0x80090005)

Causes:

Vous avez copié le fichier de configuration de IIS d’une machine à l’autre (C:\Windows\System32\inetsrv\config\applicationHost.config)

Ce dernier contient des comptes Windows pour certains pools d’applications. Le mot de passe est encrypté en utilisant une clé locale à la machine, l’autre serveur n’arrive donc pas à les décrypter.

Corriger le mot de passe à la main depuis la console IIS ne résous pas le problème.

Résolution:

2 possibilités:

  • Faire un retour arrière sur le serveur où la configuration a été copiée. Par défaut IIS garde une copie des 10 derniers fichiers de configuration (C:\inetpub\history)
  • Utiliser la méthode supportée pour copier la configuration.

Exporter la configuration:

aspnet_regiis -px "iisConfigurationKey" "C:\iisConfigurationKey.xml" -pri 
aspnet_regiis -px "iisWasKey" "c:\iisWasKey.xml" –pri

Importer sur la cible:

aspnet_regiis -pi "iisConfigurationKey" "C:\iisConfigurationKey.xml" 
aspnet_regiis -pi "iisWasKey" "C:\iisWasKey.xml"

TechED 2012 Europe: la meilleure session

Les techED sont maintenant terminées… Voici ma session préférée:Windows Azure Internals

Mark Russinovich (qu’on ne présente plus) montre l’autre côté du miroir pour Azure.

Eléments les plus marquants:

  • ~10 personnes pour administrer 100 000 serveurs physiques!
  • Démonstration d’une interface d’administration Azure,
  • Vue graphique des racks avec les VM,
  • Démonstration de self healing de la plateforme,
  • Explications sur le bug du 29 février, avec la ligne de commande qui a tout planté

Je vous préviens, c’est du lourd 🙂

Elle est disponible en ligne ici (slides + vidéo): http://channel9.msdn.com/events/TechEd/Europe/2012/AZR302

Restaurer une base SQL server via powershell

clear

#---------------------------------------------------
$server="mysqlserver"
$endpoint_port="5022"
$instance="myNamedSQLinstance"
$emailFrom = "provisioning@mydomain.com"
$emailTo = "mathieu.chateau@lotp.fr"
$smtpServer = "mysmtpserver"
$sendmail=$true
$foldersource='\\myfileserver\backupFromDev$'
$folderarchived='\\myfileserver\backupFromDev$\done'
$excludeList=@()
$excludeList+='master'
$excludeList+='tempdb'
$excludeList+='model'
#---------------------------------------------------
$foldersource="c:\"
$folderarchived="F:\"

$majorError=$true
$global:log=@()
try
{
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")  | out-null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")
    $source = new-object ('Microsoft.SqlServer.Management.Smo.Server') "$server\$instance"
    $majorError=$false
}
catch
{
       AddLog "major error, one side not reachable $_"
       "major error, one side not reachable $_"
       $majorError=$true
}

function AddLog($text)
{
       $global:log+=$text
       Write-Host $text
}

if ($majorError -eq $false)
{
       $databases = $source.Databases
       foreach ($file in (Get-childitem $foldersource -Filter "*.bak"))
       {
               $dbname=$file.Name -replace (".bak","")
               if ($excludeList -notcontains $dbname)
            {
                #not on the blacklist
                if (($databases | ?{$_.Name -ieq $dbname}) -eq $null)
                {
                    #database does not exist
                    try
                    {
                        #Restore
                        $targetDBFilePath = $source.MasterDBPath + "\" + $dbName + ".mdf"
                        $targetLogFilePath = $source.MasterDBLogPath + "\" + $dbName + ".ldf"
                        AddLog "   going to restore $dbname to:"
                        AddLog "   $targetDBFilePath and $targetLogFilePath"
                        $restore = new-object ('Microsoft.SqlServer.Management.Smo.Restore')
                        $restore.Action = 'Database'
                        $restore.Database = $dbname
                        ##$backupDataFile=$dbbk.Devices[0].Name
                        #$restore.Devices.AddDevice($backupDataFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
                        $backupfile=New-Object ("Microsoft.SqlServer.Management.Smo.BackupDeviceItem")($file.FullName, "File")
                        $restore.Devices.Add($backupfile)
                        #$restoredetails=$restore.ReadBackupHeader($source)
                        $relocateDataFile = new-object ('Microsoft.SqlServer.Management.Smo.RelocateFile')
                        $relocateLogFile  = new-object ('Microsoft.SqlServer.Management.Smo.RelocateFile')
                        $dbFileList = $restore.ReadFileList($source)
                        $relocateDataFile.LogicalFileName = $dbFileList.Select("Type = 'D'")[0].LogicalName
                        $relocateDataFile.PhysicalFileName = $targetDBFilePath
                        $relocateLogFile.LogicalFileName = $dbFileList.Select("Type = 'L'")[0].LogicalName
                        $relocateLogFile.PhysicalFileName = $targetLogFilePath
                        $restore.RelocateFiles.Add($relocateDataFile)
                        $restore.RelocateFiles.Add($relocateLogFile)
                        $restore.ReplaceDatabase = $False
                        $restore.NoRecovery = $False
                        $restore.SqlRestore($source)
                        AddLog "     Restore done"
                        Move-Item $file.FullName $folderarchived
                    }
                    catch
                    {
                        AddLog "    error during restore: $_"
                        $majorError=$true
                        break
                    }
                    
                }
                else
                {
                    #blacklisted name
                    AddLog "database $dbname / $($files.Names) already exist"
                }
            }
            else
            {
                AddLog "Forbidden databasename: $dbname"
            }
       
       }
}

if($sendmail)
{
       $temp=""
       foreach ($line in $log)
       {
              $temp+=$line+"`r`n"
       }
       $smtp = new-object Net.Mail.SmtpClient($smtpServer)
       $smtp.Send($emailFrom, $emailTo,"SQL mirror automator",$temp)
}


$log

Ferme RDP avec broker: comment accéder à un serveur spécifique ?

Hypothèses

  • Vous avez une ferme RDP avec par exemple 2 serveurs RDP,
  • Vous avez le broker en place, donc les utilisateurs sont redirigés vers leur connexion actuelle (affinité),
  • You avez restreint à une session par utilisateur.

Problème

Quand vous essayez de joindre un serveur RDP spécifique de la ferme (pour faire de l’admin dessus ou aider un utilisateur qui est dessus), vous êtes refusé:

La connexion ne peut pas être établie car l’ordinateur distant qui a été joint n’est pas celui que vous avez spécifié. 
Cela peut être dû à une entrée obsolète du cache DNS. Essayez d’utiliser l’adresse IP de l’ordinateur à la place du nom.

 

Idem en essayant par l’adresse IP comme suggéré:

Cet ordinateur ne peut pas se connecter à l’ordinateur distant.

L’ordinateur distant auquel vous essayez de vous connecter vous redirige vers l’ordinateur distant. 
La Connexion Bureau à distance ne peut pas vérifier que les deux ordinateurs distants appartiennent à la même batterie de serveurs. 
Ceci peut se produire si un autre ordinateur du réseau porte le même nom que celui auquel vous tentez de vous connecter.

 

Solution

Il suffit d’utiliser le fameux /admin du client RDP pour bypasser les règles !

 

 

SharePoint 2010 PowerShell : renommer une Application Web

Une recherche google semble indiquer que renommer une application Web SharePoint est compliqué et passe par un backup/suppression/création/Restore.

Etant de nature un peu…Opiniatre ? j’y suis allé « au flanc » en PowerShell…Et ca marche 🙂

Les commandes:

$a=Get-SPWebApplication | where {$_.Name -match "Demo"#on vérifie que l'on a bien que l'application à modifier
$a
#On change le nom
$a.Name="[Demo] demo blah blah"
#On pousse la modification
$a.Update()

#on vérifie que le nom a bien changé
Get-SPWebApplication | where {$_.Name -match "Demo"}