SlideShare une entreprise Scribd logo
1  sur  109
Télécharger pour lire hors ligne
The life and times of


PuppetDB
                    Clojure/West 2013
deepak
giridharagopal
deepak@puppetlabs.com
@grim_radical [github twitter freenode]
Let’s talk about...
Immutability
  is great!
Immutability allows
for invariants, which
help you reason about
correctness
Immutability prevents
spooky action at a
distance
Immutability fosters
modular, composable
abstractions
(not a tough sell
  to Clojurists*)

               *clojurians?
That’s great for
develoment, but how
 about operations?
Immutability for
infrastructure?
Because operations is in the
same boat as development
Everyone who’s got
their app running on
a fleet of servers has
experienced spooky
action at a distance
Known, good state is
critical for reliable
upgrades
A lack of predictability
in your systems
ruins automation and
abstraction
The problem is that:

         Systems are inherently
                       mutable!

But ideally:

      Systems should behave as
           though they weren’t!
façade of immutability. Immutability
Computer systems are in many ways
open systems, providing the keys to
the vault if one is so inclined to grab
them. But in order to foster an air of
immutability in our own systems,
it's of utmost importance to create a
façade of immutability. Immutability




                                          -- The Joy of Clojure
requires that we layer over and
abstract the parts of our system that
provide unrestrained mutability.
Describe how you’d
like your systems to
look, and Puppet
does all the hard
work for you!
file { “/etc/issue”:
  content => “Got an issue? Here’s a tissue!”,
}

file { “/etc/motd”:
  content => template(“Welcome to $hostname!”),
}
file { "/etc/sudoers":
  owner => root,
  group => root,
  mode   => 440,
  source => "puppet:///modules/sudo/sudoers"
}
package { 'ntp':
  ensure => installed,
}

service { 'ntpd':
  ensure    => running,
  enable    => true,
  subscribe => File['/etc/ntp.conf'],
}

file { '/etc/ntp.conf':
  ensure => file,
  require => Package['ntp'],
  source => "puppet:///modules/ntp/ntp.conf",
}
class ntp {

    package { 'ntp':
      ensure => installed,
    }

    service { 'ntpd':
      ensure    => running,
      enable    => true,
      subscribe => File['/etc/ntp.conf'],
    }

    file { '/etc/ntp.conf':
      ensure => file,
      require => Package['ntp'],
      source => "puppet:///modules/ntp/ntp.conf",
    }

}
node “webserver.mydomain.com” {
  include ntp
}

node “appserver.mydomain.com” {
  include ntp
}

node “database.mydomain.com” {
  include ntp
}
class ssh {

    @@sshkey { $hostname:
      type => dsa,
      key => $sshdsakey
    }

    Sshkey <<| |>>

}
File “/tmp/foo/bar”
   User “deepak”
   Dir “/tmp/foo”
    Dir “/tmp”
Dir “/tmp”    User “deepak”

      Dir “/tmp/foo”


   File “/tmp/foo/bar”
Dir “/tmp”    User “deepak”

      Dir “/tmp/foo”


   File “/tmp/foo/bar”
Idempotent, and
only does what’s
necessary
Compensates for the
inherent mutability
of systems
Combats spooky
action at a distance
with automatic
repair
Brings predictability
to your systems
A foundation of
predictability and
reliability lets you
perform higher-level
operations on your
infrastructure
V    UME
    OL
every resource
   every parameter
  every relationship
          every fact
     for every node
updated all the time
Users leverage this
data to do higher-
order things with
their infrastructure
key distribution
      monitoring
  clustered services
master/slave replication
    load balancers
  shared filesystems
     firewall rules
           ...
Infrastructure as
code
Infrastructure as
data
User demand:

 Store as much data as we can!
     Much better queryability!

Oh yeah, but:

  Don’t slow down the system!
  Don’t compromise reliability!
We can rebuild it, we
have the technology!
Speed is important
       Parsing, validating, and
  manipulating incoming data is
    computationally expensive
Speed is important
The slower central storage is, the
less agile sysadmins can be. That
      can cost money and uptime!
Reliability is
important
 If it’s a critical part of managing
infrastructure, it’s got to be solid!
Deployment is
important
      Should be easy to package,
  install, configure, use, monitor,
                     and upgrade.
Wait, isn’t Puppet
written in Ruby?
Lessons learned from
writing the rest of
our software in Ruby
It’s...not speedy. Object creation,
method calls, garbage collection,
       etc. “Magical” APIs amplify
                      the problem.
Lessons learned from
writing the rest of
our software in Ruby
       Can only use one core!
    Workarounds compromise
    performance or simplicity
Lessons learned from
writing the rest of
our software in Ruby
       Mutable state all over
           the damn place!
Lessons learned from
writing the rest of
our software in Ruby
      Many struggles with the
                  runtime. :(
-- Jeff Gagliardi
1. It’s fast
2. JVM libraries &
   Tools
3. State &
   Parallelism
PuppetDB
PuppetDB
     Definitely Better!
Fast, safe storage
of catalogs, facts,
and events
           like, *way* faster!
HTTP APIs
for resource, fact,
node, report retrieval
          plenty of data, just
              a “curl” away!
Storage &
Querying
Storage &
Querying
CQRS
Command
Query
Responsibility
Separation
  use a different model to update
 information than the model you
          use to read information
Writes
CQRS
write pipeline
 async, parallel, MQ-based, with
                  automatic retry
{
    :command "replace catalog"
    :version 2
    :payload {...}
}
Delayed




UUID




   /commands   MQ     Parse       Process




                    Dead Letter
                      Office
(defmulti process-command!
  (fn [{:keys [command version] :or {version 1}} _]
    [command version]))

(defmethod process-command! ["replace catalog" 1]
  [command options]
  (replace-catalog* command options))
(defmulti process-command!
  (fn [{:keys [command version] :or {version 1}} _]
    [command version]))

(defmethod process-command! ["replace catalog" 2]
  [command options]
  (replace-catalog* command options))

(defmethod process-command! ["replace catalog" 1]
  [command options]
   (-> command
       (update-in [:payload] catalog-v1->v2)
       (replace-catalog* options))
Command
processors must be
retry-aware
      expect failure, because
            it *will* happen.
(demo)
Reads
Queries
are expressed in their
own “language”
    domain specific, AST-based
              query language
["and",
  ["=", "type", "User"],
  ["=", "title", "nick"]]
["and",
  ["=", ["fact", "operatingsystem"], "Debian"],
  ["<", ["fact", "uptime_seconds"], 10000]]
["and",
  ["=", "name", "ipaddress"],
  ["in", "certname",
    ["extract", "certname", ["select-resources",
                              ["and",
                                ["=", "type", "Class"],
                                ["=", "title", "Apache"]]]]
["or",
  ["=", "certname", "foo.com"],
  ["=", "certname", "bar.com"],
  ["=", "certname", "baz.com"]]
We use core.match
to walk the tree,
compiling it to SQL
AST-based API lets
users write their own
languages
       ah, you’ve got to love
                open source!
(Package[httpd] and country=fr)
or country=us


Package["mysql-server"]
and architecture=amd64




                         Erik Dalén, Spotify
             https://github.com/dalen/puppet-puppetdbquery
AST-based API lets
us more safely
manipulate queries
(def query-app
  (app
    [&]
    {:get (fn [{:keys [params] :as request}]
             (perform-query (params "query")))}))

(def resources-app
  (app
   []
   query-app

   [type title &]
   (comp query-app
         (partial http-q/restrict-resource-query-to-type type)
         (partial http-q/restrict-resource-query-to-title title))

   [type &]
   (comp query-app
         (partial http-q/restrict-resource-query-to-type type))))
(defn restrict-resource-query-to-type
  [type query]
  (conj ["and"
          ["=" "type" type]]
        query))
Storage
Relational Database,
embedded or
PostgreSQL
 because they’re actually pretty
    fantastic at ad-hoc queries,
  aggregation, windowing, etc.
      while maintaining safety
Relational Database,
embedded or
PostgreSQL
we use arrays, recursive queries,
       indexing inside complex
                       structures
Relational Database,
embedded or
PostgreSQL
 schema is oriented towards the
  types of queries we encounter
Deployment
PuppetDB Server          DLO



     DB           Workers



    HTTP            MQ
PuppetDB Server
   Workers    DLO
                         DB


    HTTP            MQ
PuppetDB Server
           Workers    DLO
HTTP                             DB
Proxy
(SSL)
            HTTP            MQ
Codez
(defn process-commands!
  "Connect to an MQ an continually, sequentially process commands.

  If the MQ consumption timeout is reached without any new data, the
  function will terminate."
  [connection endpoint discarded-dir options-map]
  (let [producer   (mq-conn/producer connection)
        publish    (partial mq-producer/publish producer endpoint)
        on-message (produce-message-handler publish discarded-dir options-map)
        mq-error   (promise)
        consumer   (mq-conn/consumer connection
                                     {:endpoint   endpoint
                                      :on-message on-message
                                      :transacted true
                                      :on-failure #(deliver mq-error (:exception %))})]
    (mq-cons/start consumer)

    ;; Block until an exception is thrown by the consumer thread
    (try
      (deref mq-error)
      (throw @mq-error)
      (finally
        (mq-cons/close consumer)))))
(defmacro with-error-delivery
  "Executes body, and delivers an exception to the provided promise if one is
  thrown."
  [error & body]
  `(try
     ~@body
     (catch Exception e#
       (deliver ~error e#))))
(defn filter-mbean
  "Converts an mbean to a map. For attributes that can't be converted to JSON,
  return a string representation of the value."
  [mbean]
  {:post [(map? %)]}
  (into {} (for [[k v] mbean]
             (cond
              ;; Nested structures should themselves be filtered
              (map? v)
              [k (filter-mbean v)]

              ;; Cheshire can serialize to JSON anything that
              ;; implements the JSONable protocol
              (satisfies? JSONable v)
              [k v]

              :else
              [k (str v)]))))
(defmacro with-test-broker
  "Constructs and starts an embedded MQ, and evaluates `body` inside a
  `with-open` expression that takes care of connection cleanup and MQ
  tear-down.

  `name` - The name to use for the embedded MQ

  `conn-var` - Inside of `body`, the variable named `conn-var`
  contains an active connection to the embedded broker.

  Example:

      (with-test-broker "my-broker" the-connetion
        ;; Do something with the connection
        (prn the-connection))
  "
  [name conn-var & body]
  `(let [dir#                     (fs/absolute-path (fs/temp-dir))
         broker-name#             ~name
         conn-str#                (str "vm://" ~name)
         ^BrokerService broker#   (mq/build-embedded-broker broker-name# dir#)]

     (.setUseJmx broker# false)
     (.setPersistent broker# false)
     (mq/start-broker! broker#)

     (try
       (with-open [~conn-var (mq/connect! conn-str#)]
         ~@body)
       (finally
         (mq/stop-broker! broker#)
         (fs/delete-dir dir#)))))
Results
Thousands of
production
deployments
Small shops with a dozen hosts,
large shops with thousands of
hosts, intercontinental
deployments...
Thousands of deployments,
Hundreds of threads per install,
Zero deadlocks,
Zero bugs involving clojure state

          companion Ruby code has
              ~10x the defect rate
Users dig the uberjar,
makes deployment
straightforward and
less error-prone
Nobody cares that it’s
Clojure. Users just
want stuff to work.
Monitoring and
instrumentation is a
big deal. Users want
easy ways to
consume metrics.
If you build it, they
will come.
Open source

http://github.com/
puppetlabs/puppetdb
deepak
giridharagopal
deepak@puppetlabs.com
@grim_radical [github twitter freenode]


        We’re hiring!

Contenu connexe

Tendances

Apache ZooKeeper TechTuesday
Apache ZooKeeper TechTuesdayApache ZooKeeper TechTuesday
Apache ZooKeeper TechTuesday
Andrei Savu
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag
garrett honeycutt
 
Zookeeper big sonata
Zookeeper  big sonataZookeeper  big sonata
Zookeeper big sonata
Anh Le
 

Tendances (20)

Take control of your Jenkins jobs via job DSL.
Take control of your Jenkins jobs via job DSL.Take control of your Jenkins jobs via job DSL.
Take control of your Jenkins jobs via job DSL.
 
Apache Zookeeper
Apache ZookeeperApache Zookeeper
Apache Zookeeper
 
Introduction to Apache ZooKeeper
Introduction to Apache ZooKeeperIntroduction to Apache ZooKeeper
Introduction to Apache ZooKeeper
 
Zookeeper Introduce
Zookeeper IntroduceZookeeper Introduce
Zookeeper Introduce
 
Новый InterSystems: open-source, митапы, хакатоны
Новый InterSystems: open-source, митапы, хакатоныНовый InterSystems: open-source, митапы, хакатоны
Новый InterSystems: open-source, митапы, хакатоны
 
Distributed system coordination by zookeeper and introduction to kazoo python...
Distributed system coordination by zookeeper and introduction to kazoo python...Distributed system coordination by zookeeper and introduction to kazoo python...
Distributed system coordination by zookeeper and introduction to kazoo python...
 
Puppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionPuppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 Edition
 
Introduction to apache zoo keeper
Introduction to apache zoo keeper Introduction to apache zoo keeper
Introduction to apache zoo keeper
 
Getting started with Ansible
Getting started with AnsibleGetting started with Ansible
Getting started with Ansible
 
Herd your chickens: Ansible for DB2 configuration management
Herd your chickens: Ansible for DB2 configuration managementHerd your chickens: Ansible for DB2 configuration management
Herd your chickens: Ansible for DB2 configuration management
 
Apache ZooKeeper TechTuesday
Apache ZooKeeper TechTuesdayApache ZooKeeper TechTuesday
Apache ZooKeeper TechTuesday
 
Ansible 實戰:top down 觀點
Ansible 實戰:top down 觀點Ansible 實戰:top down 觀點
Ansible 實戰:top down 觀點
 
Building and Deploying Application to Apache Mesos
Building and Deploying Application to Apache MesosBuilding and Deploying Application to Apache Mesos
Building and Deploying Application to Apache Mesos
 
Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
 
20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag20090514 Introducing Puppet To Sasag
20090514 Introducing Puppet To Sasag
 
AWS Update | London - Elastic Beanstalk
AWS Update | London - Elastic BeanstalkAWS Update | London - Elastic Beanstalk
AWS Update | London - Elastic Beanstalk
 
Zookeeper big sonata
Zookeeper  big sonataZookeeper  big sonata
Zookeeper big sonata
 
DevOpsDays Warsaw 2015: Running High Performance And Fault Tolerant Elasticse...
DevOpsDays Warsaw 2015: Running High Performance And Fault Tolerant Elasticse...DevOpsDays Warsaw 2015: Running High Performance And Fault Tolerant Elasticse...
DevOpsDays Warsaw 2015: Running High Performance And Fault Tolerant Elasticse...
 
Puppet Camp Dallas 2014: Puppet Keynote
Puppet Camp Dallas 2014: Puppet Keynote Puppet Camp Dallas 2014: Puppet Keynote
Puppet Camp Dallas 2014: Puppet Keynote
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 

En vedette

En vedette (20)

Слайды седьмого вещания ИБ
Слайды седьмого вещания ИБСлайды седьмого вещания ИБ
Слайды седьмого вещания ИБ
 
НвЗ Слайды седьмого вещания
НвЗ Слайды седьмого вещанияНвЗ Слайды седьмого вещания
НвЗ Слайды седьмого вещания
 
10 Ways to Succeed as a Copywriter
10 Ways to Succeed as a Copywriter10 Ways to Succeed as a Copywriter
10 Ways to Succeed as a Copywriter
 
Методика Черная кобра
Методика Черная кобраМетодика Черная кобра
Методика Черная кобра
 
НвЗ Слайды третьего вещания
НвЗ Слайды третьего вещанияНвЗ Слайды третьего вещания
НвЗ Слайды третьего вещания
 
НвЗ Слайды второго вещания
НвЗ Слайды второго вещанияНвЗ Слайды второго вещания
НвЗ Слайды второго вещания
 
Fórmulas de copywriting - Aprende a escribir de forma estratégica
Fórmulas de copywriting - Aprende a escribir de forma estratégicaFórmulas de copywriting - Aprende a escribir de forma estratégica
Fórmulas de copywriting - Aprende a escribir de forma estratégica
 
Слайды шестого вещания
Слайды шестого вещанияСлайды шестого вещания
Слайды шестого вещания
 
Слайды восьмого вещания
Слайды восьмого вещанияСлайды восьмого вещания
Слайды восьмого вещания
 
Слайды девятого вещания
Слайды девятого вещанияСлайды девятого вещания
Слайды девятого вещания
 
НвЗ Слайды шестого занятия
НвЗ Слайды шестого занятияНвЗ Слайды шестого занятия
НвЗ Слайды шестого занятия
 
НвЗ Методика Раскадровка
НвЗ Методика РаскадровкаНвЗ Методика Раскадровка
НвЗ Методика Раскадровка
 
НвЗ Слайды первого вещания
НвЗ Слайды первого вещанияНвЗ Слайды первого вещания
НвЗ Слайды первого вещания
 
ТЛ - слайды четвертого вещания
ТЛ - слайды четвертого вещанияТЛ - слайды четвертого вещания
ТЛ - слайды четвертого вещания
 
Визуальное мышление - Слайды занятий 5 и 6
Визуальное мышление - Слайды занятий 5 и 6Визуальное мышление - Слайды занятий 5 и 6
Визуальное мышление - Слайды занятий 5 и 6
 
ТЛ - слайды девятого вещания
ТЛ - слайды девятого вещанияТЛ - слайды девятого вещания
ТЛ - слайды девятого вещания
 
ТЛ - слайды седьмого вещания
ТЛ - слайды седьмого вещанияТЛ - слайды седьмого вещания
ТЛ - слайды седьмого вещания
 
ТЛ - слайды пятого вещания
ТЛ - слайды пятого вещанияТЛ - слайды пятого вещания
ТЛ - слайды пятого вещания
 
Слайды второго занятия
Слайды второго занятияСлайды второго занятия
Слайды второго занятия
 
Слайды четвертого вещания
Слайды четвертого вещанияСлайды четвертого вещания
Слайды четвертого вещания
 

Similaire à PuppetDB: Sneaking Clojure into Operations

A Presentation about Puppet that I've made at the OSSPAC conference
A Presentation about Puppet that I've made at the OSSPAC conferenceA Presentation about Puppet that I've made at the OSSPAC conference
A Presentation about Puppet that I've made at the OSSPAC conference
ohadlevy
 
Taming Deployment With Smart Frog
Taming Deployment With Smart FrogTaming Deployment With Smart Frog
Taming Deployment With Smart Frog
Steve Loughran
 

Similaire à PuppetDB: Sneaking Clojure into Operations (20)

Developing IT infrastructures with Puppet
Developing IT infrastructures with PuppetDeveloping IT infrastructures with Puppet
Developing IT infrastructures with Puppet
 
Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013
 
Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and Puppet
 
Linux Desktop Automation
Linux Desktop AutomationLinux Desktop Automation
Linux Desktop Automation
 
A Presentation about Puppet that I've made at the OSSPAC conference
A Presentation about Puppet that I've made at the OSSPAC conferenceA Presentation about Puppet that I've made at the OSSPAC conference
A Presentation about Puppet that I've made at the OSSPAC conference
 
Container & kubernetes
Container & kubernetesContainer & kubernetes
Container & kubernetes
 
Containerization is more than the new Virtualization: enabling separation of ...
Containerization is more than the new Virtualization: enabling separation of ...Containerization is more than the new Virtualization: enabling separation of ...
Containerization is more than the new Virtualization: enabling separation of ...
 
Managing Infrastructure as Code
Managing Infrastructure as CodeManaging Infrastructure as Code
Managing Infrastructure as Code
 
A Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy SystemA Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy System
 
Build Automation 101
Build Automation 101Build Automation 101
Build Automation 101
 
Workflow story: Theory versus Practice in large enterprises by Marcin Piebiak
Workflow story: Theory versus Practice in large enterprises by Marcin PiebiakWorkflow story: Theory versus Practice in large enterprises by Marcin Piebiak
Workflow story: Theory versus Practice in large enterprises by Marcin Piebiak
 
Workflow story: Theory versus practice in Large Enterprises
Workflow story: Theory versus practice in Large EnterprisesWorkflow story: Theory versus practice in Large Enterprises
Workflow story: Theory versus practice in Large Enterprises
 
SaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
SaltConf14 - Ben Cane - Using SaltStack in High Availability EnvironmentsSaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
SaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
 
Taming Deployment With Smart Frog
Taming Deployment With Smart FrogTaming Deployment With Smart Frog
Taming Deployment With Smart Frog
 
Puppet for Developers
Puppet for DevelopersPuppet for Developers
Puppet for Developers
 
Continuous Delivery: The Next Frontier
Continuous Delivery: The Next FrontierContinuous Delivery: The Next Frontier
Continuous Delivery: The Next Frontier
 
Terraform modules restructured
Terraform modules restructuredTerraform modules restructured
Terraform modules restructured
 
Terraform Modules Restructured
Terraform Modules RestructuredTerraform Modules Restructured
Terraform Modules Restructured
 
Cloud Meetup - Automation in the Cloud
Cloud Meetup - Automation in the CloudCloud Meetup - Automation in the Cloud
Cloud Meetup - Automation in the Cloud
 
A DevOps guide to Kubernetes
A DevOps guide to KubernetesA DevOps guide to Kubernetes
A DevOps guide to Kubernetes
 

Dernier

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

PuppetDB: Sneaking Clojure into Operations