zookeeper在kafka集群的作用
早期版本中kafka依赖zookeeper存储topic,consumer group,offset等信息。
kafka 0.9+版本中,弃用了将offset存储在zookeeper集群上,以减少zk的压力,而是将数据存储在"__consumer_offset"的内置topic。
kafka 2.0+版本中,移除了offset存储在zk的支持。
kafka 2.8+版本中,弃用了zookeeper集群协同管理数据,而是自实现管理。
kafka 3.9.0版本中,依旧是支持zk存储元数据信息的。
生产环境中,建议大家还是将数据存储在zookeeper集群,不建议直接使用kafka独立使用。
nacos单机部署实战
- 1.nacos概述
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以**“服务”**为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos 支持几乎所有主流类型的**“服务”**的发现、配置和管理:
- Kubernetes Service
- gRPC
- Dubbo RPC Service
- Spring Cloud RESTful Service
Nacos官网地址:
https://nacos.io/
Nacos的Github地址:
https://github.com/alibaba/nacos
- 2.下载nacos
wget https://github.com/alibaba/nacos/releases/download/2.5.1/nacos-server-2.5.1.tar.gz
- 3.解压nacos
[root@elk91 ~]# tar xf nacos-server-2.5.1.tar.gz -C /usr/local/
[root@elk91 ~]#
[root@elk91 ~]# apt -y install tree
[root@elk91 ~]#
[root@elk91 ~]# tree /usr/local/nacos/
/usr/local/nacos/
├── bin
│ ├── shutdown.cmd
│ ├── shutdown.sh
│ ├── startup.cmd
│ └── startup.sh
├── conf
│ ├── 1.4.0-ipv6_support-update.sql
│ ├── announcement_en-US.conf
│ ├── announcement_zh-CN.conf
│ ├── application.properties
│ ├── application.properties.example
│ ├── cluster.conf.example
│ ├── console-guide.conf
│ ├── derby-schema.sql
│ ├── mysql-schema.sql
│ └── nacos-logback.xml
├── LICENSE
├── NOTICE
└── target
└── nacos-server.jar
3 directories, 17 files
[root@elk91 ~]#
- 4.启动nacos单机版
[root@elk91 ~]# /usr/local/nacos/bin/startup.sh -m standalone
/usr/share/elasticsearch/jdk/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/usr/local/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=100m -Dloader.path=/usr/local/nacos/plugins,/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb,/usr/local/nacos/plugins/selector -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting. you can check the /usr/local/nacos/logs/start.out
[root@elk91 ~]#
[root@elk91 ~]# tail -100f /usr/local/nacos/logs/start.out
/usr/share/elasticsearch/jdk/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/usr/local/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=100m -Dloader.path=/usr/local/nacos/plugins,/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb,/usr/local/nacos/plugins/selector -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
,--.
,--.'|
,--,: : | Nacos 2.5.1
,`--.'`| ' : ,---. Running in stand alone mode, All function modules
| : : | | ' ,'\ .--.--. Port: 8848
: | \ | : ,--.--. ,---. / / | / / ' Pid: 58224
| : ' '; | / \ / \. ; ,. :| : /`./ Console: http://10.0.0.91:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'
2025-03-18 09:40:05,502 INFO Tomcat initialized with port(s): 8848 (http)
...
[root@elk91 ~]# ss -ntl | grep 8848
LISTEN 0 100 *:8848 *:*
[root@elk91 ~]#
- 5.访问nacos的WebUI
http://10.0.0.91:8848/nacos/
nacos实现服务注册和服务发现
- 1.注册节点
[root@elk93 ~]# curl -s -X POST 'http://10.0.0.91:8848/nacos/v1/ns/instance?serviceName=elasticstack&ip=10.0.0.91&port=9200' ;echo
ok
[root@elk93 ~]#
[root@elk93 ~]# curl -s -X POST 'http://10.0.0.91:8848/nacos/v1/ns/instance?serviceName=elasticstack&ip=10.0.0.92&port=9200' ;echo
ok
[root@elk93 ~]#
[root@elk93 ~]# curl -s -X POST 'http://10.0.0.91:8848/nacos/v1/ns/instance?serviceName=elasticstack&ip=10.0.0.93&port=9200' ;echo
ok
[root@elk93 ~]#
- 2.服务发现
[root@elk93 ~]# curl -X GET -s 'http://10.0.0.91:8848/nacos/v1/ns/instance/list?serviceName=elasticstack' | jq
{
"name": "DEFAULT_GROUP@@elasticstack",
"groupName": "DEFAULT_GROUP",
"clusters": "",
"cacheMillis": 10000,
"hosts": [
{
"instanceId": "10.0.0.92#9200#DEFAULT#DEFAULT_GROUP@@elasticstack",
"ip": "10.0.0.92",
"port": 9200,
"weight": 1,
"healthy": true,
"enabled": true,
"ephemeral": true,
"clusterName": "DEFAULT",
"serviceName": "DEFAULT_GROUP@@elasticstack",
"metadata": {},
"instanceHeartBeatInterval": 5000,
"instanceHeartBeatTimeOut": 15000,
"ipDeleteTimeout": 30000,
"instanceIdGenerator": "simple"
},
{
"instanceId": "10.0.0.93#9200#DEFAULT#DEFAULT_GROUP@@elasticstack",
"ip": "10.0.0.93",
"port": 9200,
"weight": 1,
"healthy": true,
"enabled": true,
"ephemeral": true,
"clusterName": "DEFAULT",
"serviceName": "DEFAULT_GROUP@@elasticstack",
"metadata": {},
"instanceHeartBeatInterval": 5000,
"instanceHeartBeatTimeOut": 15000,
"ipDeleteTimeout": 30000,
"instanceIdGenerator": "simple"
},
{
"instanceId": "10.0.0.91#9200#DEFAULT#DEFAULT_GROUP@@elasticstack",
"ip": "10.0.0.91",
"port": 9200,
"weight": 1,
"healthy": true,
"enabled": true,
"ephemeral": true,
"clusterName": "DEFAULT",
"serviceName": "DEFAULT_GROUP@@elasticstack",
"metadata": {},
"instanceHeartBeatInterval": 5000,
"instanceHeartBeatTimeOut": 15000,
"ipDeleteTimeout": 30000,
"instanceIdGenerator": "simple"
}
],
"lastRefTime": 1742264229641,
"checksum": "",
"allIPs": false,
"reachProtectionThreshold": false,
"valid": true
}
[root@elk93 ~]#
nacos实现服务中心案例
- 1.发布配置
[root@elk93 ~]# curl -s -X POST "http://10.0.0.91:8848/nacos/v1/cs/configs?dataId=blog&group=k8s&content=https://www.cnblogs.com/yinzhengjie" ;echo
true
[root@elk93 ~]#
- 2.获取配置
[root@elk93 ~]# curl -s "http://10.0.0.91:8848/nacos/v1/cs/configs?dataId=blog&group=k8s";echo
https://www.cnblogs.com/yinzhengjie
[root@elk93 ~]#
[root@elk93 ~]# curl -s "http://10.0.0.91:8848/nacos/v1/cs/configs?dataId=laonanhai&group=DEFAULT_GROUP";echo
{"office": "https://www.oldboyedu.com","school":"oldboyedu"}
[root@elk93 ~]#
Nacos启动脚本编写
- 1.编写启动脚本
cat > /lib/systemd/system/nacos.service <<EOF
[Unit]
Description=nacos.service
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/share/elasticsearch/jdk
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecStop=/usr/local/nacos/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
EOF
- 2.配置开机自启动
[root@elk91 ~]# systemctl daemon-reload
[root@elk91 ~]# systemctl enable --now nacos.service
[root@elk91 ~]#
[root@elk91 ~]# ss -ntl | grep 8848
LISTEN 0 100 *:8848 *:*
[root@elk91 ~]#
[root@elk91 ~]# systemctl status nacos.service
● nacos.service
Loaded: loaded (/lib/systemd/system/nacos.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-03-18 10:32:36 CST; 29s ago
Process: 58921 ExecStart=/usr/local/nacos/bin/startup.sh -m standalone (code=exited, status=0/SUCCESS)
Tasks: 183 (limit: 9350)
Memory: 707.6M
CPU: 19.082s
CGroup: /system.slice/nacos.service
└─58957 /usr/share/elasticsearch/jdk/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= "-X>
Mar 18 10:32:36 elk91 systemd[1]: Starting nacos.service...
Mar 18 10:32:36 elk91 startup.sh[58921]: /usr/share/elasticsearch/jdk/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true ->
Mar 18 10:32:36 elk91 startup.sh[58921]: nacos is starting with standalone
Mar 18 10:32:36 elk91 startup.sh[58921]: nacos is starting. you can check the /usr/local/nacos/logs/start.out
Mar 18 10:32:36 elk91 systemd[1]: Started nacos.service.
[root@elk91 ~]#
nacos配置MySQL作为数据源
- 1.拷贝nacos的SQL初始化语句
[root@elk91 ~]# scp /usr/local/nacos/conf/mysql-schema.sql 10.0.0.93:~
- 2.创建用户并授权,导入SQL语句
[root@elk93 logstash]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 91
Server version: 8.4.4 MySQL Community Server - GPL
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> CREATE DATABASE nacos;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER nacos IDENTIFIED WITH mysql_native_password by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON nacos.* TO nacos;
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> QUIT
Bye
[root@elk93 ~]#
[root@elk93 ~]# mysql < mysql-schema.sql
ERROR 1046 (3D000) at line 1: No database selected
[root@elk93 ~]#
[root@elk93 ~]# mysql nacos < mysql-schema.sql
[root@elk93 ~]#
[root@elk93 ~]# mysql -e 'SHOW TABLES FROM nacos;'
+----------------------+
| Tables_in_nacos |
+----------------------+
| config_info |
| config_info_gray |
| config_tags_relation |
| group_capacity |
| his_config_info |
| permissions |
| roles |
| tenant_capacity |
| tenant_info |
| users |
+----------------------+
[root@elk93 ~]#
- 3.修改nacos的配置文件
[root@elk91 ~]# vim /usr/local/nacos/conf/application.properties
# 修改nacos的访问站点
server.servlet.contextPath=/
...
# 指定数据库的类型是MySQL
spring.sql.init.platform=mysql
# 数据库的数量,官方写的是1,此处我也写1.
db.num=1
# 指定数据库的主机,端口,数据库及相关参数。
db.url.0=jdbc:mysql://10.0.0.93:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnic ode=true&useSSL=false&serverTimezone=Asia/Shanghai
# 指定数据库的用户名
db.user.0=nacos
# 指定数据库的密码
db.password.0=123456
- 4.重启nacos
[root@elk91 ~]# systemctl restart nacos.service
[root@elk91 ~]#
- 5.访问nacos的WebUI
http://10.0.0.91:8848/
- 6.写入配置信息观察MySQL数据库是否有数据存储
mysql> SELECT * FROM config_info;
+----+-----------+---------------+----------------------------------------------------------------------------------------------------------------------+----------------------------------+---------------------+---------------------+----------+----------+----------+-----------+--------+-------+--------+------+----------+--------------------+
| id | data_id | group_id | content | md5 | gmt_create | gmt_modified | src_user | src_ip | app_name | tenant_id | c_desc | c_use | effect | type | c_schema | encrypted_data_key |
+----+-----------+---------------+----------------------------------------------------------------------------------------------------------------------+----------------------------------+---------------------+---------------------+----------+----------+----------+-----------+--------+-------+--------+------+----------+--------------------+
| 1 | oldboyedu | DEFAULT_GROUP | {"office":"https://www.baidu.com","address":"沙河","name":"xiaoming","O":"天天睡大觉"} | 4e417ec009737a6db135e8f0c6c494ba | 2025-03-18 11:02:20 | 2025-03-18 11:02:20 | NULL | 10.0.0.1 | | | NULL | NULL | NULL | json | NULL | |
+----+-----------+---------------+----------------------------------------------------------------------------------------------------------------------+----------------------------------+---------------------+---------------------+----------+----------+----------+-----------+--------+-------+--------+------+----------+--------------------+
1 row in set (0.00 sec)
mysql>
nacos配置认证功能及RBAC实战
- 1.nacos认证概述
Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。
Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。
如果运行在不可信的网络环境或者有强鉴权诉求,请参考官方简单实现做替换增强。
参考链接:
https://nacos.io/zh-cn/docs/auth.html
- 2.生成toke的值,自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。
[root@elk91 ~]# openssl rand -base64 33
428Gjk5EGkADiPC+577iPOH49V1lGzDSN+gW8ggvUOyo
[root@elk91 ~]#
- 3.修改Nacos的配置文件
[root@elk91 ~]# tail -5 /usr/local/nacos/conf/application.properties
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=violet
nacos.core.auth.server.identity.value=violet
nacos.core.auth.plugin.nacos.token.secret.key=428Gjk5EGkADiPC+577iPOH49V1lGzDSN+gW8ggvUOyo
[root@elk91 ~]#
- 4.重启nacos
[root@elk91 ~]# systemctl restart nacos.service
[root@elk91 ~]#
- 5.登录测试
http://10.0.0.91:8848/#/login
初始密码: 可以自定义。
- 6.创建用户并绑定权限测试
nacos集群基于haproxy实现高可用实战
- 1.在单点的配置上修改配置文件
[root@elk91 ~]# cat /usr/local/nacos/conf/cluster.conf
10.0.0.91:8848
10.0.0.92:8848
10.0.0.93:8848
[root@elk91 ~]#
- 2.拷贝nacos程序
[root@elk91 ~]# scp -r /usr/local/nacos/ 10.0.0.92:/usr/local/
[root@elk91 ~]# scp -r /usr/local/nacos/ 10.0.0.93:/usr/local/
3.停止单点的nacos
[root@elk91 ~]# systemctl disable --now nacos.service
- 4.所有节点以集群的方式启动
4.1 所有节点启动
/usr/local/nacos/bin/startup.sh -p embedded
4.2 访问验证
http://10.0.0.91:8848/#/clusterManagement
http://10.0.0.92:8848/#/clusterManagement
http://10.0.0.93:8848/#/clusterManagement
- 5.配置haproxy实现负载均衡【3个节点都得操作】
5.1 修改内核参数
echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.d/nacos.conf
sysctl -f /etc/sysctl.d/nacos.conf
sysctl -q net.ipv4.ip_nonlocal_bind
5.2 安装配置haproxy
apt -y install haproxy
5.3 修改haproxy的配置文件
[root@elk93 ~]# tail -13 /etc/haproxy/haproxy.cfg
listen status
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /ruok
stats auth admin:123456
listen nacos
bind 10.0.0.66:18848
server elk91 10.0.0.91:8848 check
server elk92 10.0.0.92:8848 check
server elk93 10.0.0.93:8848 check
[root@elk93 ~]#
[root@elk93 ~]# scp /etc/haproxy/haproxy.cfg 10.0.0.91:/etc/haproxy
[root@elk93 ~]# scp /etc/haproxy/haproxy.cfg 10.0.0.92:/etc/haproxy
- 6.配置抢占式keepalived实现高可用
6.1.在两台服务器上安装配置keepalived实现高可用
apt -y install keepalived
6.2.修改keepalived的配置文件
[root@elk91 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 10.0.0.91
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 251
priority 100
advert_int 1
mcast_src_ip 10.0.0.91
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_haproxy
}
virtual_ipaddress {
10.0.0.66
}
}
[root@elk91 ~]#
[root@elk92 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 10.0.0.92
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 251
priority 80
advert_int 1
mcast_src_ip 10.0.0.92
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_haproxy
}
virtual_ipaddress {
10.0.0.66
}
}
[root@elk92 ~]#
[root@elk93 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 10.0.0.93
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 251
priority 60
advert_int 1
mcast_src_ip 10.0.0.93
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_haproxy
}
virtual_ipaddress {
10.0.0.66
}
}
[root@elk93 ~]#
6.3 重启keepalived服务使得配置生效
[root@elk91 ~]# systemctl enable --now keepalived
[root@elk92 ~]# systemctl enable --now keepalived
[root@elk93 ~]# systemctl enable --now keepalived
6.4 启动haproxy负载均衡器
[root@elk91 ~]# systemctl restart haproxy.service
[root@elk91 ~]#
[root@elk91 ~]# ss -ntl | grep 18848
LISTEN 0 4096 10.0.0.66:18848 0.0.0.0:*
[root@elk91 ~]#
[root@elk92 ~]# systemctl restart haproxy.service
[root@elk92 ~]#
[root@elk92 ~]# ss -ntl | grep 18848
LISTEN 0 4096 10.0.0.66:18848 0.0.0.0:*
[root@elk92 ~]#
[root@elk93 ~]# systemctl restart haproxy.service
[root@elk93 ~]#
[root@elk93 ~]# ss -ntl | grep 18848
LISTEN 0 4096 10.0.0.66:18848 0.0.0.0:*
[root@elk93 ~]#
6.5 访问测试验证
http://10.0.0.66:18848/#/login
6.6 验证高可用
[root@elk91 ~]# systemctl stop keepalived
6.7 发现VIP飘逸,但是不影响客户端使用。
Categories: