NATS服務集群化
NATS支持每一個服務按照集群模式方式運行。你可以將這些服務組織在一起形成一個集群來提高服務器的容量的消息傳遞系統,並可以提升整個系統的彈性話和高可用性。
注意,NATS集群服務器轉發是通過一個跳躍來完成的。這意味着每個gnatsd當從一個客戶端接收到消息之后通過路由信息會立即轉發給對應注冊的gnatsd實例。接收到的消息通過一個路由才會分發給本地的客戶。因此一個完整的集群網,或完全圖,建議NATS以功能作為目的方式來形象的描述整個過程。
概覽
除了可以監聽一個客戶端應用端口,gnatsd還可以監聽一個“集群” URL(-cluster 選項)。另外,gnatsd服務器可以將該URL添加到它其中的 -routes 參數用以加入集群。這些選項可以指定在一個配置文件。
例如:
非集群化的啟動
gnatsd -p 4222 -m 8222
一個最簡單的集群化啟動
# Server A on 10.10.0.1 gnatsd -p 4222 -cluster nats://10.10.0.1:5222 # Server B on 10.10.0.2 gnatsd -p 4222 -cluster nats://10.10.0.2:5222 -routes nats://10.10.0.1:5222
或者采用另外一種方式
# Server A on 10.10.0.1 gnatsd -p 4222 -cluster nats://10.10.0.1:5222 -routes nats://10.10.0.2:5222 # Server B on 10.10.0.2 gnatsd -p 4222 -cluster nats://10.10.0.2:5222 -routes nats://10.10.0.1:5222
客戶端連接到集群中的任何一個服務器都將會保持連接到服務器集群,即使它最初的連接被關閉了,只要至少有一個服務器存活那么就可以連上整個集群。
實例
首先,下面的例子將會演示如何在同一個主機上運行3個服務器組建的集群。我們將先啟動第一個服務並使用 -d 命令行參數產生調試信息
gnatsd -a 127.0.0.1 -p 4222 -m 8222 -cluster nats://127.0.0.1:4248 -D
或者我們使用類似的配置文件實現和上面一樣的效果,具體配置文件我們命名為 seed.conf ,內容如下:
# Cluster Seed Node listen: 127.0.0.1:4222 http: 8222 cluster { listen: 127.0.0.1:4248 }
那么我們可以通過指定配置文件啟動服務,其中 -config 參數可以簡寫為:-c
gnatsd -config ./seed.conf -D
運行啟動服務會產生以下日志內容:
[12064] 2017/04/06 18:58:46.007119 [INF] Starting nats-server version 0.9.6 [12064] 2017/04/06 18:58:46.007215 [DBG] Go build version go1.8 [12064] 2017/04/06 18:58:46.007224 [INF] Starting http monitor on 127.0.0.1:8222 [12064] 2017/04/06 18:58:46.007347 [INF] Listening for client connections on 127.0.0.1:4222 [12064] 2017/04/06 18:58:46.007391 [DBG] Server id is s03C0PiftvdfFO3MnQzrft [12064] 2017/04/06 18:58:46.007396 [INF] Server is ready [12064] 2017/04/06 18:58:46.007778 [INF] Listening for route connections on 127.0.0.1:4248
接下來讓我們啟動另外兩個服務,它們路由都指向第一個服務
gnatsd -a 127.0.0.1 -p 5222 -m 8222 -cluster nats://localhost:5248 -routes nats://localhost:4248 -D
在同一個主機上運行時,我們需要通過 -p 參數來指定不同的客戶端連接端口以及通過參數 -cluster 來指定對應的集群用於接受其他路由。注意,參數 -routes 指定 參數 -cluster 地址為第一個服務地址(localhost:4248)
查看日志,可以看到它連接和注冊一個路由到第一個啟動的服務信息
[12083] 2017/04/06 19:17:04.551954 [INF] Starting nats-server version 0.9.6 [12083] 2017/04/06 19:17:04.552038 [DBG] Go build version go1.8 [12083] 2017/04/06 19:17:04.552047 [INF] Starting http monitor on 127.0.0.1:8223 [12083] 2017/04/06 19:17:04.552139 [INF] Listening for client connections on 127.0.0.1:5222 [12083] 2017/04/06 19:17:04.552170 [DBG] Server id is FZz1WSobE9ltpRnRIvVyBx [12083] 2017/04/06 19:17:04.552174 [INF] Server is ready [12083] 2017/04/06 19:17:04.552266 [INF] Listening for route connections on localhost:5248 [12083] 2017/04/06 19:17:04.556239 [DBG] Trying to connect to route on localhost:4248 [12083] 2017/04/06 19:17:04.557549 [DBG] 127.0.0.1:4248 - rid:1 - Route connection created [12083] 2017/04/06 19:17:04.557578 [DBG] 127.0.0.1:4248 - rid:1 - Route connect msg sent [12083] 2017/04/06 19:17:04.557891 [DBG] 127.0.0.1:4248 - rid:1 - Registering remote route "pC3oopm6SevB2Di1o5L5I3" [12083] 2017/04/06 19:17:04.557905 [DBG] 127.0.0.1:4248 - rid:1 - Route sent local subscriptions
查看第一個服務的日志信息,我們可以看到反饋日志信息
[12069] 2017/04/06 19:17:04.557578 [DBG] 127.0.0.1:63928 - rid:1 - Route connection created [12069] 2017/04/06 19:17:04.557937 [DBG] 127.0.0.1:63928 - rid:1 - Registering remote route "FZz1WSobE9ltpRnRIvVyBx" [12069] 2017/04/06 19:17:04.557948 [DBG] 127.0.0.1:63928 - rid:1 - Route sent local subscriptions
最后,我們來啟動第三個也就是最后一個服務
gnatsd -a 127.0.0.1 -p 6222 -m 8224 -cluster nats://localhost:6248 -routes nats://localhost:4248 -D
當前服務打印日志信息如下
[12092] 2017/04/06 19:21:45.684036 [INF] Starting nats-server version 0.9.6 [12092] 2017/04/06 19:21:45.684123 [DBG] Go build version go1.8 [12092] 2017/04/06 19:21:45.684132 [INF] Starting http monitor on 127.0.0.1:8224 [12092] 2017/04/06 19:21:45.684237 [INF] Listening for client connections on 127.0.0.1:6222 [12092] 2017/04/06 19:21:45.684266 [DBG] Server id is VFCs2SMxmVnkcCKar2eQbq [12092] 2017/04/06 19:21:45.684270 [INF] Server is ready [12092] 2017/04/06 19:21:45.684357 [INF] Listening for route connections on localhost:6248 [12092] 2017/04/06 19:21:45.686608 [DBG] Trying to connect to route on localhost:4248 [12092] 2017/04/06 19:21:45.687497 [DBG] 127.0.0.1:4248 - rid:1 - Route connection created [12092] 2017/04/06 19:21:45.687518 [DBG] 127.0.0.1:4248 - rid:1 - Route connect msg sent [12092] 2017/04/06 19:21:45.687862 [DBG] 127.0.0.1:4248 - rid:1 - Registering remote route "pC3oopm6SevB2Di1o5L5I3" [12092] 2017/04/06 19:21:45.687875 [DBG] 127.0.0.1:4248 - rid:1 - Route sent local subscriptions [12092] 2017/04/06 19:21:45.688174 [DBG] 127.0.0.1:63949 - rid:2 - Route connection created [12092] 2017/04/06 19:21:45.688414 [DBG] 127.0.0.1:63949 - rid:2 - Registering remote route "FZz1WSobE9ltpRnRIvVyBx" [12092] 2017/04/06 19:21:45.688426 [DBG] 127.0.0.1:63949 - rid:2 - Route sent local subscriptions
再來看第一個服務終端日志打印信息
[12069] 2017/04/06 19:21:45.687523 [DBG] 127.0.0.1:63948 - rid:2 - Route connection created [12069] 2017/04/06 19:21:45.687829 [DBG] 127.0.0.1:63948 - rid:2 - Registering remote route "VFCs2SMxmVnkcCKar2eQbq" [12069] 2017/04/06 19:21:45.687842 [DBG] 127.0.0.1:63948 - rid:2 - Route sent local subscriptions
而第二個服務終端也會打印出相應連接信息如下
[12083] 2017/04/06 19:21:45.687990 [DBG] Trying to connect to route on 127.0.0.1:6248 [12083] 2017/04/06 19:21:45.688224 [DBG] 127.0.0.1:6248 - rid:2 - Route connection created [12083] 2017/04/06 19:21:45.688235 [DBG] 127.0.0.1:6248 - rid:2 - Route connect msg sent [12083] 2017/04/06 19:21:45.688383 [DBG] 127.0.0.1:6248 - rid:2 - Registering remote route "VFCs2SMxmVnkcCKar2eQbq" [12083] 2017/04/06 19:21:45.688395 [DBG] 127.0.0.1:6248 - rid:2 - Route sent local subscriptions
從以上的日志信息可以看出,一個完整的網絡NATS集群就已經搭建完畢。