Sorry
This feed does not validate.
Kurzum die Dienste, die noch mit den alten ASM APIs erstellt worden sind.
^
In addition, interoperability with the widest range of feed readers could be improved by implementing the following recommendation.
Source: http://feeds.feedburner.com/SaschaDittmann
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
<channel>
<title>Sascha Dittmann</title>
<atom:link href="https://www.sascha-dittmann.de/feed/" rel="self" type="application/rss+xml" />
<link>https://www.sascha-dittmann.de</link>
<description>Über .NET, SQL Server und die Cloud</description>
<lastBuildDate>Tue, 05 Sep 2017 17:08:10 +0000</lastBuildDate>
<language>de-DE</language>
<sy:updatePeriod>
hourly </sy:updatePeriod>
<sy:updateFrequency>
1 </sy:updateFrequency>
<generator>https://wordpress.org/?v=6.1.4</generator>
<item>
<title>Time Machine Backups nach Microsoft Azure</title>
<link>https://www.sascha-dittmann.de/2017/09/time-machine-backups-nach-microsoft-azure/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Tue, 05 Sep 2017 16:54:15 +0000</pubDate>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[Apple]]></category>
<category><![CDATA[Azure File Storage]]></category>
<category><![CDATA[Backup]]></category>
<category><![CDATA[Cloud]]></category>
<category><![CDATA[MacOS]]></category>
<category><![CDATA[Microsoft Azure]]></category>
<category><![CDATA[SMB]]></category>
<category><![CDATA[Time Machine]]></category>
<guid isPermaLink="false">https://www.sascha-dittmann.de/?p=12039</guid>
<description><![CDATA[Seit einigen Jahren verwende ich eine Apple Time Capsule, um meine Time Machine Backups an einem zentralen Ort speichern zu können.
Bislang hatte das für mich auch vollkommen ausgereicht.
Seitdem ich jedoch immer mehr unterwegs bin, habe ich nach einer Lösung gesucht, die ich auch von unterwegs nutzen kann.
In diesem Blog Post zeige ich deshalb, wie man Time Machine Backups nach Microsoft Azure machen kann.]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" alt="Time Machine Backups nach Microsoft Azure" class="alignleft size-thumbnail" height="150" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure-150x150.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; border: 0px none;" width="150" /><strong>Seit einigen Jahren verwende ich eine Apple Time Capsule, um meine Time Machine Backups an einem zentralen Ort speichern zu können.<br />
Bislang hatte das für mich auch vollkommen ausgereicht.<br />
Seitdem ich jedoch immer mehr unterwegs bin, habe ich nach einer Lösung gesucht, die ich auch von unterwegs nutzen kann. </strong>
</p>
<p>
Anfangs habe ich hierfür eine externe Platte mit USB Anschluss benutzt.<br />
Jedoch war dies einerseits nicht besonders praktisch, da ich ein zusätzliches Gerät mit mir rumschleppen musste.<br />
Und andererseits ist es nicht besonders sinnvoll die Backups, sowie das zu sichernde MacBook, am gleichen Ort aufzubewahren.
</p>
<p>
Deshalb möchte ich heute zeigen, wie man Time Machine Backups nach Microsoft Azure sichern kann.
</p>
<p> </p>
<h2>
Einen Fileshare im Azure Portal anlegen<br />
</h2>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure01.png" target="_blank"><img decoding="async" loading="lazy" alt="New Azure Storage Account" class="alignleft size-medium wp-image-12044" height="177" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure01-300x177.png" style="border: 0px none;" width="300" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure01-300x177.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure01-768x454.png 768w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure01-1024x605.png 1024w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure01-150x89.png 150w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure01.png 1355w" sizes="(max-width: 300px) 100vw, 300px" /></a>Zuerst müsste hierfür ein Storage Account anlegen.<br />
Dazu meldet ihr euch am Azure Portal an.<br />
Anschließend klickt ihr auf das Plus-Symbol (oben links), dann auf Storage und dann auf Storage Account.
</p>
<p style="display: inline-block;">In dem geöffneten Blade gebt ihr den Namen des neuen Storage Accounts, die Ressource-Gruppe und die Azure-Region an.<br />
Als Replikationstyp langen LRS (für drei Kopien in der ausgewählten Region) oder GRS (für drei zusätzliche Kopien in der Geschwisterregion) vollkommen aus.
</p>
<p><a href="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure02.png" target="_blank"><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure02-474x1024.png" alt="" width="474" height="1024" class="alignnone size-large wp-image-12045" style="border: 0px none;" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure02-474x1024.png 474w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure02-139x300.png 139w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure02-768x1659.png 768w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure02-69x150.png 69w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure02.png 840w" sizes="(max-width: 474px) 100vw, 474px" /></a></p>
<p>
Sobald das Storage Account erstellt ist, navigiert ihr zu dem Files-Dienst…
</p>
<p>
<a href="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure03.png" target="_blank"><img decoding="async" loading="lazy" alt="Azure File Service" class="alignnone size-medium wp-image-12046" height="114" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure03-300x114.png" style="border: 0px none;" width="300" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure03-300x114.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure03-150x57.png 150w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure03.png 730w" sizes="(max-width: 300px) 100vw, 300px" /></a>
</p>
<p>
…und legt dort einen neuen Fileshare an.
</p>
<p>
<a href="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure04.png" target="_blank"><img decoding="async" loading="lazy" alt="Create File Share" class="alignnone size-medium wp-image-12047" height="215" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure04-300x215.png" style="border: 0px none;" width="300" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure04-300x215.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure04-768x552.png 768w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure04-150x108.png 150w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure04.png 1011w" sizes="(max-width: 300px) 100vw, 300px" /></a>
</p>
<p> </p>
<h2>Fileshare mounten</h2>
<p>
Anschließend könnt ihr im Finder im MacOS euch mit dem Fileshare verbinden.</p>
<p><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure05.png" alt="Connect to Server... (Menu)" width="612" height="467" class="alignnone size-full wp-image-12048" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure05.png 612w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure05-300x229.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure05-150x114.png 150w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<p><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure06.png" alt="Connect to Server... (Dialog)" width="486" height="231" class="alignnone size-full wp-image-12049" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure06.png 486w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure06-300x143.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure06-150x71.png 150w" sizes="(max-width: 486px) 100vw, 486px" /></p>
<p>
Ihr werdet dann aufgefordert den Benutzernamen und das Passwort für die Verbindung anzugeben.<br />Welche ihr am besten auch in der Keychain speichert.</p>
<p><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure07.png" alt="Attempting to connect to the server" width="420" height="162" class="alignnone size-full wp-image-12050" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure07.png 420w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure07-300x116.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure07-150x58.png 150w" sizes="(max-width: 420px) 100vw, 420px" /></p>
<p><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure08.png" alt="Enter user credentials" width="430" height="283" class="alignnone size-full wp-image-12051" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure08.png 430w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure08-300x197.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure08-150x99.png 150w" sizes="(max-width: 430px) 100vw, 430px" /></p>
<p>
Beides findet ihr unter Access Keys im Azure Portal.
</p>
<p><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure09-1024x251.png" alt="Azure Storage Access Keys" width="618" height="151" class="alignnone size-large wp-image-12052" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure09-1024x251.png 1024w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure09-300x74.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure09-768x189.png 768w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure09-150x37.png 150w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure09.png 1507w" sizes="(max-width: 618px) 100vw, 618px" /></p>
<blockquote>
<p>Damit ihr euch mit dem Fileshare verbinden könnt, muss der Port 445 in den entsprechenden Firewalls freigegeben sein.
</p>
</blockquote>
<p> </p>
<h2>Erstellen eines Sparse-Bundles</h2>
<p>Da die Apple Time Machine nur Datensicherungen auf einen Datenträger mit HFS+ Dateisystem durchführt, müssen wir als nächstes ein Sparse-Bundle erstellen.
</p>
<p>Dazu öffnen wir am besten ein Terminalfenster und wechseln in den Mount Point des Azure-Fileshares.
</p>
<pre>
cd /Volumes/backups/
</pre>
<p>
Anschließend erstellen wir mit folgendem Befehl ein Sparse-Bundle.<br />
Dieses sollte mindestens doppelt so groß sein wie die zu sichernde Festplatte.
</p>
<pre>
hdiutil create -size 1t -type SPARSEBUNDLE -fs "HFS+J" -volname AzureTimeCapsule AzureTimeCapsule.sparsebundle
</pre>
<blockquote>
<p>
Falls dabei Timeouts auftreten, kann man das Sparse-Bundle auch vorerst lokal erstellen und anschließend in den Fileshare verschieben.
</p>
</blockquote>
<p>
Danach kann man das Sparse-Bundle mit folgendem Befehl mounten oder ihr macht alternativ einen Doppelklick auf das Sparse-Bundel im Finder.
</p>
<pre>
hdiutil attach -mountpoint /Volumes/AzureTimeCapsule /Volumes/backups/AzureTimeCapsule.sparsebundle
</pre>
<p>
Zu guter Letzt, muss man die neue "Festplatte" nur noch als weiteres Ziel der Time Machine hinzufügen.
</p>
<pre>
sudo tmutil setdestination -a /Volumes/AzureTimeCapsule
</pre>
<p><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure10.png" alt="Sparse-Bundle in der Time Machine" width="668" height="440" class="alignnone size-full wp-image-12053" srcset="https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure10.png 668w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure10-300x198.png 300w, https://media.sascha-dittmann.de/blog/2017/09/TimeMachineToAzure10-150x99.png 150w" sizes="(max-width: 668px) 100vw, 668px" /></p>
<blockquote>
<p>
Beim ersten Backup, sollte man eine Internetverbindung mit ausreichender Bandbreite zur Verfügung haben, da dies einige Stunden – wenn nicht sogar Tage – dauern kann.
</p>
</blockquote>
<h2>Video Anleitung (Englisch)</h2>
<p>Wer das Ganze auch noch mal als Video sehen möchte, kann sich <a href="https://youtu.be/_TDi3Et9-cs" target="_blank">hier</a> mein englisches YouTube-Video dazu ansehen.</p>
<p> </p>
<hr />
<div style="display: inline-block;">
<div style="float: left;">
<img decoding="async" alt="Weitere Informationen" src="https://media.sascha-dittmann.de/blog/Shared/info.png" />
</div>
<div style="float: left;">
<p>
Weitere Informationen:
</p>
<ul>
<li>
<a href="https://azure.microsoft.com/en-us/services/storage/files/" rel="nofollow" target="_blank">Microsoft Azure File Storage</a>
</li>
<li>
<a href="https://de.wikipedia.org/wiki/Time_Machine_(Apple)" rel="nofollow" target="_blank">Wikipedia: Time Machine (Apple)</a>
</li>
<li>
<a href="https://youtu.be/_TDi3Et9-cs" target="_blank">YouTube: Time Machine Backups to Microsoft Azure (English)</a>
</li>
</ul></div>
</div>
]]></content:encoded>
</item>
<item>
<title>Azure Storage Account (Classic) nach Azure Resource Manager (ARM) migrieren</title>
<link>https://www.sascha-dittmann.de/2017/02/azure-storage-account-classic-nach-azure-resource-manager-arm-migrieren/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Tue, 21 Feb 2017 06:52:53 +0000</pubDate>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[ARM]]></category>
<category><![CDATA[Blob Storage]]></category>
<category><![CDATA[Microsoft Azure]]></category>
<category><![CDATA[PowerShell]]></category>
<guid isPermaLink="false">https://www.sascha-dittmann.de/?p=12010</guid>
<description><![CDATA[Am vergangenen Wochenende wollte ich endlich mal meine private Azure Subscription aufräumen, die ich seit vielen Jahren für meine Community Projekte nutze. Dabei bin ich über ein Problem mit den "alten" Storage Accounts gestolpert, dass sich durch eine Migration auf ARM beheben lässt.
Deshalb möchte ich in diesem Blog Post beschreiben, wie man ein Azure Storage Account (Classic) auf den Azure Resource Manager (ARM) migrieren kann.]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="Azure Storage Account (Classic) nach Azure Resource Manager (ARM) migrieren" class="alignleft size-thumbnail" height="150" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage-150x150.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; border: 0px none;" width="150" /><strong>Am vergangenen Wochenende wollte ich endlich mal meine private Azure Subscription aufräumen, die ich seit vielen Jahren für meine Community Projekte nutze. Dabei bin ich über ein Problem mit den "alten" Storage Accounts gestolpert, dass sich durch eine Migration auf ARM beheben lässt.<br />
Deshalb möchte ich in diesem Blog Post beschreiben, wie man ein Azure Storage Account (Classic) auf den Azure Resource Manager (ARM) migrieren kann.</strong>
</p>
<h2>
Wo lag eigentlich das Problem?<br />
</h2>
<p>
Nachdem sich in meiner ältesten Azure Subscription doch einige Altlasten über die letzten Jahre angesammelt hatten, wollte ich am vergangenen Wochenende endlich mal Ordnung schaffen.<br />
Dazu nahm ich mir als erstes die "Default-…" Ressourcegruppen vor.<br />
Kurzum die Dienste, die noch mit den alten ASM APIs erstellt worden sind.
</p>
<p>
Einige der darin befindlichen Dienste, wollte ich in neue Ressourcegruppen umziehen…<br />
<a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_00.png" target="_blank"><img decoding="async" loading="lazy" alt="Move to another resource group" height="188" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_00-300x188.png" width="300" /></a>
</p>
<p>
</p>
<p>
Bei diesem Vorhaben, bin ich allerdings über die Meldung "Resource that cannot be moved" gestolpert…<br />
<a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_01.png" target="_blank"><img decoding="async" loading="lazy" alt="Resource that cannot be moved" height="300" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_01-264x300.png" width="264" /></a>
</p>
<p>
Das Ganze brachte mich auf die Frage:<br />Kann man eigentlich ein klassisches Azure Storage Account nach ARM migrieren?<br />
Ein wenig Nachforschung zeigte schnell:<br />Ja, das geht.</p>
<p>
Dazu müssen, wie so oft, die <a href="https://docs.microsoft.com/en-us/powershell/azureps-cmdlets-docs/" target="_blank">PowerShell Cmdlets für Azure</a> installiert sein.
</p>
<p>
</p>
<h2>
Registrierung des Azure Resource Providers</h2>
<p>
Zuerst öffnet man das PowerShell Eingabefenster und loggt man sich in die entsprechende Azure Subscription für den Azure Resource Manager ein…
</p>
<pre>
Login-AzureRmAccount
Select-AzureRmSubscription -SubscriptionName "<Name der Subscription>"</pre>
<p>
Anschließend muss der entsprechende Azure Resource Provider registriert werden…
</p>
<pre>
Register-AzureRmResourceProvider -ProviderNamespace Microsoft.ClassicInfrastructureMigrate</pre>
<p>
Die Registrierung passiert dann asynchron im Hintergrund.<br />
Um zu sehen, wann dies beendet ist, kann folgender Befehl ausgeführt werden…
</p>
<pre>
Get-AzureRmResourceProvider -ProviderNamespace Microsoft.ClassicInfrastructureMigrate</pre>
<p>
Sobald der Azure Resource Provider registriert ist, kann mit der Migration losgelegt werden…<br />
<a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_02.png" target="_blank"><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_02-300x46.png" alt="Azure PowerShell Provider is registered" width="300" height="46" /></a>
</p>
<p>
</p>
<h2>
Migration des Azure Storage Accounts<br />
</h2>
<p>Beim Azure Resource Manager hatte wir uns ja bereits für die Provider Registrierung angemeldet.<br />Jetzt muss man noch das Gleiche bei den klassischen ASM APIs machen…</p>
<pre>
Add-AzureAccount
Select-AzureSubscription -SubscriptionName "<Name der Subscription>"</pre>
<p>Zur Kontrolle noch ein kurzer Blick in das Azure Portal und los gehts…<br />
<a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_03.png" target="_blank"><img decoding="async" loading="lazy" alt="Azure Portal - Storage Accounts (classic)" height="185" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_03-300x185.png" width="300" /></p>
<p></a></p>
<p>Die Migration läuft in zwei Schritten ab.<br />In Schritt Eins muss das entsprechende Storage Account mit folgendem Befehl vorbereitet werden…</p>
<pre>
Move-AzureStorageAccount -Prepare -StorageAccountName "saschadittmann"</pre>
<p>Das dauert einen Moment und sollte mit folgender Meldung quittiert werden…<br /><a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_04.png" target="_blank"><img decoding="async" loading="lazy" alt="Azure Storage Account (Prepared)" height="41" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_04-300x41.png" width="300" /></a>
</p>
<p>Eine erneute Kontrolle im Azure Portal zeigt, dass jetzt zwei Azure Storage Accounts mit dem gleichem Namen existieren.<br />Das neue Azure Storage Account wurde außerdem in einer eigenen bzw. neuen Ressourcegruppe hinzugefügt.<br />
<a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_05.png" target="_blank"><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_05-300x186.png" alt="Azure Portal - Storage Accounts (Both)" width="300" height="186" /></a></p>
<p>Jetzt sollte man ausführlich prüfen, ob man mit dem Migrationsergebnis zufrieden ist.</p>
<p>Wenn ja, kann man mit Schritt Zwei die Migration abschließen…</p>
<pre>
Move-AzureStorageAccount -Commit -StorageAccountName "saschadittmann"</pre>
<p>… oder rückgängig machen …</p>
<pre>
Move-AzureStorageAccount -Abort -StorageAccountName "saschadittmann"</pre>
<p>Auch das wird wieder entsprechend von PowerShell quittiert.<br /> <br />
<a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_06.png" target="_blank"><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_06-300x44.png" alt="Azure Storage Account (Committed)" width="300" height="44" /></a></p>
<p>Im Azure Portal sollte jetzt auch nur das neue Storage Account zu sehen sein…<br /><a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_07.png" target="_blank"><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_07-300x196.png" alt="Azure Portal - Storage Accounts (New)" width="300" height="196" /></a></p>
<p>Zu guter Letzt kann das neue Storage Account im Azure Portal, oder auch via PowerShell, umgezogen werden…</p>
<pre>
Get-AzureRmResource -ResourceType "Microsoft.Storage/storageAccounts" `
-ResourceName "saschadittmann" `
-ResourceGroupName "saschadittmann-Migrated" `
| Move-AzureRmResource -DestinationResourceGroupName "saschadittmann"</pre>
<p><a href="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_08.png" target="_blank"><img decoding="async" loading="lazy" src="https://media.sascha-dittmann.de/blog/2017/02/MigrateStorage_08-300x46.png" alt="Azure Storage Account moved to new Resource Group" width="300" height="46" /></a></p>
<hr />
<div style="display: inline-block;">
<div style="float: left;">
<img decoding="async" alt="Weitere Informationen" src="https://media.sascha-dittmann.de/blog/Shared/info.png" />
</div>
<div style="float: left;">
<p>
Weitere Informationen:
</p>
<ul>
<li>
<a href="https://docs.microsoft.com/en-us/powershell/azureps-cmdlets-docs/" target="_blank" rel="nofollow">Get started with Azure PowerShell cmdlets</a>
</li>
<li><a href="https://docs.microsoft.com/en-us/powershell/servicemanagement/azure.service/v2.1.0/move-azurestorageaccount" target="_blank" rel="nofollow">Azure PowerShell Cmdlet: Move-AzureStorageAccount</a></li>
</ul></div>
</div>
]]></content:encoded>
</item>
<item>
<title>SQL Saturday #409 Rheinland – Slides und Demos</title>
<link>https://www.sascha-dittmann.de/2015/07/sql-saturday-409-rheinland-slides-und-demos/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Sun, 12 Jul 2015 09:15:41 +0000</pubDate>
<category><![CDATA[.NET]]></category>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[SQL Server]]></category>
<category><![CDATA[Big Data]]></category>
<category><![CDATA[Cloud]]></category>
<category><![CDATA[Community]]></category>
<category><![CDATA[DocumentDB]]></category>
<category><![CDATA[Microsoft Azure]]></category>
<category><![CDATA[NoSQL]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=11712</guid>
<description><![CDATA[Vergangenen Samstag fand der dritte deutsche SQL Saturday statt. Wie auch im letzten Jahr konnte dafür als Austragungsort die Hochschule Bonn-Rhein-Sieg genutzt werden. Gemeinsam mit Alexander Karl durfte ich dort eine Session zum Thema "SQL Server vs. Azure DocumentDB – Ein Battle zwischen XML und JSON" halten. Die verwendeten Slides und Code Beispiele findet ihr in diesem Blog Post.]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="SQL Saturday #409 Rheinland" class="alignleft size-thumbnail wp-image-11742" height="150" src="https://media.sascha-dittmann.de/blog/2015/06/SQLSat409-150x150.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; border: 0px none;" width="150" srcset="https://media.sascha-dittmann.de/blog/2015/06/SQLSat409-150x150.png 150w, https://media.sascha-dittmann.de/blog/2015/06/SQLSat409-55x55.png 55w" sizes="(max-width: 150px) 100vw, 150px" /><strong>Am Samstag, dem 13. Juni 2015, fand der dritte deutsche <a href="http://www.sqlsaturday.com/409/eventhome.aspx" rel="nofollow" target="_blank">SQL Saturday</a> statt. Wie auch im letzten Jahr konnte dafür als Austragungsort die Hochschule Bonn-Rhein-Sieg genutzt werden.<br />
Gemeinsam mit Alexander Karl durfte ich dort eine Session zum Thema "SQL Server vs. Azure DocumentDB – Ein Battle zwischen XML und JSON" halten.<br />
Die verwendeten Slides und Code Beispiele findet ihr in diesem Blog Post.</strong>
</p>
<h2>
IoT Camp/Hackathon: Das Internet der Dinge live erleben<br />
</h2>
<p>
Doch bevor es mit dem eigentlichen SQL Saturday los ging, fanden am Tag davor zwei Pre-Conference Workshops statt.<br />
Gemeinsam mit <a href="http://oliviaklose.com" target="_blank">Olivia Klose</a> und <a href="https://kostjaklein.wordpress.com" target="_blank">Kostja Klein</a> habe ich das IoT Camp mitgestalten dürfen.
</p>
<p>
In diesem Workshop wurde erläutert, welche Typen von IoT Lösungen es gibt und wie man sie realisiert. An praktischen Beispielen wurden verschiedene Lösungen demonstriert und welche Anforderungen an die einzelnen Typen gestellt werden. Schwerpunkt lag dabei auf der praktischen Umsetzung auf Basis von Microsoft Azure und richtete sich sowohl an den Hobbyisten als auch an den Profi, der kommerzielle und hoch verfügbare Lösungen entwickeln muss.
</p>
<p>
<iframe loading="lazy" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/aFeWqJIIl6g" width="560"></iframe>
</p>
<p>
Mehr dazu gibt es auf <a href="http://oliviaklose.azurewebsites.net/techcamp-internet-of-things/" target="_blank">Olivia's Blog</a>.
</p>
<p>
</p>
<h2>
SQL Server vs. Azure DocumentDB – Ein Battle zwischen XML und JSON<br />
</h2>
<p>
Am Samstag waren dann <a href="https://www.xing.com/profile/Alexander_Karl6" rel="nofollow" target="_blank">Alexander Karl</a> und ich an der Reihe…<br />
Hier haben wir einen Vergleich zwischen SQL Server XML und der Microsoft Azure DocumentDB gezogen.
</p>
<h3>
Abstract<br />
</h3>
<p>
Seit dem SQL Server 2000 hielt Stück für Stück die XML-Unterstützung Einzug in die Microsoft RDBMS Welt.<br />
Mit der Azure DocumentDB kam die zweite, hauseigene NoSQL-Datenbank in der Microsoft Cloud hinzu, welche die Daten im JSON-Format verarbeitet.<br />
In dieser Session werden wir anhand eines Praxisbeispiels step-by-step, d.h. von den vorbereitenden Schritten, über das Schreiben bis hin zum Lesen der Daten, diese beiden Technologien gegenüberstellen. Dabei arbeiten wir die Vor- und Nachteile der einzelnen Ansätze heraus und zeigen Best Practices auf.
</p>
<h3>
Slides<br />
</h3>
<p>
<iframe loading="lazy" allowfullscreen="" frameborder="0" height="488" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/xvLKZbHJm5YrJf" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="585"></iframe>
</p>
<hr />
<div style="display:inline-block;">
<div style="float:left;width;150px;">
<img decoding="async" alt="Download" src="https://media.sascha-dittmann.de/blog/Shared/download.jpg" />
</div>
<div style="float:left;width;150px;">
<p>
Download der Demos:
</p>
<ul>
<li>
<a href="https://media.sascha-dittmann.de/blog/2015/07/SqlXmlVsDocumentDb_DocumentDB.zip">SqlXmlVsDocumentDb_DocumentDB.zip</a>
</li>
<li>
<a href="https://media.sascha-dittmann.de/blog/2015/07/SqlXmlVsDocumentDb_XML.zip">SqlXmlVsDocumentDb_XML.zip</a>
</li>
</ul>
<p>
Weitere Informationen
</p>
<ul>
<li>
<a href="https://dev.windows.com/en-us/iot" rel="nofollow" target="_blank">Develop Windows IoT apps</a>
</li>
<li>
<a href="https://github.com/ms-iot" rel="nofollow" target="_blank">GitHub: Microsoft IoT Samples</a>
</li>
<li>
<a href="https://github.com/RobertEichenseer/IoT_MasterClass" rel="nofollow" target="_blank">GitHub: Robert Eichenseer – IoT_MasterClass</a>
</li>
</ul></div>
</div>
<hr />
]]></content:encoded>
</item>
<item>
<title>Performance Optimierung von SQL Server Azure VMs</title>
<link>https://www.sascha-dittmann.de/2015/06/performance-optimierung-von-sql-server-azure-vms/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Fri, 05 Jun 2015 14:49:45 +0000</pubDate>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[SQL Server]]></category>
<category><![CDATA[Cloud]]></category>
<category><![CDATA[IaaS]]></category>
<category><![CDATA[Microsoft Azure]]></category>
<category><![CDATA[Performance]]></category>
<category><![CDATA[SQL Server 2014]]></category>
<category><![CDATA[Virtual Machines]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=11612</guid>
<description><![CDATA[Die Virtuellen Maschine der D-Serie in Azure eigenen sich besonders gut für Anwendungen mit einer hohen Arbeitslast.
In diesem Blog Post möchte ich deshalb zwei kleine Optimierungen vorstellen, mit denen man bei SQL Server Azure VMs der D-Serie zusätzliche Performance rausholen kann...]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="Performance Optimierung von SQL Server Azure VMs" height="150" src="https://media.sascha-dittmann.de/blog/2015/06/SQL_IaaS_Performance-150x150.jpg" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; float: left;" width="150" /><strong>Die Virtuellen Maschine der D-Serie in Azure eigenen sich besonders gut für Anwendungen mit einer hohen Arbeitslast.<br />
In diesem Blog Post möchte ich deshalb zwei kleine Optimierungen vorstellen, mit denen man bei SQL Server Azure VMs der D-Serie zusätzliche Performance rausholen kann…</strong>
</p>
<p>
Im <a href="http://azure.microsoft.com/blog/2014/09/22/new-d-series-virtual-machine-sizes/" rel="nofollow" target="_blank">September letzten Jahres</a> hat Microsoft eine neue Reihe an »Azure Virtual Machines« vorgestellt, die besonderen Wert auf Performance legen. Diese D-Serien VMs bieten bis zu 112GB Arbeitsspeicher, bis zu 800GB lokalen SSD-Festplattenspeicher und Prozessoren die ca. 60% schneller sind als die der A-Serie.
</p>
<p>
Durch die lokale SSD, welche als D: Laufwerk in der Windows-VM zur Verfügung gestellt wird, kann man bei SQL Server Azure VMs zusätzliche Performance rauskitzeln.
</p>
<h2>
Verschieben der tempdb-Datenbank<br />
</h2>
<p>
Eine Möglichkeit, diese SSDs zu auszunutzen, ist es die tempdb-Datenbank zu verschieben.
</p>
<p>
Hierzu richtet man 1-2 zusätzliche Verzeichnisse auf der SSD ein, wie beispielsweise D:\SQLData und D:\SQLLog, und weißt der tempdb-Datenbank den neuen Speicherort zu:
</p>
<pre>
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'D:\SQLData\tempdb.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'D:\SQLLog\templog.ldf');
</pre>
<p>
Zum Prüfen der Änderung kann dann folgendes Skript genutzt werden:
</p>
<pre>
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');</pre>
<p>
Anschließend muss der SQL Server Dienst neu gestartet werden, damit die Änderung aktiv wird.
</p>
<h2>
Buffer Pool Extensions<br />
</h2>
<p>
Eine weitere Möglichkeit kam mit dem SQL Server 2014 (Standard, Business Intelligence und Enterprise) hinzu.
</p>
<p>
Mit den <a href="http://msdn.microsoft.com/en-us/library/dn133176.aspx" rel="nofollow" target="_blank">Buffer Pool Extensions (BPE)</a> nutzt der Buffer Pool der SQL Engine zusätzliche die SSD-Festplatte, um somit noch mehr Daten im Cache halten zu können.
</p>
<blockquote>
<p>
Der Buffer Pool ist ein globaler In-Memory-Cache des SQL Servers, welcher <a href="https://technet.microsoft.com/en-us/library/ms190969(v=sql.105).aspx" rel="nofollow" target="_blank">Data-Pages</a> zwischenspeichert, um somit die Lese-Leistung zu verbessern.
</p>
</blockquote>
<p>
Zur Aktivierung der Buffer Pool Extension wird erneut ein Verzeichnis, wie beispielsweise D:\SQLCache, auf der SSD-Platte benötigt.
</p>
<p>
Anschließend kann mit folgendem Skript das BPE-Feature konfiguriert und aktiviert werden:
</p>
<pre>
ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION ON
(
FILENAME = 'D:\SQLCache\SQLSERVER.BPE'
, SIZE = <span class="str"><Gewünschte-Cache-Größe></span><span class="pln"> </span><span class="pun">[</span><span class="pln"> KB </span><span class="pun">|</span><span class="pln"> MB </span><span class="pun">|</span><span class="pln"> GB </span><span class="pun">]</span>
);</pre>
<h2>
Vorsicht beim Starten / Neustart der VM<br />
</h2>
<p>
Einen kleinen Wermutstropfen haben diese Änderungen allerdings.
</p>
<p>
Wenn die Virtuelle Maschine gestoppt und wieder gestartet wird, werden alle Daten auf der SSD gelöscht.
</p>
<p>
Dies wäre zwar kein Problem, da der SQL Server die Dateien wiederherstellen würde; Allerdings wird dies, durch die fehlenden Verzeichnisse, fehlschlagen.
</p>
<p>
Eine Möglichkeit dies zu umgehen ist ein Skript, das bei Starten des Computers ausgeführt wird.
</p>
<p>
Deshalb habe ich auf der Systemplatte ein Verzeichnis angelegt (C:\Scripts) und dort folgendes Skript (Dateiname SQLStartup.cmd) hinterlegt:
</p>
<pre>
@echo off
md D:\SQLCache
md D:\SQLData
md D:\SQLLog
net start MSSQLSERVER
net start SQLSERVERAGENT</pre>
<p>
Zusätzlich muss noch der Start-Typ des SQL Server Dienstes auf »Manual« umgestellt …
</p>
<p>
<img decoding="async" loading="lazy" alt="Start-Typ des SQL Servers aus Manuell umstellen" class="alignnone size-full wp-image-11632" height="475" src="https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_01.png" width="420" srcset="https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_01.png 420w, https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_01-265x300.png 265w, https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_01-133x150.png 133w" sizes="(max-width: 420px) 100vw, 420px" />
</p>
<p>
… und das neu erstellte Skript – als Startup-Script – in den Lokalen Gruppenrichtlinien hinzugefügt werden.
</p>
<blockquote>
<p>
Zum Öffnen des Local Group Policy Editors kann in der Befehlszeile »gpedit.msc« eingeben.
</p>
</blockquote>
<p>
<img decoding="async" loading="lazy" alt="Startup-Skript hinzufügen (1)" class="alignnone size-full wp-image-11642" height="412" src="https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_02.png" width="653" srcset="https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_02.png 653w, https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_02-300x189.png 300w, https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_02-150x95.png 150w" sizes="(max-width: 653px) 100vw, 653px" />
</p>
<p>
<img decoding="async" loading="lazy" alt="Startup-Skript hinzufügen (2)" class="alignnone size-full wp-image-11652" height="462" src="https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_03.png" width="414" srcset="https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_03.png 414w, https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_03-269x300.png 269w, https://media.sascha-dittmann.de/blog/2015/06/sql_iaas_perf_03-134x150.png 134w" sizes="(max-width: 414px) 100vw, 414px" />
</p>
<p>
</p>
<hr />
<div style="display: inline-block;">
<div style="float: left;">
<img decoding="async" alt="Weitere Informationen" src="https://media.sascha-dittmann.de/blog/Shared/info.png" />
</div>
<div style="float: left;">
<p>
Weitere Informationen:
</p>
<ul>
<li>
<a href="https://msdn.microsoft.com/en-us/library/dn133176.aspx" rel="nofollow" target="_blank">MSDN: Buffer Pool Extension</a>
</li>
<li>
<a href="https://technet.microsoft.com/en-us/library/ms190969(v=sql.105).aspx" rel="nofollow" target="_blank">TechNet: Understanding Pages and Extents</a>
</li>
<li>
<a href="https://technet.microsoft.com/en-us/library/aa337525(v=sql.105).aspx" rel="nofollow" target="_blank">TechNet: Buffer Management</a>
</li>
</ul></div>
</div>
<hr />
<p>
<strong>Verwendete Bildquellen:</strong><br />
© Armin Tost (AT) / pixelio.de</p>
]]></content:encoded>
</item>
<item>
<title>Hadoop on Linux mit Azure VMs (2) – Basis Image erstellen</title>
<link>https://www.sascha-dittmann.de/2015/06/hadoop-on-linux-mit-azure-vms-2-basis-image-erstellen/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Wed, 03 Jun 2015 09:00:18 +0000</pubDate>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[SQL Server]]></category>
<category><![CDATA[Big Data]]></category>
<category><![CDATA[Hadoop]]></category>
<category><![CDATA[Linux]]></category>
<category><![CDATA[Microsoft Azure]]></category>
<category><![CDATA[Virtual Machines]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=11082</guid>
<description><![CDATA[Am Montag hatte ich bereits aufgezeigt, wie man ein Storage Account, den Cloud Service, sowie das Virtuelle Netzwerk für ein manuell erstelltes Hadoop on Linux Cluster anlegt.
In diesem Teil meiner dreiteiligen Serie stelle ich vor, wie man ein Basis-Image für die Cluster-Knoten erstellen kann...]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="Hadoop on Linux (Teil 2)" height="150" src="https://media.sascha-dittmann.de/blog/2015/06/HadoopOnLinux-2.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; float: left;" width="150" /><strong>Am Montag hatte ich bereits aufgezeigt, wie man ein Storage Account, den Cloud Service, sowie das Virtuelle Netzwerk für ein manuell erstelltes Hadoop on Linux Cluster anlegt.<br />
In diesem Teil meiner dreiteiligen Serie stelle ich vor, wie man ein Basis-Image für die Cluster-Knoten erstellen kann…</strong>
</p>
<p>
Da das Ganze für einen einzelnen Blog Post etwas zu umfangreich ausfallen würde, habe ich diese Step-By-Step Anleitung in 3 Teile aufgesplittet:
</p>
<ol>
<li>
<a href="http://www.sascha-dittmann.de/2015/06/hadoop-on-linux-mit-azure-vms-1-vorbereitungen">Vorbereitung der Azure Umgebung<br />
(Storage Account, Cloud Service und Virtuelles Netzwerk)</a>
</li>
<li>
Erstellen eines Basis-Images
</li>
<li>
Erzeugen des Clusters
</li>
</ol>
<h2>
Virtuelle Maschine Erstellen<br />
</h2>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-01.png" target="_blank"><img decoding="async" loading="lazy" alt="Virtuelle Machine erstellen" class="alignright size-medium wp-image-11122" height="137" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-01-300x137.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-01-300x137.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-01-1024x469.png 1024w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-01-272x125.png 272w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-01-150x69.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-01.png 1162w" sizes="(max-width: 300px) 100vw, 300px" /></a>Da ich natürlich nicht komplett bei Null anfangen möchte, nutze ich als Basis für unsere Hadoop on Linux Vorlage ein CentOS 6.x Image aus der Azure VM Gallery.<br />
Für die neue Virtuelle Maschine wähle ich deshalb New -> Compute -> Virtual Machine -> From Gallery aus.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-02.png" target="_blank"><img decoding="async" loading="lazy" alt="HDP Image - Basis auswählen" class="alignleft size-medium wp-image-11132" height="191" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-02-300x191.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-02-300x191.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-02-150x95.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-02.png 1010w" sizes="(max-width: 300px) 100vw, 300px" /></a>Im ersten Schitt des Assistenten-Dialogs wählen ich dann entsprechend die aktuellste OpenLogic 6.x Vorlage aus.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-03.png" target="_blank"><img decoding="async" loading="lazy" alt="HDP Image - VM Daten" class="alignright size-medium wp-image-11142" height="191" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-03-300x191.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-03-300x191.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-03-150x95.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-03.png 1010w" sizes="(max-width: 300px) 100vw, 300px" /></a>Im zweiten Schritt muss ich Angaben zur Virtuellen Maschine machen.<br />
Hier verpasse ich der Maschine den Namen »hdp-image«, da diese ohnehin am Ende des Prozesses in ein Basis-Image umgewandelt wird.<br />
Ausserdem wähle ich die VM-Größe »Standard_D2« aus.<br />
Im Gegensatz zur A-Serie der Azure VMs, haben die Maschinen der D-Serie besonders viel Arbeitsspeicher und eine lokale SSD, die für das Temporäre Laufwerk genutzt wird.<br />
Für das Administratorkonto muss ich noch einen Benutzernamen und Passwort angeben.<br />
Ein Zertifikat für die Secure Shell (SSH) möchte ich nicht benutzen.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-04.png" target="_blank"><img decoding="async" loading="lazy" alt="HDP Image - Infrastruktur auswählen" class="alignleft size-medium wp-image-11152" height="191" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-04-300x191.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-04-300x191.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-04-150x95.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-04.png 1010w" sizes="(max-width: 300px) 100vw, 300px" /></a>In Schritt 3 werden der Cloud Service, das Virtuellen Netzwerk, das Subnetz und das Storage Account ausgewählt, die ich im ersten Teil dieser Step-By-Step Anleitung erstellt hatte.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-05.png" target="_blank"><img decoding="async" loading="lazy" alt="HDP Image - Extentions" class="alignright size-medium wp-image-11162" height="191" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-05-300x191.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-05-300x191.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-05-150x95.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-05.png 1010w" sizes="(max-width: 300px) 100vw, 300px" /></a>Als Erweiterung für Azure VMs, sollte noch der VM Agent installiert werden.<br />
Dieser wird am Ende dieses Prozesses genutzt, um die VM für die Image-Erstellung vorzubereiten.
</p>
<h2>
Aktualisieren des Betriebssystems<br />
</h2>
<p>
Damit die Virtuelle Maschine für unsere Zwecke angepasst werden kann, muss man sich als erstes eine Secure Shell (SSH) Verbindung herstellen.
</p>
<p>
SSH ist auf Unix-Betriebssystemen und OS X meist vorinstalliert.<br />
Für Windows-Systeme kann das <a href="http://www.putty.org" rel="nofollow" target="_blank">kostenlose Tool PuTTY</a> genutzt werden.
</p>
<p>
<img decoding="async" loading="lazy" alt="PuTTY" class="alignnone size-full wp-image-11182" height="448" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-06.png" width="466" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-06.png 466w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-06-300x288.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-06-150x144.png 150w" sizes="(max-width: 466px) 100vw, 466px" />
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-07.png" target="_blank"><img decoding="async" loading="lazy" alt="Administrator Session" class="alignright size-medium wp-image-11192" height="237" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-07-300x237.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-07-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-07-150x119.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-07.png 570w" sizes="(max-width: 300px) 100vw, 300px" /></a>Anschließend sollte man die Session mit »sudo -s« dauerhaft in den Administrator-Modus heben, da man ansonsten vor jedem der folgenden Befehle separat »sudo« voranstellen müsste.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-08.png" target="_blank"><img decoding="async" loading="lazy" alt="Update Linux (1)" class="alignleft size-medium wp-image-11202" height="237" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-08-300x237.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-08-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-08-150x119.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-08.png 570w" sizes="(max-width: 300px) 100vw, 300px" /></a>Um alle installierten Pakete des Betriebsystems auf den aktuellen Stand zu bringen, führe ich als erstes den Befehl »yum update« aus.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-09.png" target="_blank"><img decoding="async" loading="lazy" alt="Update Linux (2)" class="alignright size-medium wp-image-11212" height="237" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-09-300x237.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-09-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-09-150x119.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-09.png 570w" sizes="(max-width: 300px) 100vw, 300px" /></a>Nach dessen initialer Prüfung, muss der Download zuvor noch mit einem »y« bestätigt werden.
</p>
<h2>
Passwortloses SSH<br />
</h2>
<p>
Damit später das Hadoop Installations- und Verwaltungssystem <a href="http://ambari.apache.org" rel="nofollow" target="_blank">Ambari</a> eine Administratorverbindung zu den einzelnen Knoten herstellen kann, muss vorher das Passwortlose SSH eingerichtet werden.
</p>
<p>
Hierzu muss zuerst ein RSA-Schlüsselpaar erstellt werden.<br />
Anschließend wird dieses als Autorisiertes Schlüsselpaar für das Basis-Image (und dementsprechend für alle später erstellten Knoten) bekannt gemacht und die entsprechenden Dateisystemrechte gesetzt:
</p>
<pre>
ssh-keygen
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
</pre>
<p>
<img decoding="async" loading="lazy" alt="SSH Keys erzeugen" class="alignnone size-full wp-image-11232" height="451" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-11.png" width="570" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-11.png 570w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-11-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-11-150x119.png 150w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<blockquote>
<p>
Mit »ls -ld ~/.ssh & ls -l ~/.ssh« lassen sich die vorgenommenen Einstellungen nochmals prüfen.
</p>
</blockquote>
<p>
<img decoding="async" loading="lazy" alt="Passwortloses SSH" class="alignnone size-full wp-image-11242" height="451" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-12.png" width="570" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-12.png 570w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-12-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-12-150x119.png 150w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<h2>
Network Time Protocol (NTP)<br />
</h2>
<p>
Damit später auch alle Cluster-Knoten im "Gleichen Takt" ticken, muss der Network Time Protocol (NTP) Dienst installiert und aktiviert werden.<br />
Geprüft werden kann die Installation mit »chkconfig –list ntpd«.
</p>
<pre>
yum install ntp
service ntpd start
chkconfig ntpd on
</pre>
<p>
<img decoding="async" loading="lazy" alt="NTP Dienst installieren" class="alignnone size-full wp-image-11252" height="451" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-13.png" width="570" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-13.png 570w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-13-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-13-150x119.png 150w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<h2>
SELinux Deaktivieren<br />
</h2>
<p>
Da sich die <a href="http://de.wikipedia.org/wiki/SELinux" rel="nofollow" target="_blank">Security-Enhanced Linux (kurz SELinux)</a> Kernel-Erweiterung mit Ambari beißt, muss diese deaktiviert werden.<br />
Hierzu führt man folgenden Befehl aus:
</p>
<pre>
setenforce 0
</pre>
<p>
<img decoding="async" loading="lazy" alt="SELinux abschalten (1)" class="alignnone size-full wp-image-11352" height="166" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-14.png" width="585" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-14.png 585w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-14-300x85.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-14-150x43.png 150w" sizes="(max-width: 585px) 100vw, 585px" />
</p>
<p>
Damit diese auch nach dem Neustart der VMs nicht wieder aktiv wird, muss man die entsprechende Konfigurationsdatei (/etc/selinux/config) angepasst werden.<br />
Dabei muss »SELINUX« auf »disabled« gesetzt werden.
</p>
<pre>
vi /etc/selinux/config
</pre>
<p>
<img decoding="async" loading="lazy" alt="SELinux abschalten (2)" class="alignnone size-full wp-image-11272" height="451" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-15.png" width="570" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-15.png 570w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-15-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-15-150x119.png 150w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<h2>
PackageKit Deaktivieren<br />
</h2>
<p>
Auch das <a href="http://de.wikipedia.org/wiki/PackageKit" rel="nofollow" target="_blank">PackageKit</a> kann zu Problemen führen, weshalb dies deaktiviert werden sollte.
</p>
<p>
Hierzu muss »enabled=0« in der entsprechenden Konfigurationsdatei (/etc/yum/pluginconf.d/refresh-packagekit.conf) gesetzt werden.
</p>
<pre>
vi /etc/yum/pluginconf.d/refresh-packagekit.conf
</pre>
<p>
<img decoding="async" loading="lazy" alt="PackageKit abschalten" class="alignnone size-full wp-image-11362" height="134" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-16.png" width="585" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-16.png 585w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-16-300x69.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-16-150x34.png 150w" sizes="(max-width: 585px) 100vw, 585px" />
</p>
<p>
Da diese in der aktuellen Vorlage der Azure VM Gallery nicht vorhanden ist, kann auch folgender Befehl genutzt werden.
</p>
<pre>
echo 'enabled=0' >> /etc/yum/pluginconf.d/refresh-packagekit.conf
</pre>
<h2>
Transparent Huge Pages (THP) Deaktivieren<br />
</h2>
<p>
Um etwaigen Performance-Problemen aus dem Weg zu gehen, sollten auch die Transparent Huge Pages (THP) abgeschaltet werden.
</p>
<p>
Dieser Mechanismus ist ähnlich der Windows-Auslagerungsdatei (pagefile.sys) und lagert Daten des virtuellen Speichers aus.
</p>
<p>
Hierzu muss man 2 kleinere Änderungen in der /etc/grub.conf vornehmen und bei den Kernel Aufrufen den Parameter »transparent_hugepage=never« anhängen.
</p>
<pre>
vi /etc/grub.conf
</pre>
<p>
<img decoding="async" loading="lazy" alt="Transparent Huge Pages (THP) abschalten" class="alignnone size-full wp-image-11302" height="451" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-18.png" width="570" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-18.png 570w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-18-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-18-150x119.png 150w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<h2>
Netzwerk Konfiguration<br />
</h2>
<p>
Bei der Netzwerk Konfiguration habe ich zwei Änderungen vorgenommen.
</p>
<p>
Zum einen hab ich die IP v6 Unterstützung aktiviert, indem ich bei der /etc/sysconfig/network Konfigurationsdatei »NETWORKING_IPV6« auf »yes« gesetzt habe.
</p>
<pre>
vi /etc/sysconfig/network
</pre>
<p>
oder
</p>
<pre>
echo 'NETWORKING_IPV6=yes' >> /etc/sysconfig/network
</pre>
<p>
<img decoding="async" loading="lazy" alt="IPv6 aktivieren" class="alignnone size-full wp-image-11372" height="165" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-17.png" width="585" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-17.png 585w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-17-300x85.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-17-150x42.png 150w" sizes="(max-width: 585px) 100vw, 585px" />
</p>
<p>
Außerdem habe ich die hosts-Datei bereits mit den entsprechenden Einträgen der zukünftigen Cluster-Knoten versehen.
</p>
<blockquote>
<p>
Der in den »Azure Virtual Networks« integrierte DNS-Dienst verrichtet zwar hervorragend seinen Dienst, allerdings fehlt bei der Hadoop Installation ein »Fully Qualified Domain Name (FQDN)« für jeden Cluster-Knoten.<br />
Deshalb habe ich die pragmatischen Schritt gewählt.
</p>
</blockquote>
<pre>
vi /etc/hosts
</pre>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-191.png" target="_blank"><img decoding="async" loading="lazy" alt="Hosts-Datei" class="alignright size-medium wp-image-11442" height="185" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-191-300x185.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-191-300x185.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-191-150x93.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-191.png 731w" sizes="(max-width: 300px) 100vw, 300px" /></a>Die hierbei verwende Domain-Struktur ist komplett ausgedacht und setzt auf der Domain des Cloud-Service-Endpunkts auf.<br />
Über »hostname -f« läßt sich der interne FQDN anzeigen, welchen ich auch mit in die hosts-Datei übernommen habe.
</p>
<table border="0" style="border: 0px currentColor; border-image: none;">
<caption>
Zukünftige Domain-Struktur<br />
</caption>
<thead>
<tr>
<th>
IP
</th>
<th>
FQDN
</th>
<th>
HOSTNAME
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
10.10.0.4
</td>
<td>
hdp-head-01.hdp-demo.cloudapp.net
</td>
<td>
hdp-head-01
</td>
</tr>
<tr>
<td>
10.10.1.4
</td>
<td>
hdp-data-01.hdp-demo.cloudapp.net
</td>
<td>
hdp-data-01
</td>
</tr>
<tr>
<td>
10.10.1.5
</td>
<td>
hdp-data-02.hdp-demo.cloudapp.net
</td>
<td>
hdp-data-02
</td>
</tr>
<tr>
<td>
10.10.1.6
</td>
<td>
hdp-data-03.hdp-demo.cloudapp.net
</td>
<td>
hdp-data-03
</td>
</tr>
</tbody>
</table>
<p>
</p>
<h2>
Festplatte hinzufügen<br />
</h2>
<p>
Als letzten Punkt für das Basis-Image, füge ich noch eine zweite Festplatte hinzu, welche später als Datenplatte für das HDFS dienen soll.
</p>
<p>
Hierzu wechsel ich im Azure Management Portal in das Dashboard der Virtuellen Machine und wähle die Aktion »Attach empty disk« aus:
</p>
<p>
<img decoding="async" loading="lazy" alt="Neue VHD hinzufügen" class="alignnone size-full wp-image-11312" height="97" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-19.png" width="232" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-19.png 232w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-19-150x63.png 150w" sizes="(max-width: 232px) 100vw, 232px" />
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-21.png"><img decoding="async" loading="lazy" alt="Attach empty disk" class="alignright size-medium wp-image-11482" height="300" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-21-278x300.png" width="278" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-21-278x300.png 278w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-21-139x150.png 139w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-21.png 504w" sizes="(max-width: 278px) 100vw, 278px" /></a>Im daraufhin erscheinenden Dialog wähle ich die entsprechende Plattengröße (in diesem Fall 100GB) aus und passe ggf. den Namen der VHD-Datei an.
</p>
<p>
Anschließend wechsel ich wieder zur SSH-Konsole zurück.<br />
Dort partitioniere und formatiere ich die neue Festplatte, mounte diese als Verzeichnis /mnt/datadrive und passe die Konfigurationsdatei /etc/fstab entsprechend an, damit diese Veränderung auch nach einem Neustart zur Verfügung steht.
</p>
<pre>
parted /dev/sdc mklabel msdos
parted /dev/sdc mkpart primary 1 100%
mkfs.ext4 /dev/sdc1
mkdir /mnt/datadrive
mount /dev/sdc1 /mnt/datadrive
echo '/dev/sdc1 /mnt/datadrive ext4 defaults 1 2' >> /etc/fstab
</pre>
<p>
<img decoding="async" loading="lazy" alt="Neue VHD in Linux bereitstellen" class="alignnone size-full wp-image-11512" height="621" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-22.png" width="570" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-22.png 570w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-22-275x300.png 275w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-22-138x150.png 138w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<h2>
<br />
</h2>
<h2>
VM in ein Image umwandeln<br />
</h2>
<p>
Nachdem die Virtuelle Maschine soweit vorbereitet wurde, kann diese jetzt in ein Image umgewandelt werden.
</p>
<p>
Dazu verwende ich als Erstes den VM Agent, um in Linux alles zu entfernen, was eine Dublizierbarkeit behindern könnte.
</p>
<p>
waagent -deprovision<br />
shutdown -h 0
</p>
<p>
<img decoding="async" loading="lazy" alt="Deprovision Linux VM" class="alignnone size-full wp-image-11522" height="451" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-23.png" width="570" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-23.png 570w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-23-300x237.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-23-150x119.png 150w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<p>
Anschließend kann ich die VM im Azure Management Portal herunterfahren…
</p>
<p>
<img decoding="async" loading="lazy" alt="VM Herunterfahren" class="alignnone size-full wp-image-11532" height="76" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-24.png" width="126" />
</p>
<p>
… und in ein Image umwandeln.
</p>
<p>
<img decoding="async" loading="lazy" alt="Image Erzeugen (1)" class="alignnone size-full wp-image-11542" height="70" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-25.png" width="108" />
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-26.png"><img decoding="async" loading="lazy" alt="Image Erzeugen (2)" class="alignright size-medium wp-image-11552" height="234" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-26-300x234.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-base-26-300x234.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-26-150x117.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-base-26.png 504w" sizes="(max-width: 300px) 100vw, 300px" /></a>In dem Capture-Dialog gebe ich dem Image einen Namen, wie beispielsweise »hdp-image«, und setzte das Häkchen, dass der Deprovision-Vorgang durchgeführt worden ist.
</p>
<h2>
Wie geht’s weiter?<br />
</h2>
<p>
Nachdem jetzt das Basis-Image für die Cluster-Knoten erstellt wurde, wird im dritten Teil das eigentliche Hadoop on Linux-Cluster erzeugt.<br />
</p>
]]></content:encoded>
</item>
<item>
<title>Hadoop on Linux mit Azure VMs (1) – Vorbereitungen</title>
<link>https://www.sascha-dittmann.de/2015/06/hadoop-on-linux-mit-azure-vms-1-vorbereitungen/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Mon, 01 Jun 2015 13:07:15 +0000</pubDate>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[SQL Server]]></category>
<category><![CDATA[Big Data]]></category>
<category><![CDATA[Blob Storage]]></category>
<category><![CDATA[Cloud Services]]></category>
<category><![CDATA[Hadoop]]></category>
<category><![CDATA[Linux]]></category>
<category><![CDATA[Microsoft Azure]]></category>
<category><![CDATA[Virtual Machines]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=10932</guid>
<description><![CDATA[Vor kurzem benötigte ich ein Hadoop on Linux Test-Cluster, welches relativ nah an eine lokale Produktionsumgebung rankommen sollte. Somit fielen leider HDInsight (inkl. der Hadoop on Linux Preview), durch die Nutzung des Blob Storages aus.
Grund genug, um einmal aufzuzeigen, wie man ein Hadoop on Linux Cluster mit Azure VMs aufsetzen kann.]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="Hadoop on Linux (Teil 1)" height="150" src="https://media.sascha-dittmann.de/blog/2015/06/HadoopOnLinux-1.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; float: left;" width="150" /><strong>Vor kurzem benötigte ich ein Hadoop on Linux Test-Cluster, welches relativ nah an eine lokale Produktionsumgebung rankommen sollte. Somit fielen leider HDInsight (inkl. der Hadoop on Linux Preview), durch die Nutzung des Blob Storages aus.<br />
Grund genug, um einmal aufzuzeigen, wie man ein Hadoop on Linux Cluster mit Azure VMs aufsetzen kann.</strong>
</p>
<p>
Da das Ganze für einen einzelnen Blog Post etwas zu umfangreich ausfallen würde, möchte ich dies in folgende 3 Teile aufsplitten:
</p>
<ol>
<li>
Vorbereitung der Azure Umgebung<br />
(Storage Account, Cloud Service und Virtuelles Netzwerk)
</li>
<li>
Erstellen eines Basis-Images
</li>
<li>
Erzeugen des Clusters
</li>
</ol>
<h2>
Storage Account & Cloud Service<br />
</h2>
<p>
Wie für die Virtuellen Maschinen in Azure üblich, benötigt man hierzu einen »Storage Account« für die VHD Dateien, sowie einen »Cloud Service« als Container und Endpunkt für die VMs.
</p>
<p>
Beides lässt sich zwar auch während des Erstellens der VMs erzeugen, allerdings finde ich zum Einen sprechende Namen für die jeweiligen Dienste sinnvoller und zum Anderen weiß man dann auch genau, was bzw. wofür etwas erstellt worden ist.
</p>
<p>
Beides lässt sich ganz einfach über das <a href="https://manage.windowsazure.com" rel="nofollow" target="_blank">Azure Management Portal</a> erstellen.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-01.png" target="_blank"><img decoding="async" loading="lazy" alt="Azure Storage Account erstellen" class="alignright size-medium wp-image-10952" height="137" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-01-300x137.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-01-300x137.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-01-1024x468.png 1024w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-01-272x125.png 272w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-01-150x69.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-01.png 1163w" sizes="(max-width: 300px) 100vw, 300px" /></a>Für das Azure Storage Account geht man auf New -> Data Services -> Storage -> Quick Create und gibt dem Storage Account einen Namen.<br />
Außerdem sollte man noch das gewünschte Rechenzentrum, sowie den Replikationstyp, auswählen.<br />
Für mein Test-Cluster langt die Replikation innerhalb des ausgewählten Rechenzentrums völlig aus, weshalb ich „Locally Redundant“ ausgewählt habe.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-02.png" target="_blank"><img decoding="async" loading="lazy" alt="Azure Cloud Service erstellen" class="alignleft size-medium wp-image-10962" height="137" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-02-300x137.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-02-300x137.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-02-1024x468.png 1024w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-02-272x125.png 272w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-02-150x69.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-02.png 1162w" sizes="(max-width: 300px) 100vw, 300px" /></a>Auch der Cloud Service ist schnell erstellt.<br />
Hierzu wählt man New -> Compute -> Cloud Service -> Quick Create aus und gibt auch hier Name und das gleiche Rechenzentrum an.
</p>
<h2>
Virtuelles Netzwerk<br />
</h2>
<p>
Nachdem man nun das Storage Account und die Cloud Service erstellt hat, kommt der etwas komplexere Teil an die Reihe – das Virtuelle Netzwerk.
</p>
<p>
Ich möchte innerhalb meines Virtuellen Netzwerks zwei Subnetze haben (eines für die Head-Nodes und eines für die Data-Nodes meines Hadoop Clusters), um erneut möglichst nah an die spätere Produktivumgebung heranzukommen.
</p>
<p>
Für etwaige Applikationen, die dieses Hadoop-Cluster benutzen, würde ich dann später ein weiteres Subnetz hinzufügen.<br />
Soweit zum Plan – Kommen wir also zur Umsetzung…
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-03.png" target="_blank"><img decoding="async" loading="lazy" alt="Virtuelles Netzwerk erstellen" class="alignright size-medium wp-image-10972" height="137" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-03-300x137.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-03-300x137.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-03-1024x469.png 1024w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-03-272x125.png 272w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-03-150x69.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-03.png 1162w" sizes="(max-width: 300px) 100vw, 300px" /></a>Für das neue Netzwerk wähle ich New -> Network Services -> Virtual Network -> Custom Create aus.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-04.png" target="_blank"><img decoding="async" loading="lazy" alt="Virtuelles Netzwerk - Name und Rechenzentrum" class="alignleft size-medium wp-image-10982" height="200" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-04-300x200.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-04-300x200.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-04-150x100.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-04.png 962w" sizes="(max-width: 300px) 100vw, 300px" /></a>Im ersten Schritt des Assistenten-Dialogs gebe ich meinem neuen Netzwerk einen Namen und wähle erneut das gewünschte Rechenzentrum aus.
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-05.png" target="_blank"><img decoding="async" loading="lazy" alt="Virtuelles Netzwerk - DNS und VPN" class="alignright size-medium wp-image-10992" height="200" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-05-300x200.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-05-300x200.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-05-150x100.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-05.png 962w" sizes="(max-width: 300px) 100vw, 300px" /></a>Den zweiten Schritt kann ich überspringen, da ich weder einen eigenen DNS Server angeben möchte, noch einen VPN Tunnel benötige.
</p>
<blockquote>
<p>
Der von Azure bereitgestellte DNS Dienst würde zwar vollkommen ausreichen, allerdings werde ich ohnehin für mein kleines Cluster die hosts-Datei entsprechend anpassen.
</p>
</blockquote>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-06.png" target="_blank"><img decoding="async" loading="lazy" alt="Virtuelles Netzwerk - Adressräume und Subnetze" class="alignleft size-medium wp-image-11002" height="200" src="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-06-300x200.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-06-300x200.png 300w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-06-150x100.png 150w, https://media.sascha-dittmann.de/blog/2015/06/hdp-prep-06.png 962w" sizes="(max-width: 300px) 100vw, 300px" /></a>Im letzten Schritte gebe ich einen Adressraum (10.10.0.0/16), sowie die zwei Subnetze (Master-Subnet 10.10.0.0/24 und Worker-Subnet 10.10.1.0/24) an.
</p>
<h2>
Wie geht’s weiter?<br />
</h2>
<p>
Im kommenden Teil erstelle ich ein Basis-Image für unsere Hadoop on Linux Cluster-Knoten.<br />
</p>
]]></content:encoded>
</item>
<item>
<title>WordPress auf Microsoft Azure – Plugin Aktualisierung fehlgeschlagen</title>
<link>https://www.sascha-dittmann.de/2015/05/wordpress-auf-microsoft-azure-plugin-aktualisierung-fehlgeschlagen/</link>
<comments>https://www.sascha-dittmann.de/2015/05/wordpress-auf-microsoft-azure-plugin-aktualisierung-fehlgeschlagen/#comments</comments>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Wed, 13 May 2015 12:36:52 +0000</pubDate>
<category><![CDATA[.NET]]></category>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[Azure Web Sites]]></category>
<category><![CDATA[Cloud]]></category>
<category><![CDATA[Microsoft Azure]]></category>
<category><![CDATA[Troubleshooting]]></category>
<category><![CDATA[Web Apps]]></category>
<category><![CDATA[WordPress]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=10262</guid>
<description><![CDATA[Seit einigen Wochen schlug die Aktualisierung von Wordpress-Plugins bzw. Themes in meinem - in Microsoft Azure gehosteten - Blog fehl. Die Suche im Internet führte leider auch zu keiner Lösung, da meistens nur auf die Rechte im Dateisystem verwiesen wurde. Doch heute bin ich durch einen Zufall auf die Lösung gestoßen...]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="WordPress" class="alignleft size-full wp-image-10282" height="150" src="https://media.sascha-dittmann.de/blog/2015/05/wordpress-150x150.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; float: left;border: 0px none;" width="150" srcset="https://media.sascha-dittmann.de/blog/2015/05/wordpress-150x150.png 150w, https://media.sascha-dittmann.de/blog/2015/05/wordpress-300x300.png 300w, https://media.sascha-dittmann.de/blog/2015/05/wordpress-55x55.png 55w, https://media.sascha-dittmann.de/blog/2015/05/wordpress.png 500w" sizes="(max-width: 150px) 100vw, 150px" /><strong>Seit einigen Wochen schlug die Aktualisierung von WordPress-Plugins bzw. Themes in meinem – in Microsoft Azure gehosteten – Blog fehl. Die Suche im Internet führte leider auch zu keiner Lösung, da meistens nur auf die Rechte im Dateisystem verwiesen wurde.<br />
Doch heute bin ich durch einen Zufall auf die Lösung gestoßen…</strong>
</p>
<p>
Ende letzten Jahres hatte ich meinen Blog von der BlogEngine.NET auf WordPress, und von den Azure Cloud Services auf die Azure Web Apps (aka Azure Web Sites), umgezogen.
</p>
<p>
Alles lief wunderbar, und ich war mit dem Ergebnis vollkommen zufrieden.
</p>
<h2>
Das Problem<br />
</h2>
<p>
Vor wenigen Wochen konnte ich urplötzlich weder WordPress-Plugins noch Themes aktualisieren.<br />
Die WordPress Engine aktualisierte sich allerdings weiterhin ohne Probleme.
</p>
<p>
Genauer gesagt, konnten beim Aktualisieren der Plugins, die Alte Version nicht mehr entfernt werden.
</p>
<pre>
Downloading update from http://downloads.wordpress.org/plugin/<i><plugin></i>.zip
Unpacking the update
Deactivating the plugin
Removing the old version of the plugin
Could not remove the old plugin
Plugin upgrade Failed</pre>
<p>
Nachdem die Aktualisierung fehlgeschlagen war, waren auch die Plugins verschwunden.
</p>
<p>
Leider ging anschließend auch die Neuinstallation der betroffenen Plugins nicht mehr.<br />
Hier bekam ich die Fehlermeldung, dass für das Plugin relevante Verzeichnisse nicht mehr angelegt werden konnten.
</p>
<p>
Die einzige "Lösung" war ein Neustart der Web App.<br />
Danach ging auch die Re-Installation wieder.
</p>
<p>
Bei meiner Suche im Internet stieß ich immer wieder auf Rechteprobleme im Dateisystem.
</p>
<p>
Dies führte allerdings zu keiner Lösung, da der Blog zum Einen auf Windows (und nicht Linux) gehostet wird und zum Anderen ausreichende Rechte vorhanden waren.
</p>
<h2>
Endlich die Lösung<br />
</h2>
<p>
Heute bin ich endlich auf die Lösung gestoßen…<br />
Danke an <a href="https://twitter.com/cfowlerMSFT" rel="nofollow" target="_blank">Cory Fowler</a> für den Tipp!
</p>
<p>
Vor kurzem wurden Änderungen an der <a href="http://www.iis.net/downloads/microsoft/wincache-extension" rel="nofollow" target="_blank">WinCache Extension for PHP</a> durchgeführt, welche Anfragen ans Dateisystem, wie beispielsweise <strong>is_dir</strong>, <strong>is_file</strong> und <strong>file_exists</strong>, an WinCache umleiten.<br />
Somit kann es passieren, dass bereits gelöschte Dateien »kurzfristig« als Vorhanden an PHP Skripte zurückgemeldet werden.
</p>
<p>
Diese Umleitungen können ganz einfach deaktiviert werden:
</p>
<ol>
<li>
Falls noch nicht vorhanden, muss eine Datei mit dem Namen <strong>.user.ini</strong> Im Stammverzeichnis des Blogs angelegt werden.<br />
Das wäre bei den Azure Web Apps: <b>d:\home\site\wwwroot</b>
</li>
<li>
Dort muss die Zeile <code>wincache.reroute_enabled=0</code> hinzugefügt werden.
</li>
<li>
Sicherheitshalber hatte ich anschließend die Web App neu gestartet
</li>
</ol>
<p>
Nachdem ich die Umleitungen deaktiviert hatte, lief auch das Aktualisieren der Plugins wieder.</p>
]]></content:encoded>
<wfw:commentRss>https://www.sascha-dittmann.de/2015/05/wordpress-auf-microsoft-azure-plugin-aktualisierung-fehlgeschlagen/feed/</wfw:commentRss>
<slash:comments>8</slash:comments>
</item>
<item>
<title>dotnet Cologne 2015 – Azure Service Fabric</title>
<link>https://www.sascha-dittmann.de/2015/05/dotnet-cologne-2015-azure-service-fabric/</link>
<comments>https://www.sascha-dittmann.de/2015/05/dotnet-cologne-2015-azure-service-fabric/#comments</comments>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Sat, 09 May 2015 08:07:24 +0000</pubDate>
<category><![CDATA[.NET]]></category>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[Azure Service Fabric]]></category>
<category><![CDATA[Cloud]]></category>
<category><![CDATA[Cloud Services]]></category>
<category><![CDATA[Microservices]]></category>
<category><![CDATA[PaaS]]></category>
<category><![CDATA[Preview]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=10162</guid>
<description><![CDATA[Das Event »von Entwicklern für Entwickler« fand dieses Jahr zum siebten mal statt und war - wie auch in den vergangenen Jahren - eine großartige Veranstaltung. Auch ich durfte wieder mit einer Session aus dem Azure-Themenbereich dabei sein. Diesmal drehte es ich in meiner Session um die Erstellung von Microservices mit der Azure Service Fabric.]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="dotnet Cologne 2015" class="alignleft size-full wp-image-10172" height="160" src="https://media.sascha-dittmann.de/blog/2015/05/dnc15_banner_180x160.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; float: left;border: 0px none;" width="180" srcset="https://media.sascha-dittmann.de/blog/2015/05/dnc15_banner_180x160.png 180w, https://media.sascha-dittmann.de/blog/2015/05/dnc15_banner_180x160-150x133.png 150w" sizes="(max-width: 180px) 100vw, 180px" /><strong>Das Event »von Entwicklern für Entwickler« fand dieses Jahr zum siebten mal statt und war – wie auch in den vergangenen Jahren – eine großartige Veranstaltung.<br />
Auch ich durfte wieder mit einer Session aus dem Azure-Themenbereich dabei sein.<br />
Diesmal drehte es ich in meiner Session um die Erstellung von Microservices mit der Azure Service Fabric.</strong>
</p>
<p>
Mittlerweile hat sich die Veranstaltung als eine der größten deutsche Community-Konferenzen für Entwickler im Microsoft-Umfeld etabliert.
</p>
<p>
Mit über 40 großartigen Sessions, in 7 Tracks, war es wieder ein besonders Erlebnis für alle Teilnehmer.<br />
Ein großer Dank an das Orga-Team, die Sprecher und natürlich die vielen Helfer dafür!
</p>
<p>
Ich freue mich schon auf's nächste Jahr, wenn sich am 06. Mai 2016 wieder die Pforten der dotnet Cologne öffnen!
</p>
<h2>
Azure Service Fabric – Erstellen von leichtgewichtigen Microservices<br />
</h2>
<p>
Neben den Slides und <a href="https://github.com/SaschaDittmann/service-fabric-samples/" rel="nofollow" target="_blank">Code-Beispielen</a>, möchte ich in diesem Jahr zusätzlich eine Aufnahme meiner Session bereitstellen…
</p>
<h3>
Slides<br />
</h3>
<p>
<iframe loading="lazy" allowfullscreen="" frameborder="0" height="488" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/4kqalB5FiQhn2d" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="585"></iframe>
</p>
<div style="margin-bottom:5px">
<strong><a href="//www.slideshare.net/Sascha5812/azure-service-fabric" target="_blank" title="Slideshare: dotnet Cologne 2015 - Azure Service Fabric ">Slideshare: dotnet Cologne 2015 – Azure Service Fabric </a> </strong>
</div>
<h3>
Video<br />
</h3>
<p>
<iframe loading="lazy" allowfullscreen="" frameborder="0" height="438" src="https://www.youtube.com/embed/5qFuBV-XZ9Q" width="585"></iframe></p>
]]></content:encoded>
<wfw:commentRss>https://www.sascha-dittmann.de/2015/05/dotnet-cologne-2015-azure-service-fabric/feed/</wfw:commentRss>
<slash:comments>1</slash:comments>
</item>
<item>
<title>Azure Service Fabric: Stateless Virtual Actors</title>
<link>https://www.sascha-dittmann.de/2015/05/azure-service-fabric-stateless-virtual-actors/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Tue, 05 May 2015 15:06:02 +0000</pubDate>
<category><![CDATA[.NET]]></category>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[Azure Service Fabric]]></category>
<category><![CDATA[Cloud]]></category>
<category><![CDATA[Cloud Services]]></category>
<category><![CDATA[Microservices]]></category>
<category><![CDATA[PaaS]]></category>
<category><![CDATA[Preview]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=9892</guid>
<description><![CDATA[Vergangene Woche berichtete ich bereits über die neue Azure Service Fabric Preview der Microsoft Azure Plattform. Diese soll Entwicklern dabei helfen, schneller und unkomplizierter Anwendungen für die Cloud bauen zu können. Dabei können verschiedene Programmiermodelle eingesetzt werden, welche ich in diesem, sowie den kommenden Blog Posts, näher vorstellen möchte. Starten möchte ich mit den Stateless Virtual Actors ...]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="Azure Service Fabric (Preview) - Virtual Actors" class="size-full" height="150" src="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; float: left;" width="150" /><strong>Vergangene Woche <a href="http://www.sascha-dittmann.de/2015/04/azure-service-fabric-paas-auf-microservice-basis/" target="_blank">berichtete ich bereits</a> über die neue Azure Service Fabric Preview der Microsoft Azure Plattform. Diese soll Entwicklern dabei helfen, schneller und unkomplizierter Anwendungen für die Cloud bauen zu können.<br />
Dabei können verschiedene Programmiermodelle eingesetzt werden, welche ich in diesem, sowie den kommenden Blog Posts, näher vorstellen möchte.<br />
Starten möchte ich mit den Stateless Virtual Actors…</strong>
</p>
<h2>
Distributed Virtual Actors<br />
</h2>
<p>
Das Modell der »Distributed Virtual Actors« ist nicht völlig neu.<br />
Es entstand im Rahmen des Orleans Projektes der Microsoft Research.
</p>
<blockquote>
<p>
Project "Orleans" invented the Virtual Actor abstraction, which provides a straightforward approach to building distributed interactive applications, without the need to learn complex programming patterns for handling concurrency, fault tolerance, and resource management. Orleans applications scale-up automatically and are meant to be deployed in the cloud. It has been used heavily by a number of high-scale cloud services at Microsoft, starting with cloud services for the Halo franchise running in production in Microsoft Azure since 2011. It was made available as open source in January 2015.
</p>
</blockquote>
<p>
Wer mehr über die Orleans Virtual Actors wissen möchte, sollte sich das <a href="http://aka.ms/OrleansVirtualActors" rel="nofollow" target="_blank">Research Paper</a> durchlesen.
</p>
<p>
Durch den Azure Service Fabric Dienst, wird dieses Modell mit verschiedenen Funktionalitäten angereichert, wie beispielsweise:
</p>
<ul>
<li>
Application Lifecycle Management
</li>
<li>
Beeinflussung der Microservice-Platzierung im Cluster
</li>
<li>
Ressourcenverwaltung
</li>
<li>
Sicherheitsfunktionen
</li>
<li>
Dienstüberwachung
</li>
</ul>
<p>
Somit stellt dieses Programmiermodell die höchste Ebene in den Schichten der Azure Service Fabric API dar.
</p>
<p>
<img decoding="async" loading="lazy" alt="Azure Service Fabric - Runtime API Layers" class="size-full" height="400" src="https://media.sascha-dittmann.de/blog/2015/05/AzureServiceFabricLayers.png" width="585" />
</p>
<h2>
Wann sollte man Virtual Actors verwenden?<br />
</h2>
<p>
Virtual Actors eignen sich besonders, wenn die Applikation aus mehreren unabhängigen Einheiten besteht, welche ihre eigene Geschäftslogik und Statusinformationen enthalten.
</p>
<p>
Virtual Actors sind isolierte Single-Thread-Komponenten.<br />
Sie interagieren mit dem Rest des Systems, was auch andere Virtual Actors sein können, indem sie asynchrone Nachrichten austauschen (Request-Response-Pattern).<br />
Sie existieren immer, müssen also weder explizit erzeugt noch entfernt werden.
</p>
<h2>
Stateless Virtual Actors<br />
</h2>
<p>
Als Beispiel für einen »Stateless Virtual Actor« möchte ich einen einfachen Taschenrechner hernehmen.
</p>
<p>
Nach man also, wie in meinem <a href="http://www.sascha-dittmann.de/2015/04/azure-service-fabric-paas-auf-microservice-basis/" target="_blank">vergangenen Blog Post</a> beschrieben, das Azure Service Fabric SDK installiert hat, kann in Visual Studio ein neues »Stateless Actor Service« Projekt erzeugt werden.
</p>
<p>
<img decoding="async" loading="lazy" alt="Visual Studio: Stateless Actor Vorlage" class="alignnone size-full wp-image-10002" height="381" src="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_01.png" width="585" srcset="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_01.png 585w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_01-300x195.png 300w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_01-150x98.png 150w" sizes="(max-width: 585px) 100vw, 585px" />
</p>
<p>
<a href="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_02.png" style="border: 0px currentColor; border-image: none;" target="_blank"><img decoding="async" loading="lazy" alt="Stateless Actor Projects" class="alignright size-medium wp-image-10022" height="300" src="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_02-181x300.png" style="border: 0px currentColor; border-image: none;" width="181" srcset="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_02-181x300.png 181w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_02-91x150.png 91w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_02.png 363w" sizes="(max-width: 181px) 100vw, 181px" /></a>Genauer gesagt, werden hierbei 4 Projekte in eine Solution gepackt.
</p>
<p>
Bei meinem Beispiel wären das:
</p>
<ul>
<li>
<b>StatelessCalculatorActor</b><br />
Dieses Projekt enthält die Implementierung und Konfiguration des Actors
</li>
<li>
<b>StatelessCalculatorActor.Client</b><br />
Dieses Projekt enthält eine Konsolenapplikation, um den Actor zu testen
</li>
<li>
<b>StatelessCalculatorActor.Interfaces</b><br />
Dieses Projekt enthält die Schnittstellenbeschreibungen, die sich die Actors und Clients teilen.
</li>
<li>
<b>StatelessCalculatorActorApplication</b><br />
Dieses Projekt enthält das »Applicaton Manifest«, sowie die PowerShell-Skripte, die benötigt werden, um den Dienst paketieren und installieren bzw. deinstallieren zu können
</li>
<li>
Das <strong>Calculator</strong>-Projekt habe ich nachträglich angefügt und enthält eine WPF-Applikation, die den Actor verwendet.
</li>
</ul>
<h3>
Implementierung des Taschenrechner-Actors<br />
</h3>
<p>
Als Erstes benötigt unser Taschenrechner-Actor eine Schnittstellenbeschreibung im StatelessCalculatorActor.Interfaces Projekt.<br />
Diese beinhaltet Methoden für die 4 Grundrechenarten unseres Taschenrechners.
</p>
<pre class="brush: c-sharp;">
public interface IStatelessCalculatorActor : IActor
{
Task<double> Add(double x, double y);
Task<double> Substract(double x, double y);
Task<double> Multiply(double x, double y);
Task<double> Divide(double x, double y);
}
</pre>
<p>
Als Zweites benötigen wir die Implementierung des Taschenrechner-Actors im StatelessCalculatorActor Projekt.<br />
Diese leitet von der Basis-Klasse <em>Actor</em> ab und implementiert unsere Schnittstelle.<br />
Außerdem können wir die mitgelieferte <em>ActorEventSource</em> Klasse nutzen, um Statusinformationen an die Service Fabric Runtime zu melden.
</p>
<pre class="brush: c-sharp;">
public class StatelessCalculatorActor : Actor, IStatelessCalculatorActor
{
public async Task<double> Add(double x, double y)
{
ActorEventSource.Current.ActorMessage(this, "Add {0} and {1}", x, y);
return await Task.FromResult(x + y);
}
public async Task<double> Divide(double x, double y)
{
ActorEventSource.Current.ActorMessage(this, "Divide {0} by {1}", x, y);
return await Task.FromResult(x / y);
}
public async Task<double> Multiply(double x, double y)
{
ActorEventSource.Current.ActorMessage(this, "Multiply {0} and {1}", x, y);
return await Task.FromResult(x * y);
}
public async Task<double> Substract(double x, double y)
{
ActorEventSource.Current.ActorMessage(this, "Substract {1} from {0}", x, y);
return await Task.FromResult(x - y);
}
}</pre>
<p>
Zuletzt müssen nur noch die Clients implementiert werden.<br />
Auch diese referenzieren das Schnittstellen-Projekt, sowie die Service Fabric NuGet-Pakete.
</p>
<p>
Um den Actor ansprechen zu können wird ein Proxy-Objekt benötigt.<br />
Dieses kann über die ActorProxy-Factoryklasse erzeugt werden.<br />
Dabei verwende ich eine zufällige Actor-ID, die mich auf einen der verfügbaren Actor-Instanzen verweist, sowie den Pfad zur übergeordneten Dienst-Applikation.<br />
Auf diese Konzepte werde ich in einem späteren Blog Post näher eingehen.
</p>
<pre class="brush: c-sharp;">
public static void Main(string[] args)
{
var proxy = ActorProxy.Create<IStatelessCalculatorActor>(
ActorId.NewId(), "fabric:/StatelessCalculatorActorApplication");
Console.WriteLine(
"[Actor {0}]: 1 + 5 = {1}",
proxy.GetActorId(),
proxy.Add(1, 5).Result);
Console.WriteLine(
"[Actor {0}]: 11 - 6 = {1}",
proxy.GetActorId(),
proxy.Substract(11, 6).Result);
Console.WriteLine(
"[Actor {0}]: 3 * 5 = {1}",
proxy.GetActorId(),
proxy.Multiply(3, 5).Result);
Console.WriteLine(
"[Actor {0}]: 9 / 2 = {1}",
proxy.GetActorId(),
proxy.Divide(9, 2).Result);
}</pre>
<h3>
Testen & Debuggen<br />
</h3>
<p>
Anschließend kann die Solution – wie gewohnt – getested und debugged werden.
</p>
<p>
Als kleine Besonderheit werden beim Debuggen in Visual Studio diverse Statusmeldungen ausgegeben.
</p>
<p>
<a href="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_03.png" target="_blank"><img decoding="async" loading="lazy" alt="Stateless Calculator Actor" class="alignnone size-large wp-image-10112" height="549" src="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_03-1024x909.png" width="618" srcset="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_03-1024x909.png 1024w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_03-300x266.png 300w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_03-150x133.png 150w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_03.png 1060w" sizes="(max-width: 618px) 100vw, 618px" /></a>
</p>
<p>
Zusätzlich wird mit dem Azure Service Fabric SDK, auch ein kleines Tool, der Service Fabric Explorer, installiert, mit dem diverse Informationen des lokalen Clusters einsehbar sind.
</p>
<p>
<img decoding="async" loading="lazy" alt="Service Fabric Explorer" class="alignnone size-full wp-image-10122" height="407" src="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_04.png" width="600" srcset="https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_04.png 600w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_04-300x204.png 300w, https://media.sascha-dittmann.de/blog/2015/05/StatelessActor_04-150x102.png 150w" sizes="(max-width: 600px) 100vw, 600px" />
</p>
<h3>
Quellcode des Beispiels<br />
</h3>
<p>
Das komplette Taschenrechner-Beispiel habe ich <a href="https://github.com/SaschaDittmann/service-fabric-samples/tree/master/StatelessCalculatorActor" rel="nofollow" target="_blank">hier</a> zur Verfügung gestellt.
</p>
<hr />
<div style="display: inline-block;">
<div style="float: left;">
<img decoding="async" alt="Weitere Informationen" src="https://media.sascha-dittmann.de/blog/Shared/info.png" />
</div>
<div style="float: left;">
<p>
Weitere Informationen:
</p>
<ul>
<li>
<a href="http://www.sascha-dittmann.de/2015/04/azure-service-fabric-paas-auf-microservice-basis/" target="_blank">Azure Service Fabric: PaaS auf Microservice-Basis</a>
</li>
<li>
<a href="http://research.microsoft.com/en-us/projects/orleans/" rel="nofollow" target="_blank">Microsoft Research: Project Orleans</a>
</li>
<li>
<a href="https://github.com/SaschaDittmann/service-fabric-samples/tree/master/StatelessCalculatorActor" rel="nofollow" target="_blank">GitHub: Stateless Calculator Actor </a>
</li>
</ul></div>
</div>
<hr />
]]></content:encoded>
</item>
<item>
<title>Azure Service Fabric: PaaS auf Microservice-Basis</title>
<link>https://www.sascha-dittmann.de/2015/04/azure-service-fabric-paas-auf-microservice-basis/</link>
<dc:creator><![CDATA[Sascha Dittmann]]></dc:creator>
<pubDate>Wed, 29 Apr 2015 20:32:48 +0000</pubDate>
<category><![CDATA[.NET]]></category>
<category><![CDATA[Cloud Computing]]></category>
<category><![CDATA[Azure Service Fabric]]></category>
<category><![CDATA[Cloud]]></category>
<category><![CDATA[Cloud Services]]></category>
<category><![CDATA[Microservices]]></category>
<category><![CDATA[PaaS]]></category>
<category><![CDATA[Preview]]></category>
<guid isPermaLink="false">http://www.sascha-dittmann.de/?p=9672</guid>
<description><![CDATA[Nachdem Mark Russinovich bereits vor einigen Tagen die neuen Azure Service Fabric Preview angekündigt hatte, war es heute soweit. Im Rahmen der //build/ Konferenz wurde dieser Preview-Dienst für die Öffentlichkeit freigegeben. Diese neue PaaS soll Entwicklern dabei helfen, schneller und unkomplizierter Anwendungen für die Cloud zu konstruieren.]]></description>
<content:encoded><![CDATA[<p style="display: inline-block;">
<img decoding="async" loading="lazy" alt="Azure Service Fabric (Preview)" class="size-full" height="150" src="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 30px; float: left;" width="150" /><strong>Nachdem Mark Russinovich bereits vor einigen Tagen die neuen <a href="http://azure.microsoft.com/blog/2015/04/20/announcing-azure-service-fabric-reducing-complexity-in-a-hyper-scale-world/" rel="nofollow" target="_blank">Azure Service Fabric Preview angekündigt</a> hatte, war es heute soweit. Im Rahmen der <a href="http://www.buildwindows.com/" rel="nofollow" target="_blank">//build/ Konferenz</a> wurde dieser Preview-Dienst für die Öffentlichkeit freigegeben. Diese neue PaaS soll Entwicklern dabei helfen, schneller und unkomplizierter Anwendungen für die Cloud zu konstruieren.</strong>
</p>
<h2>
Ist Azure Service Fabric komplett neu?<br />
</h2>
<p>
Die Service Fabric-Plattform wird bereits seit über 5 Jahren bei Microsoft intern eingesetzt und stellt dabei die Basis für einige Microsoft Produkte, wie beispielsweise Azure SQL Database, Azure DocumentDB, Azure Networking, Event Hubs, Intune, Skype for Business (ehemals Lync) und Bing Cortana.
</p>
<h2>
Ein Blick in die Vergangenheit<br />
</h2>
<p>
Bislang hatte man 3 Optionen, als Basis für Anwendungen in Microsoft Azure:
</p>
<ul>
<li>
Azure App Services (Web Apps, Logic Apps, Mobile Apps und API Apps)
</li>
<li>
Cloud Services
</li>
<li>
Virtual Machines
</li>
</ul>
<p>
Somit schwankte man in der Regel zwischen einem automatisierten Model zum Ausrollen und Betreiben von Applikationen, wie man es mit den Azure App Services hat, oder der vollen Kontrolle wie man es bei den Virtual Machines vorfindet.
</p>
<p>
Meiner Meinung nach, wird immer noch zu häufig zu den Virtual Machines (IaaS) gegriffen, da man es in der Vergangenheit so gewohnt war.<br />
Für die eigenen Anwendungen, ist ein so hohes Maß an Kontrolle meist gar nicht nötig, und man macht sich mit dem dadurch entstehenden Manuellen Aufwand nur unnötig das Leben schwer.
</p>
<p>
Bei den Cloud Services, hatte man eine gute Kombination aus beiden Welten.<br />
Man hatte ein einfaches Programmiermodell, und die Azure-Plattform nahm einem Vieles ab, und trotzdem konnte man durch ein hohes Maß an Kontrolle die VMs nach seinen Wünschen anpassen.
</p>
<p>
Das Ganze hatte natürlich auch einige Nachteile…
</p>
<p>
<a href="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_01.png"><img decoding="async" loading="lazy" alt="Cloud Service Architektur" class="alignright size-medium wp-image-9742" height="127" src="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_01-300x127.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_01-300x127.png 300w, https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_01-150x64.png 150w, https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_01.png 585w" sizes="(max-width: 300px) 100vw, 300px" /></a>Schnell war man bei einem Cloud Services bei einer recht komplexen Architektur angelangt.<br />
Diese bestand meist aus Web- und Worker Roles, Queues für die asynchrone Kommunikation zwischen den Rollen, sowie Speicherdiensten, wie beispielsweise Azure SQL Database oder Azure Storage, da die erzeugten VMs keine eigenen dauerhaften Speichermöglichkeiten boten.<br />
Schnell kam auch ein In-Memory-Cache für die Datenbanken hinzu.
</p>
<p>
Hinzu kam noch, dass das Ausrollen und Testen eines Cloud Services immer ein wenig Zeit in Anspruch nahm, da aus den Rollen auch erst mal VMs erzeugt werden mussten.
</p>
<h2>
Applikationen auf Microservice-Basis<br />
</h2>
<p>
Bei der Azure Service Fabric muss eine komplexe Applikationen in kleine, eigenständige Module aufgeteilt werden, sogenannte Microservices.
</p>
<p>
Diese, sowie einige Konfigurationsinformationen, werden dann in einem Applikationspaket verpackt und in der Azure Service Fabric ausgerollt.<br />
Dabei kann so ein Microservice verschiedene Technologieren verwenden, wie z.B. ASP.NET 5, Node.js, JVM oder auch eine einfache EXE-Datei.
</p>
<p>
<a href="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_02.png"><img decoding="async" loading="lazy" alt="Azure Service Fabric Cluster" class="size-medium" height="163" src="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_02-300x163.png" style="margin: 0px 10px 5px 0px; padding-right: 10px; padding-bottom: 10px; float:left;" width="300" /></a>Die Azure Service Fabric nutzt dann ein oder mehrere vom Benutzer erstelle Cluster aus VMs, um diese Microservices zu betreiben.
</p>
<p>
Dabei können die Cluster sowohl in der Public Cloud oder auch im eigenen Rechenzentrum betreiben werden (Dieser Dienst soll auch Teil des nächsten Windows Server werden).
</p>
<p>
Auch beim Betriebssystem will Microsoft flexibel sein. Momentan wird zwar nur Windows angeboten. Zukünftig soll es aber auch möglich sein Linux-Cluster zu erstellen.
</p>
<p>
Die Service Fabric Container, bieten außerdem die Möglichkeit einen lokalen Speichermechanismus zu verwenden, um so die Daten nahe am Dienst und damit im schnellen Zugriff zu haben.<br />
Somit lassen sich auch Stateful-Microservices erstellen.
</p>
<p>
Eine Architektur einer solchen Anwendung könnte dann wie folgt aussehen:
</p>
<p>
<img decoding="async" loading="lazy" alt="Azure Service Fabric - Anwendungsarchitektur" class="alignnone size-full" height="354" src="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_03.png" width="595" />
</p>
<p style="display: inline-block;">
<a href="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_04.png"><img decoding="async" loading="lazy" alt="Azure Service Fabric - Replikationsset" class="alignright size-medium wp-image-9832" height="225" src="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_04-300x225.png" width="300" srcset="https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_04-300x225.png 300w, https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_04-150x112.png 150w, https://media.sascha-dittmann.de/blog/2015/04/AzureServiceFabric_04.png 410w" sizes="(max-width: 300px) 100vw, 300px" /></a>Zu Ausfallsicherheit können im Cluster mehrere Instanzen des Microservices gestartet werden, wobei immer nur eine aktiv ist (Primary).<br />
Die Sekundärinstanzen sind dann Teil eines Replikationssets und erhalten alle Daten der Primärinstanz. Es wird dabei durch Transaktionen sichergestellt, dass mindestens eine Sekundärinstanz den aktuellen Stand der Daten enthält.<br />
Wenn dann die Primärinstanz ausfallen sollte, wird umgehend eine Sekundärinstanz zum neuen Primary erhoben.
</p>
<h2>
Entwicklungsumgebung für die Service Fabric<br />
</h2>
<p>
Wer mit der Azure Service Fabric Preview gleich loslegen möchte, benötigt dazu den <a href="http://go.microsoft.com/fwlink/?linkid=517106" rel="nofollow" target="_blank">Visual Studio 2015 RC</a>, sowie das <a href="http://www.microsoft.com/web/handlers/webpi.ashx?command=getinstallerredirect&appid=MicrosoftAzure-ServiceFabric">Service Fabric SDK</a>, was über den Web Platform Installer installiert werden kann.
</p>
<p>
Da das Service Fabric SDK PowerShell-Skripte für das Testen der Anwendung im Lokalen Cluster ausführen will, muss vorher folgender PowerShell-Befehl im entsprechenden Benutzerkontext ausgeführt werden:
</p>
<pre>
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force -Scope CurrentUser
</pre>
<p>
Anschließend kann man sich ein lokales Cluster erstellen:
</p>
<ol>
<li>
Ein PowerShell Fenster mit Administrator-Rechten öffnen
</li>
<li>
In das %programfiles%\Microsoft SDKs\Service Fabric\ClusterSetup Verzeichnis wechseln
</li>
<li>
Das PowerShell-Skript ./DevClusterSetup.ps1 ausführen
</li>
</ol>
<p>
</p>
<hr />
<div style="display: inline-block;">
<div style="float: left;">
<img decoding="async" alt="Weitere Informationen" src="https://media.sascha-dittmann.de/blog/Shared/info.png" />
</div>
<div style="float: left;">
<p>
Weitere Informationen:
</p>
<ul>
<li>
<a href="http://azure.microsoft.com/blog/2015/04/20/announcing-azure-service-fabric-reducing-complexity-in-a-hyper-scale-world/" rel="nofollow" target="_blank">Announcing Azure Service Fabric: Reducing Complexity in a Hyper-scale World</a>
</li>
<li>
<a href="http://go.microsoft.com/fwlink/?linkid=517106" rel="nofollow" target="_blank">Visual Studio 2015 RC</a>
</li>
<li>
<a href="http://www.microsoft.com/web/handlers/webpi.ashx?command=getinstallerredirect&appid=MicrosoftAzure-ServiceFabric">Download: Azure Service Fabric SDK</a>
</li>
</ul></div>
</div>
<hr />
]]></content:encoded>
</item>
</channel>
</rss>