Nginx + Keepalived + Nacos + Mysql(HA) 搭建生产环境可用的Nacos集群

1. Nacos 的集群模式

  • 单机模式 - 用于测试和单机试用。

  • 集群模式 - 用于生产环境,确保高可用。

  • 多集群模式 - 用于多数据中心场景。

1.1 针对集群部署模式,Nacos文档中也提供了三种集群部署方案

  1. http://ip1:port/openAPI 直连ip模式:

    • 特点: ip+端口进行部署,客户端直接连接Nacos的ip

    • 缺点: 只能连接单台 Nacos ,故障切换无法实现。

  2. http://Vip:port/openAPI 挂载虚拟IP模式:

    • 特点: 配合 KeepAlived,Nacos真实ip都挂载虚拟Ip下,客户端访问Vip发起请求。当主Nacos宕机后,备用Nacos接管,实现高可用。

    • 缺点: 实现了高可用,但是无法实现复杂均衡。

  3. http://www.nacostest.com:port/openAPI 挂载虚拟IP+域名模式:

    • 特点: 为虚拟ip绑定一个域名,当Nacos集群迁移时,客户端配置无需修改。

    • 缺点: 实现了高可用,但是无法实现复杂均衡。

2. Nginx + Keepalived + Nacos + Mysql(HA) 搭建生产环境可用的Nacos集群

2.1 前提步骤 - 组建Nacos集群

  • Tips

    • 3个或3个以上Nacos节点才能构成集群。

    • 建议 (Nginx + Keepalived (*2)) + Nacos(*3 + Mysql), 结合虚拟IP来组建集群。

    • 下载并解压 nacos 的jar包后, 直接讲解压后的 nacos 目录 copy 出三份。

  1. 导入初始化脚本

     * 找到 conf/nacos-mysql.sql ,将其导入到数据库中。
    
     * 或者从网上下载: https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
    
  2. 配置数据库连接

    找到 conf/application.properties ,添加如下内容:

     ```
     # 表明用MySQL作为后端存储
     spring.datasource.platform=mysql
    
     # 有几个数据库实例
     db.num=2
    
     # 第1个实例的地址
     db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
     # 第2个实例的地址
     db.url.1=jdbc:mysql://11.163.152.9:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
     db.user=nacos_devtest
     db.password=nacos
     ```
    
  3. 配置集群配置文件

    • 在nacos的解压目录 nacos/的conf目录下,有配置文件 cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)

      # ip:port
      200.8.9.16:8848
      200.8.9.17:8848
      200.8.9.18:8848
      
  4. 启动集群

    • 集群模式

      • 使用内置数据源

        sh startup.sh -p embedded

      • 使用外置数据源

        sh startup.sh

    • JVM 参数配置

      默认配置为: JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

    • Tips: 集群模式中至少三台启动成功了,整个集群才能真正启动成功

      2020-09-08 18:54:54,532 INFO Nacos is starting...
      
      2020-09-08 18:54:54,778 INFO Nacos Log files: /home/jump/softWare/nacos/logs
      
      2020-09-08 18:54:54,778 INFO Nacos Log files: /home/jump/softWare/nacos/conf
      
      2020-09-08 18:54:54,778 INFO Nacos Log files: /home/jump/softWare/nacos/data
      
      2020-09-08 18:54:54,779 INFO Nacos started successfully in cluster mode. use embedded storage
      

2.2 [单点 Nginx + Nacos 模式] – 不建议使用,存在Nginx的单点问题

  • nacos的集群访问通过一个前置的负载均衡器进行转发,很容易就能想到使用nginx来完成,因此整个搭建需要的软件就是:

nginx + nacos + mysql(可选,若不配置则会使用内置数据库)

  1. Nginx 配置

    upstream nacos-server {
      # 下面是三台nacos服务的地址。(且这三台必须互相能连通)
      server 192.168.0.1:8849;
      server 192.168.0.2:8850;
      server 192.168.0.3:8851;
    }
    
    server {
      listen 80;
      server_name  localhost;
      location /nacos/ {
        proxy_pass http://nacos-server/nacos/;
      }
    }
    
  2. 控制台访问

    http://your-nginx-server-host:80/nacos 可看到Nacos的登录页,登录后即可正常使用Nacos。

2.3 [Keepalived + Nacos 模式] – 不推荐使用,只能高可用,不能负载均衡

参考: https://blog.csdn.net/qq_36268452/article/details/104357165

  1. 安装配置keepalived

    在三台Nacos服务器上分别安装keepalived

     yum install -y keepalived
    

    在三台服务器上分别修改/etc/keepalived/keepalived.conf

     vrrp_instance VI_1 {
         state MASTER
         interface enp0s8
         virtual_router_id 51
         priority 100
         advert_int 1
         authentication {
             auth_type PASS
             auth_pass 123456
         }
         virtual_ipaddress {
             192.168.161.6
         }
     }
    
    • 一台服务器是MASTER,其他的服务器为BACKUP

    • interface 配置为我们刚刚查看的网卡的名称

    • virtualrouterid 必须一致,表示这三台服务器抢用一个虚拟ip。

    • 修改priority 优先级,三台服务器要不一样,比如:100、101、102,优先级最高的优先使用虚拟ip。MASTER的优先级一定要高于BACKUP主机

    • advert_int 是几台服务器之间的同步检查时间,1秒

    • authentication 的设置必须一致,这样这几台服务器才能通信

    • 修改virtual_ipaddress为三台服务器所在网段内未被占用的IP地址,比如:192.168.161.6

    • 6.2.修改防火墙CentOS7必须开放防火墙配置,否则三台主机无法就虚拟ip的使用优先级通信,将都是MASTER,都配置虚拟ip。

      firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT;
      firewall-cmd --reload;

    6.3.启动keepalived服务

     sudo systemctl restart keepalived.service
    
  2. 详细教程

    1,安装keepalived软件,本操作系统为centos。

     yum clean all
     yum install -y keepalived
    

    2,keepalived简单操作

       systemctl start keepalived.service   #启动keepalived
       systemctl stop  keepalived.service   #停止keepalived   
       systemctl status keepalived.service  #查看keepalived状态
       ifconfig                             #查看IP网卡等
       ip addr show ens192                  #查看某个网卡下的ip地址
    

    3,修改/etc/keepalived/keepalived.conf配置文件,配置内容如下:

     192.168.1.100服务器:
    
         #监控服务nacos
         vrrp_script chk_nacos {
              script "/etc/keepalived/chk_nacos.sh"
              #每2s检查一次
              interval 2
              #每次检查-20
              weight -20
         }
         
         vrrp_instance VI_1 {
             #只有一个MASTER 其他为BACKUP
             state MASTER
             #网卡
             interface ens192
             #必须一样
             virtual_router_id 51
             #优先级
             priority 102
             advert_int 1
             #本机ip
             unicast_src_ip 192.168.1.100
             # 其他机器ip
             unicast_peer {                
                 192.168.1.101         
                 192.168.1.102
             }
             authentication {
                 auth_type PASS
                 auth_pass 1111
             }
             track_script {
                    #检测脚本,上面配置的
                    chk_nacos
             }
             virtual_ipaddress {
                 #虚拟ip  是同网关下未使用的ip
                 192.168.1.8
             }
         }
         
     1
     192.168.1.101服务器:
    
         #监控服务nacos
         vrrp_script chk_nacos {
              script "/etc/keepalived/chk_nacos.sh"
              #每2s检查一次
              interval 2
              #每次检查-20
              weight -20
         }
         
         vrrp_instance VI_1 {
             #只有一个MASTER 其他为BACKUP
             state BACKUP
             #网卡
             interface ens192
             #必须一样
             virtual_router_id 51
             #优先级
             priority 102
             advert_int 1
             #本机ip
             unicast_src_ip 192.168.1.101
             # 其他机器ip
             unicast_peer {                
                 192.168.1.100       
                 192.168.1.102
             }
             authentication {
                 auth_type PASS
                 auth_pass 1111
             }
             track_script {
                    #检测脚本,上面配置的
                    chk_nacos
             }
             virtual_ipaddress {
                 #虚拟ip  是同网关下未使用的ip
                 192.168.1.8
             }
         }
    
     192.168.1.102服务器:
    
    
         #监控服务nacos
         vrrp_script chk_nacos {
              script "/etc/keepalived/chk_nacos.sh"
              #每2s检查一次
              interval 2
              #每次检查-20
              weight -20
         }
         
         vrrp_instance VI_1 {
             #只有一个MASTER 其他为BACKUP
             state BACKUP
             #网卡
             interface ens192
             #必须一样
             virtual_router_id 51
             #优先级
             priority 102
             advert_int 1
             #本机ip
             unicast_src_ip 192.168.1.102
             # 其他机器ip
             unicast_peer {                
                 192.168.1.100
                 192.168.1.101
             }
             authentication {
                 auth_type PASS
                 auth_pass 1111
             }
             track_script {
                    #检测脚本,上面配置的
                    chk_nacos
             }
             virtual_ipaddress {
                 #虚拟ip  是同网关下未使用的ip
                 192.168.1.8
             }
         }
    

    4,建立/etc/keepalived/chk_nacos.sh脚本,三个服务器都一样。作用就是检测nacos服务是否运行,不运行就让keepalived让出master,优先级降低。让其他节点提供服务。

     #!/bin/bash
     COUNT=$(ps -ef | grep nacos |grep -v "chk_nacos" | grep -v "grep" | wc -l )
     echo "nacos服务数量为:$COUNT"
     #判断nacos 是否都挂掉了
     if [ $COUNT -lt 1 ]; then    
        echo “nacos服务失败,让出master”
        exit 1
     else
        echo "检测成功"
        exit 0
     fi
    

    5,这样便可以搭建一个高可用的nacos服务。直接访问http:192.168.1.8:8848/nacos即可。当提供服务的nacos挂掉了,就可以切到其他可用的nacos服务器。
    6,日志可以在 /var/log/messages查看

2.4 [推荐方案]- Nginx + Keepalived + Nacos + Mysql(HA)

在这里插入图片描述

  1. 参考 : https://www.gylinux.cn/3210.html

    • 使用keepalived保证Nginx高可用,就是基于主-备架构,利用keepalived实现故障时自动切换到备机。一般使用一个keepalived服务+一个Nginx服务搭配作为一个(主节点),备机节点也一样。相当于keepalived服务监控着Nginx服务,然后利用keepalived自身的故障选举机制,实现间接实现Nginx的故障转移。

    • keepalived作用
      检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障服务器。

      keepalived会让两个nginx争抢一个VIP
      keepalived配置文件可以设置角色:Master、backup,当nginx1是master时,那么nginx-1抢到VIP。
      keepalived可以通过脚本监测当前Master所对应的Nginx服务是否可用,如果不可用,那么其他keepalived会争抢成为master。

    • keepalived工作原理
      1.watchDog监控checkers和VRRR进程的状态;
      2.checkers负责真实服务器的健康监测healthchecking;
      3.VRRR Stack负责负载均衡器之间的失败切换;
      4.IPVS wrapper 用来发送设定的规则到内核IPVS代码
      5.Netlink Reflector 用来设定VRRP的VIP地址等。

    • Keepalived 高可用故障切换转移原理(重点)#
      Keepalived 高可用服务对之间的故障切换转移,是通过 VRRP 协议(虚拟路由冗余协议)来实现的。

      在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息了,备节点也就因此无法继续检测到来自Master 节点的心跳了,进而调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来备用角色。

  2. 然后让这些Nginx都配置好代理 Nacos 集群的请求即可。

    upstream nacos-server {
      # 下面是三台nacos服务的地址。(且这三台必须互相能连通)
      server 192.168.0.1:8849;
      server 192.168.0.2:8850;
      server 192.168.0.3:8851;
    }
    
    server {
      listen 80;
      server_name  localhost;
      location /nacos/ {
        proxy_pass http://nacos-server/nacos/;
      }
    }
    
  • Tips:
    • 建议 Nacos 服务节点分别部署到不同服务器上,这样才能故障隔离,确保高可用。

    • 实际项目中,建议为Nacos绑定一个域名(域名解析 & 修改NGINX配置的 server_name),这样即使未来Nacos Server需要迁移,也无需修改Nacos Client端的配置;•本文为了演示方便,将所有实例部署在了一台机器中;实际项目中,请将Nacos部署在不同机器中,从而实现更好的容灾与隔离

      • 例如: 配置域名 test.nacos.com 绑定 VIP , 然后在客户端只需要给 server-addr 配置域名 test.nacos.com 即可。

3. 客户端应用(微服务)怎么连接 Nacos 集群?

  1. 微服务访问

    spring:
      application:
        name: demo-test
      cloud:
        nacos:
          discovery:
          	# Nacos 集群vip地址
            server-addr: your-nginx-server-host
          config:
            server-addr: your-nginx-server-host
            prefix: ${spring.application.name}
            file-extension: yml
    
    • 启动成功

      2020-09-08 19:52:29.529 INFO 13595 — [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP demo-test 10.210.1.1:7001 register finished

  2. Tips:

    • 在客户端还支持配置 Nacos 集群名 - 可选

      spring.cloud.nacos.discovery.cluster-name

        * 默认值 DEFAULT
      
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值