-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuzz-2020-01.html
More file actions
169 lines (155 loc) · 18.3 KB
/
Copy pathbuzz-2020-01.html
File metadata and controls
169 lines (155 loc) · 18.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>DEVOPS MEETUP #19</title><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui" name="viewport"><link href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/css/reveal.css" rel="stylesheet"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/css/theme/night.css" id="theme"><!--This CSS is generated by the Asciidoctor-Reveal.js converter to further integrate AsciiDoc's existing semantic with Reveal.js--><style type="text/css">.reveal div.right {
float: right;
}
/* callouts */
.conum[data-value] {display:inline-block;color:#fff!important;background-color:rgba(50,150,50,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]:after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}</style><link href="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/lib/css/zenburn.css" rel="stylesheet"><script>var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? "https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/css/print/pdf.css" : "https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/css/print/paper.css";
document.getElementsByTagName( 'head' )[0].appendChild( link );</script><!--[if lt IE 9]><script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/lib/js/html5shiv.js"></script><![endif]--></head><body><div class="reveal"><div class="slides"><section id="_devops_meetup_19" class="text-center"><h2>DEVOPS MEETUP #19</h2><div class="paragraph"><p><h3>Accenture</h3></p></div>
<div class="paragraph"><p>21st January 2020</p></div>
<div class="paragraph small"><small>Slides: <a href="https://devops-my.github.io/meetup">devops-my.github.io/meetup</a></small></div></section>
<section><section id="_community"><h2>Community</h2></section><section><div class="paragraph"><p>Volunteers (usually on <a href="https://engineers.my">EngineersMY slack</a>)</p></div>
<h3><strong>JOIN US</strong></h3><div class="paragraph"><p>Monthly meetup announced on <a href="https://www.meetup.com/DevOpsMalaysia/">meetup.com</a><br>
Ping <code><strong>#meetups</strong></code> to volunteer / speak</p></div></section><section id="_other_meetups"><h2>OTHER MEETUPS</h2><div class="paragraph"><p>DevKami curated meetups:<br>
<a href="https://devkami.com/meetups">devkami.com/meetups</a></p></div></section><section id="_house_rules"><h2>House Rules</h2><div class="ulist step"><ul><li class="fragment"><p>minimal bikeshedding</p></li><li class="fragment"><p>respect opinions — agree to disagree</p></li><li class="fragment"><p>participate</p></li><li class="fragment"><p>thank the sponsors & volunteers</p></li></ul></div></section></section>
<section id="_buzzcorner"><h2>BUZZCORNER</h2></section>
<section><section id="_containers"><h2>Containers</h2></section><section id="_kuma_io"><h2><a href="https://kuma.io/">Kuma.io</a></h2><div class="imageblock stretch" style=""><a class="image" href="https://kuma.io/images/diagrams/main-diagram@2x.png"><img src="https://kuma.io/images/diagrams/main-diagram@2x.png" alt="Kuma" height="100%"></a></div><div class="title">Kuma: Build, Secure and Observe your modern Service Mesh</div></section></section>
<section><section id="_security"><h2>Security</h2></section><section id="_267_million_fb_data_leak"><h2><a href="https://thenextweb.com/facebook/2019/12/20/267-million-facebook-users-data-has-reportedly-been-leaked/">267 million FB data leak</a></h2><div class="quoteblock stretch"><blockquote>The <strong>Elasticsearch</strong> cluster contained user IDs, phone numbers, and names of mostly US-based users.<br/>
…​ the data likely came from “an illegal scraping operation or Facebook API abuse by criminals in Vietnam.”</blockquote></div></section><section id="_webauthn"><h2><a href="https://webauthn.guide/">WebAuthn</a></h2><div class="ulist step"><ul><li class="fragment"><p><a href="https://twitter.com/herrjemand/status/1069186691011796992">Pronounced "Web-Auth-En"</a>, is an API for managing public key credentials</p></li><li class="fragment"><p>81% of hacking-related breaches from stolen or weak passwords</p></li><li class="fragment"><p>28% of users using 2FA :(</p></li><li class="fragment"><p><a href="https://webauthn.io/">Demo</a></p></li></ul></div></section><section data-background-image="https://miro.medium.com/max/2624/1*RFgaz29QsE1DYXpX0-9Aew.png" data-background-size="contain"></section><section id="_sms_2fa_insecure"><h2>SMS 2FA Insecure</h2><div class="paragraph"><p>Yes we know, but <a href="https://www.issms2fasecure.com/">here</a> is an actual study by folks from Princeton</p></div></section></section>
<section><section id="_articles"><h2>Articles</h2></section><section id="_dos_tale_of_tech_debt"><h2><a href="https://blog.digitalocean.com/from-15-000-database-connections-to-under-100-digitaloceans-tale-of-tech-debt/">DO’s tale of tech debt</a></h2><div class="paragraph"><p>From 15,000 database connections to under 100</p></div></section><section><div class="imageblock stretch" style=""><img src="https://assets.digitalocean.com/ghost/2019/12/image5.png" alt="DB polling" height="100%"></div><div class="title">Figure 1. DB polling</div></section><section><div class="quoteblock"><blockquote>While infinite loops and giving each server a direct connection to the database may have been rudimentary in terms of system design, <strong>it was simple and it worked</strong> – especially for a short-staffed technical team facing tight deadlines and a rapidly increasing user base.</blockquote></div></section><section><div class="quoteblock"><blockquote>It’s important to note that simply because something is “legacy” does not mean it is dysfunctional and should be replaced. Bloomberg and IBM have legacy services written in Fortran and COBOL that generate more revenue than entire companies. <br/><br/>On the other hand, every system has a scaling limit.</blockquote></div></section><section><div class="ulist step"><ul><li class="fragment"><p>By the start of 2016, the db had > 15k direct connections, each querying for new events every 1-5s</p></li><li class="fragment"><p>SQL query that each hypervisor used also grown in complexity</p></li><li class="fragment"><p>It had become a colossus over 150 lines long and JOINed across 18 tables</p></li></ul></div></section><section id="_refactored_event_router"><h2>Refactored: Event Router</h2><div class="imageblock stretch" style=""><img src="https://assets.digitalocean.com/ghost/2019/12/image3.png" alt="Event Router" height="100%"></div><div class="title">Figure 2. 15k → less than 100 direct connections</div></section><section id="_refactored_scheduler_v2"><h2>Refactored: Scheduler V2</h2><div class="paragraph"><p>(the thing that decides which hypervisor will host new droplets)</p></div>
<div class="ulist step"><ul><li class="fragment"><p>Single instance for the entire fleet → multiple</p></li><li class="fragment"><p>Single threaded → concurrent</p></li></ul></div></section><section id="_refactored_message_queue"><h2>Refactored: Message Queue</h2><div class="ulist step"><ul><li class="fragment"><p>By early 2017, the centralized MySQL message queue was still in use</p></li><li class="fragment"><p>(that’s like ≈5 years!)</p></li><li class="fragment"><p>It was handling up to 400,000 new records/day, and 20 updates/s.</p></li><li class="fragment"><p><strong>Harpoon</strong> was born to interface between services and DB via API</p></li></ul></div></section><section id="_2019_do_arch"><h2>2019 DO Arch</h2><div class="imageblock stretch" style=""><img src="https://assets.digitalocean.com/ghost/2019/12/image2-1.png" alt="DO Arch" height="100%"></div></section><section id="_lessons_gracefully_manage_internal_friction"><h2>Lessons: Gracefully manage internal friction</h2><div class="paragraph"><p><blockquote class="stretch" style="width: 100%; font-size: smaller;">
Getting buy-in from the other teams proved more difficult. ...teams would have to give up their database access, rewrite portions of their codebase, and ultimately change how they had always done things. That wasn’t an easy sell. <br/><br/>Team by team and service by service, the Harpoon engineers were able to migrate the entire codebase onto their new platform. ...by end of 2017, Harpoon became the sole publisher to the database message queue.
</blockquote></p></div></section><section id="_lessons_dont_overengineer"><h2>Lessons: Don’t overengineer</h2><div class="paragraph"><p><blockquote class="stretch" style="width: 100%; font-size: smaller;">
We looked at using a queue service initially, but decided against it. It would be one more service that we needed to maintain...
<br/><br/>
It was definitely less overhead for the initial build, and the fact that it scaled for so long was quite impressive given how much DO grew between when we first wrote the event queue in late 2012...
<br/><br/>
I think when you are building something, it's important to not over engineer it. ...you can guess where some of the bottlenecks maybe, but without actual usage often those guesses can be wrong.
</blockquote></p></div></section><section id="_lessons_dont_overengineer_2"><h2>Lessons: Don’t overengineer</h2><div class="quoteblock"><blockquote>…​We basically built things to accommodate how people wanted to work rather than future-scaling. In this case we decided to stick with a MySQL queue for events because it made Jeff’s life a lot easier, and he built the entire backend…​</blockquote><div class="attribution"><cite>DigitalOcean Co-Founder</cite><br>— Moisey Uretsky</div></div></section></section>
<section><section id="_misc"><h2>Misc</h2></section><section id="_tld_benchmarks_by_bunnycdn"><h2>TLD <a href="https://bunnycdn.com/blog/is-your-fancy-new-domain-hurting-your-performance-gtld-benchmark/">Benchmarks</a> by BunnyCDN</h2><div class="paragraph"><p>The biggest shockers were the <code>.info</code> and <code>.org</code> domains that showed really poor performance especially in the 85 percentile, despite being one of the oldest and well established TLD with millions of registered domains each. It appears <strong>4 out of 6 of their nameservers are performing extremely poorly</strong> which is the reason for the poor results.</p></div></section><section data-background-image="https://bunnycdn.com/blog/content/images/2019/12/gtld-dns-resolution-time-6.png" data-background-size="contain"></section><section><div class="ulist step"><ul><li class="fragment"><p>Another interesting thing to see was the performance for <code>.co</code>, <code>.biz</code> and <code>.in</code> domains that ended up way ahead of the rest.</p></li><li class="fragment"><p>So is your fancy new domain hurting your performance?</p></li><li class="fragment"><p>It actually might be, but probably not enough to worry about that too much.</p></li></ul></div></section><section id="_why_caddy_is_better_than_haproxy"><h2><a href="https://www.reddit.com/r/golang/comments/en2yvk/a_dead_simple_proxy_server_that_allows_you_to/fdx3lq1/?context=8&depth=9">Why Caddy is better than HAProxy</a></h2><div class="paragraph"><p>Matt Holt, creator of Caddy lists why he thinks Caddy is better</p></div></section><section id="_user_agent_getting_phased_out"><h2>User-Agent getting phased out</h2><div class="ulist step"><ul><li class="fragment"><p><a href="https://www.zdnet.com/article/google-to-phase-out-user-agent-strings-in-chrome/">Google is phasing out UA</a>, and others will most likely follow the move</p></li><li class="fragment"><p>Replacement: <a href="https://developer.mozilla.org/en-US/docs/Glossary/Client_hints">Client Hints</a> HTTP header (<code>Accept-CH: DPR, Width, Viewport-Width, Downlink</code>)</p></li></ul></div></section><section id="_example_device_pixel_ratio"><h2>Example: Device Pixel Ratio</h2><div class="title">Request</div><pre class="highlight listingblock"><code>Accept-CH: DPR
Accept-CH-Lifetime: 86400</code></pre>
<div class="title">Response</div><pre class="highlight listingblock"><code>DPR: 1.0</code></pre></section><section id="_google_kills_again"><h2>Google kills, again</h2><div class="paragraph"><p>Google <a href="https://digiday.com/media/google-plans-kill-off-third-party-cookies-chrome-within-2-years/">plans to kill</a> 3rd-party cookies within 2 years.</p></div></section></section></div></div><script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/lib/js/head.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/js/reveal.js"></script><script>Array.prototype.slice.call(document.querySelectorAll('.slides section')).forEach(function(slide) {
if (slide.getAttribute('data-background-color')) return;
// user needs to explicitly say he wants CSS color to override otherwise we might break custom css or theme (#226)
if (!(slide.classList.contains('canvas') || slide.classList.contains('background'))) return;
var bgColor = getComputedStyle(slide).backgroundColor;
if (bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {
slide.setAttribute('data-background-color', bgColor);
slide.style.backgroundColor = 'transparent';
}
})
// See https://github.com/hakimel/reveal.js#configuration for a full list of configuration options
Reveal.initialize({
// Display presentation control arrows
controls: true,
// Help the user learn the controls by providing hints, for example by
// bouncing the down arrow when they first encounter a vertical slide
controlsTutorial: true,
// Determines where controls appear, "edges" or "bottom-right"
controlsLayout: 'bottom-right',
// Visibility rule for backwards navigation arrows; "faded", "hidden"
// or "visible"
controlsBackArrows: 'faded',
// Display a presentation progress bar
progress: true,
// Display the page number of the current slide
slideNumber: 'h.v',
// Control which views the slide number displays on
showSlideNumber: 'all',
// Push each slide change to the browser history
history: true,
// Enable keyboard shortcuts for navigation
keyboard: true,
// Enable the slide overview mode
overview: true,
// Vertical centering of slides
center: true,
// Enables touch navigation on devices with touch input
touch: true,
// Loop the presentation
loop: false,
// Change the presentation direction to be RTL
rtl: false,
// Randomizes the order of slides each time the presentation loads
shuffle: false,
// Turns fragments on and off globally
fragments: true,
// Flags whether to include the current fragment in the URL,
// so that reloading brings you to the same fragment position
fragmentInURL: true,
// Flags if the presentation is running in an embedded mode,
// i.e. contained within a limited portion of the screen
embedded: false,
// Flags if we should show a help overlay when the questionmark
// key is pressed
help: true,
// Flags if speaker notes should be visible to all viewers
showNotes: false,
// Global override for autolaying embedded media (video/audio/iframe)
// - null: Media will only autoplay if data-autoplay is present
// - true: All media will autoplay, regardless of individual setting
// - false: No media will autoplay, regardless of individual setting
autoPlayMedia: null,
// Number of milliseconds between automatically proceeding to the
// next slide, disabled when set to 0, this value can be overwritten
// by using a data-autoslide attribute on your slides
autoSlide: 0,
// Stop auto-sliding after user input
autoSlideStoppable: true,
// Use this method for navigation when auto-sliding
autoSlideMethod: Reveal.navigateNext,
// Specify the average time in seconds that you think you will spend
// presenting each slide. This is used to show a pacing timer in the
// speaker view
defaultTiming: 120,
// Enable slide navigation via mouse wheel
mouseWheel: false,
// Hides the address bar on mobile devices
hideAddressBar: true,
// Opens links in an iframe preview overlay
// Add `data-preview-link` and `data-preview-link="false"` to customise each link
// individually
previewLinks: true,
// Transition style (e.g., none, fade, slide, convex, concave, zoom)
transition: 'slide',
// Transition speed (e.g., default, fast, slow)
transitionSpeed: 'default',
// Transition style for full page slide backgrounds (e.g., none, fade, slide, convex, concave, zoom)
backgroundTransition: 'fade',
// Number of slides away from the current that are visible
viewDistance: 3,
// Parallax background image (e.g., "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'")
parallaxBackgroundImage: '',
// Parallax background size in CSS syntax (e.g., "2100px 900px")
parallaxBackgroundSize: '',
// Number of pixels to move the parallax background per slide
// - Calculated automatically unless specified
// - Set to 0 to disable movement along an axis
parallaxBackgroundHorizontal: null,
parallaxBackgroundVertical: null,
// The display mode that will be used to show slides
display: 'block',
// The "normal" size of the presentation, aspect ratio will be preserved
// when the presentation is scaled to fit different resolutions. Can be
// specified using percentage units.
width: 960,
height: 700,
// Factor of the display size that should remain empty around the content
margin: 0.1,
// Bounds for smallest/largest possible scale to apply to content
minScale: 0.2,
maxScale: 1.5,
// Optional libraries used to extend on reveal.js
dependencies: [
{ src: 'https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/plugin/zoom-js/zoom.js', async: true },
{ src: 'https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.8.0/plugin/notes/notes.js', async: true },
],
});</script></body></html>