We continue with a detailed study of Microsoft Azure stack
as inferred from an introduction of Azure by Microsoft. We reviewed some more
features of Azure storage. We saw how erasure coding works in Windows Azure
Storage aka WAS and how its different from Pelican. We saw what steps WAS takes
to improve durability. We also saw the benefits of journaling. We reviewed the
partition layer which translates objects such as blob, table or queue to
storage. We saw how the partition manager maintains a massive Object Table that
is sharded on different partition servers which maintain their consistency
across concurrent transactions using a lock service. We read the partition
layer data model and the supported data types and operations, the partition
layer architecture and the range partition data structures. we reviewed the
load balancing, split and merge operations. Then we reviewed intrastamp and
interstamp replication.
Lets take some digression to talk about TCO. Yan Han in his
tutorial on TCO in December 2011 gave two examples of Cost Analysis citing
examples on AWS. According to him at
that time the TCO of an AWS small instance for five years was $2750-$3750 all
of which was operational costs not hardware costs which he put at 0$. The TCO of a physical server comparable to an
AWS small instance for 5 years was
$5868-$7608. The operation expense was
$7190-$10,690 ignoring downtime and failure expenses, insurance cost,
technology training, and backup process. Similarly he cited costs for an
example using storage instead of
compute. He said the TCO of a 10TB in Amazon S3 per year is $16,800 all of
which was exclusively operational expense. The TCO of an on-premise 10TB
physical storage per year was $11,212-$12,612. He broke down the hardware costs
as $4168 per year and the operation expense as $1438-$2138 per year. Together
with his analysis, he concluded on-premise cost higher than any public cloud offering.
In such case, an organization will find it uphill to reduce or justify cost of
private cloud to the point of tipping it below the costs incurred on public
cloud. Therefore the migration path to public cloud becomes mandatory to be
paved.
The migration path for applications and customers could
include the following initiatives:
1) classifying usages of customers based on IaaS, PaaS, and
SaaS and separating them to more and more
2) surveying all compute and storage usages to determine
priority and severity levels of workloads for their migration
3) Onboarding new applications to public cloud with
translation of jargons for core services such as logging, backup, monitoring,
databases and so on.
4) Determining security and compliance defaults for application
destinations in the public cloud.
5) Transferring account ownership and tracking to these
resources for individuals and groups based on accounts and roles in the cloud .
6) Setting up alerts and notifications for management and activities involved.
7) Mapping project, resource and data transfers from private
to public cloud
8) Perform automatic migrations where customer interactions
can be avoided.
The migration plan may also depend on the TCO. Martens,
Walterbusch and Teuteberg mention that a major issue of any TCO model is the
disregard of a differentiation between private, public and hybrid cloud.
Print Top view of a binary tree
void PrintTopView(Node root)
{
// similar to level wise traversal
if (root == null) return;
var d = new SortedDictionary<int, int>();
int left = 0;
int right = 0;
var q = new Queue<Node>();
q.enqueue(root);
root.dist = 0;
q.enqueue(null);
while (q.empty() == false)
{
var item = q.dequeue();
if (item == null){
q.enqueue(null);
}else
{
//if (root.dist == 0) { d[root.dist] = root.data;}
if (root.dist < left ) { left = root.dist; d[root.dist] = root.data;}
if (root.dist > right) { right = root.dist; d[root.dist] = root.data;}
if (root.left){
root.left.dist = root.dist-1;
q.enqueue(root.left);
}
if (root.right){
root.right.dist = root.dist+1;
q.enqueue(root.right);
}
}
}
foreach (var kvp in d)
Console.Write("{0} ", kvp.value);
}
int GetMid(Node root)
{
if (root == null) return 0;
var current = root;
while (current.left != null)
current = current.left;
var min = root.data;
current = root;
while (current.right != null)
current = current.right;
var max = root.data;
return (min+max)/2;
}
No comments:
Post a Comment