1. 环境
[root@localhost bin]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
ip | 端口 | 作用 | 备注 | 172.16.10.66 | 80|3307 | mysq和nginx | 集群是需要数据库的;nginx是代理服务器 | 172.16.10.67 | 8848 | | | 172.16.10.68 | 8848 | | | 172.16.10.69 | 8848 | | |
nacos:2.1.1 MySQL:mysql:8.0.28?
[root@localhost nacos]# wget https://github.com/alibaba/nacos/releases/download/2.1.1/nacos-server-2.1.1.tar.gz
[root@localhost nginx]# docker ps -a | grep mysql
e7f8a15e88c3 harbor.jettech.com/jettechtools/mysql:8.0.28 "docker-entrypoint.s…" 4 hours ago Up 4 hours 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-nacos
2 集群搭建
nacos-server-2.1.1.tar.gz
[root@localhost nacos]# tar -xf nacos-server-2.1.1.tar.gz ^C
[root@localhost nacos]# cd nacos/
[root@localhost nacos]# ls
bin conf data LICENSE logs NOTICE
[root@localhost nacos]# cp conf/cluster.conf.example conf/cluster.conf
[root@localhost conf]# ls cluster.conf application.properties nacos-mysql.sql
application.properties cluster.conf nacos-mysql.sql
添加集群机器列表:
Nacos Server 可以从一个本地配置文件中获取所有的 Server 地址信息,从而实现服务器之间的数据同步。
所以现在我们要在 Nacos Server 的 conf 目录下创建 cluster.conf 文件,并将 nacos-cluster1 和 nacos-cluster2 这两台服务器的 IP 地址 + 端口号添加到文件中。下面是我本地的 cluster.conf 文件的内容。
cluster.conf:nacos集群配置文件?
[root@localhost conf]# cat cluster.conf
#2022-08-29T14:23:01.962
172.16.10.67:8848
172.16.10.68:8848
172.16.10.69:8848
nacos-mysql.sql:数据库文件
nacos集群模式的工作是将一切注册或配置信息以及存储在数据库中,各个nacos的节点也是从数据库中获取各个用户注册以及配置信息;因此我们需要另外准备好数据库服务器,这里以mysql为例; 在nacos安装目录conf文件夹下有一个 nacos-mysql.sql 脚本文件,此脚本是nacos存储数据库表结构脚本,我们需要把它导入到准备好的mysql服务器
创建 DB Schema 和 Table
Nacos Server 的数据库用来保存配置信息、Nacos Portal 登录用户、用户权限等数据,下面我们分两步来创建数据库。
- 第一步,创建 Schema。你可以通过数据库控制台或者 DataGrip 之类的可视化操作工具,执行下面这行 SQL 命令,创建一个名为 nacos 的 schema。
create schema nacos; - 第二步,创建数据库表。Nacos 已经把建表语句准备好了,就放在你解压后的 Nacos Server 安装目录中。打开 Nacos Server 安装路径下的 conf 文件夹,找到里面的 nacos-mysql.sql 文件,你所需要的数据库建表语句都在这了。你也可以直接到源码仓库的资源文件中获取 Nacos 建表语句的 SQL 文件。
mysql> source /opt/nacos-mysql.sql
将文件中的 SQL 命令复制下来,在第一步中创建的 schema 下执行这些 SQL 命令。执行完之后,你就可以在在数据库中看到这些 tables 了,总共有 12 张数据库表。
application.properties:nacos工程配置文件
[root@localhost conf]# cat application.properties| grep -v "#" | grep -v "^$"
server.servlet.contextPath=/nacos
server.error.include-message=ON_PARAM
server.port=8848
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://172.16.10.66:3307/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456aA
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.basedir=file:.
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=false
nacos.core.auth.caching.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
nacos.istio.mcp.server.enabled=false
mysql服务器准备好后修改conf目录中的?cluster.conf?和?application.properties?配置 每台服务器都要改并保持一致
3. 启动
- sh startup.sh -m 模式:?模式有两个选项 standalone / cluster 分别代表单机和集群模式启动;单机模式不需要依赖数据库单独使用,集群模式需要依赖数据库,默认为集群模式
- [root@localhost conf]# ./startup.sh?
nacos设置开机自启
vim /lib/systemd/system/nacos.service
# 添加以下内容
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk1.8"
# 启动后面可以加上 -m standalone/cluster 表示以单机/集群方式启动,默认为集群
ExecStart=/opt/nacos/nacos/bin/startup.sh
ExecReload=/opt/nacos/nacos/bin/shutdown.sh
ExecStop=/opt/nacos/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#重新加载服务
systemctl daemon-reload
#启用服务
systemctl enable nacos.service
#启动服务
systemctl start nacos.service
4 nginx代理
新版本部署
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 | 与主端口的偏移量 | 描述 |
---|
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 | 9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。
客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。
因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。
其余部署参考Nacos部署手册?,将版本相关替换成2.0.0。
[root@localhost nginx]# cat nginx.conf
load_module /usr/lib64/nginx/modules/ngx_stream_module.so;
worker_processes 1;
events {
worker_connections 10240;
}
#TCP tcp转发:要添加在http {}之外
stream {
upstream nacosgrpc{
server 172.16.10.67:9848;
server 172.16.10.68:9848;
server 172.16.10.69:9848;
}
server {
listen 9846;
proxy_pass nacosgrpc;
}
}
#HTTP http转发:要添加在http {}里面
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#nacos集群负载均衡
upstream nacos-cluster {
server 172.16.10.67:8848;
server 172.16.10.68:8848;
server 172.16.10.69:8848;
}
server {
listen 80;
server_name 172.16.10.66;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://nacos-cluster;
proxy_set_header Host $http_host;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
出现问题:
#查看日志journalctl -u nginx nginx: [emerg] unknown directive “stream” in /etc/nginx/nginx.conf:13 nginx: configuration file /etc/nginx/nginx.conf test failed #无法识别stream命令,应该是缺少modules模块 #解决方法 #安装nginx源 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #先安装 yum -y install epel-release #然后安装modules模块,启动正常 yum -y install nginx-all-modules.noarch
解决方案:
流模块被添加为动态的,根据:
--with-stream=dynamic
您需要它为“静态”?- 因此直接加载模块。为此,请在nginx.conf的最顶部添加以下内容:
在CentOS7上,位于lib64文件夹下的模块路径。因此,您需要添加此行:
load_module '/usr/lib64/nginx/modules/ngx_stream_module.so';
小结:
在实际的项目中,如果某个微服务 Client 要连接到 Nacos 集群做服务注册,我们并不会把 Nacos 集群中的所有服务器都配置在 Client 中,否则每次 Nacos 集群增加或删除了节点,我都要对所有 Client 做一次代码变更并重新发布。那么正确的做法是什么呢?
常见的一个做法是提供一个 VIP URL 给到 Client,VIP URL 是一个虚拟 IP 地址,我们可以把真实的 Nacos 服务器地址列表“隐藏”在虚拟 IP 后面,客户端只需要连接到虚 IP 即可,由提供虚 IP 的组件负责将请求转发给背后的服务器列表。这样一来,即便 Nacos 集群机器数量发生了变动,也不会对客户端造成任何感知。
|