Jenkins升级出现An attempt to save the global configuration was made before it was loaded
CentOS7升级yum安装的Jenkins,升级之后无法进入Jenkins页面,出现以下错误:
java.lang.IllegalStateException: An attempt to save the global configuration was made before it was loaded at jenkins.model.Jenkins.save(Jenkins.java:3379) at jenkins.model.Jenkins.saveQuietly(Jenkins.java:3398) at jenkins.model.Jenkins.setSecurityRealm(Jenkins.java:2637) at jenkins.model.Jenkins$16.run(Jenkins.java:3342) at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:169) at org.jvnet.hudson.reac ...
Prometheus监控JVM
下载下载 jmx_exporter:https://github.com/prometheus/jmx_exporter
配置jmx_exporter
vim /usr/local/jmx_exporter/simple-config.yml
---lowercaseOutputLabelNames: truelowercaseOutputName: truewhitelistObjectNames: ["java.lang:type=OperatingSystem"]rules: - pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):' name: os_$1 type: GAUGE attrNameSnakeCase: true
在应用程序启动命令中添加配置-javaagent:/usr/local/jmx_exporter/jmx_prometheus_jav ...
Prometheus快照
创建快照在启动配置中添加 :
--storage.tsdb.path=/prometheus/data --web.enable-admin-api
创建快照:
curl -XPOST http://localhost:9090/api/v2/admin/tsdb/snapshot
执行完成之后,会在/prometheus/data/下生成snapshot目录,并且里面存放以日期开头的快照目录
恢复快照
关闭prometheus服务
将/prometheus/data改名为/prometheus/data-bak
将/prometheus/data-bak/snapshot的一个日期目录改名为data,并移动到/prometheus目录下
启动prometheus服务
定时备份在crontab里面添加定时计划:
#每周日凌晨备份prometheus数据0 0 * * 0 /usr/bin/curl -XPOST http://lo ...
使用Nginx Ingress实现金丝雀发布
金丝雀发布(灰度发布)旨在以较小的增量步骤来部署应用程序,并将部分流量交给金丝雀发布的版本。具体有下面几种可能,最简单的方法是向新应用提供一定比例的流量;还有就是根据Header、Cookie分割流量。
注解说明通过给ingress资源指定nginx ingress所支持的annotation可实现金丝雀发布。需要给服务创建2个ingress,其中一个是常规ingress,另一个带有
nginx.ingress.kubernetes.io/canary: “true” 表示使用canary ingress
nginx.ingress.kubernetes.io/canary-by-header表示如果请求头中包含指定的 header 名称,并且值为 always,就将该请求转发给该 Ingress 定义的对应后端服务。如果值为 never 则不转发,可以用于回滚到旧版。如果为其他值则忽略该 annotation。
nginx.ingress.kubernetes.io/canary-by-header-value该 annotation 可以作为 canary-by-header 的 ...
Kubernetes实现session会话保持
当流量请求到后端ECS,我们可以通过nginx这类的http服务器来实现会话保持,但是在k8s集群中真正提供服务的是Pod,那么如何实现ECS到Pod这条链路的会话保持呢。
service sessionAffinity通过在service配置文件中加入 sessionAffinity: ClientIP 实现会话保持。
测试例子该deployment会有2个nginx pod副本,在容器中有postStart钩子函数会将pod名称写入到nginx的index.html中,用来使我们看到会话保持的效果。
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx labels: app: nginxspec: replicas: 2 progressDeadlineSeconds: 600 revisionHistoryLimit: 10 strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavai ...
阿里巴巴Arthas-在线诊断工具
阿里巴巴Arthas是一种诊断工具,使我们能够监控、分析和排除Java应用程序的故障。下面,我们将首先安装Arthas,然后通过案例来演示Arthas的一些关键功能。
下载首先,我们可以使用curl下载Arthas:
curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar -h
如果成功,我们应该看到显示所有命令的帮助指南:
案例分析启动math-game下载启动math-game.jar:
curl -O https://arthas.aliyun.com/math-game.jarjava -jar math-game.jar
启动arthas启动arthas-boot.jar:
java -jar arthas-boot.jar
arthas会提示一个菜单来选择我们要附加到哪个进程:
让我们选择名称为math-game.jar的那个,只需要输入前面的数字,在上图中为“1”,然后按Enter。
Arthas现在将附加到这 ...
G1调优
在某些情况下,CMS GC的性能比G1更高,因此一些人推荐在Java8坚持使用CMS,而由于CMS在Java9被启用,切换到另一个GC迫在眉睫,因此转向G1是目前最好的解决方案。
G1基础G1关键设计的目标之一是使垃圾收集导致的stop-the-world暂停持续时间变得可预测和可配置。实际上,G1是一个软实时的垃圾收集器,简单说就是您可以为stop-the-world配置一个毫秒长的时间,G1 GC将尽最大可能实现这个目标。
为实现stop-the-world的时间可预测,G1将堆分成多个(通常大约2048个)可以容纳对象、大小相等的独立区域(Region),可以通过 -XX:G1HeapRegionSize 配置每个Region大小,每个Region大小可以从1MB到32MB不等,并且必须是 2 的幂。
每个Region可能是Eden,也可能是Survivor,也可能是Old,所有的Eden和Survivor区逻辑上组成年轻代,所有Old区逻辑上组成老年代。另外Region还有一类特殊的Humongous区域,专门用来存储大对象。G1认为只要大小超过了一个Region容量一半的对象 ...
CMS调优
CMS基础这个垃圾收集器官方名称是”Mostly Concurrent Mark and Sweep Garbage Collector“。它在年轻代使用”复制”算法,并行进行垃圾回收,在老年代使用并发的“标记清除”算法。
CMS收集器目标是避免在老年代长时间停顿,它通过两种方式实现。首先,它不压缩老年代空间,而是通过空闲列表来管理回收空间。其次,它与应用程序线程同时完成标记和清理阶段的大部分工作。这意味着垃圾收集器不会显式停止应用程序线程来执行这些阶段,然后这也会导致垃圾回收线程和应用程序线程会竞争CPU时间。
CMS收集阶段第一阶段:初始标记该阶段会触发stop-the-world暂停。这个阶段的目标是标记老年代中的所有对象,这些对象要么是直接的GC根,要么是从年轻代中某个活动对象引用的。后者很重要,因为老年代是单独收集的。
第二阶段:并发标记在这个阶段,垃圾收集器会遍历老年代并标记所有活着的对象,从“初始标记”阶段找到的GC根开始。“并发标记”阶段,顾名思义,就是与应用程序线程并发运行,不会停止应用程序线程。请注意,此阶段并不是所有的老年代存活对象都可以被标记,因为应用程序在标记 ...
Garbage Collection
什么是垃圾收集从字面意思来说,顾名思义垃圾收集就是处理垃圾。实际上,它的做法恰恰相反,垃圾收集正在追踪所有仍在使用的对象,将其余的对象标记为垃圾。下面我们深入探究 Java 虚拟机实现“垃圾收集”的自动内存回收过程。
内存管理内存管理主要分为手动内存管理和自动内存管理。
手动内存管理在C语言中通过malloc申请内存,通过free释放内存;C++通过new申请对象使用的内存,通过delete释放内存。对于C和C++这种手动管理内存的方式,很容易忘记释放内存,从而造成内存泄漏。因此,更好的方法是自动回收未使用的内存,这种自动化称为垃圾收集(即GC)。
自动内存管理自动内存管理让开发者不再需要考虑自己清理内存,极大地提高了开发效率。但是这种自动内存管理,也就是说自动释放内存,它该如何定位到垃圾呢?
引用计数Reference Count称为引用计数,为了标记存活对象,引用计数会在每个对象的头上引入一个叫“计数器”的东西,用来记录有多少对象引用了它。
A a = new A();B b = new B();a.ref = b;
对象A的实例在堆中就是一块内存 ...
Kubernetes二进制升级
Kubernetes升级比较简单,小版本的升级只需要更新二进制文件即可,大版本升级需要额外关注组件升级的参数变化。
提前准备好二进制包
升级kubectl(master节点)备份kubectl:
cd /usr/binmv kubectl kubectl.bak_2021-05-27
替换下载的二进制包并查看版本:
[root@master1 bin]# kubectl versionClient Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.3", GitCommit:"01849e73f3c86211f05533c2e807736e776fcf29", GitTreeState:"clean", BuildDate:"2021-02-17T12:44:29Z", GoVersion:"go1.15.8", Compiler:&qu ...