1 Windows Azure SQL Database + VM Pekka Korhonen ja Ahti Haukilehto, senior-konsultit Soveltosta Sisältö Tietokannat Azuressa SQL Database Federointi Entity Frameworkin käyttö Federoinnissa Azure Storage Suorituskyky Hinnoittelu 2
2 Tietokanta Windows Azuressa Kaksi perusvaihtoehtoa SQL Database, tietokanta palveluna, ent. SQL Azure Azure VM, jossa SQL Server asennettuna Tärkeimmät erot Scale out vain Sql Databasessa (= federointi) Azure VM:ssä voit vaikuttaa palvelinlaitteen ominaisuuksiin (keskusmuisti, ytimet) Ja onhan tietysti Azure Storage, ml. Tables Ei ole relaatiokanta 3 Windows Azure SQL Database (ent. SQL Azure) 4
3 Kytkeytyminen SQL Databaseen Vain SQL Server autentikointi, ei Windows-autentikointia Ei Use tietokanta komentoa, eli kantaa ei voi vaihtaa lennossa Connection Stringissä siis: palvelin, käyttäjätunnus, salasana, kanta esim: Server=tcp:soxpw8k0ij.database.windows.net;Database=KirjaDB;Use r ID=Pekka@soxpw8k0ij;Password=myPassword; Trusted_Connection=False;Encrypt=True; Liikennöinti aina tcp-porttiin 1433 (jonne siis ulospäin lähtevä liikenne sallittava) 5 SQL Database sovellukset Yhteys tietokantaan saatetaan katkaista mm. seuraavista syistä suuri resurssien käyttö (ylikuormitus) pitkään kestävät kyselyt pitkä yksittäinen transaktio yhteys pitkään käyttämättä (ei tapahdu mitään) Sovelluksen olisi varauduttava yhteyden katkeamiseen ja uudelleen kytkeytymiseen http://windowsazurecat.com/2010/10/best-practices-forhandling-transient-conditions-in-sql-azure-client-applications/ 6
4 Looginen vs. fyysinen hallinta Palvelu huolehtii fyysisestä hallinnasta Automaattinen HA out of box Transparent failover kaatumistilanteissa Kuormantasaus, Load balancing (SLA) Ei ole edes mahdollista viitata fyysisiin levyihin Ei mahdollista käyttää tiedostoryhmiä Ei mahdollista vaikuttaa muistin määrään Ei mahdollista vaikuttaa prosessorien määrään Skaalaus siis vain Luomalla useita kantatoja tai Federaatioilla 7 SQL Azure tietokannat Kaksi kantatyyppiä (ja vain kaksi) WEB max. koko 1-5 GB Business max. koko 10-150 GB Hinta käytetyn koon mukaan, jyvitetään per päivä Max 149 kantaa + master per Server Kollaatio-asetus voidaan antaa kannan luonnin yhteydessä. Ei voi muuttaa. Snapshot-lukitustaso aina käytössä (ei voi muuttaa) Klusteroitu indeksi pakollinen tauluissa luotava viimeistään ennen Insert-komentoja Ei hajautettuja DTC-tapahtumaa 8
5 Käyttäjätunnusten luominen -- Master-tietokanta: CREATE LOGIN login1 WITH password='<providepassword>'; CREATE DATABASE database1; -- Tarvittaessa loginille roolit: -- näitä peruskäyttäjä ei tarvitse EXEC sp_addrolemember 'dbmanager', 'login1user'; EXEC sp_addrolemember 'loginmanager', 'login1user'; -- systeemitaulut: SELECT * FROM sys.sql_logins; SELECT * FROM sys.databases; -- Uusi yhteys suoraan luotuun kantaan: CREATE USER login1user FROM LOGIN login1; -- oikeudet normaaliin tapaan, esim. exec sp_addrolemember 'db_datareader', Login1User 9 Varmistukset Server Failure automaatinen High Availability Inhimillinen/sovellusvirhe Ei Backup-käsitettä! Voidaan kiertää luomalla uusi kanta kopiona vanhasta CREATE DATABASE Database1B AS COPY OF Database1A TAI Export/Import BACPACina Azure Storageen tai On-Premises levyille 3. osapuolien tuotteet, esim codeplex 10
6 SQL Azure Data Sync 11 Hinnoittelu Hinta lasketaan jyvitettynä päivittäin ko. päivän maksimikoon mukaan (koko pyöristetään yli gigan kannoille seuraavaan täyteen gigaan) 99,9% SLA 12
7 SQL Azure Federation Miten toteutetaan esim. SaaS-järjestelmä (multitenant)? oma palvelin oma kanta oma schema kaikki data samoissa tauluissa vai federointi tarvitaanko tenant kohtainen backup/restore, scheman customointi, suorituskykyä? Federation perustuu datan hajautukseen useaan tietokantaan (federation member) Data hajautetaan Federation Keyllä T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 kaikki data yhdessä kannassa T11 T12 T13 T14 T15 T16 T17 T18 T19 T20 13 Federation Use Federation Syntaksi Filtering optio oleellinen Kertoo sen nähdäänkö koko federaation sisältö vai vain valittu jäsen USE FEDERATION ROOT WITH RESET TAI USE FEDERATION federation_name (distribution_name = value) WITH [FILTERING={ON OFF},] RESET 14
8 Federation, esim. CREATE FEDERATION AsiakasFederation(id bigint RANGE) GO USE FEDERATION AsiakasFederation(id=0) WITH RESET, FILTERING=OFF GO --DROP TABLE ASIAKAS CREATE TABLE [dbo].[asiakas]( [OrgId] [bigint] NOT NULL, [asnro] [uniqueidentifier] NOT NULL DEFAULT NEWID(), [nimi] [varchar](100) NULL, [osoite] [varchar](100) NULL, [puhelin] [varchar](100) NULL, [selite] [varchar](500) NULL, ) FEDERATED ON (id=orgid) go create unique clustered index a1 on asiakas(orgid, asnro) go 15 Federation, esim.2 GO ALTER FEDERATION AsiakasFederation SPLIT AT (id=40000) GO ------------------------- Federaation käyttö ------------------- ------------------------- FILTER on / off USE FEDERATION AsiakasFederation(id=50000) WITH RESET, FILTERING=Off -- paluttaa kaikki 40000 -> USE FEDERATION AsiakasFederation(id=50000) WITH RESET, FILTERING=On -- palauttaa vain id = 50000 16
9 Federation DEMO 1 7 Esimerkki, Federoitu kanta, jossa M-M -sude 18
10 Esimerkki: Federoitu kanta ja Entity Framework Kannan voi suunnitella EF Designerilla tai Code-First Käyttää Root-federaatiota Mutta generoituun DDL:n on käsin lisättävä federointi Federointiavain ja klusteroidut indeksit on korjattava. Koska PK on (usein) GUID, on syytä olla CreatedOn tyyppinen kenttä järjestyksen saamiseksi Mekaaninen muutos, on mahdollista tehdä ohjelmallisesti -- Creating table 'Users' CREATE TABLE [dbo].[users] ( [Id] uniqueidentifier NOT NULL default newid(), [Name] nvarchar(max) NOT NULL, [Customer_id] bigint NOT NULL default 0, [CreatedOn] datetime2 NOT NULL default sysdatetime() ) FEDERATED ON (range_id = customer_id) 19 Kannan luonti - EF Primary Key:n on lisättävä federaatio Kuten myös viiteavaimiin -- Creating primary key on [Id] in table 'Users' ALTER TABLE [dbo].[users] ADD CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED (customer_id, [Id] ASC); GO -- Creating foreign key on [Groups_Id] in table 'UserGroup' ALTER TABLE [dbo].[usergroup] ADD CONSTRAINT [FK_UserGroup_Group] FOREIGN KEY (customer_id, [Groups_Id]) REFERENCES [dbo].[groups] (customer_id, [Id]) ON DELETE NO ACTION ON UPDATE NO ACTION; 20
11 Federointi, M-M -suhde Liitostauluun on lisättävä federointi-avain Jos EF-model (eikä Code-First), niin sille annetaan default-arvo -- Creating table 'UserGroup' CREATE TABLE [dbo].[usergroup] ( [Users_Id] uniqueidentifier NOT NULL, [Groups_Id] uniqueidentifier NOT NULL, [Customer_id] bigint NOT NULL default 40, -- tässä federaatio 40 [CreatedOn] datetime2 NOT NULL default sysdatetime() ) FEDERATED ON (range_id = customer_id) 21 Federointi ja EF -käsittely Federaatio on asetettava kuhunkin dbconnect:oon using (FedTestEntities dc = new FedTestEntities()) { string federationcmdtext = @"USE FEDERATION FED_1 (range_id=40) WITH FILTERING=ON, RESET"; } // Tietokantayhteys on explisiittisesti avattava ja asetetaan federaatio ((IObjectContextAdapter)dc).ObjectContext.Connection.Open(); dc.database.executesqlcommand(federationcmdtext); // ja sitten käsittely datagridview1.datasource = dc.orders.tolist(); 22
12 Federaatiot - rajoituksia MARS (Multiple Active Result Sets) ei voi olla päällä Joka on EF:n oletus Joten Lazy loading ei ole käytettävissä! // Ei lazy loading, siksi ToList() foreach (var order in dc.orders.tolist()) { listbox1.items.add("order id:" + order.order_id); // explicit load will not work because no MARS // dc.entry(order).collection(o => o.orderdetails).load(); } foreach (var orderdetail in order.orderdetails) { listbox1.items.add(" orderdetail id:" + orderdetail.order_detail_id); } 23 Federaatiot - rajoituksia MSDTC ei tuettu, vain lokaali Tx tuettuna Azure SQL:n oletus Read Commited Snapshot Isolation (RCSI) Transaktiot on tehtävä seuraavassa järjestyksessä 1. Avaa tietokantayhteys 2. Use Federation 3. Aloita Local Tx 24
13 Federaatiot local Tx using (FedTestEntities dc = new FedTestEntities()) { string federationcmdtext = @"USE FEDERATION FED_1 (range_id=40) WITH FILTERING=ON, RESET"; ((IObjectContextAdapter)dc).ObjectContext.Connection.Open(); dc.database.executesqlcommand(federationcmdtext); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { Order order = dc.orders.first(); order.total_cost += 1; dc.savechanges(); scope.complete(); } } 25 Windows Azure tietovarastot 1. Windows Azure Storage 2. Windows Azure SQL Database Ovat hyvin erilaisia kuin on-premises ratkaisuissa Tästä (yhdessä security-muutosten kanssa) aiheutuu suurin muutostarve olemassa oleviin sovelluksiin On-premises sovellusta ei nyt vain voi sellaisenaan siirtää pilveen Sql Azure on SQL-kanta, mutta sitä ei pilvisovelluksissa käytetä (välttämättä) kaiken datan säilyttämiseen Sitä käytetään usein yhdessä Azure Storagen kanssa Azure Storage on halvempi ja skaalautuvampi
14 Blobs e.g. pictures, videos, documents Tables e.g. entities with properties (no schema) Queues e.g. asynchronous messaging Windows Azure Storage + SQL Azure HTTP/ REST SQL Azure TDS Windows Azure Storage Skaalutuva datavarasto pilvessä No-SQL 100TB per storage account Auto-scale to meet massive volume and throughput RESTful Web Service API Access from Windows Azure Compute Access from anywhere via internet Supporting.NET Client Library
15 Miksi Azure Storage Table Sovellusarkkitehtuuri erityisesti se, kuinka client käyttää tietovarastoa mahdollistaa huiman skaalautuvuuden HTTP Rest Key : PartitionKey, RowKey; jokainen client, jokainen kutsu, ottaa kantaa hajautukseen Data on hajautunut useilla palvelimille. PartitionKey:llä sovellus osoittaa sen, mikä data olisi syytä olla lähekkäin. Pay as you Go velotusmalli 29 Windows Azure Storage suorituskyky Scalability Dimension Total Windows Azure Storage Account Capacity Number of Windows Azure Storage Account Transactions Target Up to 100 TBs Up to a few thousand requests per second Total Windows Azure Storage Account Bandwidth Up to a few hundred megabytes per second a table with good partitioning can process up to a few thousand requests per second.
16 Windows Azure Storage Tables Key-Value storage No-SQL On siis serialisoitujen entiteettien varasto Taulussa voi olla mitä tahansa entiteettejä Client-koodi yleensä rajoittaa/hoitaa sen, että vai yhdenlaisia Ei ole indeksejä (paitsi RowKey) Taulut ovat täysin riippumattomia toisistaan Viite-eheyttä ei ole Ei voida tehdä join-kyselyjä Joka toisaalta mahdollistaa sen skaalautuvuuden Azure Storage Table - partitiot Partitiot voidaan tallentaa eri palvelimille Hajautus tehdään automaattisesti käytön perusteella Joka mahdollistaa automaattisen rinnakkaisen kyselyn Clientin tekemä haku voi kohdistua useaan partitioon Tehokkaimmat kyselyt kuitenkin aina partitio-kohtaisia (ja mieluusti myös RowKey-ehto) 32
17 Windows Azure Storage kyselyt Table storage queries are limited to 1000 entities by default. If a query finds more than 1000 entities, a continuation token is returned and must be used by the application to retrieve the next set of entities. Queries that take longer than 5 seconds to execute also return a continuation token. Queries that take longer than 30 seconds are cancelled. Data in table storage is organized by partition key and indexed by row key. Because there are no custom indexes in tables, queries by partition key and row key are fast, but queries that do not use partition key and row key are slow. Client-kirjasto hoitaa nämä rajoitukset Tietotyypit Table Storage Supported Property Types byte[] bool DateTime double Guid Int32 or int Int64 or long String Ei ole esim decimal-tyyppiä, valutta-arvot täytyy tallentaa sovelluksen omalla tavalla
18 Tables, Entities, Properties ja Partitions Max 255 properties (sisältää PartitionKey, RowKey ja Timestamp. Total Size (sisältäen propertien nimet) max 1 MB. Pitääkö property-nimet lyhentää a1, a2, a3 jne Säästää samalla tietoliikennekustannuksia Yleensä dataaccess-kerroksen olioita ei voi monestakaan syystä käyttää ylempänä, vaan data on kopiotava Model-oliohin. Se mahdollistaa myös tälläisen hakkeroinnin Keys Kullakin entiteetillä on oltava PartitionKey ja RowKey Niiden muodostamisalgoritmi on mietittävä tarkoin. Datan järjestys ja järkevä sivuttaminen on mahdollista tehdä vain partition sisällä RowKey:llä Joten sen rakentamisalgoritmi on mietittävä vielä tarkemmin PartitionKey ja RowKey ovat merkkijonoja. Kummankin pituus max 1 KB RowKey:n pitää olla yksilöllinen partition sisällä Eivät voi sisältää seuraavia merkkejä: / \ #?
19 Table-dataa käyttävä koodi Yleensä kirjoitetaan entiteettiluokka ja TableServiceContext luokka Rest ei näy sovelluskehittäjälle Azure Storage SaaS-sovelluksen tietovarastona, etuja Internet skaalautuvuus jokainen sovellus, jokainen DataAccess koodi, on partitiontitietoinen => multitenancy on jo äidinmaidossa saatu PartitionKey on luontevasti OrganizationID:stä muodostettu Organisaation data on yhdessä partitioissa Partitio sisältää vain yhden organisaation dataa Client-koodi on helppo hajauttaa
20 Ja niitä haittoja toimittajariippuvuus, vain yksi hostausvaihtoehto paljon koodia, vähän palveluja tietokantaosaajalle paljon ylläreitä Esim. tx Erittäin rajoittunut kyselykieli, mm. lajittelun puuttuminen Hallintavälineiden ja mahdollisuuksien puuttuminen Data on hajautunut kuin mustikat metsään. Esim. yhden organisaation poistaminen/turvakopiointi/synkronointi suuren työn takana Yleiskuvan saaminen datavarastosta vaikeaa Suorituskyky 39 Mittaustuloksia, massiivien päivitys Mittaustulokset, iso usean taulun insert Proc N. 1 Milj. riviä Voidaan Tx:nä tai ilman (jokainen insert on TX) 2012 On-prem: TX: 21 s SQLDatabase TX 255 s 2013 On-prem: TX: 11 s (SSD) SQLDatabase TX: 43 s Azure VM + SQL TX: 20 s, Cachen vaikutus n. 10% On-prem: ei TX: 85 s (SSD) SQLDatabase ei TX: n 1 h Azure VM + SQL ei TX: n. 2 h 40
21 Azure vm hinnat Windows Server CPU Memory GB /h GA /kk koko ajan /kk 10 h/tp Extra Small Share 0.7 0,0142 10 3 d Small 1 1.75 0,0816 59 18 Medium 2 3.5 0,1632 118 36 Large 4 7 0,3263 235 72 Extra Large 8 14 0,6525 470 144 41 Azure VM + SQL Sql Server CPU /h GA /kk koko ajan /kk 10 h/tp jos mahdollista Extra Small Share N/A N/A N/A d Small 1 0,3901 340 104 Medium 2 0,3901 398 122 Large 4 0,3901 516 158 Extra Large 8 0,7802 1032 315 Palveluna ostetun Windows Azure SQL Databasen kuukausihinta on noin 90 /kk. 42
22 Mittaustuloksia, Datan hakeminen Tilaukset, tilausrivit ja tuotteet Azure Storage Table Sql, oma kanta EF Sql Azure EF 10 0,8 0,05 0,2 100 13 0,2 1,7 1000 120 1,2 14 43 Q&A t