0%

minio提供对象存储,支持单节点部署及集群部署;集群部署模式下最少4节点,集群需要至少N/2节点在线才可读,至少N/2+1节点在线才可写——准确的说,至少需要4块“盘”,两个节点每个节点两块“盘”也是可行的

以下记录centos 7下的minio单机及集群部署,最初只记录了minio单节点部署,现在进行了完善,替换为minio新版本,通过配置文件的方式自动识别按单机模式或者集群模式启动

阅读全文 »

软件系统尤其是分布式系统需要保持多个节点的主机时间一致。内网环境中可以从授时服务器同步时间,因为不是所有机器都有公网访问权限,因此在内网中搭建了NTP服务器,由NTP服务器向互联网授时服务器同步时间,其他内网服务器向内网NTP服务器同步时间。

通过配置ntp或chrony可以进行服务器时间同步,两者支持作为服务端提供授时服务,或作为客户端从授时服务器同步时间;两者可以单独使用,也可以搭配使用,但是同一主机不要同时启用以避免冲突。比如:

  • NTP服务器A使用ntp服务从互联网授时服务器同步时间,其他内网服务器使用ntp服务从A同步时间
  • NTP服务器A使用chrony服务从互联网授时服务器同步时间,其他内网服务器使用ntp服务从A同步时间
  • NTP服务器A使用ntp服务从互联网授时服务器同步时间,其他内网服务器使用chrony服务从A同步时间
  • NTP服务器A使用chrony服务从互联网授时服务器同步时间,其他内网服务器使用chrony服务从A同步时间

客户端也可以通过crontab+ntpdate的方式从授时服务器同步时间,但是这一方式会引起时间跳变,可能引起意想不到的bug;而ntp/chrony同步时间是步进式的,将逐步调整时间以达到一致

相比于ntp服务,chrony精度更高、同步更快,在centos 7中默认安装了chrony并默认启用

阅读全文 »

代码来自于Spring Boot 2.0.4.RELEASE

SpringApplication类负责由main方法启动spring应用,文档中给出了启动的主要步骤:

  • 创建ApplicationContext
  • 处理命令行参数
  • refresh ApplicationContext,加载bean
  • 触发各类Runner
阅读全文 »

ConcurrentHashMap 的实现比较复杂,里面涉及到的内容很多,而且有很多的性能优化的策略,想全部搞清楚比较困难,所以主要对里面感兴趣的并发的处理方面,相关的几个函数的实现看下,难免有理解不到位的地方,以后随时修改补充吧。

这里看的是 java 7 中的实现。

另外,推荐一篇文章,写的很详细: The Concurrency Of ConcurrentHashMap

阅读全文 »

看了下 java 8 中 HashMap 的源码,结合网上一些文章,大概明白了 HashMap 中几个一直很疑惑的地方。这里就记录一下 HashMap 的学习。

数据结构和一些参数的作用

HashMap 的数据结构“平平无奇”,就是我们熟悉的“数组+链表”的方式(链地址法),并且在链表长度超过某个值(默认为 8)后,将链表转换为红黑树以提高效率。

HashMap 存储数据的数组是:

1
transient Node<K,V>[] table;

也即一个 Node 数组,Node 实现 Entry 接口,每个 Node 存储一个键值对,如下:

1
2
3
4
final int hash;
final K key;
V value;
Node<K,V> next;

其中,hash 是存储的 node 中的 key 的哈希值,key、value 即键和值,而 next 则显然是构建链表的,指向链表的下一个节点。

阅读全文 »

在 Spring Boot 中观察了一下有新的请求时,Servlet filter 的执行情况,做下记录。

Spring Boot 默认 Servlet filter

Spring Boot 会按照 ApplicationFilterChain 中的数组 filters 里保存的 filter 按顺序执行,对于 OrderedFilter 可以指定 order 值(一个 int 值),值小的先执行,不指定 order 时按照首字母顺序执行。

默认情况下,有 CharacterEncodingFilter、HiddenHttpMethodFilter、FormContentFilter 和 RequestContextFilter,以及 webSocket 的 WsFilter。CharacterEncodingFilter、HiddenHttpMethodFilter、FormContentFilter 和 RequestContextFilter 都是使用了 Ordered***Filter 实例,order 值分别是 -2147483648、-10000、-9900 和 -105。

RequestContextFilter 主要用于使用第三方 Servlet 时的情况。关于 CharacterEncodingFilter、HiddenHttpMethodFilter 和 FormContentFilter,其作用可见如下。

阅读全文 »

一直想了解一下 Spring AOP 的实现,所以看了下 java 动态代理(jdk 8)。

java Proxy 实现动态代理

Proxy 原理是在运行期创建指定的被代理接口的一个实现类,这个类是 Proxy 的子类,并使用反射机制,对接口中声明的方法,用 InvocationHandler 转发函数调用。

Proxy 只能代理接口的实现,会被转发到从其原理不难看出,这是因为生成的代理类已经继承了 Proxy,因为 java 单继承的机制,所以只能实现接口作为其代理。

阅读全文 »

项目打包时,直接用spring-boot maven plugin之类插件组装出一个包含了所有依赖的jar,即fat-jar的形式,可以直接启动,部署方便。但是并不是任何时候fat-jar都是最优解。

依赖文件分离打包在几种场景下的优化

稳定版本依赖包的分离对部署的优化

在项目开发中,依赖包我们期望是稳定的:版本的升级一定是审慎进行的,新依赖的加入也需要考量。也因此,在项目部署时,如果只打包源代码到一个thin-jar、将固定不变依赖包分离,打包得到的部署文件体积将大大减小——使用spring boot开发的项目打包成fat-jar百兆起步,但其实源代码打包的thin-jar体积很可能是KB级的。

尤其是在使用docker镜像部署jar时,对于镜像打包有优化:虽然对镜像体积减小不会有优化,但是可以将依赖文件置入单独的镜像层复用,镜像构建时多数情况下(依赖未变更的情况下)只需要重新构建源代码及它之上的层,构建速度将会得到提升。

阅读全文 »

CMD,有多个的话之后最后一个生效,作为启动时的默认命令行和用于向 ENTRYPOINT 传递参数,会被 docker run 带的命令行和参数覆盖。

ENTRYPOINT,有多个时最后一个生效,启动时执行,不会被 docker run 带的命令行和参数覆盖。

exec form 和 shell form

两者都有 exec 和 shell 两种格式的写法,如下:

1
2
3
4
# exec form
ENTRYPOINT ["executable", "param1", "param2"]
#shell form
ENTRYPOINT command param1 param2
阅读全文 »

要在服务器进行一些重复性的体力活,干脆简单看了下shell,下面记录一些内容,都是最基本的用法。

``、’’和””(反引号、单引号和双引号)

以输出为例,``内的内容作为一个命令,先执行其中命令,再执行原命令,即代表命令替换;’’内的原原本本的输出;””内的内容,进行参数替换(如$name)和命令替换(如`echo abc`)。

比如下面代码

1
2
echo "`echo hello world`"
echo '`echo hello world`'

输出将是

1
2
hello world
`echo hello world`
阅读全文 »

对于正则表达式一向了解不多,假期期间随着《正则表达式必知必会》快速学习了一下正则表达式的基本使用,在此记录一下。

正则表达式语法笔记

常用元字符

元字符 作用
. 换行符外任意字符
\d 一个数字,等价于 [0-9]
\D 一个非数字,等价于 [^0-9]
\w 一个数字、字符及下划线,等价于[a-zA-Z0-9_](最后一个是下划线_)
\W 一个非数字、字符和下划线,等价于[^a-zA-Z0-9_](最后一个是下划线_),注意,[]内的 ^,对之后每个组合都取非,不只是紧接的
\s 一个空白字符,等价于[\f\n\r\t\v ](最后有个空格),换页、换行、回车、制表、垂直制表符、空格
\S 一个非空白字符,等价于[^\f\n\r\t\v ](最后有个空格)

要注意,[]内出现的的元字符对应字符,不按照元字符处理,不需要要转义,如“.”、“$”等

阅读全文 »

整理下 Spring 项目中读取 resources 下的文件的方式,包括 Resource 接口,另外跟一下 ResourceUtils 读取资源文件的流程。

File 方式读取

直接使用 File 类的接口读取资源文件,需要注意的是传入应是相对路径,生成的项目文件中资源文件的路径可以参考 target 目录下的结构。比如,资源文件目录下的文件 resources/static/test.html,在生成的 target 目录下路径是:target/classes/static/test.html

阅读全文 »

zabbix提供了监控与告警的全套解决方案,在许多大型企业进行了深度实践,功能强大、产品成熟而稳定

选用5.0.4版本,主要的组件有:

  • zabbix-server,拉取/接收zabbix-agent的数据,计算触发器条件、向用户发送通知等核心功能
  • zabbix-agent,客户端,收集本地监控项数据,并通过主动/被动方式发送到zabbix-server
  • zabbix-proxy,可选,负责从一个或多个受监控设备采集监控数据并将信息发送到zabbix-server,以分担zabbix-server的压力

此外,根据选用的部署组件版本,zabbix-server如果不包含web功能,还需要部署zabbix-web。zabbix使用Mysql关系型数据库作为底层存储(可选mysql、postgresql、sqlite等),在数据量大的时候对数据库的压力较大,限制了大规模集群中 zabbix 的应用,对告警信息汇总运算时性能较差;并且,zabbix为监控主机、网络设备等基础设置而设计,对于容器监控等场景,zabbix只能通过集成定制化脚本的方式实现且功能有限,在云原生环境下的应用受到限制

阅读全文 »

昨天看了下 Spring Security 的使用,打着断点弄清了认证的流程。

首先,可以了解下涉及到的关键的几个类,形成一个整体的了解。

主要的类

  1. Authentication

Authentication接口,子类有 AbstractAuthenticationToken,直接用的实现常是 UsernamePasswordAuthenticationToken 类,用于保存认证信息,最重要的字段有:

  • principal

对应用户名之类的用户ID。

  • credentials

根据用户信息加密生成的凭证,用于认证。

阅读全文 »