minio提供对象存储,支持单节点部署及集群部署;集群部署模式下最少4节点,集群需要至少N/2节点在线才可读,至少N/2+1节点在线才可写——准确的说,至少需要4块“盘”,两个节点每个节点两块“盘”也是可行的
以下记录centos 7下的minio单机及集群部署,最初只记录了minio单节点部署,现在进行了完善,替换为minio新版本,通过配置文件的方式自动识别按单机模式或者集群模式启动
minio提供对象存储,支持单节点部署及集群部署;集群部署模式下最少4节点,集群需要至少N/2节点在线才可读,至少N/2+1节点在线才可写——准确的说,至少需要4块“盘”,两个节点每个节点两块“盘”也是可行的
以下记录centos 7下的minio单机及集群部署,最初只记录了minio单节点部署,现在进行了完善,替换为minio新版本,通过配置文件的方式自动识别按单机模式或者集群模式启动
软件系统尤其是分布式系统需要保持多个节点的主机时间一致。内网环境中可以从授时服务器同步时间,因为不是所有机器都有公网访问权限,因此在内网中搭建了NTP服务器,由NTP服务器向互联网授时服务器同步时间,其他内网服务器向内网NTP服务器同步时间。
通过配置ntp或chrony可以进行服务器时间同步,两者支持作为服务端提供授时服务,或作为客户端从授时服务器同步时间;两者可以单独使用,也可以搭配使用,但是同一主机不要同时启用以避免冲突。比如:
客户端也可以通过crontab+ntpdate的方式从授时服务器同步时间,但是这一方式会引起时间跳变,可能引起意想不到的bug;而ntp/chrony同步时间是步进式的,将逐步调整时间以达到一致
相比于ntp服务,chrony精度更高、同步更快,在centos 7中默认安装了chrony并默认启用
代码来自于Spring Boot 2.0.4.RELEASE
SpringApplication类负责由main方法启动spring应用,文档中给出了启动的主要步骤:
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 | final int hash; |
其中,hash 是存储的 node 中的 key 的哈希值,key、value 即键和值,而 next 则显然是构建链表的,指向链表的下一个节点。
在 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-boot maven plugin之类插件组装出一个包含了所有依赖的jar,即fat-jar的形式,可以直接启动,部署方便。但是并不是任何时候fat-jar都是最优解。
在项目开发中,依赖包我们期望是稳定的:版本的升级一定是审慎进行的,新依赖的加入也需要考量。也因此,在项目部署时,如果只打包源代码到一个thin-jar、将固定不变依赖包分离,打包得到的部署文件体积将大大减小——使用spring boot开发的项目打包成fat-jar百兆起步,但其实源代码打包的thin-jar体积很可能是KB级的。
尤其是在使用docker镜像部署jar时,对于镜像打包有优化:虽然对镜像体积减小不会有优化,但是可以将依赖文件置入单独的镜像层复用,镜像构建时多数情况下(依赖未变更的情况下)只需要重新构建源代码及它之上的层,构建速度将会得到提升。
对于正则表达式一向了解不多,假期期间随着《正则表达式必知必会》快速学习了一下正则表达式的基本使用,在此记录一下。
元字符 | 作用 |
---|---|
. | 换行符外任意字符 |
\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 ](最后有个空格) |
要注意,[]内出现的的元字符对应字符,不按照元字符处理,不需要要转义,如“.”、“$”等
zabbix提供了监控与告警的全套解决方案,在许多大型企业进行了深度实践,功能强大、产品成熟而稳定
选用5.0.4版本,主要的组件有:
此外,根据选用的部署组件版本,zabbix-server如果不包含web功能,还需要部署zabbix-web。zabbix使用Mysql关系型数据库作为底层存储(可选mysql、postgresql、sqlite等),在数据量大的时候对数据库的压力较大,限制了大规模集群中 zabbix 的应用,对告警信息汇总运算时性能较差;并且,zabbix为监控主机、网络设备等基础设置而设计,对于容器监控等场景,zabbix只能通过集成定制化脚本的方式实现且功能有限,在云原生环境下的应用受到限制