本文已参与腾源会发起的「开源摘星计划」
- 视频教程一
skywalking8.7.0搭建之centos7安装
- 视频教程二
skywalking8.7.0搭建之es+oap
- 安装规划
skywalking java agent用于采集链路信息,kafak用于信息缓存,skywalking oap cluster(Observability Analysis Platform观测性分析平台)用于链路数据分析,并将数据存储到elasticsearch中,最终提供查询。需要用到:ElasticSearch7.9.1,Zookeeper3.6.2,Kafka2.5.0,Skywalking8.2.0。准备6个虚拟机节点:node1,node2,node3,内存为1G。3台安装springboot应用,包括一个dubbo提供者,一个消费者;同时node1,node2,node3也安装zookeeper集群,kafka集群。另外3台(node4、node5、node6)安装skywalking oap集群和es集群,内存为3G。
- Springboot应用在node1安装sprintboot dubbo consumer,node2上安装sprintboot dubbo provider,node3上安装。
- Skywalking java agent在3个机器上分别安装,分别安装在node1,node2,node3上。
- Kafak安装3个节点集群,分别安装在node1,node2,node3上。
- ElasticSearch安装3个节点集群,分别安装在node4,node5,node6上。
- Skywalking oap(服务端)3个节安装在node4,node5,node6上。
安装准备:我的pc机有32G内存、24个处理器。安装了oracle虚拟机管理器,和secureCRT。更具生产版本下载各个开源软件安装包:
CentOS-7-x86_64-Everything-2009
apache-skywalking-apm-es7-8.2.0.tar
elasticsearch-7.9.1-linux-x86_64.tar
kafka_2.12-2.5.0
node-v16.15.0-linux-x64.tar
apache-zookeeper-3.6.3-bin.tar.gz
网络规划:node1-6地址分别为192.168.0.201-206
- 安装步骤
- 最小安装centos7
设置好root密码,网络,主机名node1
cd /etc/sysconfig/network-scripts/
vi ifcfg-enp0s3
service network restart
hostname node1
vi /etc/hostname
node1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.0.201
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
vi /etc/resolv.conf
nameserver 192.168.0.1
vi /etc/hosts
192.168.0.201 node1
192.168.0.202 node2
192.168.0.203 node3
192.168.0.204 node4
192.168.0.205 node5
192.168.0.206 node6
关闭防火墙:
systemctl stop firewalld.service
systemctl disable firewalld.service
安装基础命令:
yum -y install net-tools.x86_64
yum -y install java
yum -y install httpd-tools
yum -y install wget
传输安装包
把node1 java agent配置文件改好
复制虚拟机完成node2,node3,node4,node5,node6
启动修改IP地址。
-
- Zookeeper集群安装:
下载安装包
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz --no-check-certificate
cd apache-zookeeper-3.6.3-bin
mv conf/zoo_sample.cfg conf/zoo.cfg
vi conf/zoo.cfg
新增配置:
server.1=node1:12888:13888
server.2=node2:12888:13888
server.3=node3:12888:13888
在目录/tmp/zookeeper下新建myid文件,写入一个数字代表Server编号。三个虚拟机分别是1,2,3
三个节点都操作。
cd /root/apache-zookeeper-3.6.3-bin
#启动集群:
bin/zkServer.sh start
#查看状态:
bin/zkServer.sh status
#登录命令行:
bin/zkCli.sh -server
-
- kafka集群安装:
解压安装包,编辑配置文件:
cd /root/kafka_2.12-2.5.0
vi config/server.properties
改下面,broker.id改为节点号,node3就改为3。集群中不能重复。
broker.id=3
listeners=PLAINTEXT://node1:9092
zookeeper.connect=node1:2181,node2:2181,node3:2181
启动zookeeper后20秒再启动kafka。
https://stackoverflow.com/questions/39759071/error-while-starting-kafka-broker/47884301
启动:
cd /root/kafka_2.12-2.5.0
nohup bin/kafka-server-start.sh config/server.properties &
tail -f nohup.out
观察日志:
tail -f logs/server.log
[2022-05-11 02:20:21,680] INFO [KafkaServer id=3] started (kafka.server.KafkaServer)
#查看kafka topic命令
bin/kafka-topics.sh --list --bootstrap-server node2:9092
-
- ElasticSearch集群安装
#文件打开数量调整
vi /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536
#内存使用调整
vi /etc/sysctl.conf
vm.max_map_count = 655360
vm.swappiness=1
sysctl -p #生效
#因为以 root 用户启动不了ES,需要新建用户:
chmod 777 /root
useradd es
passwd es
c
tar -xzf elasticsearch-7.9.1-linux-x86_64.tar.gz #用es用户解压
修改配置文件elasticsearch.yml
cd /root/elasticsearch-7.9.1
vi config/elasticsearch.yml
http.port: 9200
cluster.name: psbc-es
node.name: node4
network.host: node4
discovery.seed_hosts: ["node4", "node5", "node6"]
cluster.initial_master_nodes: ["node4"]
复制虚拟机node5、node6。同样修改配置。
#如果启动锁错误,就删除data目录:rm -rf /root/elasticsearch-7.9.1/data/
启动elasticsearch:
su - es
/root/elasticsearch-7.9.1/bin/elasticsearch -d
tail -f /root/elasticsearch-7.9.1/logs/psbc-es.log
安装es管理界面elasticsearch head。
在windows上解压es-head.rar
在chrome浏览器上安装,设置->扩展程序->加载已解压的扩展程序。点击地址栏右边插
件图标,选择elasticsearch head,再界面中输入http://192.168.0.204:9200/
-
- skywalking oap集群安装
先安装oap。oap启动时会连接kafka并自动创建多个topic。
参考第二节的方法先启动zookeeper集群。查看端口2181
参考第三节启动kafka
参考第四节启动elasticsearch
配置方法参考官网:
https://skywalking.apache.org/docs/main/v8.6.0/en/setup/backend/backend-cluster/
cd /root
tar -xzf apache-skywalking-apm-es7-8.2.0.tar.gz
cd /root/apache-skywalking-apm-bin-es7/
vi config/application.yml
#配置zookeeper集群管理
cluster:
selector: ${SW_CLUSTER:zookeeper}
hostPort: ${SW_CLUSTER_ZK_HOST_PORT:node1:2181}
#配置elasticsearch存储elasticsearch7
storage:
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:node4:9200,node5:9200,node6:9200}
#配置kafka
selector: ${SW_KAFKA_FETCHER:default}
kafka-fetcher:
selector: ${SW_KAFKA_FETCHER:default}
default:
bootstrapServers: ${SW_KAFKA_FETCHER_SERVERS:node1:9092,node2:9092,node3:9092}
启动oap集群:
cd /root/apache-skywalking-apm-bin-es7/
bin/startup.sh
tail -f logs/skywalking-oap-server.log
初次启动会初始化elasticsearch、新建kafak主题
-
- 应用安装,开发见《springboot dubbo应用开发》
首先配置skywalking java agent provider:
配置方法见:
Advanced Reporters | Apache SkyWalking
cd /root/apache-skywalking-apm-bin-es7/
cp -r agent agent-provider
vi agent-provider/config/agent.config
agent.service_name=${SW_AGENT_NAME:psbc_provider}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:node1:9092,node2:9020,node3:9020}
安装kafka插件:
mv optional-reporter-plugins/kafka-reporter-plugin-8.2.0.jar plugins/
同理配置skywalking java agent consumer。
Java agent 配置坑:启动应用后发现“追踪”视图里有VNode:表示有应用跨度丢失。Consumer启动应用时候,链接kafka后,get topic超时导致。
Get KAFKA topic:skywalking-managements error. java.util.concurrent.TimeoutException
可以修改配置文件:
plugin.kafka.get_topic_timeout=${SW_GET_TOPIC_TIMEOUT:20}
启动应用:
nohup java -javaagent:/root/skywalking-agent-provider/skywalking-agent.jar -jar /root/psbc-provider-1.0-SNAPSHOT.jar &
sleep 20
nohup java -javaagent:/root/skywalking-agent-consumer/skywalking-agent.jar -jar /root/psbc-consumer-1.0-SNAPSHOT.jar &
tail -f nohup.out
启动成功会和provider建立长连接:dubbo service com.psbc.api.IHelloService from url ubbo://node2:20880/
在node3上安装postgresql:
使用ab(Apache benchmark)
ab -n3000 -c30 http://node2:8085/hello
- 后续工作
- 为了高度还原生产系统,需要和生产环境进行对比。首先确保逻辑结构一致。如各个部分的版本、配置文件参数、相互连接关系,也包括操作系统参数都要对齐(张明悦);其次要保持和生产环境数据结构一致。例如我们新核心产生的调用链路、调用耗时要精确模拟。最后找出无法实现的差异,做到心中有数。比如机器性能、容量以及我们没有的定制化软件。
- 对比生产系统的定制部分,例如数据计算加工、视图的定制,这就是我们要具备相关开发能力。从而实现工作目标:二次开发。
- 优化完善测试环境配置,解决拓扑图错误问题。
- 按照逻辑结构,对各个部分进行配置对比、压力测试,学习怎样观察系统运行状态;怎样对系统进行扩缩容量;模拟故障场景,并进行处理。
- 快速启动方法
节点1,3:
cd /root/apache-zookeeper-3.6.3-bin
bin/zkServer.sh start
sleep 20
cd /root/kafka_2.12-2.8.1
nohup bin/kafka-server-start.sh config/server.properties &
tail -f nohup.out
节点2:
cd /root/apache-zookeeper-3.6.3-bin
bin/zkServer.sh start
sleep 20
cd /root/kafka_2.12-2.5.0
nohup bin/kafka-server-start.sh config/server.properties &
nohup java -javaagent:/root/skywalking-agent-provider/skywalking-agent.jar -jar /root/psbc-provider-1.0-SNAPSHOT.jar &
nohup java -javaagent:/root/skywalking-agent-consumer/skywalking-agent.jar -jar /root/psbc-consumer-1.0-SNAPSHOT.jar &
tail -f nohup.out
节点4,5,6:
su - es
/root/elasticsearch-7.9.1/bin/elasticsearch -d
#tail -f /root/elasticsearch-7.9.1/logs/psbc-es.log
exit
#等待es启动到黄色状态执行下面
cd /root/apache-skywalking-apm-bin/
bin/startup.sh
tail -f logs/skywalking-oap-server.log
- 代码学习
- 下载解压8.7.0
- 学习protobuf
- 加入protobuf源码
- Protobuf是用来序列化通讯数据的。
- 使用方法是
- 编辑.proto文件类似这样:
syntax = "proto3";
option java_package = "com.test";
option java_outer_classname = "GpsDataProto";
message gps_data {
int64 id = 1;
string terminalId = 2;
string dataTime = 3;
double lon = 4;
double lat = 5;
float speed = 6;
int32 altitude = 7;
int32 locType = 8;
int32 gpsStatus = 9;
float direction = 10;
int32 satellite = 11;
}
- 编译成java代码:
protoc -I=src/main/resource/proto --java_out=src/main/java gps_data.proto
- 代码中进行序列化和反序列化
GpsDataProto.gps_data gps_data = gps_builder.build();
gps_data.toByteArray()
GpsDataProto.gps_data.parseFrom(gps_data.toByteArray()
- 从agent开始,premaim开始
- Javaagent原理,静态启动,使用-javaagent参数在系统启动时候挂载。
源码概览介绍:Skywalking:源码阅览 - 简书
Java agent:Java Agent 调试,Java agent debug_汪小哥的博客-CSDN博客_javaagent调试
Java aop:https://www.jianshu.com/p/602f9f42891f
拦截函数入口,出口得到参数、返回值等,可以计算耗时
Skywalking java agent 启动流程:
- 先用启动命令行参数,初始化配置。
- 载入所有的插件,以及插件的配置。
- 构建java agent
Oap代码读解
预备知识:javaagent原理;aop面向切面编程,classloader,spi,opentracing,
java classloader:
bootstrapclassloader加载JAVA_HOME/lib/rt.jar中的类;extensionclassloader加载JAVA_HOME/lib/ext/*.jar;appclassloader加载classpath中的jar。Classloader是一个类隔离器,也是一个容器。一个classloader容器内的类是需要唯一的。而且可以从classloader可以从父类中共享类。
skywalking-segments topic 是处理segment的通道。segment是跨度(span)的集合。它包含一次请求中的所有跨度。Agent应该一次性报告一个请求的所有跨度。通常,在Java中,一个segment代表同一线程中一个请求的所有跟踪(跨度)。