Nacos 使用 CentOS7 进行集群部署

有了上篇博客的 Nacos 单机部署经验,对于集群搭建就容易多了。

要想搭建 Nacos 集群,至少需要 3 个节点。为了统一访问地址,因此需要使用 nginx 进行转发。

本篇博客仍然采用 Nacos 当前最新的版本 2.2.2 进行集群搭建。Nacos 官网上也有集群搭建的说明,不过有点简略。

Nacos 的集群搭建官方网址为:http://nacos.io/zh-cn/docs/cluster-mode-quick-start.html


一、条件准备

由于只是演示,所以就在我个人的笔记本电脑的一台虚拟机上进行搭建。

虚拟机的操作系统是 CentOS7,分配了 3 个 G 的内存(勉强够用),建议分配更多的内存。

对于 Nacos 的 3 个节点,就通过 3 个端口来实现,具体细节如下:

节点 ip port
nacos1 192.168.216.129 6841
nacos2 192.168.216.129 6844
nacos3 192.168.216.129 6847

1. 安装 jdk

由于 nacos 是 java 开发的,因此必须安装 jdk ,版本需要在 1.8 或更高,具体 jdk 的安装过程,这里就省略了。


2. 安装 nginx

需要注意的是:由于 Nacos 从 2 版本开始,java 代码连接 Nacos 需要使用 grpc 协议端口

因此 nginx 必须使用 1.19 以上的版本,因为能够支持 tcp 协议的转发。本篇博客下面有 nginx 的 tcp 转发配置。

nginx 官网的 yum 安装参考网址为:http://nginx.org/en/linux_packages.html#RHEL

按照官网的 yum 步骤安装,版本一般都是最新的稳定版本,肯定是支持 tcp 转发的。

当然最好运行以下命令,安装 nginx 的所有模块,这样就能够绝对支持 tcp 转发,万无一失了:

yum -y install nginx-all-modules.noarch

3. 安装 mysql

搭建集群肯定使用 mysql 数据库,不会使用内置的 derby 数据库。

有关 mysql 的安装,可以参考 mysql 的官网 yum 安装步骤,我安装的是 mysql 5.7 版本。

官网 mysql 5.7 的 yum 安装参考网址:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

安装好之后,按照上一篇博客的操作,创建一个名称为 nacos 的数据库,运行 mysql-schema.sql 初始化数据库表。


二、Nacos 集群搭建

Nacos 的集群搭建比较简单,部署的基本思路就是:

首先我们先把单个 Nacos 的配置文件修改好,然后复制出两份,分别修改一下启动端口就可以了。

在 CentOS7 上的根目录上创建一个 app 文件夹,方便管理:mkdir /app

将安装包上传到 /app 目录下,然后进行解压缩:tar -zxvf nacos-server-2.2.2.tar.gz

这样在 /app 目录下就会多出一个 nacos 目录

由于需要部署 3 个 nacos 节点,因此该文件夹先命名为 nacos1:mv /app/nacos /app/nacos1

然后进入 nacos1 的 conf 文件夹中:cd /app/nacos1/conf

复制 conf 文件夹里面的 cluster.conf.example 文件

复制出一个名称为 cluster.conf 的新文件:cp cluster.conf.example cluster.conf

编辑 cluster.conf :vim cluster.conf 填写以下内容并保存:

192.168.216.129:6841
192.168.216.129:6844
192.168.216.129:6847

然后编辑 application.properties 配置文件:vim application.properties

由于 application.properties 文件内容太多,这里就不列出来了,最主要关注下面的几个配置项:

# 这个是 nacos 的启动端口,默认就是 8848,这里修改为 6841
server.port=6841

# 下面是配置 nacos 有关连接 mysql 的一些参数配置
# 由于本篇博客没有采用读写分离,只有一个 mysql 库,所以 db.num=1
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.216.129:3306/nacos?characterEncoding=utf8
db.user.0=root
db.password.0=root

# 该配置项决定访问 nacos 时是否账号密码认证,默认值是 false,强烈建议修改为 true
nacos.core.auth.enabled=true

# 下面这俩配置项,其实没啥用,没什么作用,但是其值不能空着,否则 nacos 无法正常工作。
# 默认值为空字符串,随便填写一个值就行
nacos.core.auth.server.identity.key=jobs
nacos.core.auth.server.identity.value=888

# 这个配置项,我也没有发现有什么用,默认值为空字符串,但是其值不能空着,否则 nacos 无法正常工作。
# 找一个在线生成 base64 字符串的网站,随便输入一个拥有32个字符组成的字符串,生成 base64 字符串,填写到这里即可。
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=

以上的步骤都操作完之后,就可以复制出两份 nacos 的节点了。

在 /app 下创建出 nacos2 和 nacos3 文件夹:mkdir /app/nacos2 /app/nacos3

将 nacos1 文件夹中的内容,全部拷贝到 nacos2 和 nacos3 中:

cp -r /app/nacos1/* /app/nacos2/
cp -r /app/nacos1/* /app/nacos3/

然后分别进入 nacos2 和 nacos3 的 conf 文件夹,修改 application.properties 文件,

将 nacos2 的端口修改为 6844,将 nacos3 的端口修改为 6847

然后进入 CentOS7 的服务存放目录中:cd /etc/systemd/system

新建 3 个 nacos 的文件,nacos1.service、nacos2.service、nacos3.service,内容填写如下:

# nacos1.service 的内容
[Unit]
Description=Nacos
After=syslog.target network.target
 
[Service]
Type=forking
Environment='JAVA_HOME=/app/jdk1.8'
ExecStart=/app/nacos1/bin/startup.sh
ExecStop=/app/nacos1/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
# nacos2.service 的内容
[Unit]
Description=Nacos
After=syslog.target network.target
 
[Service]
Type=forking
Environment='JAVA_HOME=/app/jdk1.8'
ExecStart=/app/nacos2/bin/startup.sh
ExecStop=/app/nacos2/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
# nacos3.service 的内容
[Unit]
Description=Nacos
After=syslog.target network.target
 
[Service]
Type=forking
Environment='JAVA_HOME=/app/jdk1.8'
ExecStart=/app/nacos3/bin/startup.sh
ExecStop=/app/nacos3/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

注意:上面的 Environment 指定的是你的 JAVA_HOME 的环境变量。

最后启动 nacos1、nacos2、nacos3 即可。

# 服务的配置文件修改了,可能还需要运行以下命令
systemctl daemon-reload

# 启动 nacos1、nacos2、nacos3
systemctl start nacos1
systemctl start nacos2
systemctl start nacos3

三、nginx 的转发配置

三个 nacos 的服务启动后,我们可以通过 netstat -tulnp 查看 nacos 占用的端口:

image

红框的端口,是 3 个 nacos 服务启动的端口,黄色的端口是 3 个 nacos 的 grpc 端口。如果防火墙已经开放了以上 6 个端口的话,访问下面 3 个地址的任意一个地址都可以访问 nacos:

# 实际上防火墙只需要开通 6841、6844、6847 就可以通过以下地址访问 nacos
# 但是 java 程序要想连接 nacos 的话,防火墙还得需要开通 7841、7844、7847
http://192.168.216.129:6841/nacos/index.html
http://192.168.216.129:6844/nacos/index.html
http://192.168.216.129:6847/nacos/index.html

既然是搭建集群,我们肯定是想通过统一入口进行访问,这样才比较方便。不然的话,如果我们部署 nacos 集群的节点更多的话,服务启动端口和 grpc 端口也就会更多了,因此必须使用 nginx 进行负载均衡转发才行。

使用 nginx 需要转发两个地址:

  • 本博客使用 http 的 80 端口转发 6841、6844、6847

  • 本博客使用 tcp 的 1080 端口转发 7841、7844、7847(由于 java 程序连接 nacos 时,grpc 使用的端口比连接端口大 1000,此处采用 80 端口作为连接端口,因此 grpc 端口就是 1080)

具体 nginx 的完整配置内容如下:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

# 配置 http 服务
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    upstream nacos-cluster {
        server 127.0.0.1:6841;
        server 127.0.0.1:6844;
        server 127.0.0.1:6847;
    }

    server {
        listen       80;
        server_name  192.168.216.129;

        location / {
            root  /usr/share/nginx/html;
        }

        location /nacos/ {
            proxy_pass http://nacos-cluster/nacos/;
        }
    }
}

# 配置 tcp 服务
stream {
    upstream grpc-cluster {
        server 127.0.0.1:7841;
        server 127.0.0.1:7844;
        server 127.0.0.1:7847;
    }

    server {
        listen     1080;
        proxy_pass grpc-cluster;
    }
}

配置完成后可以使用 nginx -t 检查 nginx 配置文件的正确性。

可以采用 nginx -s reload 重启加载 nginx 配置文件

当然第一次配置完成后,最好重启 nginx 服务 systemctl restart nginx

然后在防火墙中把 80 端口和 1080 端口开放了:

# 开放防火墙端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=1080/tcp --permanent

# 重新加载防火墙配置
firewall-cmd --reload

# 当然你也可以关闭防火墙
systemctl stop firewalld

一般情况下,我们也最好关闭 CentOS 的 Selinux 的安全控制。

vim /etc/selinux/config

将 SELINUX 的值修改为 disabled

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

然后重启 CentOS7 即可禁用 Selinux 的配置生效。

此时通过 http://192.168.216.129/nacos/index.html 即可访问 nacos 集群:

image

nacos 的默认登录账号和密码,都是 nacos ,登录之后,在左侧菜单点击【集群管理】下【节点列表】,在右侧即可看到集群节点,比如每个节点的 ip 地址和端口号,以及节点的状态:up 表示节点正常上线,down 表示节点下线了。

image

以上就是 nacos 集群搭建的完整过程,实际部署肯定是使用多台机器进行部署。希望本篇博客对大家有帮助。

posted @ 2023-05-08 22:49  乔京飞  阅读(11362)  评论(0编辑  收藏  举报