SQL Server 2016-Instance en cluster-Storage Spaces Direct

Mon précédent billet nous a permis de configurer un volume CSV au dessus d’une infrastructure disque hyper-convergée. Storage Spaces Direct, concurrent direct de Nutanix ou vSan permet d’agréger des disques locaux perforants (NVMe et autre SSDs) ou à bas cout (interface SATA).

Théoriquement prévu pour supporter une infrastructure Hyper-V, j’ai voulu tenter le coup pour un cluster de basculement SQL Server.

Note : la configuration qui suit est fonctionnelle, et, à l’heure actuelle, totalement NON SUPPORTEE.

Une fois le disque CSV créé, il reste à installer une ou plusieurs instance en cluster. Depuis SQL Server 2014, l’utilisation de disque CSV est supportée pour un FCI, j’avais par ailleurs posté un billet, avec la marche à suivre, à ce sujet.

J’ai ainsi ajouté la fonctionnalité dotnetfx3.5 (obligatoire) au 4 nœuds du cluster créé précédemment. J’aurais tout aussi bien pu créer plusieurs autres VMs.

Je en vais pas faire défiler les copies d’écrans du setup SQL Server que vous connaissez probablement, sinon référez vous à un de mes précédents posts pour l’installation d’un cluster de basculement.

C’est au moment de choisir le stockage pour l’instance que le disque CSV apparait.

image

Windows est en version CTP2. SQL Server 2016 est en CTP2.2. Logique donc que tout ne soit pas parfait. Mais voir un GUID en lieu est place du Pool Name du volume, c’est un peu dommage. Dans la console cluster on retrouve ce même PoolID.

image

Si dans le futur une telle configuration est supportée, ce genre de détail devrait être corrigé. Sachant que dans l’écran suivant, le nom du CSV est lui correct.

image

Poursuivons l’installation :

imageimage

Il ne reste plus qu’à faire des add node sur les 3 nœuds restants. Rien de particulier cette fois ci. Reportez vous aux différents billets à ce sujet.

Petite note, lorsque vous voulez automatiser, penser à ne pas tout paralléliser : lors du Add Node, le setup de SQL Server cherche à valider l’état du service sur les nœuds non encore installés. Cette étape échoue si un nœud est en cours d’installation.

Une fois tous les nœuds ajoutés le FCI est opérationnel sur les 4 nœuds avec un stockage réparti sur tous les nœuds. Nous avons supprimé le SPOF que constitue le stockage centralisé dans un cluster de basculement. Il aurait aussi été possible d’utiliser un logiciel tiers de réplication de bloc tel que DataKeeper, comme je l’avais fait ici.

Sachant que cette configuration n’est pour l’heure pas supportée, pourquoi en parler ? Peut être parce que j’attends avec impatience le jour où il sera possible de disposer et manipuler des instances SQL en haute disponibilité comme on joue avec des machines virtuelles sur un cluster Hyper-V.

Ne vous méprenez pas, je suis un fan des groupes de disponibilité, mais il faut bien avouer que dans certains cas, un cluster de basculement est suffisant.

L’environnement hyper-convergé, où les ressources disque et CPU sont mutualisées, est clairement la tendance actuelle niveau virtualisation. La bascule d’une VM d’un nœud à l’autre est transparente (sans coupure de service, ni de connexion réseau comme avec le live migration des VMs). Le stockage allie performance, flexibilité et extensibilité. Proposer la création de VM en Self-Service, …

Reproduire les concepts pour les instances de bases de données parait être une évidence (la mobilité des bases est déjà acquise de part les groupes de disponibilité avec l’utilisation du listener).

Plus les version de Windows et de SQL se succèdent, plus on s’en rapproche. Les briques techniques sont toutes là, ou presque.

Happy FCI sur Storage Spaces Direct

Publié dans SQL Server | Tagué , , , | Laisser un commentaire

Storage Spaces Direct–Windows 2016

Lors d’un précédent billet nous avions exploré les possibilités offertes par Windows Server 2016 liées au disaster recovery, le storage replica.

Dans ce billet, je spécifiais clairement qu’il s’agissait d’une solution de disaster recovery, et non pas de haute disponibilité. Alors, quid de la HA ?

La nouvelle mouture de Windows Server nous offre la fonctionnalité de Storage Spaces Direct. Afin de concurrencer Nutanix pour les environnement hyper-convergés, ou tout simplement pour offrir une fonctionnalité équivalente à VMware Virtual SAN, Microsoft propose ainsi de répartir le stockage sur les différents nœuds d’un cluster. Ainsi les disques locaux de chaque machine peuvent être agrégés afin d’offrir un espace de stockage vu comme une seule entité depuis le cluster.

Il est possible de passer par une connexion SAS pour des disques JBOD

Storage Spaces Direct with JBOD

Mais bien plus intéressant, il est aussi possible de faire fonctionner le Storage Spaces Direct avec des disques SATA.

Storage Spaces Direct with internal disks

L’intérêt, me direz-vous ? Il set double : soit on part sur une logique de réduction des couts, argument choc pour les DSI et Directeurs Financiers, soit on mise sur la performance avec des disques NVMe (par exemple une carte Intel Solid-State Drive 750 Series, 400GB, 400$    parfait pour des petits tests à 430 000 Read IOPS en 4K  Sourire ) ou bien des disques SSD (jusqu’à 4TB actuellement, 8TB prévus pour 2016, avec des durées de vie tout a fait correctes). Ajoutez à cela un peu de réseau à faible latence (type Mellanox) entre les serveurs, et oui, croyez moi, cela peut être franchement très performant.

Dans la CTP actuelle, la mise en place de Storage Spaces Direct requiert un minimum de 4 nœuds. Autant partir sur 4 machines virtuelles pour la démonstration, donc pas forcément de respect des best practices pour les réseau, les contrôleurs SCSI, etc …

for ($i=1; $i -le 4; $i++) 
{
    $VmName      = "Conseil IT - Win2016-$i"
    $VmMemory    = 4GB				               
    $VhdPath     = "E:\VHD"			       

    $NetworkSwitch = "External Network"	
    $WindowsISO    = "C:\Sources\en_windows_server_technical_preview_2_x64_dvd_6651466.iso"	

    
    New-VM -Name $VmName  `
                -MemoryStartupBytes $VmMemory `
                -NewVHDPath $VhdPath\$VmName.vhdx `
                -NewVHDSizeBytes 60000000000 `
                -SwitchName $NetworkSwitch `
                -Generation 2

    Set-VMProcessor -VMName $VmName  -Count 4
    Add-VMDvdDrive  -VMName $VmName  -Path $WindowsISO

    Enable-VMIntegrationService -VMName $VmName  `
                                -Name "Guest Service Interface"
}

Une fois les VM crées et configurées (changement de nom, intégration dans un domaine, paramétrage Windows, …), on ajoute les fonctionnalités nécessaires :

Add-WindowsFeature -Name File-Services, Failover-Clustering -IncludeManagementTools

Sur l’hyperviseur, on ajoute ensuite les disques “locaux”, des fichiers VHDX dans notre exemple. Pour chaque VM, 4 disques vont être ajoutés simulant ainsi plusieurs disques locaux.

for ($i=1; $i -le 4; $i++) 
{
     $VmName      = "Conseil IT - Win2016-$i"
     $VhdPath     = "E:\VHD"		

 
    for ($j=1; $j -le 4; $j++) 
    {

        New-VHD -Dynamic `
                -Path $VhdPath"\StoragePool$i-$j.vhdx" `
                -SizeBytes 10GB

        Add-VMHardDiskDrive  -VMName $VmName  `
                             -Path $VhdPath"\StoragePool$i-$j.vhdx" `
                             -ControllerType SCSI -ControllerNumber 0
    }
}

Je n’ai pas besoin de beaucoup d’espace pour les test, c’est pour cela que j’ai choisi de créer des fichiers de 10GB seulement.

Attention toutefois à ce point, car en production, il faudra tenir compte de la tolérance de panne qui va recopier les blocs sur 3 disques au minimum, donc un espace “réellement” disponible très inférieur à la somme des tailles des disques.

image

Une fois cette étape franchie, repartons dans une des VMs, connecté avec un compte du domaine afin de former le cluster.

New-Cluster -Name Win2016-ha -Node "Win2016-1", "Win2016-2", "Win2016-3", "Win2016-4" -NoStorage

Reste maintenant la petite subtilité qui permet au cluster de “profiter” du stockage local (ou DAS : Direct Attached Storage) : activation du Storage Space Direct.

(Get-Cluster).DASModeEnabled=1

 

Quelques secondes de patience et il est ensuite possible de lister les disques pouvant être “poolés” »

Get-StorageSubSystem  -Name Win2016-ha.conseilit.local | Get-PhysicalDisk

image

Tout comme le rapport du Test-Cluster dans lequel le test est inclus

Test-Cluster -Node "Win2016-1", "Win2016-2", "Win2016-3", "Win2016-4" `
             -Include “Storage Spaces Direct”,Inventory,Network,”System Configuration”

 

image

image

Reste à créer le pool en utilisant tous les disques présents :

New-StoragePool  -StorageSubSystemName Win2016-ha.conseilit.local `
                    -FriendlyName SP01 -WriteCacheSizeDefault 0 `
                    -FaultDomainAwarenessDefault StorageScaleUnit `
                    -ProvisioningTypeDefault Fixed `
                    -ResiliencySettingNameDefault Mirror `
                    -PhysicalDisk  (Get-StorageSubSystem  -Name Win2016-ha.conseilit.local | Get-PhysicalDisk)

 

Dans le console de gestion du cluster, on peut alors voir les enclosures et le pool

image

image

A ce moment de la partie, le pool est créé. reste juste à l’utiliser en créant un (ou plusieurs) storage space (que l’on pourrait aussi nommer disque virtuel si le nom storage space ne vous évoque rien). Le schéma suivant résume bien la situation : des disques locaux, agrégés dans un storage pool, sur lequel on va créer un ou plusieurs storage spaces.

Storage Spaces Direct storage stack

Lorsque le storage space est créé, reste ensuite à créer un volume qui sera exploitable par le cluster : un disque CSV.

New-Volume -StoragePoolFriendlyName SP01 `
           -FriendlyName VDSQL01 `
           -PhysicalDiskRedundancy 2 `
           -FileSystem CSVFS_REFS `
           -Size 20GB

 

image

Mission accomplie … Le disque CSV est créé et utilisable ! Ce volume est réparti sur l’ensemble des 4 nœuds du cluster, ce qui procure de la haute disponibilité. Pour du disaster recovery, ce n’est pas suffisant, car il faut un minimum de 3 nœuds actifs pour que la ressource soit UP, il faudrait donc 6 nœuds dans le cluster, 3 dans caque Datacenter par exemple.

Quel cas d’usage ? Pour l’instant Microsoft ne communique qu’autour d’Hyper-V. Logique, la cible, c’est clairement Nutanix.

image

Mais les lecteurs attentifs auront noté le nom (FriendlyName) que j’ai donné à mon volume … Sourire

Happy Storage Spaces Direct and Stay tuned !

Publié dans Hyper-V, Windows | Tagué , , , | 1 commentaire

Windows 10 disponible au téléchargement

Abonnés MSDN vous pouvez faire chauffer vos lignes ADSL / fibre (Microsoft a prévu une bande passante cumulée de 40 Tb/s) …

image

Publié dans Windows | Tagué | Laisser un commentaire

Renouvèlement MVP

 

SELECT
     'Toutes nos félicitations au MVP Microsoft 2015!' AS [Email Header.Title],
	  'Microsoft' AS [Email Header.Sender],
	  'Christophe LAPORTE' AS [Email Header.To],
	  '2015-07-01' AS [Email Header.Date],
	  'Chère/Cher Christophe Laporte,
       Félicitations! Nous sommes heureux de vous remettre la récompense 
              MVP Microsoft® 2015!' AS [Email Body.Text],
	   2009 AS [MVP Profile.First year awarded],
	   7 AS [MVP Profile.Number of MVP Awards],
	  'SQL Server' AS [MVP Profile.Technical Expertise],
	  'Cluster, Microsoft Azure, Hyper-V' AS [MVP Profile.Technical Interests]
FOR JSON PATH

 

image

 

L’email de renouvèlement MVP est arrivé aujourd’hui. Et c’est toujours avec autant de plaisir que l’on découvre que l’on est renouvelé.

Bannière Microsoft MVP

 

Une nouvelle année, donc, à partager avec vous autour des technologies Microsoft et principalement Microsoft SQL Server.

D’autant que l’année à venir va être marquée par la sortie de SQL Server 2016, donc des articles, séminaires et events en vue …

Stay tuned !

Publié dans CV | Tagué | 3 commentaires

SQL Server 2016 – Row Level Security

Comme vous le savez, SQL Server 2016 est enfin disponible au téléchargement en version CTP2. Je vous propose de découvrir une fonctionnalité attendue : le Row Level Security, ou la capacité, sans avoir à modifier l’ordre SELECT (ou Update, Delete, Insert) de filtrer les données en fonction de l’identité de la personne connectée.

Jusqu’a SQL Server 2014 inclus, si l’on souhaitait ne présenter à un vendeur les ventes qu’il a réalisées, il fallait passer par une procédure stockée ou une fonction qui allait appliquer un filtre. Si l’utilisateur avait un GRANT SELECT sur la table, il suffisait alors de passer par Excel, par exemple, pour visualiser l’intégralité des données.

Cette fois ci, de manière totalement transparente, les données sont filtrées automatiquement par SQL Server, suivant le résultat d’une fonction appelée par une stratégie de sécurité.

Dans un premier temps, créons une base exemple et récupérons quelques données de la base Adventureworks. Notez que j’ai éliminé les doublons sur le prénom des contacts car la fonction que nous allons utiliser par la suite ne doit renvoyer qu’un seul enregistrement.


CREATE DATABASE DemoRLS
GO

USE DemoRLS
GO

SELECT *
INTO SalesOrderHeader
FROM AdventureWorks.Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL

SELECT ContactID,FirstName,LastName
INTO dbo.Contact
FROM AdventureWorks.Person.Contact;

-- But there are some duplicates 
With MyCE AS 
(
	SELECT *,
	row_number() OVER (PARTITION BY FirstName ORDER BY ContactID) as RID
	FROM dbo.Contact
)
DELETE FROM MyCE
WHERE RID > 1

Comptons a présent le nombre de ventes réalisées par chaque employé, afin de choisir deux personnes :

SELECT SalesPersonID,Count(*) AS OrderCount
FROM dbo.SalesOrderHeader
GROUP BY SalesPersonID
ORDER BY SalesPersonID

image

Pour la suite de la démo, les ID 275 et 285 seront utilisés. Un login spécifique a chaque utilisateur est créé. Bien sur il est également possible de s’appuyer sur des logins de type Windows.

image

CREATE USER Maciej WITHOUT LOGIN;
CREATE USER Gail WITHOUT LOGIN;
GO

GRANT SELECT ON SalesOrderHeader TO Maciej;
GRANT SELECT ON SalesOrderHeader TO Gail;
GO

Il est temps à présent de créer la fonction qui va permettre de valider ou non la lecture des données par l’utilisateur qui sera connecté.

La fonction que j’ai créé va simplement aller extraire l’ID dans la table contact correspondant à la session en cours (USER_NAME).

Pour finir, il suffit de créer une stratégie de sécurité qui va se fixer sur la table que l’on souhaite protéger en spécifiant la colonne sur laquelle on s’appuie pour valider l’accès.


CREATE FUNCTION dbo.fn_RLSsecuritypredicate(@SalesPerson AS int)
    RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS Select_Granted
            WHERE @SalesPerson = (
					SELECT ContactID FROM dbo.Contact
					WHERE FirstName = USER_NAME()
					)
GO

CREATE SECURITY POLICY SalesOrderHeaderFilter
ADD FILTER PREDICATE dbo.fn_RLSsecuritypredicate(SalesPersonID) 
ON dbo.SalesOrderHeader
WITH (STATE = ON);

Ainsi, lorsque l’utilisateur 275 exécuter une requête SELECT, alors seuls les enregistrements du SalesPersonID de la table SalesOrderHeader seront remontées. Idem pour l’utilisateur 285.


EXECUTE AS USER = 'Maciej';
	SELECT SalesOrderID,OrderDate,CustomerID,SalesPersonID 
	FROM dbo.SalesOrderHeader
REVERT;

EXECUTE AS USER = 'Gail';
	SELECT SalesOrderID,OrderDate,CustomerID,SalesPersonID 
	FROM dbo.SalesOrderHeader
REVERT;

 

imageimage

 

Cela fonctionne parfaitement ! Mais je me dois quand même de vous mettre en garde. Rien ne prévient que les données sont filtrées, sauf à regarder de près le plan d’exécution :

image

Où un Assert et un Stream Aggregate s’imposent avant la jointure. En regardant la version XML du plan d’exécution, on décèle l’appel à la fonction.

 

Je dois également attirer votre attention sur le fait que même un sysadmin est soumis à cette policy ! L’exécution du SELECT ne renvoie aucune données.

image

 

Il suffit alors de modifier la fonction pour prendre les cas particuliers en charge. Les administrateurs, les managers qui auraient visibilité sur les ventes des employés sont ils sont responsables, etc …


DROP SECURITY POLICY SalesOrderHeaderFilter;
GO

ALTER FUNCTION dbo.fn_RLSsecuritypredicate(@SalesPerson AS int)
    RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS Select_Granted
            WHERE @SalesPerson = (
					SELECT ContactID FROM dbo.Contact
					WHERE FirstName = USER_NAME()
					)
               OR USER_NAME() = 'dbo';
GO


CREATE SECURITY POLICY SalesOrderHeaderFilter
ADD FILTER PREDICATE dbo.fn_RLSsecuritypredicate(SalesPersonID) 
ON dbo.SalesOrderHeader
WITH (STATE = ON);

 

Et on récupère la visibilité sur les données.

image

 

Cette fonctionnalité était attendue et malgré les possibilités offertes, elle est simple a mettre en œuvre. La policy s’applique bien niveau ligner et filtre les données à renvoyer. Rien pour les colonnes, il faut encore s’appuyer sur des vies/fonctions/procédures.

Enjoy !

Publié dans SQL Server | Tagué , | Laisser un commentaire

SQL Server 2016 – Live Query Statistics

Disponible depuis peu, SQL Server 2016  apporte son lot de nouveautés. Certaines orientés sécurité, haute disponibilité ou montée en charge, et puis d’autres permettent d’étoffer la trousse à outil du DBA.

Et j’avoue que la fait de “voir” l’avancement de l’exécution d’une requête est tout bonnement bluffant. Enfin pouvoir répondre à un utilisateur inquiet de connaitre l’avancement en % de ses requêtes… SQL Server 2014 nous permettait d’avoir beaucoup d’informations au travers de la DMV sys.dm_exec_query_profiles.

Mais en ajoutant le côté graphique, il faut avouer que cela fait son effet. Attention cependant à la consommation de ressources lors de l’utilisation de la fonctionnalité !

Live Query Statistics

Notez qu’il est aussi possible d’atteindre ce “plan d’exécution animé” depuis une nouvelle entrée dans la fenêtre activity monitor.

image

 

Enjoy

Publié dans SQL Server | Tagué , | Laisser un commentaire

Premier contact avec SQL Server 2016

Avec quelques jours d’avance, SQL Server 2016 CTP2 est disponible publiquement au téléchargement.

image

Vous avez ainsi la possibilité de tester la nouvelle mouture de SQL Server, ses nouvelles fonctionnalités et les améliorations des précédentes.

D’autant plus que la documentation en ligne est également disponible.

Globalement, niveau  installation, rien de particulier. Les habitués ne seront pas dépaysés.

imageimage

Je vous épargne les écrans suivants que vous maitrisez probablement.

En revanche, sur l’écran de sélection des fonctionnalités, enfin du nouveau :

image

Polybase est enfin disponible, édition entreprise il y a fort à parier.

Afin de bénéficier de cette fonctionnalité, il faudra néanmoins installer une JRE 7.51. Et j’avoue que ce point me chagrine un peu. je suis assez réfractaire quant à l’installation de Java sur un serveur SQL. Bref.

image

Même si votre serveur Windows 2012R2 est up-to-date, il faudra néanmoins ajouter un KB supplémentaire afin de pouvoir poursuivre l’installation.

image

690MB et un reboot plus tard, vous serez en mesure de poursuivre l’installation.

Et bonne surprise, on se préoccupe enfin de la base TempDB et de la contention si vous ne disposez que d’une seul fichier de data (principalement sur la page PFS – 2:1:1).

image

 

De manière étonnante, nous avons droit à une version 13 … J’avoue que je m’attendais à basculer directement sur une version 14. Histoire de superstition outre-atlantique. A vérifier sur la RTM.

image

Car il reste quelques bugs à corriger comme l’intitulé de la version SQL ( 2015 ):

image

 

Polybase !

Présenté par le Dr David DeWitt lors du Pass Summit 2012, polybase offre  la possibilité de requêter un cluster Hadoop depuis SQL Server. On imagine sans peine un scénario alliant un stockage massif pour des données non structurées ou semi structurées dans Hadoop et des données agrégées ou semi-agrégées stockées dans SQL Server. Et exécuter des requêtes sur les 2 sources de données, indifféremment.

PolyBase Concept

 

 

Query Store

Autre fonctionnalité attendue : le query store. Le but est ici de fournir aux DBA des outils (DMVs) afin de comprendre des changement au niveau des performances dus à des plans d’exécution différents.

image

 

Live Query Statistics

SQL Server 2014 avait introduit une nouvelle DMV (SQL 2014 – Nouvelle DMV sys.dm_exec_query_profiles) afin de visualiser l’état d’avancement de l’exécution d’une requête en présentant chaque opérateur, avec le nombre de lignes traitées, etc … Voici maintenant la version graphique. Très réussie. Sourire

 

Strech Databases

Enfin, dirons nous. L’archivage des données, avouons le, était un problème épineux. Au pire, on ne faisait rien et toutes les données restaient dans la ou les tables de production, pour des années voire plus. Soit on concevait une politique d’archivage qui déplaçait les enregistrements “froids” et/ou “tièdes” dans des tables spécifiques. Encore fallait il pouvoir lire simplement ces données et produire des requêtes/vues intégrant données chaudes et données froides. Ou bien, encore, on jouait avec les tables partitionnées.

Les strech databases vont permettre, simplement, d’archiver de manière transparente des données dans Azure, avec à la clé un gain d’espace et un cout de stockage réduit.

Incontestablement dans le top 5 des fonctionnalités de SQL Server 2016.

 

Temporal Tables

Ou la possibilité de requêter une table et renvoyer des données telle qu’elles étaient à un point donné dans le temps ! Cette fonctionnalité est une également une de mes préférées.

 

Sécurité

De belles nouveautés sur le plan sécurité avec le dynamic data masking, le row level security et des nouvelles permissions.

 

Haute disponibilité

Les groupes de disponibilité se voient dotés du round robin pour les accès en lecture seule au travers du listener, ce qui permet de balancer la charge sur l’intégralité des serveurs secondaires. Les transactions distribuées sont enfin supportées et le nombre de serveurs pouvant bénéficier de la bascule automatique passe de 2 à 3.

 

Bref, de nombreux articles à venir …

Bon téléchargement.

Publié dans SQL Server | Tagué | 2 commentaires

SQL Server vNext devient SQL Server 2016

Enfin quelques nouvelles (publiques) de la prochaine version de SQL Server ….

Tout d’abord, enfin, nous connaissons le nom : SQL Server 2016.

La datasheet, téléchargeable ici.

image

Elle confirme l’orientation cloud de Microsoft avec les strech tables, où le déplacement automatique des données froides vers le cloud alors que les données chaudes restent sur votre server OnPremise. Bref, un scénario hybride dont je ne manquerai pas de vous reparler.

 

L’accent est aussi mis sur la haute disponibilité avec des améliorations attendues  dans AlwaysOn : le support de MsDTC et l’accès en round-robin sur les serveurs secondaires.

D’un point de vue performances, il sera dorénavant  possible d’utiliser le columnstore index sur des données OLTP sous Hekaton. Le meilleur des deux mondes ! De l’OLTP ultra performant (et avec moins de contraintes qu’avec la version SQL 2014) et le columnstore index en read/write pour l’analyse …

Polybase sera aussi inclu dans SQL Server (présent dans APS auparavant), permettant ainsi l’accès à des données non structurées (Hadoop)  et structurées via le langage t-SQL. Au passage, on peu noter le support natif de JSON !

Une petite dose de sécurité (Row level security et Dynamic Data Masking) viennent compléter le tableau de cette nouvelle mouture de SQL Server.

Bienvenue à SQL Server 2016 !!!!

Stay tuned

Publié dans SQL Server | Laisser un commentaire

Groupes de disponibilité et disaster recovery

Vous le savez probablement, une des fonctionnalité phare de SQL Server 2012 (aka Denali) est AlwaysON.

Mais AlwaysOn n’est qu’une “marque” regroupant les technologies de haute disponibilité dans SQL Server, à savoir le FCI, ou Fail Over Cluster Instance, et les groupes de disponibilité.

J’ai pour ma part énormément communiqué sur ces fonctionnalités de haute disponibilité, que ce soit lors des Techdays (2012, 2013, 2014) , des Journées SQL Server, ou sur ce blog(Création d’un groupe de disponibilité, plusieurs groupes de disponibilité, Ajout d’un nœud à un Groupe de disponibilité).

Mais, au final, peu de littérature sur le Disaster Recovery, le “vrai”. Imaginez un scénario dans lequel vous disposez de 2 Datacenter. Le principal héberge deux réplica de votre groupe de disponibilité, pour le PCA, alors que le second Datacenter, lui, n’est là que pour pallier à une défaillance “majeure” puisque l’on perdrait 2 nœuds sur 3 dans le cluster, le PRA.  Voilà donc le décors planté.

Je ne vais pas vous abreuver une fois de plus de copies d’écran sur la création du cluster ou bien l’installation de SQL Server, l’activation de la fonctionnalité HADRON si la mise en haute disponibilité d’une base au sein d’un groupe de disponibilité.

Bref, partons du principe que les 3 nœuds sont configurés et opérationnels au sein du cluster. Node1 et Node2 dans le Datacenter principal et Node3 dans le Datacenter secondaire.

image

Le groupe de disponibilité est lui aussi configuré et opérationnel.

image

image

Tant qu’a bien faire les choses, il est possible de ne pas attribuer de vote à un nœud du cluster qui ne sert qu’au Disaster Recovery.

(Get-ClusterNode Node3).NodeWeight = 0

image

Le témoin dynamique fonctionne ici parfaitement pour “équilibrer” les votes au sein du cluster afin d’avoir un nombre de votes impair et disposer d’un quorum.

Et là, c’est le drame. Perte totale, et durable, du Datacenter principal. Les ouragans passent, les avions tombent, les pelleteuses arrachent des fibres, bref autant d’histoires connues. Mais, par chance, ou plutôt parce qu’un architecte a pensé au Disaster Recovery, le Datacenter secondaire comporte un minimum de serveur lié à l’infrastructure (AD, DNS).

Il suffit alors de stopper le service cluster, un simple Stop-Service ou bien via le gestionnaire de services Windows, qui doit être théoriquement en méforme.

Ensuite, nous allons redémarrer le cluster en forçant le quorum, a n’utiliser bien sur que dans ce genre de cas extrêmes.

$node = "Node3"
Start-ClusterNode -Name $node -FixQuorum

image

Quelques instants plus tard, le cluster est de nouveau en vie (on peut à présent lancer la console de gestion du cluster pour s’en assurer).

image

Cependant, d’un point de vue groupe de disponibilité, tout n’est pas terminé car le groupe de ressource est OFFLINE.

image

Il suffit alors de forcer la bascule du groupe de disponibilité, en autorisant la perte éventuelle de données (vous pouvez également le faire en T-SQL) :

Switch-SqlAvailabilityGroup `
   -Path SQLSERVER:\Sql\Node3\Default\AvailabilityGroups\AgDemo `
   -AllowDataLoss -Force

image

Et le groupe de disponibilité redevient ONLINE, prêt pour redémarrage des applications.

image

A compter de ce moment là, la solution n’est plus hautement disponible (il faudrait juste ajouter un second nœud dans le Datacenter secondaire. Mais la production (d’un point de vue service SQL) a pu reprendre.

Lorsque la Datacenter principal sera de nouveau opérationnel, les serveurs vont rejoindre le cluster, sans action de votre part.

image

Mais d’un point de vue bases de données, le groupe de disponibilité n’est repassé en mode synchronisé car le mouvement de données est alors suspendu.

image

Un simple “Resume Data Movement” et les bases vont progressivement se resynchroniser avec le serveur de Disaster Recovery.

image

Pour au final disposer de nouveau de bases de données en haute disponibilité

image

Libre à vous ensuite de refaire des bascules pour remettre les bases sur les serveurs principaux …

Si vous avez des questions ou si vous souhaitez mettre en œuvre une solution de HA/DR SQL Server, en environnement physique ou virtuel, n’hésitez pas, contactez moi !

Happy DR

Publié dans SQL Server, Windows | Tagué , , | Laisser un commentaire

Enregistrement des compteurs de performance dans un fichier BLG

Une de mes principales activités, outre le conseil en bases de données (architecture, virtualisation, haute disponibilité, montée en charge, …) consiste a réaliser des audits de performance et par la suite effectuer du tuning, autant côté système que base de données.

Afin de gagner du temps, ou lorsque l’on est face à une situation urgente et que mon emploi du temps ne me permet pas d’agit dans l’immédiat, je demande alors à une personne de me créer un fichier BLG que je pourrai ensuite analyser offline une fois téléchargé sur mon site FTP.

Et, relativement fréquemment, les administrateurs / DBAs ne connaissent pas cette possibilité offerte par Perfmon, nativement présent dans Windows.

La fonctionnalité la plus connue de Perfmon est de procurer un rendu visuel temps réel, dans la section Monitoring Tools | Performance Monitor. Mais il est aussi possible d’enregistrer un fichier, format “binaire”, contenant les valeurs des compteurs de performance capturées à intervalles réguliers. Une fois la capture terminée, il est alors possible de l’analyser a postériori et éventuellement sur un PC afin de ne pas travailler directement sur le serveur.

image

Voici donc un petit tutorial qui permet de créer un fichier BLG. Un click droit sur User Defined, dans la section Data Collector Sets et …suivez le guide :

image

On donne un petit nom au data collector set, et sachant que l’on va spécifier nos propres compteurs, on sélectionne l’option Create manually, et dans l’écran suivant Performance Counter (Pour els habitués, on peut également importer un fichier XML contenant els compteurs, typiquement issus du PAL).

imageimage

Ensuite, on va éditer le Data Collector afin de spécifier nos paramètres et ajouter nos métriques

image

Il est possible de modifier l’intervalle de capture en fonction des besoins. Si je souhaite une analyse fine, sur une durée limitée, alors j’opte pour un intervalle d’une seconde. Tout dépend aussi du nombre de compteurs choisis, cela influe sur le volume du fichier BLG. Ensuite on ajoute les compteurs de performance système et SQL nécessaire à l’analyse. Si vous êtes un peu perdu et que vous ne savez pas quels compteurs choisir, reportez vous à ma session lors des JSS 2014.

imageimage

J’apprécie également de modifier le nommage du fichier BLG afin d’ajouter le nom du serveur ainsi qu’une date et heure. Croyez-en mon expérience, lorsque l’on se retrouve avec 10 fichiers qui portent tous le même nom (DataCollector01.blg), difficile de s’y retrouver, bien que le nom du répertoire sur le serveur comporte le HostName et un numéro séquentiel.

image

Ensuite, il est possible de spécifier des conditions de démarrage et d’arrêt de la capture. Par ce que je n’apprécie guerre de me lever la nuit pour activer une collecte, je vous suggère de planifier l’exécution ! Vous pouvez disposer de 0 ou N planifications par CollectorSet.

imageimage

Vous pouvez également spécifier des conditions d’arrêt, en fonction de la durée de capture, de la taille du fichier BLG afin de ne pas saturer le disque, voire même relancer automatiquement une capture, sur un autre fichier, de manière automatique. On peut ainsi avoir un fichier BLG par heure, ou par tranche de 6 heures suivant les besoins.

Les plus organisés peuvent aussi positionner plusieurs Data Collectors dans un même Set afin de séparer les données système des données SQL Server par exemple.

image

Un click droit sur le collector set permet de démarrer la collecte ou bien de la stopper manuellement.

imageimage

Ensuite, laissons la capture s’effectuer. Un petit symbole (flèche verte dans un cercle blanc) permet de savoir si la capture est en cours.

image

Une fois la capture terminée, le fichier BLG est disponible.

image

Un simple double click sur le fichier permet de l’ouvrir et de l’exploiter, avec la possibilité de cacher certains compter, de “zoomer” en sélectionnant un intervalle de temps, changer l’échelle les compteurs, ….

image

Si vous disposez également d’une trace SQL couvrant le même intervalle de temps, le profiler vous permet alors de croiser les informations et ainsi d’identifier des requêtes en fonction des métriques système, et inversement de visualiser la consommation de ressources lors de l’exécution de requêtes spécifiques.

Le troubleshooting commence nécessairement par la collecte de données sur les bons indicateurs, que ce soit les compteurs de performance ou bien les DMVs/DMFs. Maintenant plus aucune excuse pour ne pas savoir créer un fichier BLG.

Enjoy

Publié dans SQL Server, Windows | Tagué , | 2 commentaires