Skip to content

Commit

Permalink
Merge pull request #95 from Yolean/ops-jobs
Browse files Browse the repository at this point in the history
Add Jobs and tests for common maintenance operations
  • Loading branch information
solsson authored Feb 3, 2018
2 parents 5a2b8c7 + 43c896b commit 467fbb9
Show file tree
Hide file tree
Showing 5 changed files with 217 additions and 0 deletions.
32 changes: 32 additions & 0 deletions maintenance/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@

## Re-assign Leadership

This is one of the cases where this repo begs to differ from traditional Kafka setups.
In Kubernetes the restart of a pod, and subsequent start on a different node, should be a non-event.

> ”when a broker is stopped and restarted, it does not resume leadership of any partitions automatically”
_-- Neha Narkhede, Gwen Shapira, and Todd Palino. ”Kafka: The Definitive Guide”_

Create the `preferred-replica-election-job.yml` resource, after deleting any previous one.

## Change a Partition's Replicas

> ”From time to time, it may be necessary to change the replica assignments for a partition. Some examples of when this might be needed are:
> * If a topic’s partitions are not balanced across the cluster, causing uneven load on brokers
> * If a broker is taken offline and the partition is under-replicated
> * If a new broker is added and needs to receive a share of the cluster load”
_-- Neha Narkhede, Gwen Shapira, and Todd Palino. ”Kafka: The Definitive Guide”_

Use the `reassign-paritions-job.yml`, after editing `TOPICS` and `BROKERS`.

## Increase a topic's replication factor

See https://github.com/Yolean/kubernetes-kafka/pull/140

Use the `replication-factor-increase-job.yml`, after editing `TOPICS` and `BROKERS`.

The affected topics may end up without a preferred replica. See above to fix that,
or to affect only your selected topics use [Kafka Manager](https://github.com/Yolean/kubernetes-kafka/pull/83)'s topic screen,
Generate Partition Assignments followed by Reassign Partitions.
19 changes: 19 additions & 0 deletions maintenance/preferred-replica-election-job.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
apiVersion: batch/v1
kind: Job
metadata:
name: preferred-replica-election
namespace: kafka
spec:
template:
metadata:
name: preferred-replica-election
spec:
containers:
- name: kafka
image: solsson/kafka:1.0.0@sha256:17fdf1637426f45c93c65826670542e36b9f3394ede1cb61885c6a4befa8f72d
command:
- ./bin/kafka-preferred-replica-election.sh
- --zookeeper
- zookeeper:2181
restartPolicy: Never
backoffLimit: 3
51 changes: 51 additions & 0 deletions maintenance/reassign-paritions-job.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
apiVersion: batch/v1
kind: Job
metadata:
name: reassign-partitions
namespace: kafka
spec:
template:
metadata:
name: reassign-partitions
spec:
containers:
- name: kafka
image: solsson/kafka:1.0.0@sha256:17fdf1637426f45c93c65826670542e36b9f3394ede1cb61885c6a4befa8f72d
env:
- name: ZOOKEEPER
value: zookeeper.kafka:2181
# the following must be edited per job
- name: TOPICS
value: test-produce-consume,test-kafkacat
- name: BROKERS
value: 0,2
command:
- /bin/bash
- -ce
- >
echo '{"topics":[' > /tmp/reassign-topics.json;
echo -n ' {"topic":"' >> /tmp/reassign-topics.json;
echo -n $TOPICS | sed 's/,/"},\n {"topic":"/g' >> /tmp/reassign-topics.json;
echo '"}' >> /tmp/reassign-topics.json;
echo ']}' >> /tmp/reassign-topics.json;
echo "# reassign-topics.json";
cat /tmp/reassign-topics.json;
./bin/kafka-reassign-partitions.sh
--zookeeper=$ZOOKEEPER
--generate
--topics-to-move-json-file=/tmp/reassign-topics.json
--broker-list=$BROKERS > /tmp/generated.txt;
tail -n 1 /tmp/generated.txt > /tmp/proposed-reassignment.json;
echo "# proposed-reassignment.json";
cat /tmp/proposed-reassignment.json;
./bin/kafka-reassign-partitions.sh
--zookeeper=$ZOOKEEPER
--execute
--reassignment-json-file=/tmp/proposed-reassignment.json;
restartPolicy: Never
backoffLimit: 3
65 changes: 65 additions & 0 deletions maintenance/replication-factor-increase-job.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
apiVersion: batch/v1
kind: Job
metadata:
name: replication-factor-increase
namespace: kafka
spec:
template:
metadata:
name: replication-factor-increase
spec:
containers:
- name: kafka
image: solsson/kafka:1.0.0@sha256:17fdf1637426f45c93c65826670542e36b9f3394ede1cb61885c6a4befa8f72d
env:
- name: ZOOKEEPER
value: zookeeper.kafka:2181
# the following must be edited per job
- name: TOPICS
value: ""
- name: BROKERS
value: 0,1,2
command:
- /bin/bash
- -ce
- >
if [ -z "$TOPICS" ]; then
echo "Please set the TOPICS env (comma-separated) and re-create the job"
tail -f /dev/null
fi
echo '{"topics":[' > /tmp/reassign-topics.json;
echo -n ' {"topic":"' >> /tmp/reassign-topics.json;
echo -n $TOPICS | sed 's/,/"},\n {"topic":"/g' >> /tmp/reassign-topics.json;
echo '"}' >> /tmp/reassign-topics.json;
echo ']}' >> /tmp/reassign-topics.json;
echo "# reassign-topics.json";
cat /tmp/reassign-topics.json;
./bin/kafka-reassign-partitions.sh
--zookeeper=$ZOOKEEPER
--generate
--topics-to-move-json-file=/tmp/reassign-topics.json
--broker-list=$BROKERS > /tmp/generated.txt;
tail -n 1 /tmp/generated.txt > /tmp/proposed-reassignment.json;
sleep 1;
echo "# proposed-reassignment.json";
cat /tmp/proposed-reassignment.json;
sed -i 's/"replicas":\[.\]/"replicas":[0,1,2]/g' /tmp/proposed-reassignment.json;
sed -i 's/,"log_dirs":\["any"\]//g' /tmp/proposed-reassignment.json;
echo "# proposed-reassignment.json modified to affect replication factor";
cat /tmp/proposed-reassignment.json;
echo "# Triggering kafka-reassign-partitions.sh"
./bin/kafka-reassign-partitions.sh
--zookeeper=$ZOOKEEPER
--execute
--reassignment-json-file=/tmp/proposed-reassignment.json;
echo "# Reassignment exited. Upon success you may want to run preferred-replica-election."
restartPolicy: Never
backoffLimit: 3
50 changes: 50 additions & 0 deletions maintenance/test/replicated-partitions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: replicated-partitions
namespace: test-kafka
spec:
replicas: 1
selector:
matchLabels:
test-type: readiness
test-target: under-replicated-partitions
template:
metadata:
labels:
test-type: readiness
test-target: under-replicated-partitions
spec:
containers:
- name: kafka
image: solsson/kafka:1.0.0@sha256:17fdf1637426f45c93c65826670542e36b9f3394ede1cb61885c6a4befa8f72d
command:
- /bin/bash
- -ec
- >
touch /tmp/testlog;
tail -f /tmp/testlog
readinessProbe:
exec:
command:
- /bin/bash
- -c
- >
echo "### $(date -Ins -u) ###" >> /tmp/testlog
&&
[
$(
./bin/kafka-topics.sh
--zookeeper zookeeper.kafka:2181
--describe
--under-replicated-partitions
|
tee -a /tmp/testlog
|
wc -l
)
-eq
0
]
periodSeconds: 30
timeoutSeconds: 29

0 comments on commit 467fbb9

Please sign in to comment.