SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
Evolution of the infrastructure and lessons learned
DHCP Infra @ Facebook
Angelo “pallotron” Failla <pallotron@fb.com> - Cluster Infrastructure Dublin
SRECon15 Europe - Dublin - 15th May 2015
Cluster Infrastructure
Agenda
• Cluster overview
• DCHP: how and why it’s used
• Old architecture and its limits
• How we solved those limits
• Lesson learned and other takeaways
server
server
TOR
server
…
“Wedge” switch running FBOSS
server
server
TOR
server
…
server
server
TOR
server
…
server
server
TOR
server
…
server
server
TOR
server
…
CSW CSW CSW CSW
uplinks
Datacenter routers
DHCP: how and why?
For bare metal provisioning:
•At reboot
•Used to install OS on hosts
•Anaconda based
•iPXE
For Out Of Band management:
•To assign IPs to OOB interfaces
•Leases renewed typically

once a day
DHCP client DHCP server
DISCOVER (broadcast)
Anatomy of a DHCP4 handshake
DHCP relayer
OFFER
DISCOVER (unicast)
OFFER
REQUEST (broadcast)
REQUEST (unicast)
ACK
ACK
What about DHCPv6 (RFC3315)?
It’s similar but with few differences:
• Different option names and formats
• Doesn’t deliver routing info (done by IPv6 via RA
packets)
• 255.255.255.255 -> ff02::1:2 (special multicast IP) ->
needs Relayer
• DUID (“Dhcp Unique IDentifier”) replaces MAC
• we use DUID-LL[T]
CSW CSW CSW CSW
uplinks
Datacenter routers
server
server
TOR
server
…
relayer
server
server
TOR
server
…
relayer
server
server
TOR
DHCP server
…
relayer
server
server
TOR
…
relayer
DHCP server
L

B
server
TOR
server
…
relayer
DHCP server
DHCP server
Problem: failure domain of the old architecture
active
standby
server
TOR
server
…
relayer
static
config
static
config
Problem: bootstrapping a cluster
L
B
DHCP server
DHCP server
active
standby
TOR
routable
DHCP server
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
static
config
static
config
static
config
for all DC
intra datacenter
remote cluster
Inventory
System
Periodic job git repo grocery-delivery
Problem: configuration distribution
/etc/dhcpd/…
/etc/init.d/
dhcpd restart
DHCP server
Chef
Infrastructure
Problem: lack of instrumentation
• Lack of instrumentation, we were oblivious to things like:
• # RPS
• client latencies
• # of errors/exceptions
• flying blind
Photo by Bill Abbott-
Path to success
• Support both DHCPv4 and DHCPv6
• Stateless server
• shipping config shouldn’t be required
• host data should be pulled dynamically from inventory system
• Get rid of the hardware load balancers
• Must be easy to “containerize”
• Integrated with Facebook infrastructure
Photo by Angelo Failla -
Photo by Edith Soto -
Enter ISC KEA
• New DHCP rewrite from ISC (Internet Software Consortium)
• Started in 2009 (BIND10), DHCP component started in 2011
• Why a re-write?
• ISC DHCPD code is ~18 years old
• Not built using modern software development models
• Monolithic code => complex => not modular => not easy to extend
• Managed open source model (closed repo, semi-closed bug tracking)
• Lacking performance
libdhcp++
general purpose DHCP library
IPv4/IPv6 packet parsing/assembly
IPv4/IPv6 options parsing/assembly
interface detection (Linux, partial BSD/Mac OSX)
socket management
DHCPv4

Server
DHCPv6

Server
DNS

Updates
perfdhcp
JSON
Configuration
KEA server
DHCPpacketprocessingflow
receive packet
select subnet
select lease
send packet
Custom library 1
function1()
function2()
Custom library 2
function1()
function2()
Extending KEA: the Hook API
{
"Logging": {
"loggers": [{
"severity": "DEBUG",
"name": "*",
"debuglevel": 0
}]
},
"Dhcp4": {
"hooks-libraries": [
"/path/to/your/library.so"
],
"interfaces": [
"eth0"
],
"valid-lifetime": 4000,
"renew-timer": 1000,
"rebind-timer": 2000,
"subnet4": [{
"subnet": "0.0.0.0/0",
"pools": [{
"pool": "0.0.0.0-255.255.255.255"
}]
}]
}
}
KEA JSON config file looks like this:
inbound
packet
KEA
initial
processing
pkt[46]_receive
FB Infra

(e.g.: logging,
alerting, metrics,
inventory, others)
In Memory

Cache
CalloutHandle
Context

Object
(persistent)
subnet[46]_select
(skipped)
pkt[46]send
FB Infra

(e.g.: logging,
alerting, metrics,
inventory, others)
outbound
packet
KEA
final

assembly
lease[46]_select
(skipped)
skipped subnet/lease
selection means packet
is empty at this
point and needs to be
filled in
Life of a packet in the FB Hook library
#include <hooks/hooks.h>
#include <dhcp/pkt4.h>
#include <dhcp/hwaddr.h>
#include "yourlibs.h"
using namespace isc::hooks;
extern "C" {
int version() {
return KEA_HOOKS_VERSION;
}
int load(LibraryHandle& libhandle) {
// initialize needed objects 

// (logging, cache, config, etc)
return 0;
}
int unload() {
// destroy the objects
return 0;
}
. . . . . . .
. . . . . . .
int subnet4_select(CalloutHandle& handle) {
handle.setSkip(true);
return 0;
}
int lease4_select(CalloutHandle& handle) {
handle.setSkip(true);
return 0;
}
. . . . . . .
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
. . . . .
int pkt4_receive(CalloutHandle& handle) {
Pkt4Ptr query4_ptr;
handle.getArgument("query4", query4_ptr);
HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr();
HostStateObject hostInfo;
if (!getHostInfo(&hostInfo, hwaddr_ptr)) {
LOG(ERROR) << "Something went wrong!";
handle.setSkip(true);
return 0;
}
logStuff(query4_ptr);
handle.setContext("hostInfo", hostInfo);
return 0;
}
. . . . .
. . . . .
int pkt4_send(CalloutHandle& handle) {
Pkt4Ptr response4_ptr;
HostStateObject hostInfo;
// at this point response4 is empty so we have
// to fill all the things ourselves
handle.getArgument("response4", response4_ptr);
handle.getContext("hostInfo", hostInfo);
// set all relevant options (e.g. default gw,
// boot options, subnet, DNS, domain search,
// hostname, lease time, etc)
fillUpResponsePacket(response4_ptr, hostInfo);
logStuff(response4_ptr);
return 0;
}
}
$ g++ -I /usr/include/kea -L /usr/lib/kea/lib -fpic -shared -o ${your_lib}.so 
${your_hook_lib_files} -lkea-dhcpsrv -lkea-dhcp++ -lkea-hooks -lkea-log 
-lkea-util -lkea-exceptions
You can compile your code using something like this:
Big wins
Photo by Greg Hildebrand -
No more static configuration
• Configuration for hosts is pulled dynamically from inventory
• DCOPs people are happy (no more problems during swaps)
• Makes deployment easier, only need to generate a small JSON
file
• Integrated with “configerator”: our configuration infrastructure
based on Python DSL.
• Version controlled, canary support, hot reload support, etc.
No more hardware load balancing!
• Switched to Anycast/ECMP
• Packets sent to the anycast address are delivered
to the nearest server
• Same fleet-wide “anycast” IP is assigned to all
DHCP servers (to ip6tnl0/tunl0 interfaces)
• ExaBGP is used to advertise the anycast IP
• Servers become routers and part of the network
infrastructure
exaBGP
TOR
DHCP
server
eth0: 10.44.10.20
tunl0: 10.127.255.67
exaBGP
DHCP
server
eth0: 10.44.11.20
tunl0: 10.127.255.67
TOR
exaBGP
TOR
DHCP
server
eth0: 10.10.10.20
tunl0: 10.127.255.67
exaBGP
DHCP
server
eth0: 10.10.11.20
tunl0: 10.127.255.67
TOR
Infrastructure routers
Region 2Region 1
BGP BGP BGP BGP
BGP
exaBGP
DHCP
server
eth0: 10.44.10.20
tunl0: 10.127.255.67
exaBGP
DHCP
server
eth0: 10.44.11.20
tunl0: 10.127.255.67
exaBGP
DHCP
server
eth0: 10.10.10.20
tunl0: 10.127.255.67
exaBGP
DHCP
server
eth0: 10.10.11.20
tunl0: 10.127.255.67
Region 2Region 1
RSW relayer
distance =1 distance = 1
distance = 2 distance = 2
Seamless cluster/datacenter turnups
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
TOR
L
B
DHCP server
DHCP server
active
standby
routable
DHCP server
static
config
static
config
static
config
for all DC
inter datacenter
Metrics!
Time for

a war story!
Photo by Karen Roe -
First IPv6-only cluster in Luleå, Sweden
• Found bug in BIOS/firmware (*ALL* of the machines in cluster)
• Unable to fetch PXE seed via TFTPv6 when client and server are
on different VLANs
• Vendor was made aware of the problem but fix wasn’t going to
be fast (multiple months)
• Realized proprietary TORs could run Python scripts
• Wrote quick and dirty Python TFTP relayer
• Deployed into all TORs in the cluster
• Modify KEA hook lib to override the IP of the
cluster TFTP endpoint with the IP of the machine in
the rack (which is in sameVLAN)
The workaround
Some takeaways…
Photo by Ollie Richardson -
Stateless is
good!
Keep data (state
and config)
remotely
It simplifies
configuration
management
and deployment!
The “Not Invented Here”
syndrome
Resources
• KEA:http://kea.isc.org
• exaBGP:https://github.com/Exa-Networks/exabgp
• OpenCompute: FBOSS and wedge rack switch:
• https://code.facebook.com/posts/843620439027582/facebook-open-switching-system-fboss-and-wedge-in-the-open/
• https://code.facebook.com/posts/681382905244727/introducing-wedge-and-fboss-the-next-steps-toward-a-disaggregated-network/
• https://code.facebook.com/posts/717010588413497/introducing-6-pack-the-first-open-hardware-modular-switch/
• https://github.com/facebook/fboss
Questions?
SREConEurope15 - The evolution of the DHCP infrastructure at Facebook

Mais conteúdo relacionado

Mais procurados

Scaling mysql with python (and Docker).
Scaling mysql with python (and Docker).Scaling mysql with python (and Docker).
Scaling mysql with python (and Docker).Roberto Polli
 
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with UciprovLukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with UciprovZabbix
 
Dynamic Hadoop Clusters
Dynamic Hadoop ClustersDynamic Hadoop Clusters
Dynamic Hadoop ClustersSteve Loughran
 
Troubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issuesTroubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issuesMichael Klishin
 
Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...
Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...
Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...Matthew Ahrens
 
IPTABLES Introduction
IPTABLES IntroductionIPTABLES Introduction
IPTABLES IntroductionHungWei Chiu
 
Asynchronous Io Programming
Asynchronous Io ProgrammingAsynchronous Io Programming
Asynchronous Io Programmingl xf
 
Orchestrating MySQL with Python and Docker
Orchestrating MySQL with Python and DockerOrchestrating MySQL with Python and Docker
Orchestrating MySQL with Python and DockerRoberto Polli
 
[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...
[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...
[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...OpenStack Korea Community
 
Networking and Go: An Epic Journey
Networking and Go: An Epic JourneyNetworking and Go: An Epic Journey
Networking and Go: An Epic JourneySneha Inguva
 
Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Naotoshi Seo
 
An Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux ContainersAn Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux ContainersKento Aoyama
 
Deploying Foreman in Enterprise Environments
Deploying Foreman in Enterprise EnvironmentsDeploying Foreman in Enterprise Environments
Deploying Foreman in Enterprise Environmentsinovex GmbH
 
[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network Troubleshooting[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network TroubleshootingOpen Source Consulting
 
debugging openstack neutron /w openvswitch
debugging openstack neutron /w openvswitchdebugging openstack neutron /w openvswitch
debugging openstack neutron /w openvswitch어형 이
 
CoreOS + Kubernetes @ All Things Open 2015
CoreOS + Kubernetes @ All Things Open 2015CoreOS + Kubernetes @ All Things Open 2015
CoreOS + Kubernetes @ All Things Open 2015Brandon Philips
 
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...Puppet
 
Software development practices in python
Software development practices in pythonSoftware development practices in python
Software development practices in pythonJimmy Lai
 
OpenNebula, the foreman and CentOS play nice, too
OpenNebula, the foreman and CentOS play nice, tooOpenNebula, the foreman and CentOS play nice, too
OpenNebula, the foreman and CentOS play nice, tooinovex GmbH
 

Mais procurados (20)

Scaling mysql with python (and Docker).
Scaling mysql with python (and Docker).Scaling mysql with python (and Docker).
Scaling mysql with python (and Docker).
 
Kamailio - Secure Communication
Kamailio - Secure CommunicationKamailio - Secure Communication
Kamailio - Secure Communication
 
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with UciprovLukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
 
Dynamic Hadoop Clusters
Dynamic Hadoop ClustersDynamic Hadoop Clusters
Dynamic Hadoop Clusters
 
Troubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issuesTroubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issues
 
Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...
Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...
Improving the ZFS Userland-Kernel API with Channel Programs - BSDCAN 2017 - M...
 
IPTABLES Introduction
IPTABLES IntroductionIPTABLES Introduction
IPTABLES Introduction
 
Asynchronous Io Programming
Asynchronous Io ProgrammingAsynchronous Io Programming
Asynchronous Io Programming
 
Orchestrating MySQL with Python and Docker
Orchestrating MySQL with Python and DockerOrchestrating MySQL with Python and Docker
Orchestrating MySQL with Python and Docker
 
[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...
[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...
[2018.10.19] Andrew Kong - Tunnel without tunnel (Seminar at OpenStack Korea ...
 
Networking and Go: An Epic Journey
Networking and Go: An Epic JourneyNetworking and Go: An Epic Journey
Networking and Go: An Epic Journey
 
Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014
 
An Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux ContainersAn Updated Performance Comparison of Virtual Machines and Linux Containers
An Updated Performance Comparison of Virtual Machines and Linux Containers
 
Deploying Foreman in Enterprise Environments
Deploying Foreman in Enterprise EnvironmentsDeploying Foreman in Enterprise Environments
Deploying Foreman in Enterprise Environments
 
[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network Troubleshooting[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network Troubleshooting
 
debugging openstack neutron /w openvswitch
debugging openstack neutron /w openvswitchdebugging openstack neutron /w openvswitch
debugging openstack neutron /w openvswitch
 
CoreOS + Kubernetes @ All Things Open 2015
CoreOS + Kubernetes @ All Things Open 2015CoreOS + Kubernetes @ All Things Open 2015
CoreOS + Kubernetes @ All Things Open 2015
 
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...
 
Software development practices in python
Software development practices in pythonSoftware development practices in python
Software development practices in python
 
OpenNebula, the foreman and CentOS play nice, too
OpenNebula, the foreman and CentOS play nice, tooOpenNebula, the foreman and CentOS play nice, too
OpenNebula, the foreman and CentOS play nice, too
 

Destaque

Facebook Retrospective - Big data-world-europe-2012
Facebook Retrospective - Big data-world-europe-2012Facebook Retrospective - Big data-world-europe-2012
Facebook Retrospective - Big data-world-europe-2012Joydeep Sen Sarma
 
Facebook's Approach to Big Data Storage Challenge
Facebook's Approach to Big Data Storage ChallengeFacebook's Approach to Big Data Storage Challenge
Facebook's Approach to Big Data Storage ChallengeDataWorks Summit
 
A Survey of Petabyte Scale Databases and Storage Systems Deployed at Facebook
A Survey of Petabyte Scale Databases and Storage Systems Deployed at FacebookA Survey of Petabyte Scale Databases and Storage Systems Deployed at Facebook
A Survey of Petabyte Scale Databases and Storage Systems Deployed at FacebookBigDataCloud
 
Data Warehouse Evolution Roadshow
Data Warehouse Evolution RoadshowData Warehouse Evolution Roadshow
Data Warehouse Evolution RoadshowMapR Technologies
 
Hw09 Rethinking The Data Warehouse With Hadoop And Hive
Hw09   Rethinking The Data Warehouse With Hadoop And HiveHw09   Rethinking The Data Warehouse With Hadoop And Hive
Hw09 Rethinking The Data Warehouse With Hadoop And HiveCloudera, Inc.
 
Facebook - Jonthan Gray - Hadoop World 2010
Facebook - Jonthan Gray - Hadoop World 2010Facebook - Jonthan Gray - Hadoop World 2010
Facebook - Jonthan Gray - Hadoop World 2010Cloudera, Inc.
 
Storage Infrastructure Behind Facebook Messages
Storage Infrastructure Behind Facebook MessagesStorage Infrastructure Behind Facebook Messages
Storage Infrastructure Behind Facebook Messagesyarapavan
 
Creating a Culture of Data @ Facebook - TCCEU13
Creating a Culture of Data @ Facebook - TCCEU13Creating a Culture of Data @ Facebook - TCCEU13
Creating a Culture of Data @ Facebook - TCCEU13Andy Kriebel
 
My last vacation.
My last vacation.My last vacation.
My last vacation.jeandrea
 
Attract more users to your Delphi & C++Builder applications by leveraging new...
Attract more users to your Delphi & C++Builder applications by leveraging new...Attract more users to your Delphi & C++Builder applications by leveraging new...
Attract more users to your Delphi & C++Builder applications by leveraging new...David Intersimone
 
Tumblr - What did you agree to?
Tumblr - What did you agree to?Tumblr - What did you agree to?
Tumblr - What did you agree to?donttrustladygaga
 
Location,props,costumes,actors
Location,props,costumes,actorsLocation,props,costumes,actors
Location,props,costumes,actorssophiecramer
 
Παρουσίαση Νίκου Γκάτσου Ευτυχίας
Παρουσίαση Νίκου Γκάτσου ΕυτυχίαςΠαρουσίαση Νίκου Γκάτσου Ευτυχίας
Παρουσίαση Νίκου Γκάτσου ΕυτυχίαςMarilia
 
Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )
Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )
Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )Constantine Zerov
 
Πώς να φτιάξετε ένα ψηφιακό παζλ
Πώς να φτιάξετε ένα ψηφιακό παζλΠώς να φτιάξετε ένα ψηφιακό παζλ
Πώς να φτιάξετε ένα ψηφιακό παζλMarilia
 
Τα ψηλά βουνά @ 45 8 4 2016
Τα ψηλά βουνά @ 45 8 4 2016Τα ψηλά βουνά @ 45 8 4 2016
Τα ψηλά βουνά @ 45 8 4 2016Marilia
 
Захист прав інтелектуальної власності в адміністративному та судовому порядку...
Захист прав інтелектуальної власності в адміністративному та судовому порядку...Захист прав інтелектуальної власності в адміністративному та судовому порядку...
Захист прав інтелектуальної власності в адміністративному та судовому порядку...Constantine Zerov
 

Destaque (20)

ADER RRHH PRESENTACIÓN CORPORATIVA
ADER RRHH PRESENTACIÓN CORPORATIVAADER RRHH PRESENTACIÓN CORPORATIVA
ADER RRHH PRESENTACIÓN CORPORATIVA
 
Facebook Retrospective - Big data-world-europe-2012
Facebook Retrospective - Big data-world-europe-2012Facebook Retrospective - Big data-world-europe-2012
Facebook Retrospective - Big data-world-europe-2012
 
Facebook's Approach to Big Data Storage Challenge
Facebook's Approach to Big Data Storage ChallengeFacebook's Approach to Big Data Storage Challenge
Facebook's Approach to Big Data Storage Challenge
 
A Survey of Petabyte Scale Databases and Storage Systems Deployed at Facebook
A Survey of Petabyte Scale Databases and Storage Systems Deployed at FacebookA Survey of Petabyte Scale Databases and Storage Systems Deployed at Facebook
A Survey of Petabyte Scale Databases and Storage Systems Deployed at Facebook
 
Data Warehouse Evolution Roadshow
Data Warehouse Evolution RoadshowData Warehouse Evolution Roadshow
Data Warehouse Evolution Roadshow
 
Project Voldemort
Project VoldemortProject Voldemort
Project Voldemort
 
Hw09 Rethinking The Data Warehouse With Hadoop And Hive
Hw09   Rethinking The Data Warehouse With Hadoop And HiveHw09   Rethinking The Data Warehouse With Hadoop And Hive
Hw09 Rethinking The Data Warehouse With Hadoop And Hive
 
Facebook - Jonthan Gray - Hadoop World 2010
Facebook - Jonthan Gray - Hadoop World 2010Facebook - Jonthan Gray - Hadoop World 2010
Facebook - Jonthan Gray - Hadoop World 2010
 
Load balancing at tuenti
Load balancing at tuentiLoad balancing at tuenti
Load balancing at tuenti
 
Storage Infrastructure Behind Facebook Messages
Storage Infrastructure Behind Facebook MessagesStorage Infrastructure Behind Facebook Messages
Storage Infrastructure Behind Facebook Messages
 
Creating a Culture of Data @ Facebook - TCCEU13
Creating a Culture of Data @ Facebook - TCCEU13Creating a Culture of Data @ Facebook - TCCEU13
Creating a Culture of Data @ Facebook - TCCEU13
 
My last vacation.
My last vacation.My last vacation.
My last vacation.
 
Attract more users to your Delphi & C++Builder applications by leveraging new...
Attract more users to your Delphi & C++Builder applications by leveraging new...Attract more users to your Delphi & C++Builder applications by leveraging new...
Attract more users to your Delphi & C++Builder applications by leveraging new...
 
Tumblr - What did you agree to?
Tumblr - What did you agree to?Tumblr - What did you agree to?
Tumblr - What did you agree to?
 
Location,props,costumes,actors
Location,props,costumes,actorsLocation,props,costumes,actors
Location,props,costumes,actors
 
Παρουσίαση Νίκου Γκάτσου Ευτυχίας
Παρουσίαση Νίκου Γκάτσου ΕυτυχίαςΠαρουσίαση Νίκου Γκάτσου Ευτυχίας
Παρουσίαση Νίκου Γκάτσου Ευτυχίας
 
Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )
Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )
Передача технологій та ліцензування -Практика (Падучак Богдан Михайлович )
 
Πώς να φτιάξετε ένα ψηφιακό παζλ
Πώς να φτιάξετε ένα ψηφιακό παζλΠώς να φτιάξετε ένα ψηφιακό παζλ
Πώς να φτιάξετε ένα ψηφιακό παζλ
 
Τα ψηλά βουνά @ 45 8 4 2016
Τα ψηλά βουνά @ 45 8 4 2016Τα ψηλά βουνά @ 45 8 4 2016
Τα ψηλά βουνά @ 45 8 4 2016
 
Захист прав інтелектуальної власності в адміністративному та судовому порядку...
Захист прав інтелектуальної власності в адміністративному та судовому порядку...Захист прав інтелектуальної власності в адміністративному та судовому порядку...
Захист прав інтелектуальної власності в адміністративному та судовому порядку...
 

Semelhante a SREConEurope15 - The evolution of the DHCP infrastructure at Facebook

DevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructure
DevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructureDevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructure
DevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructureAngelo Failla
 
Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545Kernel TLV
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.jsRichard Lee
 
Compiling P4 to XDP, IOVISOR Summit 2017
Compiling P4 to XDP, IOVISOR Summit 2017Compiling P4 to XDP, IOVISOR Summit 2017
Compiling P4 to XDP, IOVISOR Summit 2017Cheng-Chun William Tu
 
Case study ap log collector
Case study ap log collectorCase study ap log collector
Case study ap log collectorJyun-Yao Huang
 
The State of containerd
The State of containerdThe State of containerd
The State of containerdMoby Project
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsOhad Kravchick
 
2019 11-bgphp
2019 11-bgphp2019 11-bgphp
2019 11-bgphpdantleech
 
Oracle High Availabiltity for application developers
Oracle High Availabiltity for application developersOracle High Availabiltity for application developers
Oracle High Availabiltity for application developersAlexander Tokarev
 
Consuming RESTful Web services in PHP
Consuming RESTful Web services in PHPConsuming RESTful Web services in PHP
Consuming RESTful Web services in PHPZoran Jeremic
 
Consuming RESTful services in PHP
Consuming RESTful services in PHPConsuming RESTful services in PHP
Consuming RESTful services in PHPZoran Jeremic
 
Leveraging Hadoop in your PostgreSQL Environment
Leveraging Hadoop in your PostgreSQL EnvironmentLeveraging Hadoop in your PostgreSQL Environment
Leveraging Hadoop in your PostgreSQL EnvironmentJim Mlodgenski
 
Twisted logic
Twisted logicTwisted logic
Twisted logicashfall
 
Containerd Project Update: FOSDEM 2018
Containerd Project Update: FOSDEM 2018Containerd Project Update: FOSDEM 2018
Containerd Project Update: FOSDEM 2018Phil Estes
 
Ingesting hdfs intosolrusingsparktrimmed
Ingesting hdfs intosolrusingsparktrimmedIngesting hdfs intosolrusingsparktrimmed
Ingesting hdfs intosolrusingsparktrimmedwhoschek
 

Semelhante a SREConEurope15 - The evolution of the DHCP infrastructure at Facebook (20)

DevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructure
DevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructureDevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructure
DevopsItalia2015 - DHCP at Facebook - Evolution of an infrastructure
 
Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Web services tutorial
Web services tutorialWeb services tutorial
Web services tutorial
 
Solr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene EuroconSolr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene Eurocon
 
Compiling P4 to XDP, IOVISOR Summit 2017
Compiling P4 to XDP, IOVISOR Summit 2017Compiling P4 to XDP, IOVISOR Summit 2017
Compiling P4 to XDP, IOVISOR Summit 2017
 
Case study ap log collector
Case study ap log collectorCase study ap log collector
Case study ap log collector
 
The State of containerd
The State of containerdThe State of containerd
The State of containerd
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js Applications
 
2019 11-bgphp
2019 11-bgphp2019 11-bgphp
2019 11-bgphp
 
Web Services Tutorial
Web Services TutorialWeb Services Tutorial
Web Services Tutorial
 
Oracle High Availabiltity for application developers
Oracle High Availabiltity for application developersOracle High Availabiltity for application developers
Oracle High Availabiltity for application developers
 
Nodejs - A quick tour (v4)
Nodejs - A quick tour (v4)Nodejs - A quick tour (v4)
Nodejs - A quick tour (v4)
 
Consuming RESTful Web services in PHP
Consuming RESTful Web services in PHPConsuming RESTful Web services in PHP
Consuming RESTful Web services in PHP
 
Consuming RESTful services in PHP
Consuming RESTful services in PHPConsuming RESTful services in PHP
Consuming RESTful services in PHP
 
Leveraging Hadoop in your PostgreSQL Environment
Leveraging Hadoop in your PostgreSQL EnvironmentLeveraging Hadoop in your PostgreSQL Environment
Leveraging Hadoop in your PostgreSQL Environment
 
Twisted logic
Twisted logicTwisted logic
Twisted logic
 
Containerd Project Update: FOSDEM 2018
Containerd Project Update: FOSDEM 2018Containerd Project Update: FOSDEM 2018
Containerd Project Update: FOSDEM 2018
 
PostgreSQL and PL/Java
PostgreSQL and PL/JavaPostgreSQL and PL/Java
PostgreSQL and PL/Java
 
Ingesting hdfs intosolrusingsparktrimmed
Ingesting hdfs intosolrusingsparktrimmedIngesting hdfs intosolrusingsparktrimmed
Ingesting hdfs intosolrusingsparktrimmed
 

Último

Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Excelmac1
 
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一Fs
 
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一Fs
 
Git and Github workshop GDSC MLRITM
Git and Github  workshop GDSC MLRITMGit and Github  workshop GDSC MLRITM
Git and Github workshop GDSC MLRITMgdsc13
 
Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Sonam Pathan
 
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作ys8omjxb
 
Top 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptxTop 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptxDyna Gilbert
 
办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书
办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书
办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书zdzoqco
 
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja VipCall Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja VipCall Girls Lucknow
 
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)Christopher H Felton
 
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一Fs
 
Film cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasaFilm cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasa494f574xmv
 
PHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 DocumentationPHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 DocumentationLinaWolf1
 
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一z xss
 
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Sonam Pathan
 
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一Fs
 

Último (20)

Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Uttam Nagar Delhi 💯Call Us 🔝8264348440🔝
 
Model Call Girl in Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in  Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in  Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝
 
Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...
 
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
 
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
 
Git and Github workshop GDSC MLRITM
Git and Github  workshop GDSC MLRITMGit and Github  workshop GDSC MLRITM
Git and Github workshop GDSC MLRITM
 
Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170
 
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
 
Top 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptxTop 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptx
 
Hot Sexy call girls in Rk Puram 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in  Rk Puram 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in  Rk Puram 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Rk Puram 🔝 9953056974 🔝 Delhi escort Service
 
办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书
办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书
办理多伦多大学毕业证成绩单|购买加拿大UTSG文凭证书
 
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja VipCall Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
 
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
 
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
 
Film cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasaFilm cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasa
 
PHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 DocumentationPHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 Documentation
 
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
 
young call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Service
young call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Serviceyoung call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Service
young call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Service
 
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
 
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
 

SREConEurope15 - The evolution of the DHCP infrastructure at Facebook

  • 1.
  • 2. Evolution of the infrastructure and lessons learned DHCP Infra @ Facebook Angelo “pallotron” Failla <pallotron@fb.com> - Cluster Infrastructure Dublin SRECon15 Europe - Dublin - 15th May 2015
  • 3.
  • 5. Agenda • Cluster overview • DCHP: how and why it’s used • Old architecture and its limits • How we solved those limits • Lesson learned and other takeaways
  • 8. DHCP: how and why? For bare metal provisioning: •At reboot •Used to install OS on hosts •Anaconda based •iPXE For Out Of Band management: •To assign IPs to OOB interfaces •Leases renewed typically
 once a day
  • 9. DHCP client DHCP server DISCOVER (broadcast) Anatomy of a DHCP4 handshake DHCP relayer OFFER DISCOVER (unicast) OFFER REQUEST (broadcast) REQUEST (unicast) ACK ACK
  • 10. What about DHCPv6 (RFC3315)? It’s similar but with few differences: • Different option names and formats • Doesn’t deliver routing info (done by IPv6 via RA packets) • 255.255.255.255 -> ff02::1:2 (special multicast IP) -> needs Relayer • DUID (“Dhcp Unique IDentifier”) replaces MAC • we use DUID-LL[T]
  • 11. CSW CSW CSW CSW uplinks Datacenter routers server server TOR server … relayer server server TOR server … relayer server server TOR DHCP server … relayer server server TOR … relayer DHCP server
  • 12. L
 B server TOR server … relayer DHCP server DHCP server Problem: failure domain of the old architecture active standby server TOR server … relayer static config static config
  • 13. Problem: bootstrapping a cluster L B DHCP server DHCP server active standby TOR routable DHCP server TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR TOR static config static config static config for all DC intra datacenter remote cluster
  • 14. Inventory System Periodic job git repo grocery-delivery Problem: configuration distribution /etc/dhcpd/… /etc/init.d/ dhcpd restart DHCP server Chef Infrastructure
  • 15.
  • 16.
  • 17. Problem: lack of instrumentation • Lack of instrumentation, we were oblivious to things like: • # RPS • client latencies • # of errors/exceptions • flying blind Photo by Bill Abbott-
  • 18. Path to success • Support both DHCPv4 and DHCPv6 • Stateless server • shipping config shouldn’t be required • host data should be pulled dynamically from inventory system • Get rid of the hardware load balancers • Must be easy to “containerize” • Integrated with Facebook infrastructure Photo by Angelo Failla -
  • 19. Photo by Edith Soto -
  • 20. Enter ISC KEA • New DHCP rewrite from ISC (Internet Software Consortium) • Started in 2009 (BIND10), DHCP component started in 2011 • Why a re-write? • ISC DHCPD code is ~18 years old • Not built using modern software development models • Monolithic code => complex => not modular => not easy to extend • Managed open source model (closed repo, semi-closed bug tracking) • Lacking performance
  • 21. libdhcp++ general purpose DHCP library IPv4/IPv6 packet parsing/assembly IPv4/IPv6 options parsing/assembly interface detection (Linux, partial BSD/Mac OSX) socket management DHCPv4
 Server DHCPv6
 Server DNS
 Updates perfdhcp JSON Configuration
  • 22. KEA server DHCPpacketprocessingflow receive packet select subnet select lease send packet Custom library 1 function1() function2() Custom library 2 function1() function2() Extending KEA: the Hook API
  • 23. { "Logging": { "loggers": [{ "severity": "DEBUG", "name": "*", "debuglevel": 0 }] }, "Dhcp4": { "hooks-libraries": [ "/path/to/your/library.so" ], "interfaces": [ "eth0" ], "valid-lifetime": 4000, "renew-timer": 1000, "rebind-timer": 2000, "subnet4": [{ "subnet": "0.0.0.0/0", "pools": [{ "pool": "0.0.0.0-255.255.255.255" }] }] } } KEA JSON config file looks like this:
  • 24. inbound packet KEA initial processing pkt[46]_receive FB Infra
 (e.g.: logging, alerting, metrics, inventory, others) In Memory
 Cache CalloutHandle Context
 Object (persistent) subnet[46]_select (skipped) pkt[46]send FB Infra
 (e.g.: logging, alerting, metrics, inventory, others) outbound packet KEA final
 assembly lease[46]_select (skipped) skipped subnet/lease selection means packet is empty at this point and needs to be filled in Life of a packet in the FB Hook library
  • 25. #include <hooks/hooks.h> #include <dhcp/pkt4.h> #include <dhcp/hwaddr.h> #include "yourlibs.h" using namespace isc::hooks; extern "C" { int version() { return KEA_HOOKS_VERSION; } int load(LibraryHandle& libhandle) { // initialize needed objects 
 // (logging, cache, config, etc) return 0; } int unload() { // destroy the objects return 0; } . . . . . . . . . . . . . . int subnet4_select(CalloutHandle& handle) { handle.setSkip(true); return 0; } int lease4_select(CalloutHandle& handle) { handle.setSkip(true); return 0; } . . . . . . .
  • 26. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 27. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 28. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 29. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 30. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 31. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 32. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 33. . . . . . int pkt4_receive(CalloutHandle& handle) { Pkt4Ptr query4_ptr; handle.getArgument("query4", query4_ptr); HWAddrPtr hwaddr_ptr = query4_ptr->getHWAddr(); HostStateObject hostInfo; if (!getHostInfo(&hostInfo, hwaddr_ptr)) { LOG(ERROR) << "Something went wrong!"; handle.setSkip(true); return 0; } logStuff(query4_ptr); handle.setContext("hostInfo", hostInfo); return 0; } . . . . . . . . . . int pkt4_send(CalloutHandle& handle) { Pkt4Ptr response4_ptr; HostStateObject hostInfo; // at this point response4 is empty so we have // to fill all the things ourselves handle.getArgument("response4", response4_ptr); handle.getContext("hostInfo", hostInfo); // set all relevant options (e.g. default gw, // boot options, subnet, DNS, domain search, // hostname, lease time, etc) fillUpResponsePacket(response4_ptr, hostInfo); logStuff(response4_ptr); return 0; } }
  • 34. $ g++ -I /usr/include/kea -L /usr/lib/kea/lib -fpic -shared -o ${your_lib}.so ${your_hook_lib_files} -lkea-dhcpsrv -lkea-dhcp++ -lkea-hooks -lkea-log -lkea-util -lkea-exceptions You can compile your code using something like this:
  • 35. Big wins Photo by Greg Hildebrand -
  • 36. No more static configuration • Configuration for hosts is pulled dynamically from inventory • DCOPs people are happy (no more problems during swaps) • Makes deployment easier, only need to generate a small JSON file • Integrated with “configerator”: our configuration infrastructure based on Python DSL. • Version controlled, canary support, hot reload support, etc.
  • 37. No more hardware load balancing! • Switched to Anycast/ECMP • Packets sent to the anycast address are delivered to the nearest server • Same fleet-wide “anycast” IP is assigned to all DHCP servers (to ip6tnl0/tunl0 interfaces) • ExaBGP is used to advertise the anycast IP • Servers become routers and part of the network infrastructure
  • 38. exaBGP TOR DHCP server eth0: 10.44.10.20 tunl0: 10.127.255.67 exaBGP DHCP server eth0: 10.44.11.20 tunl0: 10.127.255.67 TOR exaBGP TOR DHCP server eth0: 10.10.10.20 tunl0: 10.127.255.67 exaBGP DHCP server eth0: 10.10.11.20 tunl0: 10.127.255.67 TOR Infrastructure routers Region 2Region 1 BGP BGP BGP BGP BGP
  • 39. exaBGP DHCP server eth0: 10.44.10.20 tunl0: 10.127.255.67 exaBGP DHCP server eth0: 10.44.11.20 tunl0: 10.127.255.67 exaBGP DHCP server eth0: 10.10.10.20 tunl0: 10.127.255.67 exaBGP DHCP server eth0: 10.10.11.20 tunl0: 10.127.255.67 Region 2Region 1 RSW relayer distance =1 distance = 1 distance = 2 distance = 2
  • 42. Time for
 a war story! Photo by Karen Roe -
  • 43. First IPv6-only cluster in Luleå, Sweden • Found bug in BIOS/firmware (*ALL* of the machines in cluster) • Unable to fetch PXE seed via TFTPv6 when client and server are on different VLANs • Vendor was made aware of the problem but fix wasn’t going to be fast (multiple months)
  • 44. • Realized proprietary TORs could run Python scripts • Wrote quick and dirty Python TFTP relayer • Deployed into all TORs in the cluster • Modify KEA hook lib to override the IP of the cluster TFTP endpoint with the IP of the machine in the rack (which is in sameVLAN) The workaround
  • 45. Some takeaways… Photo by Ollie Richardson -
  • 46. Stateless is good! Keep data (state and config) remotely It simplifies configuration management and deployment!
  • 47. The “Not Invented Here” syndrome
  • 48. Resources • KEA:http://kea.isc.org • exaBGP:https://github.com/Exa-Networks/exabgp • OpenCompute: FBOSS and wedge rack switch: • https://code.facebook.com/posts/843620439027582/facebook-open-switching-system-fboss-and-wedge-in-the-open/ • https://code.facebook.com/posts/681382905244727/introducing-wedge-and-fboss-the-next-steps-toward-a-disaggregated-network/ • https://code.facebook.com/posts/717010588413497/introducing-6-pack-the-first-open-hardware-modular-switch/ • https://github.com/facebook/fboss