Docker在阿里云ecs的注意事项

故障:

1.安装好docker后,无法启动docker服务

2.创建docker0后,容器网络命名空间路由出不去

错误信息:

Please configure its address manually and run ‘docker -b docker0′

 

解决方法:

1.创建Docker0的网卡

2.启动该网卡

3.指定一个私有ip网络,切勿与阿里云的内网同一网段,同一网段有人说删除172的路由,这样会导致rds访问走外网会产生rds费用。还有其他莫名其妙的网络故障,所以建议不要动任何缺省的路由。

详细操作:

root@sklinux.com#brctl addbr docker0
root@sklinux.com#ip link set dev docker0 up
root@sklinux.com#ifconfig docker0 192.168.42.1

如果不想玩docker了,干了goto重建,先清除docker的桥

root@sklinux.com#ip link set dev docker0 down
root@sklinux.com#brctl delbr docker0

阿里云的内网路由:

 

 

centos6上玩docker

只需要如下操作即可:

1.#cd /etc/yum.repos.d/
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 
#rpm -ivh http://mirrors.aliyun.com/epel/6Server/x86_64/epel-release-6-8.noarch.rpm
2. yum更新

#yum clean all && yum makecache && yum update -y

3.安装docker并启动docker服务
#yum install docker-io
#service docker start

但是这样的docker文件系统是有问题的,
[root@jboss ~]# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
Pool Name: docker-253:0-5112199-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: extfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 305.7 MB
Data Space Total: 107.4 GB
Metadata Space Used: 733.2 kB
Metadata Space Total: 2.147 GB
Udev Sync Supported: true
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.89-RHEL6 (2014-09-01)
Execution Driver: native-0.2
Kernel Version: 2.6.32-358.el6.x86_64
Operating System: <unknown>
CPUs: 16
Total Memory: 70.75 GiB
Name: jboss

注意 Data file: /dev/loop0,docker的文件存储是用loop循环块设备模式进行挂载读写,今后扩容很是麻烦。

所以最后还是升级内核3.10后进行操作

升级内核,只需要4步:

#cd /etc/yum.repos.d
#wget http://www.hop5.in/yum/el6/hop5.repo
#yum install kernel-ml-aufs kernel-ml-aufs-devel -y
#修改grub.conf启动内核3.10 && reboot

再继续玩!

Containers: 0
Images: 0
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Execution Driver: native-0.2
Kernel Version: 3.10.5-3.el6.x86_64
Operating System: <unknown>
CPUs: 24
Total Memory: 11.81 GiB

Storage Driver: aufs 看见了吗?

 

/etc/yum.repos.d/docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

docker监听

root@docker:/etc# cat /etc/default/docker
# Docker Upstart and SysVinit configuration file

# Customize location of Docker binary (especially for development testing).
#DOCKER=”/usr/local/bin/docker”

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS=”–dns 8.8.8.8 –dns 8.8.4.4″
DOCKER_OPTS=”-H 0.0.0.0:4243 -H unix:///var/run/docker.sock”

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy=”http://127.0.0.1:3128/”

# This is also a handy place to tweak where Docker’s temporary files go.
#export TMPDIR=”/mnt/bigdrive/docker-tmp”

DOCKER_OPTS=”$DOCKER_OPTS –insecure-registry=dl.dockerpool.com:5000″
DOCKER_OPTS=”$DOCKER_OPTS –insecure-registry=192.168.1.110:5000″

CDN全网详细调度器HAProxy、Nginx、Varnish比较

CDN功能如下:
1、将全网IP分为若干个IP段组,分组的依据通常是运营商或者地域,目的是让相同网络环境中的用户聚集到相同的组内;
2、依据CDN服务器们的网络和容量,确定哪些CDN服务器适合服务哪些IP段组;
3、根据以上两步得到的结论,让用户去最适合他的服务器得到服务。

说白了,就是根据用户不同的来源IP把用户请求重定向到不同的CDN服务器上去。
那么,如何实现呢?

智能DNS是办法之一,稳定可靠且有效。
但至少在两个环境下它不能完全满足我们:
1、需要特别精细的调度时。由于大多数DNS Server不支持DNS扩展协议,所以拿不到用户的真实IP,只能根据Local DNS来调度。
2、访问特别频繁时。由于每次调度都将触发一次DNS,如果请求变得密集,DNS请求本身带来的开销也会相应变大;
3、需要根据服务器的带宽容量、连接数、负载情况、当机与否来调度时。由于DNS Server没有CDN节点服务器的信息,这种调度会变得困难。

这时候我们可以:
1、将用户先行引导到某一台或几台统一的服务器上去;
2、让它拿到用户的真实IP,计算出服务他的服务器;
3、通过HTTP302或其它方式把用户定位到最终服务器上。

部署在用户先访问到的那几台服务器上,负责定位IP然后重定向用户请求的那个软件,我们叫它“调度器”。 继续阅读

docker私有仓库建立与镜像推送

简单记录:

1.拉原始镜像

docker pull regsitry

docker pull centos

2.启动registry仓库

docker run -t -i -d -p 5000:5000 -v /root/my_registry:/tmp/registry registry [你懂的]

3.给进行打标签

docker tag 9dbcac75201e docker10.sklinux.com:5000/centos:7  [tag为仓库地址+端口+名称+版本]

4.推送镜像至私有仓库

docker push docker10.sklinux.com:5000/centos:7[你懂的]

 

root@docker10:~/my_registry# docker tag 9dbcac75201e docker10.sklinux.com:5000/centos:7
root@docker10:~/my_registry# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos 7 9dbcac75201e 3 days ago 215.6 MB
centos centos7 9dbcac75201e 3 days ago 215.6 MB
centos latest 9dbcac75201e 3 days ago 215.6 MB
docker10.sklinux.com centos7 9dbcac75201e 3 days ago 215.6 MB
docker10.sklinux.com:5000/centos 7 9dbcac75201e 3 days ago 215.6 MB
centos 7.1.1503 b58de3b24eb7 9 days ago 212.1 MB
centos centos7.1.1503 b58de3b24eb7 9 days ago 212.1 MB
registry latest 59b1f7d49dc8 9 days ago 413.6 MB
centos 5.11 2e4a66ce2189 5 weeks ago 284.2 MB
centos centos5.11 2e4a66ce2189 5 weeks ago 284.2 MB
centos 6.6 0bc55ae673f7 5 weeks ago 202.6 MB
centos centos6.6 0bc55ae673f7 5 weeks ago 202.6 MB
centos 7.0.1406 99d42dc65aa6 5 weeks ago 210.2 MB
centos centos7.0.1406 99d42dc65aa6 5 weeks ago 210.2 MB
centos 5 861c710fef70 5 weeks ago 284.1 MB
centos centos5 861c710fef70 5 weeks ago 284.1 MB
centos 6 f6808a3e4d9e 5 weeks ago 202.6 MB
centos centos6 f6808a3e4d9e 5 weeks ago 202.6 MB
root@docker10:~/my_registry# docker push docker10.sklinux.com:5000/centos:7
The push refers to a repository [docker10.sklinux.com:5000/centos] (len: 1)
Sending image list
Pushing repository docker10.sklinux.com:5000/centos (1 tags)
511136ea3c5a: Image successfully pushed
b6718650e87e: Image successfully pushed
493bab5fff45: Image successfully pushed
9dbcac75201e: Image successfully pushed
Pushing tag for rev [9dbcac75201e] on {http://docker10.sklinux.com:5000/v1/repositories/centos/tags/7}
root@docker10:~/my_registry# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos 7 9dbcac75201e 3 days ago 215.6 MB
centos centos7 9dbcac75201e 3 days ago 215.6 MB
centos latest 9dbcac75201e 3 days ago 215.6 MB
docker10.sklinux.com centos7 9dbcac75201e 3 days ago 215.6 MB
docker10.sklinux.com:5000/centos 7 9dbcac75201e 3 days ago 215.6 MB
centos 7.1.1503 b58de3b24eb7 9 days ago 212.1 MB
centos centos7.1.1503 b58de3b24eb7 9 days ago 212.1 MB
registry latest 59b1f7d49dc8 9 days ago 413.6 MB
centos 5.11 2e4a66ce2189 5 weeks ago 284.2 MB
centos centos5.11 2e4a66ce2189 5 weeks ago 284.2 MB
centos 6.6 0bc55ae673f7 5 weeks ago 202.6 MB
centos centos6.6 0bc55ae673f7 5 weeks ago 202.6 MB
centos 7.0.1406 99d42dc65aa6 5 weeks ago 210.2 MB
centos centos7.0.1406 99d42dc65aa6 5 weeks ago 210.2 MB
centos 5 861c710fef70 5 weeks ago 284.1 MB
centos centos5 861c710fef70 5 weeks ago 284.1 MB
centos 6 f6808a3e4d9e 5 weeks ago 202.6 MB
centos centos6 f6808a3e4d9e 5 weeks ago 202.6 MB

iptables中hashlimit模块介绍

iptables中用hashlimit来限速

   hashlimit是iptables的一个匹配模块,用它结合iptables的其它命令可以实现限速的功能(注意,单独hashlimit模块是无法限速的)。
不过首先必须明确,hashlimit本身只是一个“匹配”模块。我们知道,iptables的基本原理是“匹配–处理”,hashlimit在这个工作过程中只能起到匹配的作用,它本身是无法对网络数据包进行任何处理的。

我看到网上有些hashlimit的例子里面说只 用一条包含hashlimit匹配规则的iptables语句就可以实现限速,那是错误的。

实际上,利用hashlimit来限速需要包括两个步骤:

1.对符合hashlimit匹配规则包放行
2.丢弃/拒绝未放行的包

下面是一个简单的例子:
iptables -A INPUT -p tcp –dport 22 -m hashlimit –hashlimit-name ssh –hashlimit 5/sec –hashlimit-burst 10 –hashlimit-mode srcip –hashlimit-htable-expire 90000 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j DROP

然后,我们来着重讲讲hashlimit模块具体是如何工作的。 继续阅读

Glusterfs集群分布式文件系统掉brick的处理

我们最近在一个已经正常运行半年左右的一个gluster分布式文件系统集群中发现一个Brick掉线了。
Volume Name: web-volume
Type: Replicate
Volume ID: cd9bf5ad-1b5f-404b-8279-6de12b8838ec
Status: Started
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: 10.48.83.204:/data/gfs
Brick2: 10.48.83.200:/data/gfs
Brick3: 10.48.83.196:/data/gfs
Status of volume: web-volume
Gluster process Port Online Pid
——————————————————————————
Brick 10.48.83.204:/data/gfs 49152 Y 1791
Brick 10.48.83.200:/data/gfs 49152 Y 17406
Brick 10.48.83.196:/data/gfs N/A N N/A

这个节点是SSD盘,由于SSD极其个别会出现IO故障导致。我们决定将该节点下线,更换新的SSD。更换过程中我们的GFS文件系统内容数据一点也不收影响。这归功于GlusterFS,这不是我们今天主要想表达的。
我们今天主要是谈论如何将新的SSD节点brick重新加入集群。
1.将节点196的/data/挂载
2.我们需要首先得到GFS的文件扩展属性(在正常节点做),如下:
[root@node1.sklinux.com ~]# getfattr -d -m ‘.*’ /data/gfs
getfattr: Removing leading ‘/’ from absolute path names
# file: data/gfs
trusted.afr.web-volume-client-0=0sAAAAAAAAAAAAAAAA
trusted.afr.web-volume-client-1=0sAAAAAAAAAAAAAAAA
trusted.afr.web-volume-client-2=0sAAAAAAAAAAAAAAAA
trusted.gfid=0sAAAAAAAAAAAAAAAAAAAAAQ== ;得到trusted.gfid的值
trusted.glusterfs.dht=0sAAAAAQAAAAAAAAAA/////w==
trusted.glusterfs.volume-id=0szZv1rRtfQEuCeW3hK4g47A== ;得到 trusted.glusterfs.volume-id的值
3.设置196的gfs文件夹扩展属性,如下:
setfattr -n trusted.glusterfs.volume-id -v 0szZv1rRtfQEuCeW3hK4g47A== /data/gfs
setfattr -n trusted.gfid -v 0sAAAAAAAAAAAAAAAAAAAAAQ== /data/gfs
4.重启GFS服务{/etc/init.d/glusterd restart}
5.@196执行getfattr -d -m ‘.*’ /data/gfs;加入完成!
数据会像Raid1一样同步过来,如果你的集群是条带的,也是一样。

Linux下的硬盘坏道检测

温彻斯特磁盘:(硬盘原理)

大致原理就是非工作时间磁头停留在landing zone;需要读取数据时,磁头离开landing zone,依靠盘片的旋转产生升力悬浮在盘片表面读取数据。
因为盘片旋转速度非常快,且磁头与盘片距离非常近(头发丝的千分之一),如果剧烈震动或者外力冲击,甚至电压不稳,均有可能导致磁头与高速旋转的盘片产生物理接触,造成不可修复性物理损坏。

当您的磁盘:在读取某一文件或运行某一程序时,硬盘反复读盘且出错,提示文件损坏等信息,或者要经过很长时间才能成功;有时甚至会出现死机;
io wait 无故增高或居高不下;
硬盘声音突然由原来正常的摩擦音变成了怪音;
系统无法正常启动,出现“IO error”等提示信息;
mkfs时,到某一进度停止不前,最后报错,无法完成;
每次系统开机都会自动运行fsck扫描磁盘错误;
对硬盘执行FDISK时,到某一进度会反复进进退退;
如果您的磁盘出现如上状况,您就需要及时对磁盘进行坏道检测以测试磁盘可用性,并立即备份数据。 继续阅读

wordpress的502错误

在php5.2.x下安装wordpress会出现502的问题。以及在后台安装插件的时候502.这个时候是php版本本身的问题。我们在一年前我们发布了一篇文章<php的内存溢出>在这里,将libsqlite3的库函数取消后就正常了。希望其他使用php5.2+WordPress的同学可以借鉴!

 

 

另:我们提供在线有偿服务!谢谢你的关注!

Zookeeper部署

介绍zookeeper单机多实例部署以及生产环境的分布式部署

1. 准备工作:

1)需要linux环境,推荐用ubuntu的系统。学习的话使用oracle的virtual box安装虚拟机,网上找下安装文档就可以装好了,而生产环境一般都会装好的。ubuntu下载链接:
32位:http://mirrors.zju.edu.cn/ubuntu-releases//precise/ubuntu-12.04.3-server-i386.iso

64位:http://mirrors.hust.edu.cn/ubuntu-releases//precise/ubuntu-12.04.3-server-amd64.iso
2) JDK:zookeeper需要java运行环境,这个建议1.6以上,配置好 JAVA_HOME 、CLASSPATH、 PATH 变量。

jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

环境变量配置,home目录下的.profile即可:
export JAVA_HOME=”/usr/lib/jvm/jdk1.7.0_40″
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export ZOOKEEPER_HOME=”/data/apache/zookeeper”
export PATH=”$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin”
3) zookeeper安装包:http://zookeeper.apache.org/releases.html 下载稳定版本,现在的版本是3.4.5

2. 各种解压,不多说,建议对解压后的目录(带有版本号的),建立软连接 zk ,方便后面的配置和升级。

我解压后放在: /data/apache/zookeeper下面,并修改文件权限为运行用户权限:
sudo chown -R zqgame:zqgame zookeeper
zqgame:zqgame是运行zookeeper的用户和用户所在组,查看权限:

$ ll
total 16
drwxr-xr-x 4 zqgame zqgame 4096 Jan 17 12:41 ./
drwxr-xr-x 11 root root 4096 Dec 13 14:49 ../
drwxr-xr-x 11 zqgame zqgame 4096 Nov 20 15:50 hadoop-2.2.0/
drwxr-xr-x 12 zqgame zqgame 4096 Jan 17 12:56 zookeeper/

3. 端口检查,通常使用的端口 2181,2888,3888 ,检查是否占用,占用则下面的配置中更改端口。
netstat -ano | grep 2181
4.单机多实例配置及启动:

#生成配置文件,配置文件名随便,这里是zoo.cfg
cp /data/apache/zookeeper/conf/zoo_sample.cfg /data/apache/zookeeper/conf/zoo.cfg
vi /data/apache/zookeeper/conf/zoo.cfg
配置文件内容:
tickTime=2000
initLimit=5
syncLimit=5
dataDir=/data/apache/zookeeper/data # 目录需要手工建立,存放 zk 数据,主要是快照
clientPort=2181
# dataLogDir事务日志存放目录,最好配置,事务日志的写入速度严重影响zookeeper的性能
dataLogDir=/data/apache/zookeeper/datalog
server.1=192.168.130.170:2889:3889
server.2=192.168.130.170:2890:3890
server.3=192.168.130.170:2891:3891
拷贝配置文件,生成三个配置文件:zoo-slave1.cfg: (另外两个 zoo-slave2.cfg 和 zoo-slave3.cfg)。

zoo-slave1.cfg需要为dataDir和dataLogDir设置目录,改动内容如下:

dataDir=/data/apache/zookeeper/data/slave1
dataLogDir=/data/apache/zookeeper/datalog/slave1
clientPort=2182
zoo-slave2.cfg :

dataDir=/data/apache/zookeeper/data/slave2
dataLogDir=/data/apache/zookeeper/datalog/slave2
clientPort=2183
zoo-slave3.cfg :

dataDir=/data/apache/zookeeper/data/slave3
dataLogDir=/data/apache/zookeeper/datalog/slave3
clientPort=2184
如上配置相同的本机IP,不同的端口号,这里配置了三个实例

如何区分到底是第几个实例呢,就要有个id文件,名字必须是myid

echo “1″ > /data/apache/zookeeper/data/slave1/myid
echo “2″ > /data/apache/zookeeper/data/slave1/myid
echo “3″ > /data/apache/zookeeper/data/slave1/myid
在三个窗口下迅速启动:

bin/zkServer.sh start zoo-slave1.cfg
bin/zkServer.sh start zoo-slave2.cfg
bin/zkServer.sh start zoo-slave3.cfg
查看zookeeper选出来的leader,通过下面的脚本,分别指定配置文件,就可以查看哪一个实例是leader:
bin/zkServer.sh status zoo-slave1.cfg
可以看下如下输出信息:
$ bin/zkServer.sh status zoo-slave2.cfg
JMX enabled by default
Using config: /data/apache/zookeeper/bin/../conf/zoo-slave2.cfg
Mode: leader
5、分布式部署:

与单机多实例差不多,不过不用三个目录,只需要一个目录,一个配置文件,三个不同IP,分发在不同的IP上,仍然是不同的myid。假设我有三台独立机器,那么zoo.cfg(只需要一个默认的配置文件zoo.cfg)配置文件如下所示:

tickTime=2000
initLimit=5
syncLimit=5
dataDir=/data/apache/zookeeper/data # 目录需要手工建立,存放 zk 数据,主要是快照
clientPort=2181
# dataLogDir事务日志存放目录,最好配置,事务日志的写入速度严重影响zookeeper的性能
dataLogDir=/data/apache/zookeeper/datalog
server.1=192.168.130.101:2888:3888
server.2=192.168.130.102:2888:3888
server.3=192.168.130.103:2888:3888
然后在三台机器上分别写入不同的myid:
#在192.168.130.101执行下面一条
echo “1″ > /data/apache/zookeeper/data/myid
#在192.168.130.102执行下面一条
echo “2″ > /data/apache/zookeeper/data/myid
#在192.168.130.103执行下面一条
echo “3″ > /data/apache/zookeeper/data/myid
这样分别在三台机器迅速启动zookeeper,此时不需要指定配置文件,默认配置文件就是zoo.cfg:
bin/zkServer.sh start
查看启动后的状态:

bin/zkServer.sh status
进入zookeeper的shell客户端:

bin/zkCli.sh #进入本机zookeeper的shell
进入指定机器的shell客户端:

bin/zkCli.sh -server 192.168.130.101
在查看启动状态有错误的情况下,稍等一会再查看,因为zookeeper启动后需要一点时间选出leader。