-
Notifications
You must be signed in to change notification settings - Fork 14
Getting Started
Btrplace is a flexible algorithm to place Virtual Machines (VMs) on servers in a hosting platforms. Basically, it manages VMs with respect to constraints that are stated by the users. As a user of the algorithm, you only have to declare the constraints you want to have satisfied. This tutorial presents the fundaments of BtrPlace.
- [Associated source code] (https://github.com/fhermeni/btrplace-solver/blob/develop/examples/src/main/java/btrplace/examples/GettingStarted.java)
BtrPlace is articulated around 4 primitives:
-
The model depicts the current state of a virtualized hosting platforms. It is usually generated from monitoring data
-
A reconfiguration plan. A plan consists of a scheduled set of actions to execute. A plan allows to transit from a source model to a destination model.
-
A set of Satisfaction Oriented Constraints ( SatConstraints). A SatConstraint imposes a restriction on a model or a reconfiguration. On a model, it provides a discrete restriction. On a plan, it imposes a continuous restriction. Basically, it allows to control the state of the elements (VMs, servers), the resource allocation, the VMs placement, ...
-
A reconfiguration algorithm is an algorithm that takes a model and a set of constraints as a parameter. It checks if the model is consistent with regards to the states constraints. If not, it computes a plan to reach a model that satisfies all the constraints simultaneously.
A model is composed of several elements, that are required or optional:
-
The mapping (required) declares the current servers states and the current VMs states and placement.
-
a serie of [views] (http://btrp.inria.fr/apidocs/releases/btrplace/solver/last/index.html?btrplace/model/ModelView.html) (optional) to declare domain-specific informations about the elements, such as their resources consumptions.
-
some [attributes] (http://btrp.inria.fr:8080/apidocs/releases/btrplace/solver/last/index.html?btrplace/model/ModelView.html) (optional that indicate options for certain elements.
"The source model"
In this tutorial, we will reproduce the model that is depicted by the figure on the left. It represents a model composed by 4 online servers hosting 6 running VMs.
In Btrplace, as in many hypervisors, elements such as servers and VMs are identified by a UUID. The next snipped describe how to create the mapping declare the online node n1 and place some VMs on it:
Mapping m = new DefaultMapping();
UUID n1 = UUID.randomUUID();
UUID vm2 = UUID.randomUUID();
UUID vm3 = UUID.randomUUID();
//n1 is online
map.addOnlineNode(n1);
//vm3 and vm2 runs on n1
map.addRunningVM(vm3, n1);
map.addRunningVM(vm2, n1);In Btrplace, a resource is defined using a special view called ShareableResource. This allows to specify the physical resource capacity of the nodes and the virtual resource usage of the VMs.
Below is the code to use to declare a "cpu" resource.For this example, it will indicates the amount of physical CPUs available on the nodes, and the amount of virtual CPUs that are allocated to the VMs.
ShareableResource rcCPU = new ShareableResource("cpu");
//Each of the node has 8 pCPUs
rcCPU.set(n1, 8);
rcCPU.set(n2, 8);
rcCPU.set(n3, 8);
rcCPU.set(n4, 8);
//VMs uses between 2 and 5 vCPUs
rcCPU.set(vm1, 2);
rcCPU.set(vm2, 3);
rcCPU.set(vm3, 4);
rcCPU.set(vm4, 3);
rcCPU.set(vm5, 3);
rcCPU.set(vm6, 5);Model mo = new DefaultModel(map);
mo.attach(rcCPU);Constraints are independant elements that impose a restriction on a model. Typically, it may restrict the VMs placement, their state, their resource allocation, ...
The following code creates a set of 5 constraints
Set<SatConstraint> cstrs = new HashSet<SatConstraint>();
//We disallow CPU overbooking, so each unit of
//virtual resource consumes one unit of physical
//resource on every nodes
Set<UUID> allNodes = new HashSet<UUID>(Arrays.asList(n1, n2, n3, n4));
cstrs.add(new Overbook(allNodes, "cpu", 1));
//VM2 and VM3 must be running on distinct nodes
cstrs.add(new Spread(new HashSet<UUID>(Arrays.asList(vm2, vm3))));
//VM1 must have at least 3 virtual CPU dedicated to it
cstrs.add(new Preserve(Collections.singleton(vm1), "cpu", 3));
//node N4 must be offline
cstrs.add(new Offline(Collections.singleton(n4)));