tisdag, december 13, 2011

SQL Azure Federations

I den stora uppdatering av Windows Azure kom även många intressanta uppdateringar till SQL Azure. Den som sticker ut för mig som mest intressant är att vi nu har släppt SQL Azure Federations. Med hjälp av SQL Azure Fedrations kan man bygga in möjligheten att skala ut en databas till flera instanser för att dela på last.

Här kommer ett SQL Script går igen olika steg för att visa på användning av SQL Azure Federation.

Observera att detta script endast går att köra i SQL Azure och kommer att skapa två databaser. Självklart blir du därför debiterad för två databaser. I SQL Azure Federations ugår ingen extra kostnad för federeringen men man får betala för varje databas som skapas. Ett exempel är om man har 6GB data i en databas blir man debiterad för en 10GB databas. Om man väljer att skapa en federation och dela upp dessa databaser på tio 1GB federations members blir man debiterad för elva 1 GB databaser. En för varje federation member plus en för en federation root.

-- Skapa en ny databas. Det blir automatiskt en Web Edition med maxstorlek på 1GB
CREATE DATABASE Sales
GO

-- Skapa en Federation
-- Eftersom att SQL Azure inte har stöd för use måste du manuellt ändra din connection

-- use Sales
-- Ge din federation ett lämpligt namn och välj vilken datatyp du ska federera på.
-- Datatypen måste överensstämma med datatypen i den tabell som du sedan vill federera
CREATE FEDERATION CustomerFederation(customerId BIGINT RANGE)
GO

-- Använd kommandot USEFEDERATION för att dirigera trafik till den federation som innehåller det
--
CustomerId som skickas in
-- FILTERING=OFF kommer att reutnera alla rader i den federationen
USE FEDERATION CustomerFederation(customerId =0)WITH RESET,FILTERING=OFF
GO

-- Skapa en tabell i denna, än så länge enda federation
-- Observera raden FEDERATED ON, det är det som visar vilken kolumn tabellen ska federeras på.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE
[dbo].[Customer](
  
[CustomerID] [bigint] NOT NULL,
  
[FirstName] [nvarchar](50) NOT NULL,
  
[LastName] [nvarchar](50) NOT NULL,
CONSTRAINT[PK_Customer] PRIMARY KEY CLUSTERED
(
  
[CustomerID] ASC
)
)
FEDERATED ON(customerId =CustomerID)
GO

-- Lägg till ett par kunder i tabellen
insert into Customer values(1,'Jules','Winnfield')
insert into Customer values(2,'Vincent','Vega')
insert into Customer values(3,'Butch','Coolidge')
insert into Customer values(4,'Marsellus','Wallace')
insert into Customer values(5,'Mia','Wallace')
insert into Customer values(6, 'Esmeralda', 'Villalobos')
insert into Customer values(7, 'Captain', 'Koons')

-- Skapa en referenstabell. Referenstabeller kopieras till varje federation när man gör en split.
-- För att skapa en referenstabell låter utesluter man bara DEDERATED ON
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE
[dbo].[SomeReferenceTable](
   
[ReferenceID] [bigint] NOT NULL,
   
[SomeData] [nvarchar](8) NULL,
CONSTRAINT [PK_SomeReferenceTable] PRIMARY KEY CLUSTERED
(
   
[ReferenceID] ASC
)
)
GO --Note the lack of the FEDERATED ON keyword.

Insert into SomeReferenceTable values(1, 'Hello');
Insert into SomeReferenceTable values(2, 'SQL');
Insert into SomeReferenceTable values(3, 'Feds');

-- För att visa vilka federations som finns kan man ställa en fråga mot federation_member_distributions
USE FEDERATION ROOT WITH RESET
GO
SELECT
* FROM sys.federation_member_distributions ORDER BY federation_id, range_low;
GO

-- Be om en connection till den federation som innehåller CustomerId = 1
-- Med FILTERING=OFF kommer alla rader att returneras från den federation

USE FEDERATION CustomerFederation(customerId=1) WITH RESET, FILTERING=OFF
GO
SELECT
* FROM Customer

-- Be om en connection till den federation som innehåller CustomerId = 1
-- Med FILTERING=ON kommer bara de rader som har CustomerId = 1 att returneras.

USE FEDERATION CustomerFederation(customerId=1) WITH RESET, FILTERING=ON
GO
SELECT
* FROM Customer

-- Nu kommer magin! Med hjälp av ALTER FEDERATION kan man göra en online split för federatioen.
-- Här väljer vi att slita vid CustomerId = 5.
-- Det innebär att med CustomerId < 5 kommer att hamna en federation member
-- medan CustomerId >= 5 kommer att hamna i en annan federation member
 
USE FEDERATION ROOT WITH RESET
GO
ALTER
FEDERATION CustomerFederation SPLIT AT (customerId=5)
GO

-- Det tar ett tag för federations att skapas men under hela tiden kommer din databas att vara tillgänlig.
-- Ställ regelbundet frågor mot federation_member_distributions för att se när det kommer in en ny rad i tabllen.

USE FEDERATION ROOT WITH RESET
GO
SELECT
* FROM sys.federation_member_distributions ORDER BY federation_id, range_low;
GO

-- Ställ ytterligare några frågor mot olika Federations för att se hur data har blivit fördelat på två databaser.
-- Referenstabeller ligger kopierat lokalt till varje databas.

USE FEDERATION CustomerFederation(customerId=1) WITH RESET, FILTERING=OFF
GO
SELECT
* FROM Customer
select * from SomeReferenceTable

USE FEDERATION CustomerFederation(customerId=5) WITH RESET, FILTERING=OFF
GO
SELECT
* FROM Customer
select * from SomeReferenceTable

federations

Från den det nya administrationsverktyget kan man nu också se en visuell bild av federationerna i databasen och där kan man även splitta en federation.


-- För att droppa databasen måste man koppla upp sig mot master databasen
-- Vid drop av Federation Root droppas också alla Federations Members.
-- use master
Drop DATABASE Sales

Scott Guthrie, Dave Campbell, and Mark Russinovich in the line up!

Om du läser det här idag, den 13 december, missa då inte vårt live online event om Windows Azure som startar kl 18.00: http://LearnWindowsAzureEvent.com

Läser du det här senare kan du kolla på alla sessioner online:
http://ch9.ms/lwa

Inga kommentarer: