-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add: π° [Chapter 05] νλ‘κ·Έλ¨ λ΄μμ μ½λλ‘ μΉ΄νμΉ΄ κ΄λ¦¬νκΈ°
- Loading branch information
1 parent
28fd7a0
commit ed17074
Showing
1 changed file
with
310 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,310 @@ | ||
--- | ||
title: Chapter 05. νλ‘κ·Έλ¨ λ΄μμ μ½λλ‘ μΉ΄νμΉ΄ κ΄λ¦¬νκΈ° | ||
date: 2024-12-15 10:00:00 +0900 | ||
categories: [μΉ΄νμΉ΄ ν΅μ¬κ°μ΄λ] | ||
tags: [μΉ΄νμΉ΄ ν΅μ¬κ°μ΄λ] | ||
--- | ||
|
||
## **1.1. AdminClient κ°μ** π‘ | ||
|
||
### **AdminClientμ μ£Όμ κΈ°λ₯** | ||
|
||
- ν ν½ μ‘°ν, μμ±, μμ | ||
- ν΄λ¬μ€ν° μμΈ μ 보 νμΈ | ||
- ACL λ° μ€μ κ΄λ¦¬ | ||
|
||
|
||
### **λΉλκΈ° μ²λ¦¬** | ||
|
||
- `AdminClient`μ λ©μλλ **λΉλκΈ°**λ‘ μλνλ©°, κ²°κ³Όλ₯Ό **`Future` κ°μ²΄**λ‘ λ°ν | ||
- λ°νλ `Future` κ°μ²΄λ₯Ό ν΅ν΄ μμ κ²°κ³Όλ₯Ό νμΈνκ±°λ, μ·¨μ λ° λκΈ° κ°λ₯ | ||
- μμ μ΄ μλ£λλ©΄ νμ μμ μ€νμ μν λ©μλλ μ 곡 | ||
- ex. `AdminClient.createTopics` λ©μλ | ||
- `CreateTopicsResult` κ°μ²΄ λ°ννλ©°, μμ±λ κ° ν ν½μ μνλ₯Ό κ°λ³μ μΌλ‘ νμΈ κ°λ₯ | ||
|
||
|
||
### **μ΅μ’ μ μΌκ΄μ±(Eventual Consistency)** | ||
|
||
- μΉ΄νμΉ΄μ λ©νλ°μ΄ν°λ λΉλκΈ°μ μΌλ‘ μ ν | ||
- μ ν ν½ μμ± μ λͺ¨λ λΈλ‘컀μ λκΈ°νλκΈ°κΉμ§ μκ°μ΄ νμ | ||
|
||
|
||
|
||
## **1.2. AdminClient μ΅μ βοΈ** | ||
|
||
### **λ©μλλ³ μ΅μ ** | ||
|
||
- `AdminClient`λ μμ μ λ°λΌ μ μ© μ΅μ κ°μ²΄λ₯Ό μ 곡 | ||
- ex. `listTopics` β `ListTopicsOptions` , `describeCluster` β `DescribeClusterOptions` | ||
- κ° μ΅μ μ ν΅ν΄ μμ μ μΈλΆ λμμ μΈλ°νκ² μ€μ κ°λ₯ | ||
|
||
|
||
### **κ³΅ν΅ λ§€κ°λ³μ μ΅μ ** | ||
|
||
- `timeoutMs`λ‘ ν΄λ¬μ€ν° μλ΅ λκΈ° μκ° μ€μ | ||
- μλ΅ μκ° μ΄κ³Ό μ `TimeoutException` λ°μ | ||
|
||
|
||
|
||
## **1.3. AdminClientμ ꡬ쑰μ νΉμ§ ποΈ** | ||
|
||
### **μνμ μ€κ³** | ||
|
||
- `AdminClient`λ **`KafkaAdminClient` νλ‘ν μ½**λ‘ μμ μν | ||
- κ°μ²΄ κ° μμ‘΄ κ΄κ³λ λ€μμ€νμ΄μ€ μμ΄ νμν λ©μλμ μ§μ μ κ·Ό κ°λ₯ | ||
- 볡μ‘ν ꡬ쑰 μμ΄ κ°κ²°νκ² μ€κ³λ¨ | ||
|
||
|
||
### **μ¬μ©μ μΉνμ±** | ||
|
||
- JavaDoc λ¬Έμμ IDE μλμμ±μΌλ‘ λ©μλλ₯Ό μ½κ² νμν μ μμ | ||
|
||
|
||
|
||
## **1.4. μΆκ° μ°Έκ³ π** | ||
|
||
### **μμ μ νλ³ μ²λ¦¬ μμΉ** | ||
|
||
- ν΄λ¬μ€ν° λ³κ²½ μμ (`create`, `delete`, `alter`)μ **컨νΈλ‘€λ¬**κ° λ΄λΉ | ||
- μ‘°ν μμ (`list`, `describe`)μ λΆνκ° μ μ λΈλ‘컀μμ μ²λ¦¬λμ΄ ν¨μ¨μ± κ·Ήλν | ||
|
||
|
||
### **μ£Όν€νΌ μμ κΈμ§** | ||
|
||
- μΉ΄νμΉ΄λ μ£Όν€νΌ μμ‘΄μ±μ μ μ°¨ μ κ±°νλ λ°©ν₯μΌλ‘ λ°μ μ€ | ||
- μ£Όν€νΌλ₯Ό μ§μ μμ νλ μμ μ κΆμ₯λμ§ μμΌλ©°, μμμΉ λͺ»ν λ¬Έμ λ₯Ό μ΄λν μ μμ | ||
|
||
|
||
|
||
## **2. AdminClient μ¬μ©λ²: μμ±, μ€μ , λ«κΈ° π** | ||
|
||
### **AdminClient μμ± λ° λ«κΈ°** | ||
|
||
```java | ||
Properties props = new Properties(); | ||
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); | ||
|
||
AdminClient admin = AdminClient.create(props); | ||
|
||
admin.close(Duration.ofSeconds(30)); | ||
``` | ||
|
||
- `Properties` κ°μ²΄λ₯Ό ν΅ν΄ `AdminClient` μμ± | ||
- `bootstrap.servers` μ€μ μΌλ‘ μΉ΄νμΉ΄ ν΄λ¬μ€ν°μ μ°κ²° | ||
- `close()` νΈμΆ μ, μ§ν μ€μΈ μμ μ΄ μλ£λκΈ°λ₯Ό μ΅λ 30μ΄ λκΈ° | ||
- 30μ΄λ₯Ό μ΄κ³Όν λ―Έμλ£ μμ μ λν΄ μμΈ λ°μ | ||
|
||
|
||
### **DNS κ΄λ ¨ μ€μ ** | ||
|
||
- **`client.dns.lookup=resolve_canonical_bootstrap_server_only`** | ||
- **DNS λ³μΉ**μ μ¬μ©νλ κ²½μ°, λͺ¨λ λΈλ‘컀 μ΄λ¦μΌλ‘ μλ λ±λ‘ κ°λ₯ | ||
- **`client.dns.lookup=use_all_dns_ips`** | ||
- **λ€μμ IP μ£Όμ**λ₯Ό κ°μ§ DNS μ΄λ¦μ νμ©νμ¬ μ°κ²° μμ μ±μ λμΌ μ μμ | ||
|
||
|
||
### **μλ΅ λκΈ° μκ° μ€μ ** | ||
|
||
- `request.timeout.ms` | ||
- `AdminClient`κ° μμ μλ΅μ κΈ°λ€λ¦¬λ μ΅λ μκ° | ||
- μ ν μκ° μ΄κ³Ό μ μμΈ λ°μ | ||
- μλΉμ€ μ΄κΈ°ν μ€ νΉμ ν ν½μ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈν λ νμ© κ°λ₯ | ||
|
||
|
||
|
||
## **3. νμμ μΈ ν ν½ κ΄λ¦¬ κΈ°λ₯ π** | ||
|
||
### **ν ν½ μ‘°ν** | ||
|
||
```java | ||
ListTopicsResult topics = admin.listTopics(); // Future κ°μ²΄ ν¬ν¨ | ||
topics.names.get().forEach(System.out::println); // λͺ¨λ ν ν½μ΄λ¦ μΆλ ₯ | ||
``` | ||
|
||
- `admin.listTopics()`λ `ListTopicsResult`κ°μ²΄ λ°ν | ||
- `Future` κ°μ²΄λ₯Ό ν΅ν΄ λΉλκΈ°μ μΌλ‘ κ²°κ³Όμ²λ¦¬ | ||
- `Future.get()` νΈμΆ μ ν ν½ μ΄λ¦ λͺ©λ‘μ λ°μ λκΉμ§ λκΈ°νλ©°, νμμμ μ μμΈ λ°μ | ||
|
||
|
||
### **ν ν½ μμ± λ° μμ ** | ||
|
||
- `admin.createTopics` , `admin.deleteTopics` λ©μλλ‘ ν ν½ μμ± λ° μμ μν | ||
- μμ λ λ³΅κ΅¬κ° λΆκ°λ₯νλ―λ‘ μ μ€ν μ§ν | ||
|
||
|
||
### **ν ν½ μ‘°κ±΄ νμΈ** | ||
|
||
- **1κ°μ νν°μ **μΌλ‘ λ°μ΄ν° μμ 보μ₯ | ||
- **μ΅μ 3κ°μ λ ν리카**λ‘ κ°μ©μ±κ³Ό μμ μ± ν보 | ||
- **μμ°©(compaction) μ€μ **μΌλ‘ μ€λλ λ°μ΄ν°λ μ μ§ κ°λ₯ | ||
|
||
|
||
### **λΉλκΈ° μ²λ¦¬λ‘ ν¨μ¨μ± ν₯μ** | ||
|
||
- `Future.get()`μ μ¬μ©ν λΈλ‘νΉ λ°©μμ λκ·λͺ¨ μμ² νκ²½μμ λΉν¨μ¨μ | ||
- λμ λΉλκΈ° λ°©μμ νμ©ν΄ μλ² ν¨μ¨μ±μ κ·Ήλν | ||
- HTTP μλ²λ μΉ΄νμΉ΄ μλ΅μ κΈ°λ€λ¦¬μ§ μκ³ λ€λ₯Έ μμ² μ²λ¦¬ κ°λ₯ | ||
- μΉ΄νμΉ΄ μλ΅ λμ°© μ ν΄λΌμ΄μΈνΈμ μ¦μ μ λ¬, μ²λ¦¬ μλ μ΅μ ν | ||
|
||
|
||
|
||
|
||
## **4. μ€μ κ΄λ¦¬ π οΈ** | ||
|
||
### **ConfigResource κ°μ²΄ νμ©** | ||
|
||
- **λΈλ‘컀, λ‘κ·Έ, ν ν½**μ μ€μ μ μ‘°ννκ±°λ μμ κ°λ₯ | ||
- CLI ν΄(`kafka-configs.sh`)μΈμλ μ ν리μΌμ΄μ μ½λλ‘ μ€μ μμ κ°λ₯ | ||
|
||
|
||
### **μμ°©(compaction) μ€μ ** | ||
|
||
- μμ°© μ€μ μ λ°μ΄ν° μΌκ΄μ±κ³Ό 보쑴μ μν΄ μ€μ | ||
- μ£ΌκΈ°μ μΌλ‘ μμ°© μ€μ μ¬λΆλ₯Ό μ κ²νκ³ , λλ½ μ μλμΌλ‘ μμ κ°λ₯ | ||
|
||
|
||
|
||
## **5. 컨μλ¨Έ κ·Έλ£Ή κ΄λ¦¬ π₯** | ||
|
||
- μΉ΄νμΉ΄λ μ΄μ λ°μ΄ν°λ₯Ό λμΌν μμλ‘ μ¬μ²λ¦¬ν μ μλ κΈ°λ₯ μ 곡 | ||
- νΈλ¬λΈμν λ° μ¬ν΄ 볡ꡬμ κ°μ μν©μμ μ μ© | ||
|
||
|
||
|
||
## **5.1. 컨μλ¨Έ κ·Έλ£Ή μ΄ν΄λ³΄κΈ° π** | ||
|
||
### **컨μλ¨Έ κ·Έλ£Ή λͺ©λ‘ μ‘°ν** | ||
|
||
```java | ||
admin.listConsumerGroups().valid().get().forEach(System.out::println); | ||
``` | ||
|
||
- `valid()`λ μλ¬ μμ΄ λ°νλ κ·Έλ£Ήλ§ ν¬ν¨ | ||
- μμΈλ `errors()` λ©μλλ‘ νμΈ κ°λ₯ | ||
|
||
|
||
### κ·Έλ£Ή μμΈ μ 보 νμΈ | ||
|
||
```java | ||
ConsumerGroupDescription groupDescription = admin | ||
.describeConsumerGroups(CONSUMER_GRP_LIST) | ||
.describedGroups().get(CONSUMER_GROUP).get(); | ||
|
||
System.out.println("Description of group " + CONSUMER_GROUP + ":" + groupDescription); | ||
``` | ||
- `ConsumerGroupDescription` κ°μ²΄λ‘ **κ·Έλ£Ή λ©€λ², ν λΉλ νν°μ , κ·Έλ£Ή μ½λλ€μ΄ν° μ 보** νμΈ κ°λ₯ | ||
- **λ§μ§λ§ 컀λ°λ μ€νμ **κ³Ό **μ§μ° μν(lag)**λ₯Ό νμ κ°λ₯ | ||
|
||
|
||
|
||
## **5.2. 컨μλ¨Έ κ·Έλ£Ή μμ νκΈ° π** | ||
|
||
### **μ§μ κΈ°λ₯** | ||
|
||
- 컨μλ¨Έ κ·Έλ£Ή μμ | ||
- νΉμ λ©€λ² μ μΈ | ||
- 컀λ°λ μ€νμ μμ λ° λ³κ²½ | ||
|
||
|
||
### **μ€νμ λ³κ²½** | ||
|
||
- μ€νμ μμ λ‘ μ»¨μλ¨Έκ° μ²μλΆν° λ°μ΄ν°λ₯Ό μ½λλ‘ μ€μ κ°λ₯ | ||
- `auto.offset.reset` κ°μ λ°λΌ μ²λ¦¬ μμ μ§μ μ μ‘°μ κ°λ₯ | ||
|
||
|
||
### **μ£Όμμ¬ν** | ||
|
||
- νμ±νλ 컨μλ¨Έ κ·Έλ£Ήμ μ€νμ λ³κ²½ λΆκ°(ex. `UnknownMemberIdException` λ°μ) | ||
- μν μ μ₯μλ₯Ό ν¨κ» μ‘°μ νμ§ μμΌλ©΄ μ€λ³΅ κ³μ° κ°λ₯μ± μ‘΄μ¬ | ||
- μ€νμ λ³κ²½μ 컨μλ¨Έκ° μλ‘μ΄ νν°μ μ ν λΉλ°κ±°λ μ¬μμν λ λ°μ | ||
|
||
|
||
|
||
## **6. κ³ κΈ μ΄λλ―Ό μμ π¬** | ||
|
||
- μΌλ°μ μΌλ‘ μ μ¬μ©λμ§ μμ§λ§, νΉμ μν©μμλ λ§€μ° μ μ©ν μμ | ||
- νΉν μ¬κ³ 볡ꡬ μ€μΈ SREμκ² μ€μν λκ΅¬λ‘ νμ© κ°λ₯ | ||
|
||
|
||
## **6.1. ν ν½μ νν°μ μΆκ°νκΈ° β** | ||
|
||
- ν ν½μ νν°μ μλ μμ± μ κ²°μ λλ©°, μΌλ°μ μΌλ‘ λ³κ²½λμ§ μμ | ||
- λΆνκ° νν°μ μ μ΅λ μ²λ¦¬λμ μ΄κ³Όνλ κ²½μ°, νν°μ μΆκ°κ° νμ | ||
|
||
```java | ||
Map<String, NewPartitions> newPartitions = new HashMap<>(); | ||
newPartitions.put(TOPIC_NAME, NewPartitions.increaseTo(NUM_PARTITIONS + 2)); | ||
admin.createPartitions(newPartitions).all().get(); | ||
``` | ||
- λ°μ΄ν° 무결μ±μ΄ κΉ¨μ§ μ μμΌλ―λ‘ μ μ€ν μ²λ¦¬ | ||
|
||
|
||
|
||
## **6.2. ν ν½μμ λ μ½λ μμ νκΈ° ποΈ** | ||
|
||
### **νμμ±** | ||
|
||
- κ°μΈμ 보 보νΈλ² λ±μΌλ‘ μΈν΄ νΉμ λ°μ΄ν° μμ κ° μꡬλλ κ²½μ° | ||
- μ§μ λ μ€νμ μ΄μ μ λͺ¨λ λ μ½λ μμ κ°λ₯ | ||
|
||
|
||
### **μ¬μ© λ°©λ²** | ||
|
||
- `deleteRecords` λ©μλλ‘ νΉμ μ€νμ μ΄μ μ λ μ½λ μμ | ||
- μμ λ λ μ½λμ μ΅λ μ€νμ κ°μ λ°νν΄ μμ μλ£ μ¬λΆ νμΈ κ°λ₯ | ||
|
||
```java | ||
admin.deleteRecords(recordsToDelete).all().get(); | ||
``` | ||
|
||
|
||
### **νΉμ§** | ||
|
||
- μμ λ λ μ½λλ μ¦μ μ κ·Ό λΆκ° μνλ‘ μ ν | ||
- μ€μ λμ€ν¬ μμ λ λΉλκΈ°λ‘ μ²λ¦¬ | ||
|
||
|
||
|
||
## **6.3. 리λ μ μΆ π** | ||
|
||
### **μ νΈ λ¦¬λ μ μΆ (Preferred Leader Election)** | ||
|
||
- κ° νν°μ μ κΈ°λ³Έμ μΌλ‘ **μ νΈ λ¦¬λ λ ν리카**λ₯Ό κ°μ§ | ||
- μΉ΄νμΉ΄λ μ νΈ λ¦¬λκ° λ¦¬λ μν μ μννλμ§ μ£ΌκΈ°μ μΌλ‘ νμΈ | ||
- `electLeader()` λ©μλλ‘ μ νΈ λ¦¬λλ₯Ό λ€μ 리λλ‘ μ§μ κ°λ₯ | ||
|
||
|
||
### **μΈν΄λ¦° 리λ μ μΆ (Unclean Leader Election)** | ||
|
||
- 리λ λ νλ¦¬μΉ΄κ° λͺ¨λ μ¬μ© λΆκ°ν κ²½μ°, 리λκ° μλ μν λ°μ κ°λ₯ | ||
- λ°μ΄ν° μ μ€μ κ°μνκ³ **λΉμ μ λ ν리카**λ₯Ό 리λλ‘ μ§μ | ||
- μ΄ κ³Όμ μ λΉλκΈ°λ‘ μ€νλλ©°, μκ°μ΄ μμλ μ μμ | ||
|
||
|
||
|
||
## **6.4. λ ν리카 μ¬ν λΉ π¦** | ||
|
||
### **νμμ±** | ||
|
||
- νΉμ λΈλ‘컀 κ³ΌλΆν μν | ||
- μ₯λΉ κ΅μ²΄λ₯Ό μν΄ λ ν리카 μ΄λ λλ μΆκ° | ||
- λ°μ΄ν° κ· νμ λ§μΆκΈ° μν μ¬λ°°μΉ | ||
|
||
|
||
### **μ¬μ© λ°©λ²** | ||
|
||
```java | ||
admin.alterPartitionReassignments(partitionReassignments).all().get(); | ||
``` | ||
|
||
### **μ£Όμμ¬ν** | ||
- λ ν리카 μ΄λμ **λλμ λ°μ΄ν° 볡μ **λ₯Ό μ΄λ | ||
- 볡μ μμ μΌλ‘ μΈν΄ λΈλ‘컀 μ±λ₯μ μν₯μ μ€ μ μμΌλ―λ‘ μ μ€ν μ§ν | ||
|
||
|
||
|
||
## **7. μΉ΄νμΉ΄ ν μ€νΈ π§ͺ** | ||
|
||
### **MockAdminClient** | ||
- μ€μ λΈλ‘컀 μμ΄ `AdminClient`μ λμμ ν μ€νΈν μ μλ λꡬ | ||
- μΉ΄νμΉ΄κ° μ 곡νλ λͺ©μ ν΄λμ€(`MockAdminClient`)λ₯Ό νμ© |