Month: November 2015

zookeeper集群配置

ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。 有关ZooKeeper的介绍,网上很多,也可以参考文章后面,我整理的一些相关链接。 下面,我们简单说明一下ZooKeeper的配置。 ZooKeeper Standalone模式 从Apache网站上(zookeeper.apache.org)下载ZooKeeper软件包,我选择了3.3.4版本的(zookeeper-3.3.4.tar.gz),在一台Linux机器上安装非常容易,只需要解压缩后,简单配置一下即可以启动ZooKeeper服务器进程。 将zookeeper-3.3.4/conf目录下面的 zoo_sample.cfg修改为zoo.cfg,配置文件内容如下所示: [plain] view plaincopy tickTime=2000 dataDir=/home/hadoop/storage/zookeeper clientPort=2181 initLimit=5 syncLimit=2 上面各个配置参数的含义也非常简单,引用如下所示: [plain] view plaincopy tickTime —— the basic time unit in milliseconds used by ZooKeeper. It is used to do heartbeats and the minimum session timeout will be twice the tickTime. dataDir —— the location to store the in-memory database snapshots and, unless specified otherwise, the transaction log of updates to the database. clientPort —— the port to listen for client connections 下面启动ZooKeeper服务器进程: [plain] view plaincopy cd zookeeper-3.3.4/ bin/zkServer.sh start 通过jps命令可以查看ZooKeeper服务器进程,名称为QuorumPeerMain。 在客户端连接ZooKeeper服务器,执行如下命令: [plain] view plaincopy bin/zkCli.sh -server dynamic:2181 上面dynamic是我的主机名,如果在本机执行,则执行如下命令即可: [plain] view plaincopy bin/zkCli.sh 客户端连接信息如下所示: 接着,可以使用help查看Zookeeper客户端可以使用的基本操作命令。 ZooKeeper Distributed模式 ZooKeeper分布式模式安装(ZooKeeper集群)也比较容易,这里说明一下基本要点。 首先要明确的是,ZooKeeper集群是一个独立的分布式协调服务集群,“独立”的含义就是说,如果想使用ZooKeeper实现分布式应用的协调与管理,简化协调与管理,任何分布式应用都可以使用,这就要归功于Zookeeper的数据模型(Data Model)和层次命名空间(Hierarchical Namespace)结构,详细可以参考http://zookeeper.apache.org/doc/trunk/zookeeperOver.html。在设计你的分布式应用协调服务时,首要的就是考虑如何组织层次命名空间。 下面说明分布式模式的安装配置,过程如下所示: 第一步:主机名称到IP地址映射配置 ZooKeeper集群中具有两个关键的角色:Leader和Follower。集群中所有的结点作为一个整体对分布式应用提供服务,集群中每个结点之间都互相连接,所以,在配置的ZooKeeper集群的时候,每一个结点的host到IP地址的映射都要配置上集群中其它结点的映射信息。 例如,我的ZooKeeper集群中每个结点的配置,以slave-01为例,/etc/hosts内容如下所示: [plain]view plaincopy 192.168.0.179   slave-01 192.168.0.178   slave-02 192.168.0.177   slave-03 ZooKeeper采用一种称为Leader election的选举算法。在整个集群运行过程中,只有一个Leader,其他的都是Follower,如果ZooKeeper集群在运行过程中Leader出了问题,系统会采用该算法重新选出一个Leader。因此,各个结点之间要能够保证互相连接,必须配置上述映射。 ZooKeeper集群启动的时候,会首先选出一个Leader,在Leader election过程中,某一个满足选举算的结点就能成为Leader。整个集群的架构可以参考http://zookeeper.apache.org/doc/trunk/zookeeperOver.html#sc_designGoals。 第二步:修改ZooKeeper配置文件 在其中一台机器(slave-01)上,解压缩zookeeper-3.3.4.tar.gz,修改配置文件conf/zoo.cfg,内容如下所示: [plain]view plaincopy tickTime=2000 dataDir=/home/hadoop/storage/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=slave-01:2888:3888 server.2=slave-02:2888:3888 server.3=slave-03:2888:3888 上述配置内容说明,可以参考http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html#sc_RunningReplicatedZooKeeper。第三步:远程复制分发安装文件 上面已经在一台机器slave-01上配置完成ZooKeeper,现在可以将该配置好的安装文件远程拷贝到集群中的各个结点对应的目录下: [plain]view plaincopy cd /home/hadoop/installation/ scp -r zookeeper-3.3.4/ hadoop@slave-02:/home/hadoop/installation/ scp -r zookeeper-3.3.4/ hadoop@slave-03:/home/hadoop/installation/ 第四步:设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字,例如: [plain]view plaincopy…

Read More »

myiptables: iptables常用配置

#!/bin/bash # myiptables.sh iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # DNS iptables -A OUTPUT -p udp –dport 53 -j ACCEPT iptables -A INPUT -p udp –sport 53 -j ACCEPT # 允许包从22端口进入 iptables -A INPUT -p tcp –dport 22 -j ACCEPT # 允许从22端口进入的包返回 iptables -A OUTPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT # 允许本机访问本机 iptables -A INPUT -i lo -j ACCEPT # 允许所有IP访问80端口 iptables -A INPUT -p tcp -s…

Read More »

iptables端口映射详解

本文作者:张天成    zhangtiancheng#gmail.com 转发请注明出处。 iptables是一个Linux下优秀的nat+防火墙工具,我使用该工具以较低配置的传统pc配置了一个灵活强劲的防火墙+nat系统,小有心得,看了网上也有很多这方面的文章,但是似乎要么说的比较少,要么就是比较偏,内容不全,容易误导,我研究了一段时间的iptables同时也用了很久,有点滴经验,写来供大家参考,同时也备日后自己翻阅。 首先要说明的是,iptables操作的是2.4以上内核的netfilter.所以需要linux的内核在2.4以上。其功能与安全性远远比其前辈 ipfwadm,ipchains强大,iptables大致是工作在OSI七层的二、三、四层,其前辈ipchains不能单独实现对tcp/udp port以及对mac地址的的定义与操作,所以我想ipchains应该是仅仅工作在三层上的。 我们先简单介绍一下netfilter的大致工作流程,也就是一个数据包(或者叫分组、packet,我个人习惯叫包)在到达linux的网络接口的时候(网卡)如何处理这个包,然后再介绍一下如何用iptables改变或者说控制对这个数据包进行操作。netfilter内部分为三个表,分别是 filter,nat,mangle,每个表又有不同的操作链(Chains)。在filter(过滤)表中,也就是他的防火墙功能的这个表,定义了三个 Chain。分别是INPUT,FORWARD,OUTPUT。也就是对包的入、转发、出进行定义的三个过滤链。对于这个filter表的操作和控制也是我们实现防火墙功能的一个重要手段;在nat(Network Address Translation、网络地址翻译)表中,也就是我们用以实现地址转换和端口转发功能的这个表,定义了PREROUTING, POSTROUTING,OUTPUT三个链,下面我们会对这三个链作详细的说明;而netfilter的mangle表则是一个自定义表,里面包括上面的filter以及nat表中的各种chains,它可以让我们进行一些自定义的操作,同时这个mangle表中的chains在netfilter对包的处理流程中处在一个比较优先的位置,下面有一张图清晰的描绘了netfilter对包的处理流程(该图摘自网上,不知作者是谁,在此深表敬意!),一般情况下,我们用不到这个mangle表,在这里我们就不做介绍了。 大家可以看到,PREROUTING这个chain在最前面,当一个包来到linux的网络接口的时候先过mangle的PREROUTING,然后是 nat的PREROUTING,从这个chain的名字我们可以看出,这个chain是在路由之前(pre-routing)要过的。为什么要在路由之前过呢?大家可以看到这个图上,上面有一个菱形的部分叫ROUTING,这个ROUTING部分就是Linux的route box,也就是路由系统,它同样有很高深的功能,可以实现策略路由等等一些高级特性,此处我们不做详细解释。单说这个PREROUTING链,因为在这个链里面我们对包的操作是DNAT,也就是改变目的地址和(或端口),通常用在端口转发,或者nat到内网的DMZ区,也就是说当一个包过来的时候我们要改变它的目的地址,大家可以想想,如果一个包在改变目的地址之前就被扔进了route box,让系统选好路之后再改变目的地址,那么选路就可能是错的,或者说毫无意义了,所以,PREROUTING这个Chain一定要在进Routing 之前做。比如说,我们的公网ip是60.1.1.1/24,位于linux中的eth0,内网ip是10.1.1.1/24位于linux中的eth1, 我们的内网有一台web服务器,地址是10.1.1.2/24,我们怎么样能让internet用户通过这个公网ip访问我们内部的这个web服务器呢?我们就可以在这个PREROUTING链上面定义一个规则,把访问60.1.1.1:80的用户的目的地址改变一下,改变为10.1.1.2:80,这样就实现了internet用户对内网服务器的访问了,当然了,这个端口是比较灵活的,我们可以定义任何一个端口的转发,不一定是80–>80,具体的命令我们在下面的例子中介绍,这里我们只谈流程与概念上的实现方法。 好了,我们接着往下走,这个包已经过了两个PREROUTING链了,这个时候,出现了一个分支转折的地方,也就是图中下方的那个菱形(FORWARD),转发!这里有一个对目的地址的判断(这里同样说明了PREROUTING一定要在最先,不仅要在route box之前,甚至是这个对目的地址的判断之前,因为我们可能做一个去某某某ip的地方转到自己的ip的规则,所以PREROUTING是最先处理这个包的 Chain)!如果包的目的地是本机ip,那么包向上走,走入INPUT链处理,然后进入LOCAL PROCESS,如果非本地,那么就进入FORWARD链进行过滤,我们在这里就不介绍INPUT,OUTPUT的处理了,因为那主要是对于本机安全的一种处理,我们这里主要说对转发的过滤和nat的实现。 这里的FORWARD我简单说一下,当linux收到了一个目的ip地址不是本地的包,Linux会把这个包丢弃,因为默认情况下,Linux的三层包转发功能是关闭的,如果要让我们的linux实现转发,则需要打开这个转发功能,可以改变它的一个系统参数,使用sysctl net.ipv4.ip_forward=1或者echo “1” > /proc/sys/net/ipv4/ip_forward命令打开转发功能。好了,在这里我们让linux允许转发,这个包的目的地址也不是本机,那么它将接着走入FORWARD链,在FORWARD链里面,我们就可以定义详细的规则,也就是是否允许他通过,或者对这个包的方向流程进行一些改变,这也是我们实现访问控制的地方,这里同样也是Mangle_FORWARD然后filter_FORWARD,我们操作任何一个链都会影响到这个包的命运,在下面的介绍中,我们就忽略掉mangle表,我们基本用不到操作它,所以我们假设它是透明的。假设这个包被我们的规则放过去了,也就是ACCEPT了,它将进入POSTROUTING部分,注意!这里我注意到一个细节问题,也就是上面的图中数据包过了FORWARD链之后直接进入了POSTROUITNG 链,我觉得这中间缺少一个环节,也就是route box,对于转发的包来说,linux同样需要在选路(路由)之后才能将它送出,这个图却没有标明这一点,我认为它是在过了route box之后才进入的POSTROUITNG,当然了,这对于我们讨论iptables的过滤转发来说不是很重要,只是我觉得流程上有这个问题,还是要说明一下。 同样的,我们在这里从名字就可以看出,这个POSTROUTING链应该是路由之后的一个链,也就是这个包要送出这台Linux的最后一个环节了,这也是极其重要的一个环节!!这个时候linux已经完成(has done..^_^)了对这个包的路由(选路工作),已经找到了合适的接口送出这个包了,在这个链里面我们要进行重要的操作,就是被Linux称为 SNAT的一个动作,修改源ip地址!为什么修改源ip地址?很多情况需要修改源地址阿,最常见的就是我们内网多台机器需要共享一个或几个公网ip访问 internet,因为我们的内网地址是私有的,假如就让linux给路由出去,源地址也不变,这个包应该能访问到目的地,但是却回不来,因为 internet上的N多个路由节点不会转发私有地址的数据包,也就是说,不用合法ip,我们的数据包有去无回。有人会说:“既然是这样,我就不用私有 ip了,我自己分配自己合法的地址不行吗?那样包就会回来了吧?”答案是否定的,ip地址是ICANN来分配的,你的数据包或许能发到目的地,但是回来的时候人家可不会转到你那里,internet上的路由器中的路由信息会把这个返回包送到那个合法的获得ip的地方去,你同样收不到,而你这种行为有可能被定义为一种ip欺骗,很多设备会把这样的包在接入端就给滤掉了,可能都到不了你要访问的那个服务器,呵呵。 那么Linux如何做SNAT呢?比如一个内网的10.1.1.11的pc访问202.2.2.2的一个web服务器,linux的内网接口10.1.1.1在收到这个包之后把原来的PC的 ip10.1.1.11改变为60.1.1.1的合法地址然后送出,同时在自己的ip_conntrack表里面做一个记录,记住是内网的哪一个ip的哪个端口访问的这个web服务器,自己把它的源地址改成多少了,端口改成多少了,以便这个web服务器返回数据包的时候linux将它准确的送回给发送请求的这个pc. 大体的数据转发流程我们说完了,我们看看iptables使用什么样的参数来完成这些操作。 在描述这些具体的操作之前,我还要说几个我对iptables的概念的理解(未必完全正确),这将有助于大家理解这些规则,以实现更精确的控制。上文中我们提到过,对包的控制是由我们在不同的Chain(链)上面添加不同的规则来实现的,比如我们对过滤表(filter table)添加规则来执行对包的操控。那么既然叫链,一定就是一条或者多条规则组成的了,这时就有一个问题了,如果多个规则对同一种包进行了定义,会发生什么事情呢?在Chain中,所有的规则都是从上向下来执行的,也就是说,如果匹配了第一行,那么就按照第一行的规则执行,一行一行的往下找,直到找到符合这个类型的包的规则为止。如果找了一遍没有找到符合这个包的规则怎么办呢?itpables里面有一个概念,就是Policy,也就是策略。一说这个东西大家可能就会觉得比较麻烦,什么策略阿,我对于它的理解就是所谓这个策略就是chain中的最后一条规则,也就是说如果找了一遍找不到符合处理这个包的规则,就按照policy来办。这样理解起来就容易多了。iptables 使用-P来设置Chain的策略。 好了,我们言归正传,来说说iptables到底怎样实现对包的控制 先介绍一下iptables如何操作链 对链的操作就那么几种,-I(插入) -A(追加) -R(替换) -D(删除) -L(列表显示) 这里要说明的就是-I将会把规则放在第一行,-A将会放在最后一行。 比如我们要添加一个规则到filter表的FORWARD链 iptables -t filter -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT 上面的命令意思为:追加一个规则至filter表中的FORWARD链尾,允许(-j ACCEPT)源地址为10.1.1.11目的地址为202.1.1.1的数据包通过。其中-t后面跟的是表名,在-A后面跟Chain名,后面的小写的 -s为源地址,-d为目的地址,-j为处理方向。 在iptables中,默认的表名就是filter,所以这里可以省略-t filter直接写成:iptables -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT iptables中的匹配参数: 我们在这里就介绍几种常用的参数,详细地用法可以man iptables看它的联机文档,你会有意外的收获。…

Read More »

配置Apache Basic和Digest认证

Apache常见的用户认证可以分为下面三种: 基于IP,子网的访问控制(ACL) 基本用户验证(Basic Authentication) 消息摘要式身份验证(Digest Authentication) 基本身份验证 原理: 一个页面访问请求 1 2 GET /auth/basic/ HTTP/1.1 Host: target Web服务器要求用书输入用户凭据(服务器返回401响应头和’realm’) 1 2 3 4 5 6 7 HTTP/1.1 401 Authorization Required Date: Sat, 08 Jun 2013 12:52:40 GMT WWW-Authenticate: Basic realm=”Basic auth Dir”          Content-Length: 401 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html; charset=iso-8859-1 浏览器弹出登录窗口(包含’realm’),要求用提供用户名/密码 1 2 3 GET /auth/basic/ HTTP/1.1 Host: target Authorization: Basic TGVuZ1dhOjEyMzQ1Ng==       //Basic后面就是LengWa:123456经过Base64编码后的字符串 服务器将用户输入的凭据和服务器端的凭据进行比较。如果一直则返回所请求页面的响应。 配置: – 以保护/data/www/auth/basic为例 Step 1: 创建密码文件,并添加第一个用户。 1 2 3 4 /usr/local/apache/bin> ./htpasswd -c /data/www/auth/basic/user.txt LengWa New…

Read More »

Ubuntu 文件共享 samba服务

文件共享 samba服务,它是一个在linux和unix上实现SMB协议的一个免费软件,SMB协议全称叫做Server Message Block(信息服务块),它可以在局域网上共享文件和打印机的一种协议,功能很强大。我采用的是这种方法。 首先,安装smb:执行下列命令 sudo apt-get install samba sudo apt-get install smbfs 如果提示找不到软件的话,update,upgrade一次应该就行。 然后,终端中执行shares-admin命令,可能也会提示先装相应的tools,按提示装就行 在界面中,先执行unlock操作,再添加一个共享文件夹,如图所示 共享之后,如果不做任何设置,则mac os可以连接到ubuntu虚拟机,但要提示用户名和密码,此时不论输入什么都无法访问共享的内容。 实现匿名访问需要修改配置文件。 修改配置文件smb.conf:执行命令 sudo nano /etc/samba/smb.conf 在其中搜索到”security=user” 改为 “securtiy=share”,并将该行头 # 注释去掉。 重启samba(sudo /etc/init.d/samba restart)或重启虚拟机。 这时已经能在mac os的文件目录下看到 共享的… 条目,如图所示 不过,这个时候只能读,不能写,如果还要写入的话,执行命令 chmod 777 /home/lemon/Downloads (这里的路径是我共享文件的路径),到这里已经可以任意的读取写入了。 摘自「互联网」

Read More »

maven 发布artifact到中央库

步骤一:注册账号,申请ticket。 注册在这里:https://issues.sonatype.org 申请ticket:创建一个issue,注意这里要选OSSRH,且是PROJECT而不是TASK,group id要慎重写,不能写你没有权限的,不然服务人员会让你重写(半天左右)。 申请成功后会提示:Configuration has been prepared, now you can:please comment on this ticket when you promoted your first release, thanks 步骤二:GPG,签名和加密用。 下载:https://www.gnupg.org/download/index.html 注意:签名的名字,邮箱和步骤一的一样,记住passphrase用于下面步骤。 步骤三:编译和提交文件。 注意事项: 1).m2\settings.xml文件中要加入: [html] view plaincopy <servers>     <server>         <id>sonatype-nexus-snapshots</id>         <username>your-jira-username</username>         <password>your-jira-password</password>     </server>     <server>         <id>sonatype-nexus-staging</id>         <username>your-jira-username</username>         <password>your-jira-password</password>     </server> </servers> 2)  pom.xml文件中要加入(project标签下): [html] view plaincopy <parent>     <groupId>org.sonatype.oss</groupId>     <artifactId>oss-parent</artifactId>     <version>7</version> </parent> 3)如果出现javadoc编译不通过的可以在javadoc插件下加入: [html] view plaincopy <configuration>     <additionalparam>-Xdoclint:none</additionalparam> </configuration> 4) 注意如过时release要加入: [html] view plaincopy <plugin>     <groupId>org.apache.maven.plugins</groupId>     <artifactId>maven-gpg-plugin</artifactId>     <version>${maven-gpg-plugin.version}</version>     <executions>         <execution>             <phase>verify</phase>             <goals>                 <goal>sign</goal>             </goals>         </execution>     </executions> </plugin> 5) 如果是java…

Read More »

maven 设置jdk编译水平

在pom.xml添加: <build>   <plugins>     <plugin>       <groupId>org.apache.maven.plugins</groupId>       <artifactId>maven-compiler-plugin</artifactId>       <version>3.1</version>       <configuration>         <source>6</source>         <target>6</target>         <encoding>UTF-8</encoding>       </configuration>     </plugin>   </plugins> </build>  

Read More »