gitlab + jenkins + salt持续集成

运维 Something 发表了文章 2 个评论 10245 次浏览 2016-03-28 00:48 来自相关话题

目的:主要是了解持续集成方面的知识,分析gitlab的对于svn的优势,了解gitlab和jenkins的原理,再配合脚本和salt做一个简易的持续集成。 环境我使用三台机器做测试: 三台机器系统都是centos7,selinux di ...查看全部
目的:
主要是了解持续集成方面的知识,分析gitlab的对于svn的优势,了解gitlab和jenkins的原理,再配合脚本和salt做一个简易的持续集成。

环境
我使用三台机器做测试:
三台机器系统都是centos7,selinux disabled,iptables disabled
192.168.46.66 jenkins salt-master
192.168.46.82 gitlab
192.168.46.105 nginx salt-minion
该测试大致过程
通过提交代码到gitlab触发jenkins构建,jenkins调用脚本打包程序,通过salt分发包,并通过salt部署包


安装


1.1 安装jenkins
官网安装文档:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins#InstallingJenkins-Unix%2FLinuxInstallation

我装的稳定版本:
1.1.1 添加Jenkins的源(repository):
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum install jenkins

1.1.2 安装/检查JDK
[root@localhost jenkins]# yum install java -y
[root@localhost jenkins]# java -version
openjdk version "1.8.0_71"
OpenJDK Runtime Environment (build 1.8.0_71-b15)
OpenJDK 64-Bit Server VM (build 25.71-b15, mixed mode)

1.1.3 安装Jenkins:
[root@localhost jenkins]#yum install jenkins

遇到错误
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
jenkins-1.653-1.1.noarch.rpm FAILED
http://pkg.jenkins-ci.org/redhat-stable/jenkins-1.653-1.1.noarch.rpm: [Errno 14] HTTP Error 404 - Not Found ] 0.0 B/s | 0 B --:--:-- ETA
Trying other mirror.
[root@localhost ~]# yum install -y deltarpm
继续安装jenkins
[root@localhost jenkins]#yum install jenkins

如果有防火墙
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
firewall-cmd --list-all

/usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里。
/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME”等都可以在这里配置
/var/lib/jenkins/:默认的JENKINS_HOME。
/var/log/jenkins/jenkins.log:Jenkins日志文件。

启动Jenkins
[root@localhost jenkins]# /sbin/chkconfig jenkins on
[root@localhost jenkins]# systemctl start jenkins
1.1.4 安装salt-master
1.1.4.1 导入key
rpm --import https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
1.1.4.2 编辑源/etc/yum.repos.d/saltstack.repo
[saltstack-repo]
name=SaltStack repo for RHEL/CentOS $releasever
baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest
enabled=1
gpgcheck=1
gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub
1.1.4.3 安装master
yum install salt-master -y
1.1.4.4 启动
systemctl enable salt-master
systemctl start salt-master
访问 192.168.46.66:8080 
jenkins.png

1.2 gitlab安装
官网安装文档:https://www.elastic.co/guide/index.html

1.2.1 安装相关软件
yum install curl policycoreutils openssh-server openssh-clients
systemctl enable sshd
systemctl start sshd
yum install postfix
systemctl enable postfix
systemctl start postfix
firewall-cmd --permanent --add-service=http
systemctl reload firewalld

1.2.2 下载安装gitlab包
curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-8.5.5-ce.0.el7.x86_64.rpm/download
rpm -i gitlab-ce-8.5.5-ce.0.el7.x86_64.rpm

1.2.3 配置启动gitlab
gitlab-ctl reconfigure
gitlab-ctl --help 查看帮助
[root@localhost ~]# gitlab-ctl service-list
gitlab-workhorse*
logrotate*
nginx*
postgresql*
redis*
sidekiq*
unicorn*

1.2.4 登陆 192.168.46.82
Username: root
Password: 5iveL!fe
第一次登陆会让你修改密码
gitlab.png

1.3 nginx安装
1.3.1 安装nginx
yum install -y nginx
启动nginx
nginx
1.3.2 安装salt-minion
1.3.2.1 导入key
rpm --import https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
1.3.2.2 编辑源/etc/yum.repos.d/saltstack.repo
[saltstack-repo]
name=SaltStack repo for RHEL/CentOS $releasever
baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest
enabled=1
gpgcheck=1
gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub
1.3.2.3 安装master
yum install salt-master -y
1.3.2.4 启动
systemctl enable salt-minion
systemctl start salt-minion


配置


2.1 配置46.105 nginx
2.1.1 配置nginx 
我的代码会发布到/usr/share/nginx/html/demo目录中
[root@nginx ~]# vim /etc/nginx/nginx.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html/demo;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
重启nginx
nginx -s reload
2.1.2 配置salt-minion
[root@nginx ~]# vim /etc/salt/minion
master: 192.168.46.66
id: nginx
重启minion
systemctl restart salt-minion

在46.66 salt-master 加入nginx
salt-key -a nginx
2.2 配置46.82 gitlab​
2.2.1 创建一个demo项目
gitlab2.png
2.2.2 在46.66上创建ssh key  
把公钥拷贝过来,私钥会拷到jenkins上,就可以无密码通信了
gitlab3.png
2.2.3 配置gitlab的web hooks
当有push时会触发jenkins构建
url为: http://192.168.46.66:8080/git/notifyCommit?url=git@192.168.46.82:root/demo.git
/git/notifyCommit?url=前为jenkins的地址和端口
/git/notifyCommit?url=后为git项目地址
2.2.4 配置salt master
vim /etc/salt/master
file_roots:
base:
- /srv/salt
重启salt-master
systemctl restart salt-master
gitlab4.png

2.2 配置46.66 jenkins
2.2.1 配置jenkins 
系统设置

jenkins2.png

jenkins3.png

创建项目
jenkins5.png

添加私钥
jenkins6.png

jenkins7.png

jenkins8.png
脚本放在/project
[root@jenkins01 project]# ls
code config deploy.sh package
code 代码目录
config 配置文件目录
package 代码打包后存放目录

deploy.sh jenkins构建时调用脚本
[root@jenkins01 project]# cat deploy.sh
#!/usr/bin/bash
###########[size=16]#[/size]
#author:CM
#mail:kakaximeng@163.com
#########[size=16]#[/size]
[size=16]提前建立相应的目录[/size]
LOCK_FILE="/project/lock"
CODE_PATH="/project/code"
DEMO_PATH="/project/code/demo"
PACKAGE_PATH="/srv/salt/package"
SALT_PACKAGE_PATH="package"
CONFIG_PATH="/project/config"
LOG_FILE="/project/deploy.log"
DEST_PROJECT="/project"
CTIME=$(date "+%Y-%m-%d-%H-%M")


Usage(){
echo "Usage: $0 ( deploy | list | rollback edition)"
}


Lock_judge(){
if [ -f $LOCK_FILE ];then
echo "warnning !!! someone else must deploy new version or rollback old version! please wait."
exit 2
else
touch -f $LOCK_FILE
fi
}

Delete_lock_file(){
if [ -f $LOCK_FILE ];then
rm -f $LOCK_FILE
fi
}

Deploy_code(){
Lock_judge
tag=$?
echo $tag
if [ $tag == 0 ];then
cd $DEMO_PATH
git pull
Commit=$(git log|head -n 1|cut -d ' ' -f 2)
Com_ID=$(echo ${Commit:0:6})
cp -r $DEMO_PATH ${PACKAGE_PATH}/demo_${Com_ID}_${CTIME}
cp -r ${CONFIG_PATH}/* ${PACKAGE_PATH}/demo_${Com_ID}_${CTIME}/
cd $PACKAGE_PATH
tar -zcf demo_${Com_ID}_${CTIME}.tar.gz demo_${Com_ID}_${CTIME}
salt "nginx" cp.get_file salt://${SALT_PACKAGE_PATH}/demo_${Com_ID}_${CTIME}.tar.gz ${DEST_PROJECT}/demo_${Com_ID}_${CTIME}.tar.gz
salt "nginx" cmd.run "cd ${DEST_PROJECT} && tar -zxf demo_${Com_ID}_${CTIME}.tar.gz && rm -f /usr/share/nginx/html/demo && ln -s ${DEST_PROJECT}/demo_${Com_ID}_${CTIME} /usr/share/nginx/html/demo && nginx -s reload"
fi
Delete_lock_file
}

Edition_list(){
salt 'nginx' cmd.run "ls -l ${DEST_PROJECT}|grep ^d"
}

Rollback_code(){
Lock_judge
salt 'nginx' cmd.run "rm -f /usr/share/nginx/html/demo && ln -s ${DEST_PROJECT}/$1 /usr/share/nginx/html/demo"
Delete_lock_file
}

main(){
case $1 in
deploy)
Deploy_code
;;
list)
Edition_list
;;
rollback)
Rollback_code $2
;;
*)
echo $1
Usage
;;
esac
}

main $1 $2

#脚本没有完善,没有写日志


测试


我之前已经推上去代码
jenkins9.png

nginx1.png
vim index.html

Adam Jensen


今晚上吃


西红柿鸡


西红牛腩


git add index.html
git commit -m "牛腩"
git push origin master
jenkins10.png

nginx2.png
回滚
[root@jenkins01 project]# ls
code config deploy.sh package
[root@jenkins01 project]# sh deploy.sh list
nginx:
drwxr-xr-x 7 root root 129 Mar 23 09:28 demo_205d03_2016-03-23-09-28
drwxr-xr-x 7 root root 129 Mar 23 17:04 demo_3c2a63_2016-03-23-17-04
drwxr-xr-x 7 root root 129 Mar 22 09:21 demo_43fabe_2016-03-22-09-21
drwxr-xr-x 7 root root 151 Mar 21 17:41 demo_4c5be1_2016-03-21-17-41
drwxr-xr-x 7 root root 151 Mar 21 17:48 demo_4c5be1_2016-03-21-17-48
drwxr-xr-x 7 root root 119 Mar 21 14:46 demo_574cdd_2016-03-21-14-46
drwxr-xr-x 7 root root 119 Mar 21 14:48 demo_574cdd_2016-03-21-14-48
drwxr-xr-x 7 root root 119 Mar 21 14:49 demo_574cdd_2016-03-21-14-49
drwxr-xr-x 7 root root 119 Mar 21 14:56 demo_574cdd_2016-03-21-14-56
drwxr-xr-x 7 root root 129 Mar 21 15:59 demo_8c7d37_2016-03-21-15-59
drwxr-xr-x 7 root root 129 Mar 23 17:22 demo_8cc9b4_2016-03-23-17-22
drwxr-xr-x 7 root root 129 Mar 21 15:41 demo_a2333d_2016-03-21-15-41
drwxr-xr-x 7 root root 129 Mar 23 17:03 demo_d5f4f3_2016-03-23-17-03

[root@jenkins01 project]# sh deploy.sh rollback demo_3c2a63_2016-03-23-17-04
nginx3.jpg

安装Rabbitmq出现的错误

大数据 Something 回复了问题 2 人关注 1 个回复 7521 次浏览 2016-03-28 00:28 来自相关话题

Centos下NTP时间服务器配置详解

运维 Rock 发表了文章 0 个评论 5076 次浏览 2016-03-27 03:10 来自相关话题

NTP简介 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度 ...查看全部


NTP简介


NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
NTP服务器就是利用NTP协议提供时间同步服务的。


NTP服务器安装


# 系统自带ntp软件包
[root@node ~]# rpm -qa ntp
ntp-4.2.6p5-5.el6.centos.x86_64
# 如果没有就安装
[root@node ~]# yum -y install ntp


配置NTP服务


[root@node ~]# vim /etc/ntp.conf
# restrict default kod nomodify notrap nopeer noquery
restrict default nomodify
# nomodify客户端可以同步
# 将默认时间同步源注释改用可用源
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
server ntp1.aliyun.com #阿里时间服务器
server s2m.time.edu.cn #北京教育网时间服务器


启动NTP服务器


# 如果计划任务有时间同步,先注释,两种用法会冲突。
[root@node ~]# crontab -e
# time sync cron
#[i]/3 [/i] [i] [/i] * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
[root@node ~]# /etc/init.d/ntpd start
Starting ntpd: [ OK ]
[root@node ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntp1.aliyun.com 10.137.38.86 2 u 22 64 1 525.885 -42.367 0.000
[root@node ~]# ntpstat
synchronised to NTP server (110.75.186.247) at stratum 3
time correct to within 4257 ms
polling server every 64 s


客户机时间同步


客户机要等几分钟再与新启动的ntp服务器进行时间同步,否则会提示no server suitable for synchronization found错误。
[root@node ~]# ntpdate 10.0.1.110 (ntp_server_ip)
27 Mar 18:40:16 ntpdate[1453]: step time server 10.0.1.110 offset 40.880807 sec
# 将命令放入计划任务即可。

Elasticsearch内存分配设置详解

大数据 空心菜 发表了文章 0 个评论 11050 次浏览 2016-03-27 02:35 来自相关话题

Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了。如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题。   这里有两种方式修改Elasticsearch的堆内存(下面就说内 ...查看全部
Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了。如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题。
 
这里有两种方式修改Elasticsearch的堆内存(下面就说内存好了),最简单的一个方法就是指定ES_HEAP_SIZE环境变量。服务进程在启动时候会读取这个变量,并相应的设置堆的大小。设置命令如下:
export ES_HEAP_SIZE=10g
此外,你也可以通过命令行参数的形式,在程序启动的时候把内存大小传递给它:
./bin/elasticsearch -Xmx10g -Xms10g
备注:确保Xmx和Xms的大小是相同的,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力。
一般来说设置ES_HEAP_SIZE环境变量,比直接写-Xmx10g  -Xms10g更好一点。


把内存的一半给Lucene


一个常见的问题是配置一个大内存,假设你有一个64G内存的机器,按照正常思维思考,你可能会认为把64G内存都给Elasticsearch比较好,但现实是这样吗, 越大越好?
 
当然,内存对于Elasticsearch来说绝对是重要的,用于更多的内存数据提供更快的操作,而且还有一个内存消耗大户-Lucene。
 
Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。
 
Lucene的性能取决于和OS的交互,如果你把所有的内存都分配给Elasticsearch,不留一点给Lucene,那你的全文检索性能会很差的。
 
最后标准的建议是把50%的内存给elasticsearch,剩下的50%也不会没有用处的,Lucene会很快吞噬剩下的这部分内存用于文件缓存。


不要超过32G


这里有另外一个原因不分配大内存给Elasticsearch,事实上jvm在内存小于32G的时候会采用一个内存对象指针压缩技术。
 
在java中,所有的对象都分配在堆上,然后有一个指针引用它。指向这些对象的指针大小通常是CPU的字长的大小,不是32bit就是64bit,这取决于你的处理器,指针指向了你的值的精确位置。
 
对于32位系统,你的内存最大可使用4G。对于64系统可以使用更大的内存。但是64位的指针意味着更大的浪费,因为你的指针本身大了。浪费内存不算,更糟糕的是,更大的指针在主内存和缓存器(例如LLC, L1等)之间移动数据的时候,会占用更多的带宽。
 
Java 使用一个叫内存指针压缩的技术来解决这个问题。它的指针不再表示对象在内存中的精确位置,而是表示偏移量。这意味着32位的指针可以引用40亿个对象,而不是40亿个字节。最终,也就是说堆内存长到32G的物理内存,也可以用32bit的指针表示。
 
一旦你越过那个神奇的30-32G的边界,指针就会切回普通对象的指针,每个对象的指针都变长了,就会使用更多的CPU内存带宽,也就是说你实际上失去了更多的内存。事实上当内存到达40-50GB的时候,有效内存才相当于使用内存对象指针压缩技术时候的32G内存。
 
这段描述的意思就是说:即便你有足够的内存,也尽量不要超过32G,因为它浪费了内存,降低了CPU的性能,还要让GC应对大内存。


1TB内存的机器


32GB是ES一个内存设置限制,那如果你的机器有很大的内存怎么办呢?现在的机器内存普遍增长,你现在都可以看到有300-500GB内存的机器。

首先,我们建议编码使用这样的大型机
其次,如果你已经有了这样的机器,你有两个可选项:
    []你主要做全文检索吗?考虑给Elasticsearch 32G内存,剩下的交给Lucene用作操作系统的文件系统缓存,所有的segment都缓存起来,会加快全文检索。[/][]你需要更多的排序和聚合?你希望更大的堆内存。你可以考虑一台机器上创建两个或者更多ES节点,而不要部署一个使用32+GB内存的节点。仍然要 坚持50%原则,假设 你有个机器有128G内存,你可以创建两个node,使用32G内存。也就是说64G内存给ES的堆内存,剩下的64G给Lucene。[/]

如果你选择第二种,你需要配置cluster.routing.allocation.same_shard.host:true。这会防止同一个shard的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了)。


swapping是性能的坟墓


这是显而易见的,但是还是有必要说的更清楚一点,内存交换到磁盘对服务器性能来说是致命的。想想看一个内存的操作必须是快速的。
 
 
如果内存交换到磁盘上,一个100微秒的操作可能变成10毫秒,再想想那么多10微秒的操作时延累加起来。不难看出swapping对于性能是多么可怕。
 
最好的办法就是在你的操作系统中完全禁用swapping。这样可以暂时禁用:
swapoff -a
为了永久禁用它,你可能需要修改/etc/fstab文件,这要参考你的操作系统相关文档。
 
如果完全禁用swap,对你来说是不可行的。你可以降低swappiness 的值,这个值决定操作系统交换内存的频率。这可以预防正常情况下发生交换。但仍允许os在紧急情况下发生交换。
 
对于大部分Linux操作系统,可以在sysctl 中这样配置:
vm.swappiness = 1
备注:swappiness设置为1比设置为0要好,因为在一些内核版本,swappness=0会引发OOM(内存溢出)
 
最后,如果上面的方法都不能做到,你需要打开配置文件中的mlockall开关,它的作用就是运行JVM锁住内存,禁止OS交换出去。在elasticsearch.yml配置如下:
bootstrap.mlockall: true


参考地址:https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.htm


Docker 终于有 Windows 和 Mac 版了

科技前沿 push 发表了文章 0 个评论 3343 次浏览 2016-03-25 12:07 来自相关话题

今天是Docker容器化系统的第三个生日,为了庆祝该公司推出了其软件的Mac和Windows测试版程序。 它提供了一个集成的、易于部署的环境,用于构建、组装和运输在Mac或Windows系统上的应用程序,同时在Docker工具箱上也具 ...查看全部
docker.png

今天是Docker容器化系统的第三个生日,为了庆祝该公司推出了其软件的Mac和Windows测试版程序。

它提供了一个集成的、易于部署的环境,用于构建、组装和运输在Mac或Windows系统上的应用程序,同时在Docker工具箱上也具有诸多改进。

Docker的Mac和Windows版本开发并不需要专用的机器,这使开发者更容易开发,并为他们在本地主机网络上访问容器运行提供方便。它包括一个用于容器的DNS服务器,并与Mac OS X和Windows网络系统集成。在Mac上,Docker甚至可以在连接到企业VPN。

Docker的Mac版本可以与Docker工具箱在同一时间同一台机器上使用,允许开发人员继续使用工具箱来评估Docker的Mac版本。而在Windows系统上你需要在使用Docker之前停止使用工具箱。

“Docker的Mac产品已经解决了对我们来说的所有这些问题,多亏了原生的Mac应用程序,安装已显著顺畅,并能自动更新。官方图片现在在Mac上只是‘仅仅工作’,而新开发的工作流使工程师能够快速运行服务的新版本,在他们的Mac上开发原生软件,一切都仅仅只是工作。”Mixcloud——少数几家曾使用过内测软件的公司之一的联合创始人Mat Clayton如是说。

如果您有兴趣参与内测,你可以通过注册Docker网站,接收邀请。Docker的Mac和Windows版本正处于不同的发展阶段,虽然他们共享一个主要的代码库。Docker的Windows版本最初以较慢的速度推送给用户,但最终也将与Mac版本有相同的功能。Windows版本目前只适用于支持Hyper-V的Windows10。


英文原文链接:http://betanews.com/2016/03/24/docker-windows-mac/
中文翻译链接:http://www.oschina.net/news/71885/docker-to-mac-windows


为什么需要学习Docker?

大数据 being 发表了文章 0 个评论 3985 次浏览 2016-03-23 23:56 来自相关话题

Docker的历史和现状分析 曾经我们都在做一个称之为PAAS的平台  PAAS平台的范围和内容  ...查看全部


Docker的历史和现状分析


曾经我们都在做一个称之为PAAS的平台 
paas.png

PAAS平台的范围和内容 
fc.png

老一代的PAAS平台的局限性和困境 
    []主要提供应用的部署和托管[/][]针对应用开发者[/][]仅支持特定的IaaS基础技术 [/][]支持单种开发语言和框架 [/][]支持特定的服务,比如自定义的数据存储APIs [/][]没有很好的解决常用中间件的部署问题 [/][]难以解决应用和资源的隔离问题[/]
新一代的PAAS平台 新一代的云应用平台技术则实现全方位的应用生命周期管理,关注开放性、应用的可移植性和云间相互操作性, 其代表者包括Cloud Foundry, OpenShift, Docker, Heroku, MoPaaS等PaaS技术或服务,除了在第一代PaaS 技术对用户在实现应用交付的加速所提供的功能外,具备以下大多数特征: 多语言和框架:支持多语言和框架以及语言框架的扩展机制多服务:开放的核心服务以及服务的扩展机制多云和多IaaS技术:支持多种IaaS技术和多云的部署,包括公有云和私有云 
docker.png
dotCloud 不仅支持诸如 PHP、MySql 等传统技术框架,还包括 Node.js、MongoDB 等新兴技术。基于 dotCloud 提供 的开发工具和技术框架,你可以直接使用dotCloud的SDK编写代码和构建业务服务,并在联网的时候把这些代码 推送到云端,实现自动部署和测试。
dockerqy.png
2014.1 被BLACK DUCK 评选为2013年10大开源新项目“TOP 10 OPEN SOURCE ROOKIE OF THE YEAR” 2014.9获取4000万美元融资,此时已经累计融资6600万美元2015.4月获取了9500万美元融资, 已经确立了在第三代PaaS市场的主导地位。2015.6月DockerCon 2015大会上,Linux 基金会与行业巨头联手打造开放容器技术项目Open Container ProjectDocker生态圈 
stq.png
Docker已经收购了一系列创业公司,包括KiteMatic、Koality和Socketplane。完成新一轮投资后,Docker计划加 快产品推进计划,在本季度推出Docker Hub企业版,并且在接下来几个月在存储、网络和安全三个产品方向发力。
红帽在新的RHEL 7版本中增添了支持Docker的功能,IBM公开拥抱Docker和容器,亚马逊推出了EC2容器服 务,就连公认的竞争对手VMware也宣布支持Docker。
国内,不仅腾讯、阿里、百度、Ucloud、青云等云计算服务提供商已经将Docker用到实践,还有数家Docker初 创企业在获得了天使投资后正在辛勤的开发,准备将产品尽快发布到市场上。
腾讯云计算公司对外宣布成为中国首家支持Docker Machine的云计算厂商,并将自身定位于Docker基础设施的服 务商,迈出构建Docker“航运”基础设施的第一步。同时,在支持Docker Machine前提下,腾讯云也推出了常用 系统的标准版Docker镜像,以方便用户能够一键便捷创建容器。
Docker生态圈,2014-2015发展 
    []贡献者增长了183%;[/][]GitHub上关于Docker的项目增长了515%; [/][]Docker提供的工作机会增长了1720%; [/][]使用Docker构建的应用程序增长了934%(Boot2Docker下载量增 加了1456%); [/][]容器的下载量增加了18082%(这个是根据DockerHub上镜像下载 量来统计的)。[/][]Docker Hub业务的进展:用户数量增长至24万,Repo增长至 15万,Pull的数量超过5亿次[/]

Docker的技术原理介绍 

Docker就是虚拟化的一种轻量级替代技术。Docker的容器技术不依赖任何语言、框架或系统,可以将App变成一种 标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行
简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件 可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响,这是docker最普遍的一个玩法。
jsyl.png
Docker相关的核心技术 
hj.png
Docker相关的核心技术之cgroups 
Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源。于是就出现了cgroups的概念, cgroup就是controller group ,在这个group中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等。 cgroups是将任意进程进行分组化管理的Linux内核功能。最初由google的工程师提出,后来被整合进Linux内核中。
cgroups中的 重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系 统是控制cpu时间分配的。首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在 memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入, 这就完成了内存的资源限制。
cgroups 被Linux内核支持,有得天独厚的性能优势,发展势头迅猛。在很多领域可以取代虚拟化技术分割资源。 cgroup默认有诸多资源组,可以限制几乎所有服务器上的资源:cpu mem iops,iobandwide,net,device acess等
Docker相关的核心技术之LXC
LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制和cgroup限额功能,LXC提供了一套统一的API和工具来建立和管理container。LXC跟其他操作系统层次的虚 拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁
LXC 旨在提供一个共享kernel的 OS 级虚拟化方法,在执行时不用重复加载Kernel, 且container的kernel与host 共享,因此可以大大加快container的 启动过程,并显著减少内存消耗,容器在提供隔离的同时,还通过共享这 些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。 在实际测试中,基于LXC的虚拟化方法的IO和CPU性能几乎接近baremetal的性能。
虽然容器所使用的这种类型的隔离总的来说非常强大,然而是不是像运行在hypervisor上的虚拟机那么强壮仍具有 争议性。如果内核停止,那么所有的容器就会停止运行。
    []性能方面:LXC>>KVM>>XEN[/][]内存利用率:LXC>>KVM>>XEN [/]
    []隔离程度:XEN>>KVM>>LXC [/]
Docker相关的核心技术之AUFS 
什么是AUFS? AuFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。 支持将不同目录挂载到同一 个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文 件系统不用格式化,直接挂载即可。
Docker一直在用AuFS作为容器的文件系统。当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。 AuFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制( copy on write )。
AuFS允许Docker把某些镜像作为容器的基础。例如,你可能有一个可以作为很多不同容器的基础的CentOS 系统镜像。多亏AuFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。
使用AuFS的另一个好处是Docker的版本容器镜像能力。每个新版本都是一个与之前版本的简单差异改动, 有效地保持镜像文件最小化。但,这也意味着你总是要有一个记录该容器从一个版本到另一个版本改动的审计跟踪。
build.png
Docker全生命周期开发模式 
zq.png
Docker正在迅速改变云计 算领域的运作规则,并彻 底颠覆云技术的发展前景 从持续集成/持续交付到微 服务、开源协作乃至 DevOps,Docker一路走来 已经给应用程序开发生命 周期以及云工程技术实践 带来了巨大变革。

Docker的基本概念

Docker Image 
    []Docker Image是一个极度精简版的Linux程序运行环境,比如vi这种基本 的工具没有,官网的Java镜像包括的东西更少,除非是镜像叠加方式的, 如Centos+Java7[/][]Docker Image是需要定制化Build的一个“安装包”,包括基础镜像+应 用的二进制部署包[/][]Docker Image内不建议有运行期需要修改的配置文件[/][]Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image[/][]Docker Image的最佳实践之一是尽量重用和使用网上公开的基础镜像[/]
Docker Container 
    []Docker Container是Image的实例,共享内核[/][]Docker Container里可以运行不同Os的Image,比如Ubuntu的或者Centos[/][]Docker Container不建议内部开启一个SSHD服务,1.3版本后新增了docker exec命令进入容器排查问题。[/][]Docker Container没有IP地址,通常不会有服务端口暴露,是一个封闭的“盒子/沙箱”[/]
Docker Container的生命周期 
dbzq.png
Docker Daemon 
    []Docker Daemon是创建和运行Container的Linux守护进程,也是Docker 最主要的核心组件[/][]Docker Daemon 可以理解为Docker Container的Container[/][]Docker Daemon可以绑定本地端口并提供Rest API服务,用来远程访问和控制[/]
Docker Registry/Hub 
hub.png
Docker之所以这么吸引人,除了它的新颖的技术外,围绕官方Registry(Docker Hub)的生态圈也是相当吸引人眼球的地方。在Docker Hub上你可以很轻松下载 到大量已经容器化好的应用镜像,即拉即用。这些镜像中,有些是Docker官方维 护的,更多的是众多开发者自发上传分享的。而且 你还可以在Docker Hub中绑定 你的代码托管系统(目前支持Github和Bitbucket)配置自动生成镜像功能,这样 Docker Hub会在你代码更新时自动生成对应的Docker镜像。
问题点:
Docker Hub是dotCloud公司私有的国内曾有公司试图提供镜像服务,但被禁止 目前国内只有一个DaoCloud提供代理缓存服务
Docker Hub - our SaaS service for sharing and managing your application stacks. 
gx.png
    []Linux基本操作和基本知识:磁盘、文件、日志、用户、权限、安全、网络,建议centos/redhat[/][]虚机相关技能:vmware workstation/virtbox熟练使用,虚机clone,组网,host-only网络,nat网络等熟练操作[/]


文章分享:炼数为金-Leader-us 


mac 终端python tab键自动补全(亲测可以)

编程 chris 发表了文章 0 个评论 3796 次浏览 2016-03-22 18:12 来自相关话题

#!/usr/bin/env python # encoding: utf-8 import readline,rlcompleter [size=16]# Indenting ...查看全部
#!/usr/bin/env python
# encoding: utf-8

import readline,rlcompleter

[size=16]# Indenting
[/size]
class TabCompleter(rlcompleter.Completer):
"""Completer that supports indenting"""
def complete(self, text, state):
if not text:
return (' ', None)[state]
else:
return rlcompleter.Completer.complete(self, text, state)

readline.set_completer(TabCompleter().complete)

[size=16]# Add autocompletion
[/size]
if 'libedit' in readline.__doc__:
readline.parse_and_bind("bind -e")
readline.parse_and_bind("bind '\t' rl_complete")
else:
readline.parse_and_bind("tab: complete")

[size=16]# Add history
[/size]
import os
histfile = os.path.join(os.environ["HOME"], ".pyhist")
try:
readline.read_history_file(histfile)
except IOError:
pass
import atexit
atexit.register(readline.write_history_file, histfile)
del histfile
pythontab.png

Shell中数学计算总结

运维 Ansible 发表了文章 1 个评论 2715 次浏览 2016-03-22 00:39 来自相关话题

Shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法,以后用到的时候可以来看看: 错误方法举例​ A: var=1+1 echo $var ...查看全部
Shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法,以后用到的时候可以来看看:


错误方法举例​


A:
 var=1+1
echo $var

输出的结果是1+1,悲剧,呵呵
B:
var=1
var=$var+1
echo $var

输出结果是1+1,依然悲剧,呵呵


正确方法


A: 使用let
var=1
let "var+=1"
echo $var

输出结果为2,这次没有悲剧
注意:
    []经我测试let几乎支持所有的运算符,在网上看到一篇文章说“let不支持++、--和逗号、(、)”,但经我测试自加、自减、以及括号的优先级都得到了很好的支持[/][]方幂运算应使用“”[/][]参数在表达式中直接访问,不必加$[/][]一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上[/][]let后的表达式只能进行整数运算[/]

B: 使用(())
var=1
((var+=1))
echo $var

输出结果为2
注意:
(())的使用方法与let完全相同
C: 使用$[]
var=1
var=$[$var+1]
echo $var

输出结果位2
注意:
    []$[]将中括号内的表达式作为数学运算先计算结果再输出[/][]对$[]中的变量进行访问时前面需要加$[/][]$[]支持的运算符与let相同,但也只支持整数运算[/]

D: 使用expr
var=1
var=`expr $var + 1`
echo $var

输出结果为2
注意:
    []expr后的表达式个符号间需用空格隔开[/][]expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、、/、%[/*][]expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>、[/*][]expr同样只支持整数运算[/]

E:使用bc(可以进行浮点数计算)
var=1
var=`echo "$var+1"|bc`
echo $var

输出结果为2
介绍:
bc是linux下的一个简单计算器,支持浮点数计算,在命令行下输入bc即进入计算器程序,而我们想在程序中直接进行浮点数计算时,利用一个简单的管道即可解决问题。
注意:
    []经我测试bc支持除位操作运算符之外的所有运算符。[/][]bc中要使用scale进行精度设置[/]

浮点数计算实例:
var=3.14
var=`echo "scale=2;$var*3"|bc`
echo $var

输出结果为9.42
F:使用awk(可进行浮点数计算)​
var=1
var=`echo "$var 1"|awk '{printf("%g",$1*$2)}'`
echo $var

输出结果为2
介绍:
awk是一种文本处理工具,同时也是一种程序设计语言,作为一种程序设计语言,awk支持多种运算,而我们可以利用awk来进行浮点数计算,和上面bc一样,通过一个简单的管道,我们便可在程序中直接调用awk进行浮点数计算。
注意:
    []awk支持除微操作运算符之外的所有运算符[/][]awk内置有log、sqr、cos、sin等等函数[/]

浮点数计算实例:
var=3.14
var=`echo "$var 2"|awk '{printf("%g",sin($1/$2))}'`
echo $var

输出结果为1


总结​


终于把所有搜集到的资料看完,最后总结分享给大家,以后再遇到shell计算问题,就可以直接用了!

Shell数组详解

运维 Ansible 发表了文章 1 个评论 2751 次浏览 2016-03-21 23:34 来自相关话题

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。 数组定义 在Shell中 ...查看全部
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。


数组定义


在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
array_name=(value1 ... valuen)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
可以不使用连续的下标,而且下标的范围没有限制。


读取数组


读取数组元素值的一般格式是:
${array_name[index]}
例如:
result=${array[2]}
举个栗子:
#!/bin/bash

IT[0]="hadoop"
IT[1]="cloud"
IT[2]="docker"
IT[3]="virtual"
IT[4]="web"
echo "First Index: ${IT[0]}"
echo "Second Index: ${IT[1]}"
运行脚本,输出:
First Index: hadoop
Second Index: cloud
用${数组名[下标]} 下标是从0开始  下标是:*或者@ 得到整个数组内容
举个栗子:
[root@workhost ansible]# vim test.sh
#!/bin/bash

IT[0]="hadoop"
IT[1]="cloud"
IT[2]="docker"
IT[3]="virtual"
IT[4]="web"
echo "First Method: ${IT[*]}"
echo "Second Method: ${IT[@]}"

[root@workhost ansible]# bash test.sh
First Method: hadoop cloud docker virtual web
Second Method: hadoop cloud docker virtual web


获取数组的长度


# 取得整个数组的长度
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

举个栗子:
len.png


删除数组


unset array_name
unset array_name[n]
举个栗子:
delete_array.png


特殊用法


分片:
[root@workhost ~]$ a=(1 2 3 4 5)
[root@workhost ~]$ echo ${a[@]:0:3}
1 2 3
[root@workhost ~]$ echo ${a[@]:1:4}
2 3 4 5

[root@workhost ~]$ c=(${a[@]:1:4})
[root@workhost ~]$ echo ${#c[@]}
4
[root@workhost ~]$ echo ${c}
2 3 4 5
直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用"空格"分开,因此如果加上"()",将得到切片数组,上面例子:c就是一个新数据。
替换:
[root@workhost ~]$ a=(1 2 3 4 5)    
[root@workhost ~]$ echo ${a[@]/3/100}
1 2 100 4 5
[root@workhost ~]$ echo ${a[@]}
1 2 3 4 5

[root@workhost ~]$ a=(${a[@]/3/100})
[root@workhost ~]$ echo ${a[@]}
1 2 100 4 5
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。
 

在线旅游平台如何确保第三方API高可用

运维 cloudwise 发表了文章 1 个评论 2638 次浏览 2016-03-21 13:34 来自相关话题

十几年前,有一首流行歌曲《我想去桂林》红遍华夏大地,那时候旅游对很多人来说是一种奢侈。然而经济和社会福利的飞速发展,有钱有闲的国人越来越多,一到各种假期,不但国内旅游景点人满为患,就连周边国家和地区也满是中国游客,旅游已经成为大部分中国人日常生活中不可或缺的一 ...查看全部
十几年前,有一首流行歌曲《我想去桂林》红遍华夏大地,那时候旅游对很多人来说是一种奢侈。然而经济和社会福利的飞速发展,有钱有闲的国人越来越多,一到各种假期,不但国内旅游景点人满为患,就连周边国家和地区也满是中国游客,旅游已经成为大部分中国人日常生活中不可或缺的一部分。据国家旅游局发布的《2014年中国旅游业统计公报》显示,当年国内旅游人数达36.11亿人次,出境游人数达到1.07亿人次,全年实现旅游业总收入3.73万亿人民币。
随着互联网的普及和移动互联网的蓬勃兴起,在线旅游(OTA)行业率先实现了互联网+转型,酒店、机票、租车、景区门票、签证等上下游行业通过专业的旅游平台紧密结合,一站式获得出游所需的各项服务,在线旅游预订已经是大势所趋。

每天由API产生的订单多达几十万
主流在线旅游平台一般通过网站和移动客户端为用户提供服务,而服务需要对接国内20000余家及海外100000余家酒店预订,全国所有航线的机票预订,8000余家景区门票预订,全球热门演出门票预订,200多个城市租车预订,境内外品质旅游度假预订,并于近万家旅行社进行平台对接。
在线旅游平台通常采用典型电商IT架构,后端服务器、数据库做支撑,前端通过网页和移动端APP为用户提供服务,中间部署着CDN分布式网络和存储节点,不仅如此,还需要通过API与数以万计合作酒店、旅行社以及航空公司和第三方支付平台进行实时数据对接。对于在线旅游平台来说,线上系统不仅要处理大并发、高负载的用户访问,还面临着数据接口繁多、与第三方数据交换频繁的状况,内外部API接口多达数百个,每天通过API获取服务和交易的数据量多达几十万。

tour01.png

图:在线旅游平台通用IT架构

因为传统运维工具和方法对于API监控功能的缺失,所以在线旅游平台在日常运维过程中通常存在下列问题:
♦ 缺少对数据接口的监控,无法主动发现接口性能降低问题所在;
♦ 缺乏对接口性能的预警,当用户访问量骤增时导致数据接口调用的负载变化,进而影响API可用性;
♦ 缺少对接口的管理手段,传统的监控手段达不到突破性能瓶颈的效果。 
如何对API数据接口正确性和性能进行有效的监控和管理成为困扰IT部门的主要问题之一,不但会影响用户的服务体验,还将使公司运营蒙受损失:
♦ 利用第三方公司提供的应用程序API失败,导致业务中断,交易失败。
♦ 旅游网站通过API获取机票和酒店库存信息并抽取佣金,API调用失败导致失去一个客户或是一次机会。
♦ 其他数据源信息的API调用失败,影响自己的内容整合。
♦ 公司内部产品之间API不稳定导致业务下滑。
♦ 公司提供出去的API稳定性直接影响业务收入。

实时洞察API的可用性、响应时间和正确性
云智慧监控宝API监控是通过遍布全球的数百台分布式监测点模拟真实用户对在线旅游平台关键业务所使用的第三方API接口发起访问,实时检测API接口的可用性、正确性、响应时间,来确保接口运行的一致性、完整性、正确性、及时性。监控宝API监控不但能监控单个API接口的运行状况,还能对连续API请求所构成的事务(如:网络支付各个环节构成一个完整的支付事务)进行监控。
 
tour02.png.jpg

图:云智慧监控宝API监控原理

监控宝API监控能够:
♦ 支持API的get、post、put、delete、head、options六种请求。
♦ 支持Basic Auth, OAuth 1.0, OAuth2, Digest认证方式。
♦ 支持添加HTTP头Header和Value。
♦ 支持添加URL参数。
♦ 支持JSON、XML、Text、Response Status验证及脚本导入。
 
监控宝通过对API实时监控所获得即时数据进行统计分析,利用独家指标算法处理,结合告警消息、故障消息及故障类型统计分析,获得全面的历史数据,实现精准的数据分析;同时根据业务的实际需求和SLA自定义告警线,实时发送智能告警消息。通过监控宝Dashboard,用户可以快速查看TOP5的最低可用率、最长故障时间、最多故障次数、最低正确率、最长错误时间、最多错误次数、最慢响应时间、最快响应时间API数据图表,以及各监测点的相应监控数据。

保障SLA服务质量和业务营销
在线旅游平台IT部门通过监控宝的API监控,对酒店联盟、机票、景区门票和团购等关键业务的第三方API接口的可用率、响应时间及正确性进行24小时的实时监控,保障业务的正常运行和信息的及时获取。
♦ 主动识别API接口的可用性和可用率,分析数据接口的性能质量。
♦ 诊断和辨别API请求的正确与否,保障数据服务有效一致。
♦ 多点、真实、连续的性能数据分析,实现整个数据交互过程可反馈、可追述、可管控。
云智慧监控宝API监控解决方案为在线旅游平台提供的全面API性能监控、分析与管理的解决方案,能够帮助运营人员实时分析业务,明确业务性能问题以快速适应市场变化;帮助开发人员基于问题事件定位API瓶颈,以实现快速构建及改进持续交付;提供基于事务的API连续监控,帮助运维人员快速定位、预测API问题,确保运维SLA与服务质量;面向公司管理团队,提供多维报告与数据决策支持,帮助企业实现用户满意度及运营效率持续提升、企业营收不断提高。

监控宝API监控 免费试用中http://cloudwise.mikecrm.com/f.php?t=aZWutd