ARTS的初衷
Algorithm: 主要是为了编程训练和学习。
Review:主要是为了学习英文
Tip:主要是为了总结和归纳在日常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。
Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章
https://www.zhihu.com/question/301150832
一、Algorithm
Power of Two
Given an integer, write a function to determine if it is a power of two.
Example 1:
Input: 1 Output: true Explanation: 20 = 1 Example 2:
Input: 16 Output: true Explanation: 24 = 16 Example 3:
Input: 218 Output: false
代码语言:javascript复制class Solution {
public boolean isPowerOfTwo(int n) {
//位运算
return n>0 && (n & (n-1))==0;
}
}
二、Review
1、DevOps是什么
DevOps文化的兴起是因为在早期许多开发者对于自己的程序是怎么跑在真实世界中所知有限,开发者要做的事情就是将程序打包好,然后扔给运维部门后,自己的工作周期就结束了,而运维部门会负责将程序部署到所有生产环境的机器上,同时也想尽各种办法和善用各种工具,确保这些程序持续正常地运作,即使运维部门完全不了解研发的程序背后实现细节
这样的工作模式很容易造成两个部门之间的对立,各自的部门都有自己的目标,而各自的目标和公司商业需求可能会不一致。DevOps的出现是为了带来一种新的软件开发文化,以降低开发与运维之间的鸿沟
然而,DevOps的本质并不是教导大家怎么做才会成功,而是订定一些基本原则让大家各自发挥,用程序设计的术语来说,DevOps比较像是一个“抽象类”或是“接口”,定义了这种文化该有什么样的行为,“实现”则是靠各个部门成员一起完成,只要符合规范,就可以说是DevOps文化的实践
SRE概念由Google公司提出,同时提出了更多关于如何用软体工程的方法和从运维的角度出发以保障系统稳定的规范。简单来说,SRE团队”实现”了DevOps这个”接口”。以下列出五点DevOps定义的”接口”以及SRE团队如何”实现”:
- DevOps:减少组织之间的谷仓效应
- SRE团队:和开发团队使用相同的工具和技术
- DevOps:接受失败
- SRE团队:视失败为开发周期中的一个元素,同时建立一套可以量化的指标去衡量失败
- DevOps:逐渐改变
- SRE团队:鼓励通过降低故障成本来达成快速交付的目的
- DevOps:善用工具和自动化
- SRE团队:鼓励团队把重复琐事自动化
- DevOps:任何事都是可以被测量的
- SRE团队:建立关于可用性、运行时间、停机时间的约束规范
2、SRE必知清单
- 1)了解如何获取CPU、操作系统版本等系统信息(cat /proc/version,/proc/cpuinfo,uptime等)
- 2)理解定时任务cron工作原理,学会设置”特定日期/时间/月”周期性cron任务
- 3)了解各种shell之间的区别:sh,dash, bash, ash ,zsh ..
- 4)了解shell配置文件的区别:〜/ .bashrc,.bash_profile,.environment
- 5)了解如何设置和取消设置ENV变量。如何设置永久变量
- 6)了解Vim及其配置(.vimrc)及其一些基本技巧
- 7)理解Swap交换分区工作原理,内核参数swappiness的作用。(swapon -s,/proc/sys/vm/swappiness,sysctl vm.swappiness ..)
- 8)掌握一门脚本语言,如Python,Perl
- 9)掌握有用的命令,如进程监控命令(ps,top,htop,atop ..),系统性能命令(nmon,iostat,sar,vmstat ..)和网络故障排除和分析(nmap,tcpdump,ping,traceroute,airmon,airodump ..)
- 10)了解ext4,ntfs,fat文件系统,了解磁盘阵列RAID原理、种类及性能优缺点对比
- 11)了解系统上查看/设置网络配置的方法
- 12)了解在具有不同子网的计算机上设置静态/动态IP地址
- 13)学会分析和了解网络的工作原理,如tcpdump,Wireshark ..
- 14)理解OSI模型和TCP/IP模型规范,TCP和UDP的区别
- 15)学会设置防火墙iptables:设置规则,列表规则,路由流量,阻塞协议/端口,NAT转换..
- 16)学会查看/设置/备份您的路由器设置
- 17)理解DNS工作原理,了解如何设置DNS服务器(Bind,Unbound,PowerDNS,Dnsmasq ..),了解A、AAAA、CNAME、TXT的区别,理解递归和权威DNS的区别,学会排查DNS问题(nslookup,dig ..etc)
- 18)理解当你在浏览器中输入www.liangsonghua.me然后回车会发生什么?学会从浏览器的缓存,本地DNS缓存,本地网络配置(主机文件),路由,DNS,网络,Web协议,缓存系统到Web服务器进行分析
- 19)熟悉CDN提供商,如fastly,Akamai
- 20)熟悉SSL/TLS的工作原理以及数字证书的工作原理
- 21)了解SSH工作原理,以及调试它以及如何生成ssh密钥以及无密码登录到其他计算机的方法
- 22)了解init系统
- 23)学会设置Web服务器
- 24)学会使用“awk,sed,sort,uniq”分析Nginx访问日志文件
- 25)学会使用日志管理工具(rsyslog,logstash,fluentd,logwatch,awslogs ..)
- 26)学会设置反向代理(Nginx ..)
- 27)学会设置缓存服务器(Squid,Nginx,Varnish ..)
- 28)学会设置负载均衡器(HAproxy,Nginx ..)
- 29)了解L4/L7负载均衡器
- 30)学会为微服务设置API网关(Ambassador,Kong,Traefik,Nginx ..)
- 31)熟悉Systemd以及如何使用systemctl和journalctl等命令分析和管理服务
- 32)熟悉OAuth和SAML或Auth0集成
- 33)熟悉RESTful API,Webhooks,GraphQL,gRPC
- 34)学习根据需要在不同类型的数据库之间进行选择:SQL,NoSQL,TSDB…,学习其备份策略,学习如何测试备分是否可靠
- 35)阅读有关PaaS/Iaas/Saas/CaaS/FaaS/DaaS和serverless架构的信息
- 36)了解如何使用至少一个配置管理和远程执行工具(Ansible,Puppet,SaltStack,Chef ..)。您的选择应基于以下标准:语法,性能,模板语言,推送与拉模型,性能,体系结构,与其他工具的集成,可伸缩性,可用性等等
- 38)学会将Jenkins集成到CI/CD中
- 39)学会设置Consul,用于服务发现
- 40)熟悉可帮助您创建可分发和可移植开发环境的工具Docker容器,熟悉基本的Docker命令(logs,inspect,top,ps,rm),基本的仓库管理命令(push,pull),了解底层架构(cgroups,namespaces)运行原理
- 41)研究容器编排工具:Docker Swarm,Kubernetes,并了解他们的组件及其工作原理
- 42)熟悉Kafka消息引擎
- 43)了解Redis分布式缓存,学习根据应用需求设置和调整Redis
- 44)熟悉Hadoop,HBase,Zookeeper,Spark等大数据框架并搭建高可用集群
- 45)了解应用程序的性质:CPU密集型,内存密集型,I/O密集型
- 46)阅读有关无状态和有状态的应用程序设计
- 47)了解微服务架构的优缺点,并开始构建类似的架构
- 48)了解如何配置和使用持续集成和持续交付工具,如Jenkins,Travis CI,Buildbot,GoCd。将这些工具与其他工具(如构建工具,配置管理软件,Docker,云提供商的SDK ..等)集成
- 49)学习分布式版本控制系统Git及其基本命令(pull,push,commit,clone,branch,merge,logs …等)。了解Git工作流程,了解Git高级用法,如回滚、代码审阅、向开源框架贡献代码等等
- 50)熟悉内核版本的Bug以及如何修补它们
- 51)了解如何生成校验和以验证任何文件的完整性
- 52)了解如何实现零停机部署,了解回滚、自我修复、自动扩展策略
- 53)熟悉API和服务:RESTfull,类似RESTful,API网关,Lambda函数,无服务器计算,SOA,SOAP,JMS,CRUD
- 54)了解如何保护您的基础架构,网络和运行的应用程序
- 55)了解ChatOps并尝试使用其中一个已知框架,如Hubot,Lita,Cog
- 56)了解监控的方式和内容,了解如何配置和使用某些监控系统(Nagios,Zabix,Sensu,Prometheus..etc)
- 57)了解DevOps词汇表
- 58)尝试建立良好的开发实践和坚实的架构
- 59)了解如何在生产级别进行扩展
- 60)了解如何在生产服务器中实时调试和跟踪运行的应用程序
文章参考: https://cloud.google.com/blog/products/gcp/sre-vs-devops-competing-standards-or-close-friends?m=1
https://medium.com/faun/the-must-know-checklist-for-devops-site-reliability-engineers-update-8ba44dbc824
三、Tip
Arrays#asList容易踩的坑
我们习惯使用Arrays#asList将Array转成ArrayList,但是其实Arrays#asList返回的其实是java.util.ArrayList,它是Arrays的定长集合类,它实现了set、get、contains方法,但是没有实现add、remove方法,调用它的add、remove方法实际上会调用父类AbstractList的方法,但是没有具体实现,仅仅抛出UnsupportedOperationException异常。同时java.util.ArrayList参数为可变长泛型,当调用其size方法时得到的将会是泛型对象个数,也就是一。另外asList得到的ArrayList其实是引用赋值,也就是说当外部集合改变时,集合会同步变化,这些都是我们平时需要注意的细节,更多细节的技巧点击阅读[码出高效JAVA代码](http://www.liangsonghua.me/archives/174)