1. 程式人生 > >Nacos高可用叢集解決方案-Docker版本

Nacos高可用叢集解決方案-Docker版本

文章主旨

本文目的是配置高可用的Nacos叢集

架構圖

整體架構為:Nginx + 3 x Nacos +高可用MySQL

高可用MySQL使用主從複製結構的可以參考Docker搭建MySQL主從叢集,基於GTID

文中對應的配置檔案已經上傳Github,地址:https://github.com/hellxz/nacos-cluster-docker

測試環境

伺服器OS 主機IP Docker版本
Ubuntu Server 18.04 LTS 192.168.87.133 18.09.6
Ubuntu Server 18.04 LTS 192.168.87.139 18.09.7
Ubuntu Desktop 18.04 LTS 192.168.87.135 18.09.7

為了實現Nacos的高可用,至少需要三臺負載較小的伺服器,可以與其它服務共存

注意事項

  1. 這裡演示高可用MySQL地址為:10.2.7.29:334010.2.7.29:3341,請自行替換
  2. 這裡的10.2.7.29是區域網,192.168.*是虛擬機器網路,通過虛擬機器是可以訪問區域網的
  3. Nacos初始化SQL這塊使用官方的即可,配置檔案中不提供,預設認為高可用MySQL已經執行了初始化nacos.sql,這個SQL請移步nacos.sql Github

配置檔案目錄結構與說明

目錄說明

  • init.d/custom.properties - 官方提供的自選功能配置檔案,Nacos節點均包含此目錄
  • nacos-1/docker-compose-nacos1.yml - 第一個Nacos節點的Docker-compose配置檔案
  • nacos-2/docker-compose-nacos1.yml - 第二個Nacos節點的Docker-compose配置檔案
  • nacos-3/docker-compose-nacos1.yml - 第三個Nacos節點的Docker-compose配置檔案

除些之外,在每個nacos-*目錄下邊,使用docker-compose命令啟動容器後,會創建出cluster-logs

目錄,

我認為最常用的應該是nacos.log

配置檔案內容

133伺服器的docker-compose-nacos1.yml

version: '3' 
services:
  # nacos-server服務註冊與發現,配置中心服務    
  docker-nacos-server:
    image: nacos/nacos-server:1.0.1
    container_name: nacos-server-1
    ports:
      - "8848:8848"
      - "9555:9555"
    networks: 
      - nacos_net
    restart: on-failure
    privileged: true
    environment:
      PREFER_HOST_MODE: ip #如果支援主機名可以使用hostname,否則使用ip,預設也是ip
      SPRING_DATASOURCE_PLATFORM: mysql #資料來源平臺 僅支援mysql或不儲存empty
      NACOS_SERVER_IP: 192.168.87.133 #多網絡卡情況下,指定ip或網絡卡
      NACOS_SERVERS: 192.168.87.133:8848 192.168.87.139:8848 192.168.87.135:8848 #叢集中其它節點[ip1:port ip2:port ip3:port]
      MYSQL_MASTER_SERVICE_HOST: 10.2.7.29 #mysql配置,Master為主節點,Slave為從節點
      MYSQL_MASTER_SERVICE_PORT: 3340
      MYSQL_MASTER_SERVICE_DB_NAME: nacos
      MYSQL_MASTER_SERVICE_USER: root
      MYSQL_MASTER_SERVICE_PASSWORD: password
      MYSQL_SLAVE_SERVICE_HOST: 10.2.7.29
      MYSQL_SLAVE_SERVICE_PORT: 3341
      #JVM調優引數
      #JVM_XMS:  #-Xms default :2g
      #JVM_XMX:  #-Xmx default :2g
      #JVM_XMN:  #-Xmn default :1g
      #JVM_MS:   #-XX:MetaspaceSize default :128m
      #JVM_MMS:  #-XX:MaxMetaspaceSize default :320m
      #NACOS_DEBUG: n #是否開啟遠端debug,y/n,預設n
      #TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,預設false
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs #日誌輸出目錄
      - ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置

networks:
  nacos_net:
    driver: bridge

139伺服器的docker-compose-nacos2.yml

version: '3' 
services:
  # nacos-server服務註冊與發現,配置中心服務    
  docker-nacos-server:
    image: nacos/nacos-server:1.0.1
    container_name: nacos-server-2
    ports:
      - "8848:8848"
      - "9555:9555"
    networks: nacos_net
    restart: 
      - on-failure
    privileged: true
    environment:
      PREFER_HOST_MODE: ip #如果支援主機名可以使用hostname,否則使用ip,預設也是ip
      SPRING_DATASOURCE_PLATFORM: mysql #資料來源平臺 僅支援mysql或不儲存empty
      NACOS_SERVER_IP: 192.168.87.139 #多網絡卡情況下,指定ip或網絡卡
      NACOS_SERVERS: 192.168.87.133:8848 192.168.87.139:8848 192.168.87.135:8848 #叢集中其它節點[ip1:port ip2:port ip3:port]
      MYSQL_MASTER_SERVICE_HOST: 10.2.7.29 #mysql配置,Master為主節點,Slave為從節點
      MYSQL_MASTER_SERVICE_PORT: 3340
      MYSQL_MASTER_SERVICE_DB_NAME: nacos
      MYSQL_MASTER_SERVICE_USER: root
      MYSQL_MASTER_SERVICE_PASSWORD: password
      MYSQL_SLAVE_SERVICE_HOST: 10.2.7.29
      MYSQL_SLAVE_SERVICE_PORT: 3341
      #JVM調優引數
      #JVM_XMS:  #-Xms default :2g
      #JVM_XMX:  #-Xmx default :2g
      #JVM_XMN:  #-Xmn default :1g
      #JVM_MS:   #-XX:MetaspaceSize default :128m
      #JVM_MMS:  #-XX:MaxMetaspaceSize default :320m
      #NACOS_DEBUG: n #是否開啟遠端debug,y/n,預設n
      #TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,預設false
    volumes:
      - ./cluster-logs/nacos2:/home/nacos/logs #日誌輸出目錄
      - ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置

networks:
  nacos_net:
    driver: bridge

135伺服器的docker-compose-nacos3.yml

version: '3' 
services:
  # nacos-server服務註冊與發現,配置中心服務    
  docker-nacos-server:
    image: nacos/nacos-server:1.0.1
    container_name: nacos-server-3
    ports:
      - "8848:8848"
      - "9555:9555"
    networks: 
      - nacos_net
    restart: on-failure
    privileged: true
    environment:
      PREFER_HOST_MODE: ip #如果支援主機名可以使用hostname,否則使用ip,預設也是ip
      SPRING_DATASOURCE_PLATFORM: mysql #資料來源平臺 僅支援mysql或不儲存empty
      NACOS_SERVER_IP: 192.168.87.135 #多網絡卡情況下,指定ip或網絡卡
      NACOS_SERVERS: 192.168.87.133:8848 192.168.87.139:8848 192.168.87.135:8848 #叢集中其它節點[ip1:port ip2:port ip3:port]
      MYSQL_MASTER_SERVICE_HOST: 10.2.7.29 #mysql配置,Master為主節點,Slave為從節點
      MYSQL_MASTER_SERVICE_PORT: 3340
      MYSQL_MASTER_SERVICE_DB_NAME: nacos
      MYSQL_MASTER_SERVICE_USER: root
      MYSQL_MASTER_SERVICE_PASSWORD: password
      MYSQL_SLAVE_SERVICE_HOST: 10.2.7.29
      MYSQL_SLAVE_SERVICE_PORT: 3341
      #JVM調優引數
      #JVM_XMS:  #-Xms default :2g
      #JVM_XMX:  #-Xmx default :2g
      #JVM_XMN:  #-Xmn default :1g
      #JVM_MS:   #-XX:MetaspaceSize default :128m
      #JVM_MMS:  #-XX:MaxMetaspaceSize default :320m
      #NACOS_DEBUG: n #是否開啟遠端debug,y/n,預設n
      #TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,預設false
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs #日誌輸出目錄
      - ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置

networks:
  nacos_net:
    driver: bridge

Nacos共用的init.d/custom.properties,與官方保持一致,按需使用

#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*

# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200

# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true

由於現在把所有的配置檔案放在一起,並且每個Nacos節點都需要一份init.d目錄,這裡就不單獨為每個nacos-*複製了,直接把資料夾整個複製過來就可以了

啟動Nacos叢集

複製配置檔案

複製nacos-cluster-docker目錄到以上三臺主機,上邊的配置檔案已經修改好了

其對應關係為:

  • 192.168.87.133 對應 nacos-1
  • 192.168.87.139 對應 nacos-2
  • 192.168.87.135 對應 nacos-3

啟動容器

分別在各主機上進入各自對應的nacos目錄中,啟動容器,命令如下:

133伺服器

$ cd nacos-cluster-docker/nacos-1
$ docker-compose -f docker-compose-nacos1.yml up -d

139伺服器

$ cd nacos-cluster-docker/nacos-2
$ docker-compose -f docker-compose-nacos2.yml up -d

135伺服器

$ cd nacos-cluster-docker/nacos-3
$ docker-compose -f docker-compose-nacos3.yml up -d

檢視日誌

檢視日誌分別在對應的nacos-*目錄下,執行

tail -f tail -f cluster-logs/nacos*/nacos.log

訪問Nacos UI介面

這裡使用133伺服器頁面進行展示下,

訪問http://192.168.87.133:8848/nacos,進入登入頁面,預設的使用者名稱與密碼都是nacos

我這裡還原的sql是平時測試用的,這裡打下碼,我們的關注點在 叢集管理 > 節點列表 這裡

這裡我們看到Nacos叢集各節點已經正常了,LEADER與FOLLOWER已經選出,一切正常了

配置Nginx

除了Nacos叢集配置外,我們在Spring Boot或Spring Cloud專案中使用的時候,只能指定一個URL指向Nacos服務端,這裡使用Nginx進行代理負載均衡

如果可以的話,生產環境最佳實踐是使用一個域名指向Nginx,之後就算換Nginx主機,客戶端也無需修改配置檔案,只需要使用域名指向一個新的Nginx的IP

列出最主要的配置

http{
    upstream nacos-cluster {
        server 192.168.87.133:8848;
        server 192.168.87.139:8848;
        server 192.168.87.135:8848;
    }
    server {
        listen 8848;
        location /{
            proxy_pass http://nacos-cluster;
        }
    }
}

啟動Nginx,使用程式碼進行測試連線當前的Nginx所在主機IP:8848

這裡已經可以看到服務正常註冊到叢集中了

遇到的問題

客戶端無法註冊到叢集中

如果遇到有客戶端服務無法連線到Nacos叢集中,請著重檢查下Nacos的堆記憶體與虛擬機器的設定,最初我使用的預設的2G最大堆記憶體,虛擬機器也分的2G記憶體,然後啟動服務時還能正常一小會,然後就開始有的服務顯示節點,有的不顯示列表,使用客戶端進行連線也無法正常連線,提示Down Server response 之類 的提示

解決辦法:修改虛擬機器記憶體大小,或修改Nacos堆記憶體配置

本文到此結束,如果對你有幫助,歡迎評論、推薦、關注三連 :happy:

本文系Hellxz學習與實踐文章,禁止布布扣、碼迷、愛碼網等第三方爬蟲網站爬取,轉載請在醒目位置註明出處:https://www.cnblogs.com/hellxz/p/nacos-cluster-docker.h