Docker 系列之 docker-compose 部署 Nacos 集群(使用 Keepalived 实现主备集群)

docker-compose 部署 三节点,多机 + Keepalived

一、机器规划

准备三台机器,在每台机器上,计划各安装一个 nacos-server

机器IP节点节点端口
192.168.9.60nacos-server8848
192.168.9.61nacos-server8848
192.168.9.62nacos-server8848

二、nacos 集群准备工作

1、在宿主机上创建 conflogs 文件夹,我这里创建在 /data/nacos 目录下

mkdir -p /data/nacos/conf
mkdir -p /data/nacos/logs
nacos子文件夹作用包含文件
conf用于存放nacos配置文件application.properties、cluster.conf
logs用于存放nacos日志文件

2、修改 nacos 配置文件

application.properties 配置文件内容如下,放入三台机器的 conf 文件夹中

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:mysql}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.enabled=true
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
# default current work dir
server.tomcat.basedir=file:.
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

cluster.conf 配置文件内容如下,放入三台机器的 conf 文件夹中

# ip:port
192.168.9.60:8848
192.168.9.61:8848
192.168.9.62:8848

3、编辑 nacos 的 docker-compose.yml 文件

在三台机器上创建 docker-compose.yml 文件

  • nacos01
version: '3'
services:
  nacos01:
    image: nacos/nacos-server:v2.2.3 #指定nacos镜像版本,如果docker开始没下载,这里会自动下载并创建容器
    container_name: nacos01
    hostname: nacos01  #这里设置主机名,是方便在同一个服务器docker环境中各个nacos服务能发现对方
    restart: always
    ports:
      - "8848:8848"  # 宿主机端口:映射容器端口
    environment:
      NACOS_SERVERS: nacos01:8848 nacos02:8848 nacos03:8848 # IP1,IP2是对应的服务器外网,PORT1,PORT2是对应的nacos服务端口
      MODE: cluster # 集群模式
      BASE_DIR: /home/nacos
      NACOS_DEBUG: y
      TIME_ZONE: Asia/Shanghai
      PREFER_HOST_MODE: hostname
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_DB_NAME: nacos
      MYSQL_SERVICE_HOST: # mysql地址
      MYSQL_SERVICE_PORT: # mysql端口
      MYSQL_SERVICE_USER: # mysql用户名
      MYSQL_SERVICE_PASSWORD: # mysql密码
      MYSQL_SERVICE_DB_PARAM: useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
      MYSQL_DATABASE_NUM: 1
      NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789
      NACOS_AUTH_IDENTITY_KEY: nacos_identity_key
      NACOS_AUTH_IDENTITY_VALUE: nacos_identity_value
    network_mode: host
    extra_hosts:
      - "nacos01:192.168.9.60"
      - "nacos02:192.168.9.61"
      - "nacos03:192.168.9.62"
    volumes: #宿主机地址或文件:映射容器地址和文件
      - /etc/localtime:/etc/localtime
      - /data/nacos/logs:/home/nacos/logs  #存放nacos日志
      - /data/nacos/conf/application.properties:/home/nacos/conf/application.properties #存放nacos配置文件
      - /data/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf #存放nacos配置文件
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
        reservations:
          cpus: '2'
          memory: 4G
  • nacos02
version: '3'
services:
  nacos02:
    image: nacos/nacos-server:v2.2.3 #指定nacos镜像版本,如果docker开始没下载,这里会自动下载并创建容器
    container_name: nacos02
    hostname: nacos02  #这里设置主机名,是方便在同一个服务器docker环境中各个nacos服务能发现对方
    restart: always
    ports:
      - "8848:8848"  # 宿主机端口:映射容器端口
    environment:
      NACOS_SERVERS: nacos01:8848 nacos02:8848 nacos03:8848 # IP1,IP2是对应的服务器外网,PORT1,PORT2是对应的nacos服务端口
      MODE: cluster # 集群模式
      BASE_DIR: /home/nacos
      NACOS_DEBUG: y
      TIME_ZONE: Asia/Shanghai
      PREFER_HOST_MODE: hostname
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_DB_NAME: nacos
      MYSQL_SERVICE_HOST: # mysql地址
      MYSQL_SERVICE_PORT: # mysql端口
      MYSQL_SERVICE_USER: # mysql用户名
      MYSQL_SERVICE_PASSWORD: # mysql密码
      MYSQL_SERVICE_DB_PARAM: useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
      MYSQL_DATABASE_NUM: 1
      NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789
      NACOS_AUTH_IDENTITY_KEY: nacos_identity_key
      NACOS_AUTH_IDENTITY_VALUE: nacos_identity_value
    network_mode: host
    extra_hosts:
      - "nacos01:192.168.9.60"
      - "nacos02:192.168.9.61"
      - "nacos03:192.168.9.62"
    volumes: #宿主机地址或文件:映射容器地址和文件
      - /etc/localtime:/etc/localtime
      - /data/nacos/logs:/home/nacos/logs  #存放nacos日志
      - /data/nacos/conf/application.properties:/home/nacos/conf/application.properties #存放nacos配置文件
      - /data/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf #存放nacos配置文件
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
        reservations:
          cpus: '2'
          memory: 4G
  • nacos03
version: '3'
services:
  nacos03:
    image: nacos/nacos-server:v2.2.3 #指定nacos镜像版本,如果docker开始没下载,这里会自动下载并创建容器
    container_name: nacos03
    hostname: nacos03  #这里设置主机名,是方便在同一个服务器docker环境中各个nacos服务能发现对方
    restart: always
    ports:
      - "8848:8848"  # 宿主机端口:映射容器端口
    environment:
      NACOS_SERVERS: nacos01:8848 nacos02:8848 nacos03:8848 # IP1,IP2是对应的服务器外网,PORT1,PORT2是对应的nacos服务端口
      MODE: cluster # 集群模式
      BASE_DIR: /home/nacos
      NACOS_DEBUG: y
      TIME_ZONE: Asia/Shanghai
      PREFER_HOST_MODE: hostname
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_DB_NAME: nacos
      MYSQL_SERVICE_HOST: # mysql地址
      MYSQL_SERVICE_PORT: # mysql端口
      MYSQL_SERVICE_USER: # mysql用户名
      MYSQL_SERVICE_PASSWORD: # mysql密码
      MYSQL_SERVICE_DB_PARAM: useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
      MYSQL_DATABASE_NUM: 1
      NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789
      NACOS_AUTH_IDENTITY_KEY: nacos_identity_key
      NACOS_AUTH_IDENTITY_VALUE: nacos_identity_value
    network_mode: host
    extra_hosts:
      - "nacos01:192.168.9.60"
      - "nacos02:192.168.9.61"
      - "nacos03:192.168.9.62"
    volumes: #宿主机地址或文件:映射容器地址和文件
      - /etc/localtime:/etc/localtime
      - /data/nacos/logs:/home/nacos/logs  #存放nacos日志
      - /data/nacos/conf/application.properties:/home/nacos/conf/application.properties #存放nacos配置文件
      - /data/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf #存放nacos配置文件
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
        reservations:
          cpus: '2'
          memory: 4G

三、 启动 nacos 服务

在三台机器的 /etc/hosts 文件中加上下面 yml 配置中的 hostname

echo "192.168.9.60 nacos01
192.168.9.61 nacos02
192.168.9.62 nacos03" >> /etc/hosts

分别在三台机器上执行启动命令

# 启动命令
docker-compose -f docker-compose.yml up -d

如图所示,代表启动成功
在这里插入图片描述

四、安装 keepalived 并设置 VIP

安装keepalived
yum install -y keepalived;
#设置开机启动
systemctl enable keepalived
cp /usr/sbin/keepalived /etc/init.d/keepalived
chmod +x /etc/init.d/keepalived
check_proxy_nacos.sh

当 doris 挂掉,则返回1,keepalived 权重降低,主节点被抢占,让另外一台机器接手

vi /etc/keepalived/check_proxy_nacos.sh

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "8848"|wc -l)
if [ "${counter}" -eq 0 ]; then
  exit 1
else
  exit 0
fi

确保这个脚本有执行权限,并且正确地配置了监听端口。如果监控的服务端口不可用,脚本将返回非零值,这将导致Keepalived认为本地服务器失效,并开始VIP转移的过程。

chmod +x /etc/keepalived/check_proxy_nacos.sh

keepalived.conf

编辑 keepalived 配置文件 /etc/keepalived/keepalived.conf

参考资料:https://blog.csdn.net/cnskylee/article/details/131591733

vi /etc/keepalived/keepalived.conf
  • mater机器配置内容
! Configuration File for keepalived
global_defs {
   # 指定router_id
   router_id ha01
   script_user root
}
vrrp_script check_haproxy_doris {
   # 定义脚本
   script "/etc/keepalived/check_haproxy_nacos.sh"
   # 脚本执行间隔,每2s检测一次
   interval 2
}
vrrp_instance VI_3 {
   # 在ha1、ha2、ha3都为 BACKUP
   state BACKUP
   # 设置为不抢占,m1挂了,m2接管VIP,m1重启不会自动抢回VIP
   nopreempt
   # 具体根据网卡来
   interface bond0
   garp_master_delay 10
   smtp_alert
   # 指定虚拟路由器ID, ha1和ha2和h3此值必须相同
   virtual_router_id 68
   # 在ha2上为80、h3上为60
   priority 100
   # 本机ip
   unicast_src_ip 192.168.9.60
   unicast_peer {   
       #对端ip
       192.168.9.61
       192.168.9.62
   }
   advert_int 1
   authentication {
       auth_type PASS
       # 指定验证密码, ha1和ha2和h3此值必须相同
       auth_pass 123456
   }
   virtual_ipaddress {
        # 指定VIP, ha1和ha2和h3此值必须相同,这里可以使用
        10.250.81.246 dev bond0 label bond0:3
   }
   track_script {
       # 调用上面定义的脚本
       check_haproxy_nacos
   }
}
  • node1机器配置内容
! Configuration File for keepalived
global_defs {
   # 指定router_id
   router_id ha02
   script_user root
}
vrrp_script check_haproxy_doris {
   # 定义脚本
   script "/etc/keepalived/check_haproxy_nacos.sh"
   # 脚本执行间隔,每2s检测一次
   interval 2
}
vrrp_instance VI_3 {
   # 在ha1、ha2、ha3都为 BACKUP
   state BACKUP
   # 设置为不抢占,m1挂了,m2接管VIP,m1重启不会自动抢回VIP
   nopreempt
   # 具体根据网卡来
   interface bond0
   garp_master_delay 10
   smtp_alert
   # 指定虚拟路由器ID, ha1和ha2和h3此值必须相同
   virtual_router_id 68
   # 在ha2上为80、h3上为60
   priority 80
   # 本机ip
   unicast_src_ip 192.168.9.61
   unicast_peer {   
       #对端ip
       192.168.9.60
       192.168.9.62
   }
   advert_int 1
   authentication {
       auth_type PASS
       # 指定验证密码, ha1和ha2和h3此值必须相同
       auth_pass 123456
   }
   virtual_ipaddress {
        # 指定VIP, ha1和ha2和h3此值必须相同,这里可以使用
        10.250.81.246 dev bond0 label bond0:3
   }
   track_script {
       # 调用上面定义的脚本
       check_haproxy_nacos
   }
}
  • node2机器配置内容
! Configuration File for keepalived
global_defs {
   # 指定router_id
   router_id ha03
   script_user root
}
vrrp_script check_haproxy_doris {
   # 定义脚本
   script "/etc/keepalived/check_haproxy_nacos.sh"
   # 脚本执行间隔,每2s检测一次
   interval 2
}
vrrp_instance VI_3 {
   # 在ha1、ha2、ha3都为 BACKUP
   state BACKUP
   # 设置为不抢占,m1挂了,m2接管VIP,m1重启不会自动抢回VIP
   nopreempt
   # 具体根据网卡来
   interface bond0
   garp_master_delay 10
   smtp_alert
   # 指定虚拟路由器ID, ha1和ha2和h3此值必须相同
   virtual_router_id 68
   # 在ha2上为80、h3上为60
   priority 60
   # 本机ip
   unicast_src_ip 192.168.9.62
   unicast_peer {   
       #对端ip
       192.168.9.61
       192.168.9.60
   }
   advert_int 1
   authentication {
       auth_type PASS
       # 指定验证密码, ha1和ha2和h3此值必须相同
       auth_pass 123456
   }
   virtual_ipaddress {
        # 指定VIP, ha1和ha2和h3此值必须相同,这里可以使用
        10.250.81.246 dev bond0 label bond0:3
   }
   track_script {
       # 调用上面定义的脚本
       check_haproxy_nacos
   }
}
启动keepalived

systemctl start keepalived

查看keepalived状态

systemctl status keepalived

使用 VIP 访问服务

在这里插入图片描述

参考资料

https://nacos.io/docs/v2.3/guide/admin/cluster-mode-quick-start/
https://blog.csdn.net/xingzuo_1840/article/details/137588589

1. 创建一个文件夹用于存放nacos集群docker-compose文件和配置文件 ``` mkdir nacos-cluster cd nacos-cluster ``` 2. 创建docker-compose.yml文件,并添加以下内容: ``` version: '3' services: nacos-server-1: image: nacos/nacos-server:latest container_name: nacos-server-1 environment: - PREFER_HOST_MODE=hostname - NACOS_SERVERS=nacos-server-1:8848,nacos-server-2:8848,nacos-server-3:8848 ports: - "8848:8848" volumes: - ./nacos-data-1:/home/nacos/data - ./nacos-logs-1:/home/nacos/logs nacos-server-2: image: nacos/nacos-server:latest container_name: nacos-server-2 environment: - PREFER_HOST_MODE=hostname - NACOS_SERVERS=nacos-server-1:8848,nacos-server-2:8848,nacos-server-3:8848 ports: - "8849:8848" volumes: - ./nacos-data-2:/home/nacos/data - ./nacos-logs-2:/home/nacos/logs nacos-server-3: image: nacos/nacos-server:latest container_name: nacos-server-3 environment: - PREFER_HOST_MODE=hostname - NACOS_SERVERS=nacos-server-1:8848,nacos-server-2:8848,nacos-server-3:8848 ports: - "8850:8848" volumes: - ./nacos-data-3:/home/nacos/data - ./nacos-logs-3:/home/nacos/logs ``` 该docker-compose.yml文件中定义了3个nacos-server容器,分别命名为nacos-server-1、nacos-server-2、nacos-server-3,使用nacos/nacos-server镜像,暴露的端口为8848、8849、8850,配置了环境变量和数据卷。 3. 创建nacos-data和nacos-logs目录 ``` mkdir nacos-data-1 nacos-data-2 nacos-data-3 mkdir nacos-logs-1 nacos-logs-2 nacos-logs-3 ``` 该命令创建了3个数据目录和3个日志目录,用于存放nacos的数据和日志。 4. 启动nacos集群 ``` docker-compose up -d ``` 该命令会在后台启动nacos集群。 5. 访问nacos控制台 打开浏览器,访问http://localhost:8848/nacos,即可访问nacos控制台。 在控制台中可以添加、修改、删除配置,管理服务等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值