私有云go语言 私有云diy

什么是DockerDocker是一个开源私有云go语言的应用容器引擎私有云go语言,它基于Go语言开发,并遵从Apache2.0开源协议 。使用Docker可以让开发者封装私有云go语言他们私有云go语言的应用以及依赖包到一个可移植的容器中,然后发布到任意Linux机器上,也可以实现虚拟化 。Docker容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性 。
Docker诞生于2013年初,目前有两个版本:Community Edition(CE,社区版)和Enterprise
Edition(EE,企业版) 。
Docker有哪些特点?
1、更高效的利用系统资源
Docker对系统资源的利用率很高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟机技术更高效 。因此 , 对比虚拟化技术,一个相同配置的主机往往可以运行更多数量的应用 。
2、更快速的启动时间
传统的虚拟化技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核 , 无需启动完整的操作系统,因此可以做到秒级 , 甚至毫秒级的启动时间,大大节约了开发测试 , 部署的时间 。
3、一致的运行环境
开发过程中常见的一个问题是环境一致问题,由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中发现 。而Docker的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现这段代码在我机器上没问题这类问题 。
4、持续支付和部署
对开发和运维人员来说,最希望就是一次创建和部署,可以在任意地方运行 。而且使用Docker
file使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像 。
5、更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易 。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本、其运行结果是一致的 。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上 , 而不用担心运行环境的变化导致应用无法正常运行的情况 。
6、更轻松的维护和扩展
Docker使用的分层存储以及镜像技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单 。此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本 。
【Minio】基于AWS S3协议搭建个人云存储服务在2007年,GlusterFS演变为大型分布式存储方案后,任何配备合适硬件的公司,单位都可以利用个做分布式的流媒体,数据分析 。在2011年,Red Hat收购了GlusterFS.
Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目 。Minio兼容Amason的S3分布式对象存储项目 , 采用Golang实现,客户端支持Java,Python,Javacript, Golang语言 。
Minio 提供对象存储服务,兼容了 AWS S3 存储协议 , 用于非结构化的数据存 。非结构化对象,比如图像,音、视频,日志文件,备份镜像…等等管理不方便,不定长,大小变化大、类型多,云端的访问复杂,minio就是来解决这种场景的 。非结构化的文件从数KB到5TB都能很好的支持 。开源并且用 Go 语言开发,有web操作界面,我们可以用它来搭建兼容S3协议的存储云服务 。
Minio可以做为云存储的解决方案用来保存海量的图片,视频,文档 。由于采用Golang实现 , 服务端可以工作在Windows,Linux, OS X和FreeBSD上 。配置简单,基本是复制可执行程序,单行命令可以运行起来 。
官网:
那么,如何自己搭建一个私有的S3存储云服务呢?
官方的话是推荐用Docker来搞,我们先用普通的二进制文件来直接解决了!
######################################################################################
# mkdir /data/aws_s3
# wget
# mvminio /usr/local/bin/
#chmod755/usr/local/bin/minio
# minio server/data/aws_s3
#############################################################
Created minio configuration file successfully at /root/.minio
Endpoint:
AccessKey: U3XLU4IMXY3IDKHU268F
SecretKey: /6NCL6HGacviaCgRqr2qLbVOjhkkJdRpV7wz0JJD
Region:us-east-1
SQS ARNs:
Browser Access:
Command-line Access:
################################################################
$ mc config host add myminioU3XLU4IMXY3IDKHU268F /6NCL6HGacviaCgRqr2qLbVOjhkkJdRpV7wz0JJD
Object API (Amazon S3 compatible):
Go:
Java:
Python:
JavaScript:
Drive Capacity: 8.3 GiB Free, 9.1 GiB Total
##############################################################
我们就成功启动了minio的s3服务,默认端口9000,可以通过网页访问:

注意 :第一次打开时候需要填写AccessKey和SecretKey才能进入,我们上面启动服务的时候,已经看到屏幕有输出:
AccessKey: U3XLU4IMXY3IDKHU268F
SecretKey:6NCL6HGacviaCgRqr2qLbVOjhkkJdRpV7wz0JJD
把这两个Key填入,就能顺利进入,进入后展开页面如下:
这就是我们的S3云存储的管理页面了,看着是不是和七牛什么的提供云存储的产品页面挺像的 , 大家都是基于S3协议开发的!
上传个文件试试:
点击右下角的红色小加号按钮 , 弹出的菜单选择”create bucket”则会创建一个桶 , 输入名字”test”
点击刚才那个红色小加号按钮,这次选择”Upload file”上传文件,给这个桶上传了一个叫login.txt的文本文档
此时页面如下:
至此我们可以看到文件已经上传 , 要访问这个文件,可以点击文件右侧的三个点的按钮,选择分享就可以得到一个外链,在浏览器中访问这个外链就可以直接访问文件 。
那么文件到底被存到哪里去了呢,我们启动命令中其实指定了工作路径/data/aws_s3/,所以到服务器这个目录下看看:
# ls /data/aws_s3/
test
# ls /data/aws_s3/test/
login.txt
桶名称test是一个目录,其下就有上传的login.txt文件 。
如果想指定ip和端口,可以这样写:
# minio server /data/aws_s3 --address=0.0.0.0:9000
如果想让服务在后台运行:
# nohup minio server /data/aws_s3--address=0.0.0.0:443
[1] 19882
// nohup: 忽略输入并把输出追加到启动命令的当前目录下的 "nohup.out"文件
minio可以用来搭建分布式存储系统 GlusterFS , 这样就成了真正的云存储了,有时间再研究下把它从现在的单机测试,变成一朵存储云!
minio官网:
minio官方文档:
minio github主页:
如何通俗解释Docker是什么?通俗解释docker就是集装箱 。
Docker 是一个开源的应用容器引擎私有云go语言,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化 。容器是完全使用沙箱机制,相互之间不会有任何接口 。
一个完整的Docker有以下几个部分组成私有云go语言:
DockerClient客户端 。
Docker Daemon守护进程 。
Docker Image镜像 。
DockerContainer容器 。
在docker的网站上提到了docker的典型场景:
Automating the packaging and deployment of applications(使应用的打包与部署自动化) 。
Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境) 。
Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署) 。
Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务) 。
有没有类似可以搭建私有云笔记的软件?Leanote。
Leanote是一款开源的云笔记程序,使用 golangmongodb 开发,支持 markdown、代码高亮、免打扰“写作模式”,以及将内容发布为博客等 。
Leanote 是一个很好用的云笔记软件,使用 Leanote 可以快速构建我们专属的云笔记,支持Docker,私有云部署 。
另外通过云服务器搭建私有云笔记,建站都是非常不错的选择 。
软件特性
1、笔记:leanote是一个笔记, 你可以用它来管理自己的知识 。
2、博客:将笔记公开, 让知识传播的更远 。
3、分享协作:你也可以将知识分享给你的好友 。
4、两款编辑器, 支持Markdown 。
5、写作模式 。
我为什么从python转向go应puppet大拿刘宇的邀请 , 我去西山居运维团队做了一个简短分享,谈谈为什么我要将我们的项目从python转向go 。
坦白的讲,在一帮python用户面前讲为什么放弃python转而用go其实是一件压力蛮大的事情 , 语言之争就跟vim和emacs之争一样,是一个永恒的无解话题,稍微不注意就可能导致粉丝强烈地反击 。所以我只会从我们项目实际情况出发,来讲讲为什么我最终选择了go 。
为什么放弃python
首先,我其实得说说为什么我们会选择python 。在我加入企业快盘团队之前,整个项目包括更早的金山快盘都是采用python进行开发的 。至于为什么这么选择,当时的架构师葱头告诉我 , 主要是因为python上手简单,开发迅速 。对于团队里面大部分完全没服务端开发经验的同学来说,python真的是一个很好的选择 。
python的简单高效,我是深有体会的 。当时私有云项目也就几个程序员 , 但是我们要服务多家大型企业,进行定制化的开发,多亏了python,我们才能快速出活 。后来企业快盘挂掉之后,我们启动轻办公项目,自然也使用python进行了原始版本的构建 。
python虽然很强大,但我们在使用的时候也碰到了一些问题,主要由如下几个方面:
动态语言
python是一门动态强类型语言 。但是,仍然可能出现intstring这样的运行时错误,因为对于一个变量,在写代码的时候,我们有时候很容易就忘记这个变量到底是啥类型的了 。
在python里面 , 可以允许同名函数的出现,后一个函数会覆盖前一个函数,有一次我们系统一个很严重的错误就是因为这个导致的 。
上面说到的这些,静态语言在编译的时候就能帮我们检测出来,而不需要等到运行时出问题才知道 。虽然我们有很完善的测试用例,但总有case遗漏的情况 。所以每次出现运行时错误,我心里都想着如果能在编译的时候就发现该多好 。
性能
其实这个一直是很多人吐槽python的地方,但python有它适合干的事情,硬是要用python进行一些高性能模块的开发,那也有点难为它了 。
python的GIL导致无法真正的多线程,大家可能会说我用多进程不就完了 。但如果一些计算需要涉及到多进程交互,进程之间的通讯开销也是不得不考虑的 。
无状态的分布式处理使用多进程很方便,譬如处理http请求,我们就是在nginx后面挂载了200多个django server来处理http的,但这么多个进程自然导致整体机器负载偏高 。
但即使我们使用了多个django进程来处理http请求,对于一些超大量请求 , python仍然处理不过来 。所以我们使用openresty,将高频次的http请求使用lua来实现 。可这样又导致使用两种开发语言,而且一些逻辑还得写两份不同的代码 。
同步网络模型
django的网络是同步阻塞的,也就是说,如果我们需要访问外部的一个服务 , 在等待结果返回这段时间,django不能处理任何其他的逻辑(当然,多线程的除外) 。如果访问外部服务需要很长时间,那就意味着我们的整个服务几乎在很长一段时间完全不可用 。
为了解决这个问题,我们只能不断的多开django进程,同时需要保证所有服务都能快速的处理响应,但想想这其实是一件很不靠谱的事情 。
异步网络模型
tornado的网络模型是异步的,这意味着它不会出现django那样因为外部服务不可用导致这个服务无法响应的问题 。话说,比起django,我可是非常喜欢tornado的,小巧简单,以前还写过几篇深入剖析tornado的文章了 。
虽然tornado是异步的,但是python的mysql库都不支持异步,这也就意味着如果我们在tornado里面访问数据库,我们仍然可能面临因为数据库问题造成的整个服务不可用 。
其实异步模型最大的问题在于代码逻辑的割裂 , 因为是事件触发的,所以我们都是通过callback进行相关处理 , 于是代码里面就经常出现干一件事情,传一个callback,然后callback里面又传callback的情况,这样的结果就是整个代码逻辑非常混乱 。
python没有原生的协程支持,虽然可以通过gevent , greenlet这种的上patch方式来支持协程,但毕竟更改了python源码 。另外,python的yield也可以进行简单的协程模拟,但毕竟不能跨堆栈,局限性很大,不知道3.x的版本有没有改进 。
开发运维部署
当我第一次使用python开发项目,我是没成功安装上项目需要的包的,光安装成功mysql库就弄了很久 。后来,是一位同事将他整个python目录打包给我用,我才能正常的将项目跑起来 。话说,现在有了docker,是多么让人幸福的一件事情 。
而部署python服务的时候 , 我们需要在服务器上面安装一堆的包,光是这一点就让人很麻烦,虽然可以通过puppet,salt这些自动化工具解决部署问题,但相比而言,静态编译语言只用扔一个二进制文件,可就方便太多了 。
代码失控
python非常灵活简单,写c几十行代码才能搞定的功能,python一行代码没准就能解决 。但是太简单 , 反而导致很多同学无法对代码进行深层次的思考,对整个架构进行细致的考量 。来了一个需求,啪啪啪 , 键盘敲完开速实现,结果就是代码越来越混乱,最终导致了整个项目代码失控 。
虽然这也有我们自身的原因,譬如没好的代码review机制 , 没有好的项目规范,但个人感觉,如果一个程序员没经过良好的编码训练,用python很容易就写出烂的代码,因为太自由了 。
当然,我这里并不是说用python无法进行大型项目的开发 , 豆瓣,dropbox都是很好的例子 , 只是在我们项目中,我们的python代码失控了 。
上面提到的都是我们在实际项目中使用python遇到的问题,虽然最终都解决了,但是让我愈发的觉得,随着项目复杂度的增大 , 流量性能压力的增大,python并不是一个很好的选择 。
为什么选择go
说完了python , 现在来说说为什么我们选择go 。其实除了python,我们也有其他的选择,java,php,lua(openresty) , 但最终我们选择了go 。
虽然java和php都是最好的编程语言(大家都这么争的),但我更倾向一门更简单的语言 。而openresty , 虽然性能强悍,但lua仍然是动态语言 , 也会碰到前面说的动态语言一些问题 。最后,前金山许式伟用的go,前快盘架构师葱头也用的go,所以我们很自然地选择了go 。
go并不是完美,一堆值得我们吐槽的地方 。
error , 好吧,如果有语言洁癖的同学可能真的受不了go的语法,尤其是约定的最后一个返回值是error 。项目里面经常会充斥这样的代码:
if _, err := w.Write(data1); err != nil {
returun err
}
if _, err := w.Write(data2); err != nil {
returun err
}
难怪有个梗是对于一个需求 , java的程序员在写配置的时候 , go程序员已经写了大部分代码,但是当java的程序员写完的时候,go程序员还在写err != nil 。
这方面,errors-are-values倒是推荐了一个不错的解决方案 。
包管理,go的包管理太弱了,只有一个go get , 也就是如果不小心更新了一个外部库,很有可能就导致现有的代码编译不过了 。虽然已经有很多开源方案 , 譬如godep以及现在才出来的gb等,但毕竟不是官方的 。貌似google也是通过vendor机制来管理第三方库的 。希望go 1.5或者之后的版本能好好处理下这个问题 。
GC,java的GC发展20年了,go才这么点时间 , gc铁定不完善 。所以我们仍然不能随心所欲的写代码 , 不然在大请求量下面gc可能会卡顿整个服务 。所以有时候,该用对象池,内存池的一定要用,虽然代码丑了点,但好歹性能上去了 。
泛型,虽然go有inteface , 但泛型的缺失会让我们在实现一个功能的时候写大量的重复代码,譬如int32和int64类型的sort,我们得为分别写两套代码,好冗余 。go 1.4之后有了go generate的支持,但这种的仍然需要自己根据go的AST库来手动写相关的parser,难度也挺大的 。虽然也有很多开源的generate实现,但毕竟不是官方的 。
当然还有很多值得吐槽的地方,就不一一列举了,但是go仍旧有它的优势 。
静态语言,强类型 。静态编译能帮我们检查出来大量的错误,go的强类型甚至变态到不支持隐式的类型转换 。虽然写代码感觉很别扭,但减少了犯错的可能 。
gofmt,应该这是我知道的第一个官方提供统一格式化代码工具的语言了 。有了gofmt,大家的代码长一个样了,也就没有花括号到底放到结尾还是新开一行这种蛋疼的代码风格讨论了 。因为大家的代码风格一样 , 所以看go的代码很容易 。
天生的并行支持,因为goroutine以及channel,用go写分布式应用,写并发程序异常的容易 。没有了蛋疼的callback导致的代码逻辑割裂,代码逻辑都是顺序的 。
性能,go的性能可能赶不上c,c以及openresty , 但真的也挺强悍的 。在我们的项目中,现在单机就部署了一个go的进程 , 就完全能够胜任以前200个python进程干的事情,而且CPU和MEM占用更低 。
运维部署,直接编译成二进制 , 扔到服务器上面就成 , 比python需要安装一堆的环境那是简单的太多了 。当然,如果有cgo,我们也需要将对应的动态库给扔过去 。
开发效率,虽然go是静态语言,但我个人感觉开发效率真的挺高,直觉上面跟python不相上下 。对于我个人来说 , 最好的例子就是我用go快速开发了非常多的开源组件,譬如ledisdb , go-mysql等,而这些最开始的版本都是在很短的时间里面完成的 。对于我们项目来说,我们也是用go在一个月就重构完成了第一个版本,并发布 。
实际项目中一些Go Tips
到现在为止,我们几乎所有的服务端项目都已经转向go , 当然在使用的时候也遇到了一些问题 , 列出来算是经验分享吧 。
godep,我们使用godep进行第三方库管理,但是godep我碰到的最大的坑就是build tag问题,如果一个文件有build tag , godep很有可能就会忽略这个文件 。
IO deadline , 如果能自己在应用层处理的都自己处理,go的deadline内部是timer来控制 , 但timer内部采用一个array来实现的heap,全局共用一个锁,如果大并发量,并且timer数量过多,timeout变动太频繁,很容易就引起性能问题 。
GC , 这个前面也说了,多用内存池,对象池,另外 , 我还发现,如果对象的生命周期跟goroutine一致,对性能的提升也不错,也在go的group问过相关问题,大家猜测可能是因为一些对象其实是在goroutine的8k栈上面分配的,所以一起回收没有额外GC了 。
Go gob , 如果要做RPC服务,gob并不是一个很好的选择,首先就跟python的pickle不通用,然后为了做不同系统的数据传入,任何包都必须带上类型的详细信息,size太大 。go里面现在还没一套官方的RPC方案,gRPC貌似有上位的可能 。
【私有云go语言 私有云diy】私有云go语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于私有云diy、私有云go语言的信息别忘了在本站进行查找喔 。

    推荐阅读