Apache
Kafka is a community distributed event streaming platform capable of handling
trillions of events a day. Initially conceived as a messaging queue, Kafka is
based on an abstraction of a distributed commit log.
Unlike
messaging queues, Kafka is a highly scalable, fault tolerant distributed
system, allowing it to be deployed for applications
Apache
Kafka provides durable storage. Kafka can act as a 'source of truth', being
able to distribute data across multiple nodes for a highly available deployment
within a single data center or across multiple availability zones.
An
event streaming platform would not be complete without the ability to
manipulate that data as it arrives. The Streams API within Apache Kafka is a
powerful, lightweight library that allows for on-the-fly processing, letting
you aggregate, create windowing parameters, perform joins of data within a
stream, and more. Perhaps best of all, it is built as a Java application on top
of Kafka, keeping your workflow intact with no extra clusters to maintain.
Apache
Kafka is a popular tool for developers because it is easy to pick up and
provides a powerful event streaming platform complete with 4 APIs: Producer,
Consumer, Streams, and Connect.
Often, developers will begin
with a single use case. This could be using Apache Kafka as a message buffer to
protect a legacy database that can’t keep up with today’s workloads, or using
the Connect API to keep said database in sync with an accompanying search
indexing engine, to process data as it arrives with the Streams API to surface
aggregations right back to your application.
In short, Apache Kafka and its
APIs make building data-driven apps and managing complex back-end systems
simple. Kafka gives you peace of mind knowing your data is always
fault-tolerant, replayable, and real-time. Helping you quickly build by
providing a single event streaming platform to process, store, and connect your
apps and systems with real-time data.
Kafka combines three key capabilities so you can implement your use cases for event
streaming end-to-end with a single battle-tested solution:
1. To publish (write) and subscribe
to (read) streams of events, including continuous import/export of
your data from other systems.
2. To store streams of events
durably and reliably for as long as you want.
3. To process streams of events as
they occur or retrospectively.
And all this functionality is provided in a distributed, highly
scalable, elastic, fault-tolerant, and secure manner. Kafka can be deployed on
bare-metal hardware, virtual machines, and containers, and on-premises as well
as in the cloud. You can choose between self-managing your Kafka environments
and using fully managed services offered by a variety of vendors.
Kafka
is a distributed system consisting of servers and clients that communicate via a
high-performance TCP network protocol. It
can be deployed on bare-metal hardware, virtual machines, and containers in
on-premise as well as cloud environments.
Servers:
Kafka is run as a cluster of one or more servers that can span multiple
datacenters or cloud regions. Some of these servers form the storage layer,
called the brokers. Other servers run Kafka Connect to continuously import and export
data as event streams to integrate Kafka with your existing systems such as
relational databases as well as other Kafka clusters. To let you implement
mission-critical use cases, a Kafka cluster is highly scalable and fault-tolerant:
if any of its servers fails, the other servers will take over their work to
ensure continuous operations without any data loss.
Clients:
They allow you to write distributed applications and microservices that read,
write, and process streams of events in parallel, at scale, and in a
fault-tolerant manner even in the case of network problems or machine failures.
Kafka ships with some such clients included, which are augmented by dozens of clients provided
by the Kafka community: clients are available for Java and Scala including the
higher-level Kafka Streams library,
for Go, Python, C/C++, and many other programming languages as well as REST
APIs.
An event records the fact that "something happened" in
the world or in your business. It is also called record or message in the
documentation. When you read or write data to Kafka, you do this in the form of
events. Conceptually, an event has a key, value, timestamp, and optional
metadata headers. Here's an example event:
Producers are those client applications that
publish (write) events to Kafka, and consumers are
those that subscribe to (read and process) these events. In Kafka, producers
and consumers are fully decoupled and agnostic of each other, which is a key
design element to achieve the high scalability that Kafka is known for. For
example, producers never need to wait for consumers. Kafka provides various guarantees such as
the ability to process events exactly-once.
Events are organized and
durably stored in topics.
Very simplified, a topic is similar to a folder in a filesystem, and the events
are the files in that folder. An example topic name could be
"payments". Topics in Kafka are always multi-producer and
multi-subscriber: a topic can have zero, one, or many producers that write
events to it, as well as zero, one, or many consumers that subscribe to these
events. Events in a topic can be read as often as needed—unlike traditional
messaging systems, events are not deleted after consumption. Instead, you
define for how long Kafka should retain your events through a per-topic configuration
setting, after which old events will be discarded. Kafka's performance is
effectively constant with respect to data size, so storing data for a long time
is perfectly fine.
Topics are partitioned, meaning a topic is spread
over a number of "buckets" located on different Kafka brokers. This
distributed placement of your data is very important for scalability because it
allows client applications to both read and write the data from/to many brokers
at the same time. When a new event is published to a topic, it is actually
appended to one of the topic's partitions. Events with the same event key
(e.g., a customer or vehicle ID) are written to the same partition, and Kafka guarantees that any
consumer of a given topic-partition will always read that partition's events in
exactly the same order as they were written.
In addition to command line tooling for management and
administration tasks, Kafka has five core APIs for Java and Scala:
- The Admin API to
manage and inspect topics, brokers, and other Kafka objects.
- The Producer
API to publish (write) a stream of events to one or more Kafka
topics.
- The Consumer
API to subscribe to (read) one or more topics and to process the
stream of events produced to them.
- The Kafka Streams API to
implement stream processing applications and microservices. It provides
higher-level functions to process event streams, including
transformations, stateful operations like aggregations and joins,
windowing, processing based on event-time, and more. Input is read from
one or more topics in order to generate output to one or more topics,
effectively transforming the input streams to output streams.
- The Kafka Connect
API to build and run reusable data import/export connectors that
consume (read) or produce (write) streams of events from and to external
systems and applications so they can integrate with Kafka. For example, a
connector to a relational database like PostgreSQL might capture every
change to a set of tables. However, in practice, you typically don't need
to implement your own connectors because the Kafka community already
provides hundreds of ready-to-use connectors.
SECURITY
The Kafka
community added a number of features that, used either separately or together,
increases security in a Kafka cluster. The following security measures are
currently supported:
Authentication of
connections to brokers from clients (producers and consumers), other brokers
and tools, using either SSL or SASL. Kafka supports the following SASL
mechanisms:
- SASL/GSSAPI (Kerberos)
- SASL/PLAIN
- SASL/SCRAM-SHA-256 and SASL/SCRAM-SHA-512
- SASL/OAUTHBEARER
- Authentication of connections
from brokers to ZooKeeper
- Encryption of data transferred
between brokers and clients, between brokers, or between brokers and tools
using SSL (Note that there is a performance degradation when SSL is
enabled, the magnitude of which depends on the CPU type and the JVM
implementation.)
- Authorization of read / write
operations by clients
- Authorization is pluggable and
integration with external authorization services is supported
Apache Kafka allows clients
to use SSL for encryption of traffic as well as authentication. By default, SSL
is disabled but can be turned on if needed.
Generate SSL key and certificate for each Kafka broker
The first step of deploying one or more brokers with SSL support
is to generate a public/private keypair for every server. Since Kafka expects
all keys and certificates to be stored in keystores we will use Java's keytool
command for this task. The tool supports two different keystore formats, the
Java specific jks format which has been deprecated by now, as well as PKCS12.
PKCS12 is the default format
To obtain a certificate that
can be used with the private key that was just created a certificate signing
request needs to be created. This signing request, when signed by a trusted CA
results in the actual certificate which can then be installed in the keystore
and used for authentication purposes.
After this step each
machine in the cluster has a public/private key pair which can already be used
to encrypt traffic and a certificate signing request, which is the basis for
creating a certificate. To add authentication capabilities this signing request
needs to be signed by a trusted authority, which will be created in this step.
A certificate authority (CA) is responsible for signing
certificates. CAs works likes a government that issues passports - the
government stamps (signs) each passport so that the passport becomes difficult
to forge. Other governments verify the stamps to ensure the passport is
authentic. Similarly, the CA signs the certificates, and the cryptography
guarantees that a signed certificate is computationally difficult to forge.
Thus, as long as the CA is a genuine and trusted authority, the clients have a
strong assurance that they are connecting to the authentic machines.

Comments
Post a Comment