使用 hazelcast 撰寫一個用 kotlin 撰寫的基于 spring 的應用程式我在部署到 kubernetes 時遇到問題。
對于 kubernetes 上的 hazelcast,我使用DNS 查找模式進行發現。我有以下榛樹配置:
hazelcast:
network:
join:
multicast:
enabled: false
kubernetes:
enabled: true
service-dns: my-application-hs
以及用于 kubernetes 部署的以下 service.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-application
spec:
type: ClusterIP
selector:
component: my-application
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
---
apiVersion: v1
kind: Service
metadata:
name: my-application-hs
spec:
type: ClusterIP
clusterIP: None
selector:
component: my-application
ports:
- name: hazelcast
port: 5701
榛樹地圖是這樣使用的:
@Component
class CacheClientImplHazelcast(){
private val hz: HazelcastInstance
init{
val serializer = SerializerConfig()
.setTypeClass(MyDto::class.java)
.setImplementation(MyDtoSerializer())
val config = Config()
config.serializationConfig.addSerializerConfig(serializer)
hz = Hazelcast.newHazelcastInstance(config)
}
fun getAllData(): List<MyDto> {
val map: IMap<String, MyDto> = hz.getMap("my-map")
return map.values.toList()
}
fun putData(key:String, myDto: MyDto) {
val map: IMap<String, MyDto> = hz.getMap("my-map")
map.put(key, myDto)
}
override fun clear() {
val map: IMap<String, MyDto> = hz.getMap("my-map")
map.clear()
}
}
在 kubernetes 上運行 3 個實體時,來自 hazelcast 的日志總是向我顯示 4 個條目,如下所示:
Members {size:4, ver:53} [
Member [10.4.2.32]:5701 - c1e70d6f-a62d-4924-9815-36bb1f98f141
Member [10.4.3.25]:5702 - be96c292-8847-4f56-ae32-f27f380d7c5b
Member [10.4.2.32]:5702 - 6ca96bfd-eb74-4149-8630-a2488e76d97d
Member [10.4.11.41]:5702 - 7e8b0bc9-ad2b-41eb-afbf-b7af9ed497bd this
]
(附帶問題 1:為什么我在這里看到的是 4 而不是 3?)
現在,即使當我在一個節點上寫入資料時,成員似乎已連接(至少節點的日志顯示所有相同的成員 uuid),但它在其他節點上不可用。呼叫getAllData僅顯示已放入此節點上 hazelcast 地圖的資料。當我向單個節點發送請求(shell 上的 curl)時,我只看到一小部分資料。當我在 pod 的正常 url 上發送請求時,使用回圈我獲取不同節點的資料,這些資料是不同步的。
如果我使用以下 hazelcast.yaml 在本地運行相同的應用程式:
hazelcast:
network:
join:
multicast:
enabled: false
然后一切正常,快取似乎在本地運行的不同服務器實體之間“同步”。對于這個測驗,我在不同的埠上啟動應用程式。
然而奇怪的是,即使我在本地運行 2 個實體,我從 hazelcast 看到的日志表明有 4 個成員:
Members {size:4, ver:4} [
Member [192.168.68.106]:5701 - 01713c9f-7718-4ed4-b532-aaf62443c425
Member [192.168.68.106]:5702 - 09921004-88ef-4fe5-9376-b88869fde2bc
Member [192.168.68.106]:5703 - cea4b13f-d538-48f1-b0f2-6c53678c5823 this
Member [192.168.68.106]:5704 - 44d84e70-5b68-4c69-a45b-fee39bd75554
]
(附帶問題 2:為什么我只在本地開始了 2 個成員,但我看到了 4 個成員?)
現在的主要問題是:為什么這個設定在 kubernetes 上不起作用?為什么每個節點都有一個與其他節點不同步的單獨映射?
這里有一些可能相關但我無法確定問題的日志訊息:
2022-04-19T12:29:31.414588357Z2022-04-19 12:29:31.414 INFO 1 --- [cached.thread-7] c.h.i.server.tcp.TcpServerConnector : [10.4.11.41]:5702 [dev] [5.1.1] Connecting to /10.4.3.25:5702, timeout: 10000, bind-any: true
2022-04-19T12:29:31.414806473Z2022-04-19 12:29:31.414 INFO 1 --- [.IO.thread-in-2] c.h.i.server.tcp.TcpServerConnection : [10.4.11.41]:5702 [dev] [5.1.1] Initialized new cluster connection between /10.4.11.41:5702 and /10.4.3.25:46475
2022-04-19T12:29:31.414905573Z2022-04-19 12:29:31.414 INFO 1 --- [cached.thread-4] c.h.i.server.tcp.TcpServerConnector : [10.4.11.41]:5702 [dev] [5.1.1] Connecting to /10.4.2.32:5702, timeout: 10000, bind-any: true
2022-04-19T12:29:31.416520854Z2022-04-19 12:29:31.416 INFO 1 --- [.IO.thread-in-0] c.h.i.server.tcp.TcpServerConnection : [10.4.3.25]:5702 [dev] [5.1.1] Initialized new cluster connection between /10.4.3.25:5702 and /10.4.11.41:40455
2022-04-19T12:29:31.416833551Z2022-04-19 12:29:31.416 INFO 1 --- [.IO.thread-in-1] c.h.i.server.tcp.TcpServerConnection : [10.4.2.32]:5702 [dev] [5.1.1] Initialized new cluster connection between /10.4.2.32:54433 and /10.4.11.41:5702
2022-04-19T12:29:31.417377114Z2022-04-19 12:29:31.417 INFO 1 --- [.IO.thread-in-0] c.h.i.server.tcp.TcpServerConnection : [10.4.11.41]:5702 [dev] [5.1.1] Initialized new cluster connection between /10.4.11.41:40455 and /10.4.3.25:5702
2022-04-19T12:29:31.417545174Z2022-04-19 12:29:31.417 INFO 1 --- [.IO.thread-in-2] c.h.i.server.tcp.TcpServerConnection : [10.4.2.32]:5702 [dev] [5.1.1] Initialized new cluster connection between /10.4.2.32:5702 and /10.4.11.41:53547
2022-04-19T12:29:31.418541840Z2022-04-19 12:29:31.418 INFO 1 --- [.IO.thread-in-1] c.h.i.server.tcp.TcpServerConnection : [10.4.11.41]:5702 [dev] [5.1.1] Initialized new cluster connection between /10.4.11.41:53547 and /10.4.2.32:5702
2022-04-19T12:29:31.419763311Z2022-04-19 12:29:31.419 INFO 1 --- [.IO.thread-in-2] c.h.i.server.tcp.TcpServerConnection : [10.4.3.25]:5702 [dev] [5.1.1] Initialized new cluster connection between /10.4.3.25:46475 and /10.4.11.41:5702
2022-04-19T12:29:31.676218042Z2022-04-19 12:29:31.675 INFO 1 --- [gulis.migration] c.h.i.partition.impl.MigrationManager : [10.4.2.32]:5701 [dev] [5.1.1] Repartitioning cluster data. Migration tasks count: 271
uj5u.com熱心網友回復:
這里有兩個問題,但只有一個問題。
- 為什么額外的實體
如果 Spring (Boot) 找到 Hazelcast 組態檔但沒有 @Bean,它將為您創建一個 Hazelcast 實體HazelcastInstance。您可以通過排除HazelcastAutoConfiguration.class或將您在組件類中創建的實體作為@Bean 回傳來修復。
- 為什么 Kubernetes 上的資料同步問題
每個 pod 意外地有 2 個 Hazelcast 節點,一個在 5701 上,一個在 5702 上。但您ClusterIP只列出了 5701。pod 中的某些實體無法從外部訪問。當您解決第一個問題時,這將消失。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/458992.html
標籤:Kubernetes 榛树
