本地虚拟机搭建nacos集群
准备工作
准备好三台服务器:
192.168.91.129
192.168.91.130
192.168.91.131
nacos所需环境:
jdk1.8、mysql8.0
安装jdk1.8
三台机器安装jdk1.8
1、安装之前先卸载linux下自带的openjdk,可以用 java -version命令查看
`openj`dk version "1.8.0_262"`
`OpenJDK Runtime Environment (build 1.8.0_262-b10)`
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)`
如果出现这些,就要删除openjdk了。
rpm -qa |grep jdk # 先查找openJdk的位置
copy-jdk-configs-3.3-10.el7_5.noarch
java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
java-1.8.0-openjdk-headless-1.8.0.262.b10-0.el7_8.x86_64
查找之后删除
[root@m local]# rpm -e --nodeps java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
[root@m local]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.262.b10-0.el7_8
2、下载linux环境下的oracle jdk1.8包,并解压
tar -zxvf jdk-8u171-linux-x64.tar.gz
3、配置环境变量
[root@localhost local]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_181 #jdk安装目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
4、文件生效
[root@localhost local]# source /etc/profile
5、查看是否安装成功
[root@m local]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
jdk1.8安装成功。
docker安装mysql8.0
参考: https://blog.csdn.net/u014576291/article/details/105890286
安装过程中使用到的docker命令:
service docker start 启动docker
docker pull 拉取镜像
docker images 查看本机都pull下来哪些镜像
docker ps 查看容器的运行状态
docker stop 停止容器
docker rm 删除容器 如 docker rm mysql
docker run 启动容器
1、拉取mysql镜像
docker pull mysql:8.0.20
2、启动mysql
docker run --name mysql -p 3306:3306 --privileged=true --restart unless-stopped -v /mysql/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.20
参数解析:
--privileged=true 挂载文件权限设置
--restart unless-stopped 设置 开机后自动重启容器
-v /mnt/sda1/mysql8.0.20/mysql:/etc/mysql 挂载配置文件
-v /mnt/sda1/mysql8.0.20/logs:/logs \ 挂载日志
-v /mnt/sda1/mysql8.0.20/data:/var/lib/mysql \ 挂载数据文件 持久化到主机,
-v /etc/localtime:/etc/localtime 容器时间与宿主机同步
-e MYSQL_ROOT_PASSWORD=123456 设置密码
-d mysql:8.0.20 后台启动,安装的mysql相关版本
3、启动完成之后,本机navicat远程连接mysql时候报错:
参考:https://my.oschina.net/u/3295928/blog/1811804
Client does not support authentication protocol requested by server
原因:密码加密规则问题。
解决:修改 远程连接的root用户(root@)的插件为mysql_native_password;
更改加密插件规则:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';
FLUSH PRIVILEGES;
验证是否成功:
select host,user,plugin from user where user='root';
查看是否更改成功。
mysql> select host,user,plugin from user where user='root';
+-----------+------+-----------------------+
| host | user | plugin |
+-----------+------+-----------------------+
| % | root | mysql_native_password |
| localhost | root | mysql_native_password |
+-----------+------+-----------------------+
注意: mysql 中root用户中主机是%和localhost的区别
root'@'%:root远程连接mysql;root'@'localhost root本地连接mysql。
4、连接上mysql数据库后。
建立三个数据库,分别对应nacos的三个节点。
192.168.91.129 nacos01
192.168.91.130 nacos02
192.168.91.131 nacos03
5、创建nacos连接数据库的用户并赋权
create user nacos identified by 'nacos'; # 设置用户 nacos和密码 nacos
grant all on nacos.* to nacos; # 赋给nacos用户操作nacos数据库的权限
grant all on nacos01.* to nacos; # 赋给nacos01用户操作nacos数据库的权限
grant all on nacos02.* to nacos; # 赋给nacos02用户操作nacos数据库的权限
6、 虚拟机关闭后,docker重新启动mysql服务:
先启动docker服务: service docker start
docker 启动mysql前,先停止并删除 mysql的容器:docker stop 容器id;docker rm 容器id
然后再执行上边mysql启动时的脚本:docker run
启动完毕后,用Navicat连下是否成功。
搭建nacos集群
准备工作做完,开始正式搭建nacos集群。
执行nacos的脚本
1、下载编译好的nacos包,并分别放到各个服务器的 /usr/local下
/usr/local nacos-server-1.3.2.tar.gz
2、三台服务器中分别解压包。
在三个数据库中分别执行 /usr/local/nacos/conf下的nacos-mysql.sql脚本
修改nacos中application.properties的配置的数据源信息
/usr/local/nacos/conf/application.properties 里的内容:
三台服务器要根据对应的数据库分别修改。
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.91.129:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=nacos
db.password=nacos
配置集群启动
在nacos/conf目录下,有一个cluster.conf.example配置文件,在这个配置文件中配置这三个节点的ip和端口
mv cluster.conf.example cluster.conf #先将该文件修改为cluster.conf
在文本最后将集群机器的地址填上
192.168.91.129:8847
192.168.91:130:8847
192.168.91:131:8847
注意: port端口号要根据 /usr/local/nacos/conf/application.properties 中的server.port进行修改
启动集群
三个节点在 nacos/bin 下执行,sh /startup.sh 启动脚本
启动报错:内存不够
启动过程中,报错内存不够
修改 bin/startup.sh 的脚本
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof
脚本中embedded集群模式下内存大小为2g,将其修改为256m,如果学习使用的话可以试着改的再小一点。
重新启动,启动成功
查看启动日志 /usr/local/nacos/logs/start.out
[root@m bin]# tail -f /usr/local/nacos/logs/start.out
2021-10-17 15:10:39,700 INFO Nacos is starting...
2021-10-17 15:10:40,522 INFO Nacos Log files: /usr/local/nacos/logs
2021-10-17 15:10:40,522 INFO Nacos Log files: /usr/local/nacos/conf
2021-10-17 15:10:40,522 INFO Nacos Log files: /usr/local/nacos/data
2021-10-17 15:10:40,522 INFO Nacos started successfully in cluster mode. use external storage
nacos选举日志:
。。。。。
2021-10-17 14:59:29,710 INFO add listener: com.alibaba.nacos.naming.domains.meta.00-00---000-NACOS_SWITCH_DOMAIN-000---00-00
2021-10-17 14:59:29,751 INFO add listener: com.alibaba.nacos.naming.domains.meta.
2021-10-17 14:59:37,089 INFO vote 192.168.91.130:8848 as leader, term: 3
2021-10-17 14:59:39,939 INFO received illegitimate vote, voter-term:3, votee-term:3
2021-10-17 14:59:42,055 INFO 192.168.91.130:8848 has become the LEADER, local: {"ip":"192.168.91.129:8848","voteFor":"192.168.91.130:8848","term":3,"leaderDueMs":18014,"heartbeatDueMs":5000,"state":"FOLLOWER"}, leader: {"ip":"192.168.91.130:8848","voteFor":"192.168.91.130:8848","term":3,"leaderDueMs":18826,"heartbeatDueMs":5000,"state":"LEADER"}
2021-10-17 14:59:56,447 INFO vote 192.168.91.131:8848 as leader, term: 4
2021-10-17 14:59:57,140 INFO [RAFT] out of date beat, beat-from-term: 3, beat-to-term: 4, remote peer: {"ip":"192.168.91.130:8848","voteFor":"192.168.91.130:8848","term":3,"leaderDueMs":17161,"heartbeatDueMs":5000,"state":"LEADER"}, and leaderDueMs: 19310
2021-10-17 15:00:01,046 INFO 192.168.91.131:8848 has become the LEADER, local: {"ip":"192.168.91.129:8848","voteFor":"192.168.91.131:8848","term":4,"leaderDueMs":15986,"heartbeatDueMs":5000,"state":"FOLLOWER"}, leader: {"ip":"192.168.91.131:8848","voteFor":"192.168.91.131:8848","term":4,"leaderDueMs":19673,"heartbeatDueMs":5000,"state":"LEADER"}
2021-10-17 15:10:12,761 INFO received illegitimate vote, voter-term:1, votee-term:4
2021-10-17 15:10:42,749 INFO received illegitimate vote, voter-term:1, votee-term:4
分别访问三个节点nacos地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bvfHcQ5m-1634462083129)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211017170051110.png)]
如果访问地址页面报错,检查防火墙是否关闭:
检查防火墙是否关闭:
sudo systemctl status firewalld。
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
#如果看到inactive(dead)就意味着防火墙关闭了
#如果看到active(running)就意味着防火墙打开了
Docs: man:firewalld(1)
#永久关闭防火墙
systemctl disable firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
#如果看到inactive(dead)就意味着防火墙关闭了
#如果看到active(running)就意味着防火墙打开了
Docs: man:firewalld(1)
#永久关闭防火墙
systemctl disable firewalld