Nacos高可用集群解决方案-Docker版本,基于Nacos 1.0.1
<h2 id="文章主旨">文章主旨</h2><p><strong>本文目的是配置高可用的Nacos集群</strong></p>
<h2 id="架构图">架构图</h2>
<p>整体架构为:<strong>Nginx + 3 x Nacos +高可用MySQL</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1149398/201909/1149398-20190903094418578-707914480.png" alt="" loading="lazy"></p>
<p>高可用MySQL使用主从复制结构的可以参考Docker搭建MySQL主从集群,基于GTID</p>
<p>文中对应的配置文件已经上传Github,地址:https://github.com/hellxz/nacos-cluster-docker</p>
<h2 id="测试环境">测试环境</h2>
<table>
<thead>
<tr>
<th>服务器OS</th>
<th>主机IP</th>
<th>Docker版本</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ubuntu Server 18.04 LTS</td>
<td>192.168.87.133</td>
<td>18.09.6</td>
</tr>
<tr>
<td>Ubuntu Server 18.04 LTS</td>
<td>192.168.87.139</td>
<td>18.09.7</td>
</tr>
<tr>
<td>Ubuntu Desktop 18.04 LTS</td>
<td>192.168.87.135</td>
<td>18.09.7</td>
</tr>
</tbody>
</table>
<p>为了实现Nacos的高可用,至少需要三台负载较小的服务器,可以与其它服务共存</p>
<blockquote>
<p><strong>注意事项</strong></p>
<ol>
<li>这里演示高可用MySQL地址为:<code>10.2.7.29:3340</code>,<code>10.2.7.29:3341</code>,请自行替换</li>
<li>这里的<code>10.2.7.29</code>是局域网,<code>192.168.*</code>是虚拟机网络,通过虚拟机是可以访问局域网的</li>
<li>Nacos初始化SQL这块使用官方的即可,配置文件中不提供,默认认为高可用MySQL已经执行了初始化nacos.sql,这个SQL请移步nacos.sql Github</li>
</ol>
</blockquote>
<h2 id="配置文件目录结构与说明">配置文件目录结构与说明</h2>
<p><img src="https://img2018.cnblogs.com/blog/1149398/201909/1149398-20190903175122776-1803942701.png" alt="" loading="lazy"></p>
<h3 id="目录说明">目录说明</h3>
<ul>
<li><strong>init.d/custom.properties</strong> - 官方提供的自选功能配置文件,Nacos节点均包含此目录</li>
<li><strong>nacos-1/docker-compose-nacos1.yml</strong> - 第一个Nacos节点的Docker-compose配置文件</li>
<li><strong>nacos-2/docker-compose-nacos1.yml</strong> - 第二个Nacos节点的Docker-compose配置文件</li>
<li><strong>nacos-3/docker-compose-nacos1.yml</strong> - 第三个Nacos节点的Docker-compose配置文件</li>
</ul>
<p>除些之外,在每个<code>nacos-*</code>目录下边,使用docker-compose命令启动容器后,会创建出<code>cluster-logs</code>目录,</p>
<p><img src="https://img2018.cnblogs.com/blog/1149398/201909/1149398-20190903182445756-1428179929.png" alt="" loading="lazy"></p>
<blockquote>
<p>我认为最常用的应该是nacos.log</p>
</blockquote>
<h2 id="配置文件内容">配置文件内容</h2>
<p>133服务器的<code>docker-compose-nacos1.yml</code></p>
<pre><code class="language-bash">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 #集群中其它节点
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
</code></pre>
<p>139服务器的<code>docker-compose-nacos2.yml</code></p>
<pre><code class="language-bash">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 #集群中其它节点
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
</code></pre>
<p>135服务器的<code>docker-compose-nacos3.yml</code></p>
<pre><code class="language-bash">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 #集群中其它节点
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
</code></pre>
<p>Nacos共用的<code>init.d/custom.properties</code>,与官方保持一致,按需使用</p>
<pre><code class="language-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
</code></pre>
<blockquote>
<p>由于现在把所有的配置文件放在一起,并且每个Nacos节点都需要一份<code>init.d</code>目录,这里就不单独为每个<code>nacos-*</code>复制了,直接把文件夹整个复制过来就可以了</p>
</blockquote>
<h2 id="启动nacos集群">启动Nacos集群</h2>
<h3 id="复制配置文件">复制配置文件</h3>
<p>复制<code>nacos-cluster-docker</code>目录到以上三台主机,上边的配置文件已经修改好了</p>
<p>其对应关系为:</p>
<ul>
<li><strong>192.168.87.133 对应 nacos-1</strong></li>
<li><strong>192.168.87.139 对应 nacos-2</strong></li>
<li><strong>192.168.87.135 对应 nacos-3</strong></li>
</ul>
<h3 id="启动容器">启动容器</h3>
<p>分别在各主机上进入各自对应的nacos目录中,启动容器,命令如下:</p>
<p>133服务器</p>
<pre><code class="language-bash">$ cd nacos-cluster-docker/nacos-1
$ docker-compose -f docker-compose-nacos1.yml up -d
</code></pre>
<p>139服务器</p>
<pre><code class="language-bash">$ cd nacos-cluster-docker/nacos-2
$ docker-compose -f docker-compose-nacos2.yml up -d
</code></pre>
<p>135服务器</p>
<pre><code class="language-bash">$ cd nacos-cluster-docker/nacos-3
$ docker-compose -f docker-compose-nacos3.yml up -d
</code></pre>
<h3 id="查看日志">查看日志</h3>
<p>查看日志分别在对应的nacos-*目录下,执行</p>
<pre><code class="language-tail">tail -f cluster-logs/nacos*/nacos.log
</code></pre>
<h2 id="访问nacos-ui界面">访问Nacos UI界面</h2>
<p>这里使用133服务器页面进行展示下,</p>
<p>访问<code>http://192.168.87.133:8848/nacos</code>,进入登录页面,默认的用户名与密码都是<code>nacos</code></p>
<p><img src="https://img2018.cnblogs.com/blog/1149398/201909/1149398-20190903185112740-1674913105.png" alt="" loading="lazy"></p>
<blockquote>
<p>我这里还原的sql是平时测试用的,这里打下码,我们的关注点在 <strong>集群管理</strong> > <strong>节点列表</strong> 这里</p>
</blockquote>
<p>这里我们看到Nacos集群各节点已经正常了,LEADER与FOLLOWER已经选出,一切正常了</p>
<h2 id="配置nginx">配置Nginx</h2>
<p>除了Nacos集群配置外,我们在Spring Boot或Spring Cloud项目中使用的时候,只能指定一个URL指向Nacos服务端,这里使用Nginx进行代理负载均衡</p>
<blockquote>
<p>如果可以的话,生产环境最佳实践是使用一个域名指向Nginx,之后就算换Nginx主机,客户端也无需修改配置文件,只需要使用域名指向一个新的Nginx的IP</p>
</blockquote>
<h3 id="列出最主要的配置">列出最主要的配置</h3>
<pre><code class="language-nginx">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;
}
}
}
</code></pre>
<p>启动Nginx,使用代码进行测试连接当前的Nginx所在主机<code>IP:8848</code></p>
<p><img src="https://img2018.cnblogs.com/blog/1149398/201909/1149398-20190903190544313-1613514353.png" alt="" loading="lazy"></p>
<p>这里已经可以看到服务正常注册到集群中了</p>
<h2 id="遇到的问题">遇到的问题</h2>
<h3 id="客户端无法注册到集群中">客户端无法注册到集群中</h3>
<p>如果遇到有客户端服务无法连接到Nacos集群中,请着重检查下Nacos的堆内存与虚拟机的设置,最初我使用的默认的2G最大堆内存,虚拟机也分的2G内存,然后启动服务时还能正常一小会,然后就开始有的服务显示节点,有的不显示列表,使用客户端进行连接也无法正常连接,提示<code>Down Server response</code> 之类 的提示</p>
<p><strong>解决办法</strong>:修改虚拟机内存大小,或修改Nacos堆内存配置</p>
<p>本文到此结束,如果对你有帮助,欢迎评论、推荐、关注三连❤️</p>
<p><strong>本文系Hellxz学习与实践文章,禁止布布扣、码迷、爱码网等第三方爬虫网站爬取,转载请在醒目位置注明出处:https://www.cnblogs.com/hellxz/p/nacos-cluster-docker.html</strong></p><br><br>
来源:https://www.cnblogs.com/hellxz/p/nacos-cluster-docker.html
頁:
[1]