一、Nacos介绍
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos 的关键特性包括:
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
- Nacos官网:https://nacos.io/
- 项目地址:https://github.com/alibaba/nacos
二、环境描述
主机名 | 服务器IP | 部署组件 |
Nacos-node1 | 192.168.66.15 192.168.66.100(VIP) | Nacos1.3.1、JDK1.8、MySQL5.7+、keepalived |
Nacos-node2 | 192.168.66.16 | Nacos1.3.1、JDK1.8、MySQL5.7+、keepalived |
Nacos-node3 | 192.168.66.17 | Nacos1.3.1、JDK1.8、MySQL5.7+、keepalived |
官方推荐安装部署方式为:域名 + VIP模式,可读性好,而且换ip方便;这里我们也采用该方式进行搭建部署

三、环境初始化
1、配置主机名
[root@localhost ~]# hostnamectl set-hostname nacos-node1
[root@localhost ~]# hostnamectl set-hostname nacos-node2
[root@localhost ~]# hostnamectl set-hostname nacos-node3
2、配置主机名解析
[root@nacos-node1 ~]# vi /etc/hosts
192.168.66.15 nacos-node1
192.168.66.16 nacos-node2
192.168.66.17 nacos-node3
- node1节点实现ssh免密登入其他节点
[root@nacos-node1 ~]# ssh-keygen -t rsa
[root@nacos-node1 ~]# ssh-copy-id [email protected]
[root@nacos-node1 ~]# ssh-copy-id [email protected]
[root@nacos-node1 ~]# ssh-copy-id [email protected]
- hosts文件传给各节点,实现通过主机名解析
[root@nacos-node1 ~]# for i in 192.168.66.{16,17}; do echo ">>> $i";scp /etc/hosts root@$i:/etc/; done
[root@nacos-node1 ~]# ssh-copy-id root@nacos-node1
[root@nacos-node1 ~]# ssh-copy-id root@nacos-node2
[root@nacos-node1 ~]# ssh-copy-id root@nacos-node3
3、关闭防火墙
[root@nacos-node1 ~]# for i in 192.168.66.{15..17}; do echo ">>> $i";ssh root@$i "systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld"; done
4、关闭SELINUX
[root@nacos-node1 ~]# for i in 192.168.66.{15..17}; do echo ">>> $i";ssh root@$i "sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"; done
[root@nacos-node1 ~]# for i in 192.168.66.{15..17}; do echo ">>> $i";ssh root@$i "setenforce 0 && getenforce"; done
5、安装常用命令
[root@nacos-node1 ~]# for i in 192.168.66.{15..17};do echo ">>> $i";ssh root@$i "yum -y install gcc gcc-c++ libaio make cmake zlib-devel openssl-devel pcre pcre-devel wget git curl lynx lftp mailx mutt rsync ntp net-tools vim lrzsz screen sysstat yum-plugin-security yum-utils createrepo bash-completion zip unzip bzip2 tree tmpwatch pinfo man-pages lshw pciutils gdisk system-storage-manager git gdbm-devel sqlite-devel chrony";done
[root@nacos-node1 ~]# for i in 192.168.66.{15..17};do echo ">>> $i";ssh root@$i "yum install -y epel-release";done
6、配置时间同步
- node1节点与互联网时间服务器进行同步,其他节点则于node1节点进行时间同步
[root@nacos-node1 ~]# systemctl start ntpd && systemctl enable ntpd
[root@nacos-node1 ~]# vim /etc/chrony.conf

- 启动服务
[root@nacos-node1 ~]# systemctl start chronyd.service
[root@nacos-node1 ~]# systemctl enable chronyd.service
[root@nacos-node1 ~]# systemctl status chronyd.service
- 检查主节点时间同步信息
[root@nacos-node1 ~]# timedatectl

- 其他节点关闭ntpd服务,我们这里使用chronyd服务
[root@nacos-node1 ~]# for i in 192.168.66.{16,17};do echo ">>> $i";ssh root@$i "systemctl stop ntpd && systemctl disable ntpd && systemctl status ntpd";done
- 登入各个节点服务器进行手动修改chronyd
~]# vim /etc/chrony.conf
server 192.168.66.15 iburst

- 另外2个节点启动服务,在node1节点操作
[root@nacos-node1 ~]# for i in 192.168.66.{16,17};do echo ">>> $i";ssh root@$i "systemctl restart chronyd.service && systemctl enable chronyd.service && systemctl status chronyd.service";done
- 检查时间同步状态
^*
表示已经同步
[root@nacos-node1 ~]# for i in 192.168.66.{16,17};do echo ">>> $i";ssh root@$i "chronyc sources ";done

7、所有节点安装JDK
- 安装方式通过RPM方式安装,版本1.8
rpm -ivh jdk-8u231-linux-x64.rpm
四、MySQL主从
官方建议数据库最好是主备模式,这里我就先搭建个一主多从的模式;由于我这边资源问题,MySQL就与Nacos安装在一块
1、下载安装
- 安装方式为RPM包安装,3台机器都需要进行安装部署,所需安装包如下:
- MySQL官网地址:https://downloads.mysql.com/archives/community/
mysql-community-server
、mysql-community-client
、mysql-community-common
、mysql-community-libs
、mysql-community-devel
、mysql-community-libs-compat
- 安装服务,所有机器执行
#卸载掉系统默认的mariadb
[root@nacos-node1 ~]# rpm -qa|grep mariadb|xargs rpm -e --nodeps
[root@nacos-node1 ~]# mkdir -p /opt/soft && cd /opt/soft
[root@nacos-node1 soft]# yum install mysql-community-*
- 启动MySQL服务(三节点都要启动)
[root@nacos-node1 ~]# systemctl start mysqld
[root@nacos-node1 ~]# systemctl enable mysqld
[root@nacos-node1 ~]# systemctl status mysqld
- 重置ROOT密码(三节点都需要)
[root@nacos-node1 ~]# cat /var/log/mysqld.log |grep password
[root@nacos-node1 ~]# mysql -uroot -p
Enter password:
#修改密码策略
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_mixed_case_count=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_number_count=3;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_special_char_count=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_length=3;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'dqz123456';
2、修改配置
- 修改MySQL配置(三节点都需要修改)
#------------node1节点------------#
[root@nacos-node1 ~]# vim /etc/my.cnf
#添加如下信息
#gtid
server-id = 1
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
#binlog
expire_logs_days = 30
max_binlog_size = 100M
log_bin = /data/mysql/mysql-bin
binlog-format = Row
#elay log
skip_slave_start= ON
#------------node2节点------------#
[root@nacos-node2 ~]# vim /etc/my.cnf
#添加如下信息
#gtid
server-id = 2
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
#binlog
expire_logs_days = 30
max_binlog_size = 100M
log_bin = /data/mysql/mysql-bin
binlog-format = Row
#elay log
skip_slave_start= ON
#------------node3节点------------#
[root@nacos-node3 ~]# vim /etc/my.cnf
#添加如下信息
#gtid
server-id = 3
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
#binlog
expire_logs_days = 30
max_binlog_size = 100M
log_bin = /data/mysql/mysql-bin
binlog-format = Row
#elay log
skip_slave_start= ON
#所有节点创建binlog日志存储目录并授权
mkdir -p /data/mysql
chown -R mysql. /data/
#所有节点重启MySQL服务
systemctl restart mysqld
3、配置主从
3.1、创建同步账号
- 在主库执行;基于 GTID 的复制会自动地将没有在从库执行过的事务重放,所以不要在其它从库上建立相同的账号。 如果建立了相同的账户,有可能造成复制链路的错误。
[root@nacos-node1 ~]# mysql -uroot -p
#修改密码策略
mysql> set global validate_password_policy=0;
mysql> set global validate_password_mixed_case_count=0;
mysql> set global validate_password_number_count=3;
mysql> set global validate_password_special_char_count=0;
mysql> set global validate_password_length=3;
mysql> grant replication slave on *.* to 'slave'@'192.168.66.%' identified by 'dqz123456';
mysql> flush privileges;
- 查看主库与从库的GTID是否开启
mysql> show variables like "%gtid%";
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.00 sec)
mysql> show variables like '%gtid_next%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| gtid_next | AUTOMATIC |
+---------------+-----------+
1 row in set (0.00 sec)
3.2、主库查看状态
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 601 | | | a4c5734e-d16e-11ea-b7c1-000c29b0226c:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
3.3、从库链接主库
- 在2台从节点执行
[root@nacos2 ~]# mysql -uroot -p
Enter password:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.66.15',MASTER_USER='slave',MASTER_PASSWORD='dqz123456',MASTER_AUTO_POSITION=1;
3.4、从库启动复制
mysql> START SLAVE;
3.5、检查SLAVE状态
mysql> SHOW SLAVE STATUS\G
- 确认
Slave_IO_Running
和Slave_SQL_Running
两个参数都为 Yes 状态

3.6、主库检查从库信息
mysql> SHOW SLAVE HOSTS;

3.7、检查GTID复制
- 在主库创建一个库,查看从库是否复制过去
#主库创建新库
mysql> CREATE DATABASE TESTDB;
#从库查看复制情况
mysql> SHOW DATABASES;

五、部署Nacos
1、下载Nacos
- 仓库地址:https://github.com/alibaba/nacos/releases
- 下载zip包后上传至服务器/opt/soft目录下进行解压
- 所有节点进行安装部署
[root@nacos-node1 ~]# cd /opt/soft/
[root@nacos-node1 soft]# unzip nacos-server-1.3.1.zip -d /usr/local/
2、修改配置
- 所有nacos节点都需要配置;
- nacos 的默认服务端口是 8848
[root@nacos-node1 soft]# cd /usr/local/nacos/conf
[root@nacos-node1 conf]# vim cluster.conf
# ip:port
192.168.66.15:8848
192.168.66.16:8848
192.168.66.17:8848
3、数据源配置
- 创建Nacos连接用户和库,在主库执行即可;
- 注意这里的库名,后面配置nacos连接数据库时需要更改为此数据库
[root@nacos-node1 conf]# mysql -uroot -p
Enter password:
mysql> CREATE DATABASE `nacos_config` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> CREATE USER 'nacos'@'%' IDENTIFIED BY 'dqz123456';
mysql> grant all privileges on nacos_config.* to nacos@'%';
mysql> flush privileges;
- 导入数据;sql文件存储在nacos安装路径下的conf目录中;只需在主库执行即可
mysql> use nacos_config
mysql> source /usr/local/nacos/conf/nacos-mysql.sql;
所有nacos节点修改nacos连接数据库的配置文件;
- db.num 为数据库实例数量
- db.url.0 指定不同的数据库连接
- 如果有多个数据库实例通过 db.url.0、db.url.1… 指定不同的数据库连接
[root@nacos-node1 ~]# cd /usr/local/nacos/conf/
[root@nacos-node1 conf]# vim application.properties

#拷贝给其他节点
[root@nacos-node1 conf]# scp application.properties [email protected]:/usr/local/nacos/conf/
[root@nacos-node1 conf]# scp application.properties [email protected]:/usr/local/nacos/conf/
4、启动Nacos
- 所有节点执行以下命令启动
[root@nacos-node1 ~]# cd /usr/local/nacos/bin/
[root@nacos-node1 bin]# ./startup.sh
- 启动日志查看
tailf /usr/local/nacos/logs/start.out
5、访问Nacos
- http://192.168.66.15:8848/nacos/#/login
- 默认的账号密码就是:
nacos
/nacos


六、安装keepalived
这里我们使用keepalived来实现nacos的高可用,通过keepalived进行虚拟IP并绑定Nacos真实地址
1、编译安装
- keepalived官网:https://www.keepalived.org/download.html
- 在15节点进行编译安装,然后将编译好的文件传给另外2个节点,并修改对应的配置
[root@nacos-node1 ~]# cd /opt/soft/
[root@nacos-node1 soft]# wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz
#所有节点都需要安装依赖
[root@nacos-node1 script]# for i in 192.168.66.{15..17}; do echo ">>> $i"; ssh root@$i "yum -y install libnl libnl-devel libnfnetlink-devel openssl-devel"; done
[root@nacos-node1 soft]# tar -xf keepalived-2.0.20.tar.gz
[root@nacos-node1 soft]# cd keepalived-2.0.20
[root@nacos-node1 keepalived-2.0.20]# ./configure --prefix=/usr/local/keepalived
[root@nacos-node1 keepalived-2.0.20]# make && make install
2、修改配置
[root@nacos-node1 ~]# cd /usr/local/keepalived/etc/keepalived/
[root@nacos-node1 keepalived]# cp keepalived.conf{,_bak}
[root@nacos-node1 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nacos-node1 //唯一值,一般为所在服务器主机名
vrrp_skip_check_adv_addr
# vrrp_strict //注释该参数
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#注意此处添加nacos服务健康检查
vrrp_script check_nacos {
script "/bin/bash /script/check_nacos.sh" #nacos健康检查脚本路径
interval 5 #健康检查周期,每隔5秒执行一次脚本
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #绑定的网卡名称
virtual_router_id 51 #主备ID必须保证一致
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.66.100/24 #VIP地址,虚拟IP
}
track_script { #调用脚本
check_nacos #这里的名称必须与vrrp_scrip写的保证一致
}
}
- keepalived默认会读取/etc/keepalived/keepalived.conf配置文件,所以需要将配置文件移至该目录下
[root@nacos-node1 ~]# mkdir /etc/keepalived/
[root@nacos-node1 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
3、编写脚本
- 编写nacos健康检查脚本
- 编写nacos健康状态消息推送脚本
- 注意:脚本存储目录跟名称要与上面配置文件中配置的检测脚本一致
3.1:健康检测脚本
[root@nacos-node1 ~]# mkdir /script
[root@nacos-node1 ~]# vim /script/check_nacos.sh
#!/bin/bash
network=`ifconfig ens33 |grep -w inet |awk '{print $2}'`
nacos=`netstat -tnlp|grep 8848|wc -l`
if [ "$nacos" -eq 0 ];then
#这里调用消息通知脚本,并配置需要发送的消息
/script/qywx_nacos.py "主机:$(hostname)--主机IP:$network:nacos服务心跳检测异常,>>> 请登入服务器查看;VIP已切换,请注意"
systemctl stop keepalived.service
fi
3.2:消息推送脚本
[root@nacos-node1 ~]# vim /script/qywx_nacos.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "企业微信机器人或者钉钉机器人的webhook地址"
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
- 安装pip和requests模块,所有节点安装
[root@nacos-node1 ~]# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
[root@nacos-node1 ~]# for i in 192.168.66.{16,17}; do echo ">>> $i";scp /root/get-pip.py root@$i:/root/; done
[root@nacos-node1 ~]# for i in 192.168.66.{15..17}; do echo ">>> $i"; ssh root@$i python /root/get-pip.py; done
[root@nacos-node1 ~]# for i in 192.168.66.{15..17}; do echo ">>> $i"; ssh root@$i pip install requests; done
3.3:授予执行权限
[root@nacos-node1 ~]# chmod +x /script/check_nacos.sh /script/qywx_nacos.py
- 脚本测试:将nacos停止后查看机器人是否收到推送消息

4、拷贝文件
[root@nacos-node1 ~]# for i in 192.168.66.{16,17}; do echo ">>> $i"; scp -r /usr/local/keepalived root@$i:/usr/local/ && scp -r /script root@$i:/ && scp -r /etc/keepalived root@$i:/etc/ && scp /usr/lib/systemd/system/keepalived.service root@$i:/usr/lib/systemd/system/; done
5、备修改配置
- 登入到另外2个备节点进行修改配置
- 注意:三节点的router_id一定不要重复最好以当前主机名;virtual_router_id一定要一致;priority值依次为15节点MASTER(100)—16节点BACKUP(90)—17节点BACKUP(80)
5.1:Nacos-node2
[root@nacos-node2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nacos-node2
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nacos {
script "/bin/bash /script/check_nacos.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.66.100/24
}
track_script {
check_nacos
}
}
5.2:Nacos-node3
[root@nacos-node3 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nacos-node3
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nacos {
script "/bin/bash /script/check_nacos.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.66.100/24
}
track_script {
check_nacos
}
}
6、启动服务
[root@nacos-node1 ~]# for i in 192.168.66.{15..17}; do echo ">>> $i"; ssh root@$i systemctl daemon-reload && systemctl start keepalived && systemctl status keepalived|grep Active; done
7、查看当前VIP
[root@nacos-node1 ~]# for i in 192.168.66.{15..17}; do echo ">>> $i"; ssh root@$i "ip a show ens33"; done

- 可以看到当前VIP在15这台主机上
8、通过VIP进行访问

mysql 8 好像没有global 的名称和密码等限制,名称长度限制为32 所以同步账户创建会出问题
怎么可能没有呢
报错
ERROR 1193 (HY000): Unknown system variable ‘validate_password_policy’
这个参数只是变了下划线
Unknown system variable ‘validate_password.policy’ 版本号8.0.20
这是你密码设置的复杂度不够,这不是啥问题
8之前是 validate_password_ 8之后validate_password.