当前位置:首页 > 开发 > 操作系统 > 正文

Linux-HA 入门指南

发表于: 2013-12-23   作者:AILIKES   来源:转载   浏览次数:
摘要: 引言 首先,本文中的大部分内容并非原创。撰写本文的目的只是以某种方式作出贡献。我所作的工作只是将Linux-HA的其他文档中(如Volker Wiegand的硬件安装指南)的部分编辑成一份文档,这份文档可以帮助初学者了解Linux-HA, 而不需麻烦Alan Robertson, 并且避免在邮件列表上出现重复的问题。 开始 你首先需要两台电脑,这两台电脑并不需要有相同的硬件(或者内存大小等

引言

首先,本文中的大部分内容并非原创。撰写本文的目的只是以某种方式作出贡献。我所作的工作只是将Linux-HA的其他文档中(如Volker Wiegand的硬件安装指南)的部分编辑成一份文档,这份文档可以帮助初学者了解Linux-HA, 而不需麻烦Alan Robertson, 并且避免在邮件列表上出现重复的问题。

开始

你首先需要两台电脑,这两台电脑并不需要有相同的硬件(或者内存大小等),但如果相同的话,当某个部件出现故障时会容易处理得多。

接下来您需要决定如何部署。你的集群是通过Heartbeat 软件产生在两台电脑之间心跳信号来建立的。为了传输心跳信号,需要在节点之间存在一条或多条介质通路(串口线通过modem电线,以太网通过交叉线,等等)。

现在可以开始配置硬件了。既然想要获得高可用性(HA),那么您很可能希望避免单点失效。在本例中,可能是您的null modem线/串口,或者网卡(NIC)/ 交叉线。因此便需要决定是否希望为每个节点添加第二条串口null modem连线或者第二条NIC/交叉线连接。制作Cat-5交叉线的方法可参照附录A。我使用一个串口和一块额外的网卡来作为heartbeat的通路,这是因为我只有一条null modem线和一块多余的网卡,并且认为有两种介质类型传输heartbeat信号比较好。

硬件配置完成之后,便需要安装操作系统以及配置网络(我在本文中使用的是RedHat)。假设您有两块网卡,那么有一块应该配置用于常规网络用途,另一块作为集群节点之间的专用网络连接(通过交叉线)。例如,假设集群有如下的IP地址:

节点 1 (linuxha1)

192.168.85.1 (常规的 192x 网络)

 

10.0.0.1 (heartbeat 专用的 10x 网络)

节点 2 (linuxha2)

192.168.85.2 (192x)

 

10.0.0.2 (10x)

注意:以上地址都不能是您的“集群地址”-即节点间由heartbeat和Failed over控制的地址。

在大多数*nix系统中,以上步骤在安装过程中都比较容易完成。然而,如果您遇到了任何问题,可以参照Ethernet HOWTO,或者您的发行版的相关文档。输入如下命令检查您的配置:

ifconfig 

这将显示您的网卡及其配置。也可以使用命令“netstat –nr”来获得网络路由信息。

如果一切正常,接下来要确定可以来两个节点之间通过所有接口ping通对方。

如果使用了串口,便需要检测其连接情况。把一个节点作为接收者,输入命令:

cat </dev/ttyS0 

在另一个节点上,输入:

echo hello >/dev/ttyS0 

应该可以在接收节点上看到该文本。如果正常的话交换这两个节点的角色再作一次,否则有可能是使用了错误的设备文件。关于解决串口连接问题的两个比较好的参考文献是Volker的HA Hardware Guide和Serial HOWTO。

安装Heartbeat

接下来便可以安装Heartbeat软件。当你阅读本文档的时候可能已经有了这个软件,如果没有的话可以从如下位置得到: http://linux-ha.org/download

在网站上也有RPM安装包,您也可以选择从源代码编译。取得源代码tar文件或者安装source RPM包,将其解包到某个文件夹。在源代码树的顶端,输入"./ConfigureMe configure", 之后输入"make"和"make install"。如果您在安装网站上发布的RPM包时遇到了问题,并想要创建自己的RPM包,FAQ中的信息会对您有所帮助。

配置Heartbeat

配置ha.cf

在启用Heartbeat之前,需要配置三个文件。第一个是ha.cf,该文件位于在安装后创建的/etc/ha.d目录中。该文件中包括为Heartbeat使用何种介质通路和如何配置他们的信息。在源代码目录中的ha.cf文件包含了您可以使用的全部选项,详述如下:

serial /dev/ttyS0 

使用串口heartbeat-如果不使用串口heartbeat,则必须使用其他的介质,如bcast(以太网)heartbeat。用适当的设备文件代替/dev/ttyS0。

watchdog /dev/watchdog 

可选。通过Watchdog 功能可以获得提供最少功能的系统,该系统不提供heartbeat,可以在持续一份钟的不正常状态后重新启动。该功能有助于避免一台机器在被认定已经死亡之后恢复heartbeat的情况。如果这种情况发生并且磁盘挂载因故障而迁移(fail over),便有可能有两个节点同时挂载一块磁盘。如果要使用这项功能,则除了这行之外,也需要加载“softdog”内核模块,并创建相应的设备文件。方法是使用命令“insmod softdog”加载模块。然后输入“grep misc /proc/devices”并记住得到的数字(应该是10)。然后输入”cat /proc/misc | grep watchdog”并记住输出的数字(应该是130)。根据以上得到的信息可以创建设备文件,“mknod /dev/watchdog c 10 130”。

bcast eth1 

表示在eth1接口上使用广播heartbeat(将eth1替换为eth0,eth2,或者您使用的任何接口)。

keepalive 2 

设定heartbeat之间的时间间隔为2秒。

warntime 10 

在日志中发出“late heartbeat“警告之前等待的时间,单位为秒。

deadtime 30 

在30秒后宣布节点死亡。

initdead 120 

在某些配置下,重启后网络需要一些时间才能正常工作。这个单独的”deadtime”选项可以处理这种情况。它的取值至少应该为通常deadtime的两倍。

baud 19200 

波特率,串口通信的速度。

udpport 694 

使用端口694进行bcast和ucast通信。这是默认的,并且在IANA官方注册的端口号。

auto_failback on 

必须的。对于那些熟悉Tru64 Unix的人来说,heartbeat的工作方式类似于“favored member“模式。在failover之前,haresources文件中列出的主节点掌握所有的资源,之后从节点接管这些资源。当auto_failback设置为on时,一旦主节点重新恢复联机,将从从节点取回所有资源。若该选项设置为off,主节点便不能重新获得资源。该选项与废弃的nice_failback选项类似。如果要从一个nice_failback设置为off的集群升级到这个或更新的版本,需要特别注意一些事项以防止flash cut。请参阅FAQ中关于如何处理这类情况的章节。

node linuxha1.linux-ha.org 

必须的。集群中机器的主机名,与“uname –n”的输出相同。

node linuxha2.linux-ha.org 

必须的。同上。

respawn <userid> <cmd> 

可选的:列出将要执行和监控的命令。例如:要执行ccm守护进程,则要添加如下的内容:

respawn hacluster /usr/lib/heartbeat/ccm 

使得Heartbeat以userid(在本例中为hacluster)的身份来执行该进程并监视该进程的执行情况,如果其死亡便重启之。对于ipfail,则应该是:

respawn hacluster /usr/lib/heartbeat/ipfail 

注意:如果结束进程的退出代码为100,则不会重启该进程。

ping ping1.linux-ha.org ping2.linux-ha.org .... 

可选:列出ping节点。这些节点不是集群节点。他们是用来为ipfail等模块检查网络连接情况的。

ping_group <name> ping1.linux-ha.org ping2.linux-ha.org ....  

可选:指定一个ping节点组。与ping节点类似,但只要节点组中的任何一个节点可用,便认为该节点组可用。组的名字可以是任意字符串,用来唯一标识该组。每个组必须出现在单独的行上。与ping节点类似,节点组也不是集群节点。他们与ping节点的功能相同,也是用来检查网络连接情况的。

配置haresources

配置好ha.cf文件之后,便是haresources文件。该文件列出集群所提供的服务以及服务的默认所有者。 注意:两个集群节点上的该文件必须相同,否则BadThingsWillHappen

在本文中我们假设要配置的HA服务为Apache和Samba。集群的IP地址是必须的,并一定不能在haresources文件以外配置该地址!在haresources文件中需要如下内容:

linuxha1.linux-ha.org 192.168.85.3 httpd smb 

该行指定在启动时,节点linuxha1得到IP地址192.168.85.3,并启动Apache和Samba。在停止时,Heartbeat将首先停止smb,然后停止Apache,最后释放IP地址192.168.85.3。这里假设命令“uname –n”的输出为“linuxha1.linux-ha.org”-如果输出为“linuxha1”,便应使用“linuxha1”。

注意:httpd和smb分别是Apache和Samba的启动脚本。Heartbeat会在以下路径中寻找有相同名字的启动脚本:

/etc/ha.d/resource.d  
/etc/init.d

这些脚本必须通过<scriptname> start来启动服务,以及<scriptname> stop来停止服务。您可以使用任何符合这个标准的脚本来作为服务。

若要向教本传递参数,则格式应该为: <scriptname>::<argument> 因此若我们添加了一个服务“maid”,他需要参数“vacuum”,则haresources文件中的该行需要修改为:

linuxha1 192.168.85.3 httpd smb maid::vacuum 

这种方式为我们将IP地址作为服务提供了灵活性。在上面我们用的其实是简化的符号。该行实际应该是(省略了maid服务):

linuxha1 IPaddr::192.168.85.3 httpd smb 

这里IPaddr是服务脚本的名字,其参数为192.168.85.3。当然,您可以在目录/etc/ha.d/resource.d中找到名为IPaddr的脚本。该脚本也允许您操作IP服务的子网掩码,广播地址和基本接口等参数。要指定有32个地址的子网,您可以定义该服务为(不显式指定IPaddr因为这样不会有问题):

linuxha1 192.168.85.3/27 httpd smb 

这里指定IP地址为192.168.85.3,子网掩码为255.255.255.224,广播地址将取默认值为192.168.85.31(即该子网上的最高地址)。您可以指定的最后一个参数为广播地址。若要以192.168.85.16覆盖默认的广播地址,可以这样写:

linuxha1 192.168.85.3/27/192.168.85.16 httpd smb 

您可能想要知道是否需要指定上面的某个参数,这要视情况而定。如果您已经为服务的IP地址建立了一条合适的路由(独立于Heartbeat),并设置了正确的子网掩码和广播地址,那么您便不需要。然而情况并不总是这样的,这便是这些选项存在的原因。另外,您可能有不止一个网络接口用于IP服务。下面将会讲述Heartbeat如何处理这种情况…

正确配置好haresources文件之后,将ha.cfharesource拷贝到/etc/ha.d目录,接下来便可以启动heartbeat了!

配置ipfail

ipfail插件的用途是检测网络故障,并作出合理的反应,如果需要的话使集群资源failover。为了实现这样的功能ipfail使用ping节点或者ping节点组,这些节点在集群中作为“哑”节点出现。如果HA节点间可以相互通信ipfail便可以可靠地检测到其中一个网络连接失效的情况,并作出补救。

配置ipfail的步骤如下:

  • 1.选择好的候选ping节点。

    • 这步很重要。你的选择越好,则得到的HA集群便越强壮。选择固定的交换机路由器等是一个好主意。不要选择HA集群中的任一个成员,也不要选择其他人的工作站。选择能反映您HA节点的连接状况的ping节点也很重要。如果您要监视两个接口的连接情况,明智的做法是为每个接口选择一个只对该接口可用的ping节点。ipfail-diagram.pdf文件中有对这个思想图形化的描述。

    2.设置auto_failback为on或者off。

    • 只有当Heartbeat被配置为非legacy时ipfail才会起作用。在ha.cf文件中,如下将auto_failback设置为on或者off:

      • auto_failback on 
        
      或者
      • auto_failback off 
        

    3.配置ha.cf使之启动ipfail。

    • ha.cf中增加如下一行(假设您在编译时的PREFIX为/usr):

      • respawn hacluster /usr/lib/heartbeat/ipfail 
        

    4.向ha.cf中加入ping节点:

    • ping pnode1 pnode2 pnodeN 
      
      将pnode1,pnode2,…pnodeN等替换为您ping节点的IP地址。

确保向集群中各个成员的ha.cf中加入以上相同的配置指令。

注意:在使用ping节点之前,最好检查他们的可用性。如果不能从所有的HA节点上ping通该ping节点,便不能使用它。

选择一个接口

为有多个网卡的机器配置haresources文件时,重要的一点是要知道Heartbeat选择网络接口的方式是如何影响对于IP服务地址的支持的。毕竟在haresource文件中没有指定所用的接口。

通过查看路由表,Heartbeat决定使用哪个接口。他尝试选择对于该IP地址代价最低的路由。如果发现了多于一条代价最低的路由,选择发现的第一个路由。对于大多数配置来说,这便意味着默认路由是最后的选择。

配置Authkeys

需要配置的第三个文件authkeys决定了您的认证密钥。共有三种认证方式:crc,md5,和sha1。您可能会问:“我应该用哪个方法呢?”简而言之:

如果您的Heartbeat运行于安全网络之上,如本例中的交叉线,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但您也希望降低CPU使用,则使用md5。最后,如果您想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解。

文件格式如下:

auth <number>  
<number> <authmethod> [<authkey>]

因此,对于sha1,示例的/etc/ha.d/authkeys可能是

auth 1  
1 sha1 key-for-sha1-any-text-you-want

对于md5,只要将上面内容中的sha1换成md5就可以了。 对于crc,可作如下配置:

auth 2  
2 crc

不论您在关键字auth后面指定的是什么索引值,在后面必须要作为键值再次出现。如果您指定“auth 4”,则在后面一定要有一行的内容为“4 <signaturetype>”。

确保该文件的访问权限是安全的,如600。其实也并不是“any text you want” 都可以,可以使用的字母个数是有限制的。

启动并测试Heartbeat

RedHat系统上,或者其他使用/etc/init.d启动脚本文件的系统,在每个节点上执行/etc/init.d/heartbeat会在所有的节点上启动heartbeat。建议您首先在系统主节点(在本例中是linuxha1)上启动。

如果希望在系统启动时运行heartbeat,根据你所用的发行版,需要作不同的配置。您需要在恰当的启动级别目录中建立启动脚本的链接,不过RPM版本的软件会自动完成这些配置。在我的系统上,Heartbeat以默认的优先级(75,即在服务00-74之后,在服务76-99之前)启动,以默认的优先级(05)停止,并只对运行级 0(停机),6(重启),3(多用户-文本界面),5(多用户-图形界面)起作用。

可以通过如下命令序列完成以上配置(以root身份):

cd /etc/rc.d/rc0.d ; ln -s ../init.d/heartbeat K05heartbeat 
cd /etc/rc.d/rc3.d ; ln -s ../init.d/heartbeat S75heartbeat
cd /etc/rc.d/rc5.d ; ln -s ../init.d/heartbeat S75heartbeat
cd /etc/rc.d/rc6.d ; ln -s ../init.d/heartbeat K05heartbeat

根据我使用Slackware的经验,Slackware系统上并没有/etc/rc.d/init.d目录(也许现在有了),为了实现如上相同的功能,可在/etc/rc.d/rc.local中加入:

/etc/ha.d/heartbeat start  

***这里假设您将ha.rc拷贝至/etc/ha.d/heartbeat。如果在您的系统上没有/etc/rc.d/init.d目录,并且您也不确定进程如何启动,便可以使用刚刚提到的rc.local方法。但使用这种方法时您需要自己处理关闭的情况,但笔者不记得如何去做了…

注意:如果您使用了watchdog功能,也需要在启动时加载其module。可以把以下命令加到/etc/rc.d/rc.sysinit的结尾:

/sbin/insmod softdog  

如果使用的是rc.local,需要把这一行放到启动Heartbeat命令的前面。

在您启动了Heartbeat之后,在测试之前查看您的日志文件(默认位置为/var/log/ha-log)。如果一切正常,服务持有者(本例中的linuxha1)的日志应该有类似如下所列内容:

heartbeat: 2003/02/10_13:52:22 info: Neither logfile nor logfacility found. 
heartbeat: 2003/02/10_13:52:22 info: Logging defaulting to /var/log/ha-log
heartbeat: 2003/02/10_13:52:22 info: **************************
heartbeat: 2003/02/10_13:52:22 info: Configuration validated. Starting heartbeat 0.4.9f
heartbeat: 2003/02/10_13:52:22 info: nice_failback is in effect.
heartbeat: 2003/02/10_13:52:22 info: heartbeat: version 0.4.9f
heartbeat: 2003/02/10_13:52:22 info: Heartbeat generation: 17
heartbeat: 2003/02/10_13:52:22 info: Starting serial heartbeat on tty /dev/ttyS0 (19200 baud)
heartbeat: 2003/02/10_13:52:22 info: UDP Broadcast heartbeat started on port 694 (694) interface eth1
heartbeat: 2003/02/10_13:52:23 info: pid 28140 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: pid 28137 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: pid 28139 locked in memory.
heartbeat: 2003/02/10_13:52:23 notice: Using watchdog device: /dev/watchdog
heartbeat: 2003/02/10_13:52:23 info: pid 28141 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: Local status now set to: 'up'
heartbeat: 2003/02/10_13:52:23 info: pid 28138 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: pid 28134 locked in memory.
heartbeat: 2003/02/10_13:52:25 info: Link linuxha1.linux-ha.org:eth1 up.
heartbeat: 2003/02/10_13:53:23 WARN: node linuxha2.linux-ha.org: is dead
heartbeat: 2003/02/10_13:53:23 info: Dead node linuxha2.linux-ha.org held no resources.
heartbeat: 2003/02/10_13:53:23 info: Resources being acquired from linuxha2.linux-ha.org.
heartbeat: 2003/02/10_13:53:23 info: Local status now set to: 'active'
heartbeat: 2003/02/10_13:53:23 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/02/10_13:53:23 info: /usr/lib/heartbeat/mach_down: nice_failback: acquiring foreign resources
heartbeat: 2003/02/10_13:53:23 info: mach_down takeover complete.
heartbeat: 2003/02/10_13:53:23 info: mach_down takeover complete for node linuxha2.linux-ha.org.
heartbeat: 2003/02/10_13:53:23 info: Acquiring resource group: linuxha1.linux-ha.org 192.168.85.3 datadisk::drbd0 datadisk::drbd1 mirror
heartbeat: 2003/02/10_13:53:23 info: Running /etc/ha.d/resource.d/IPaddr 192.168.85.3 start
heartbeat: 2003/02/10_13:53:23 info: /sbin/ifconfig eth0:0 192.168.85.3 netmask 255.255.255.0  broadcast 192.168.85.255
heartbeat: 2003/02/10_13:53:23 info: Sending Gratuitous Arp for 192.168.85.3 on eth0:0 [eth0]
heartbeat: 2003/02/10_13:53:23 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:24 info: Running /etc/ha.d/resource.d/datadisk drbd0 start
heartbeat: 2003/02/10_13:53:24 info: Running /etc/ha.d/resource.d/datadisk drbd1 start
heartbeat: 2003/02/10_13:53:25 info: Running /etc/ha.d/resource.d/mirror  start
heartbeat: 2003/02/10_13:53:25 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:26 info: Resource acquisition completed.
heartbeat: 2003/02/10_13:53:28 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:30 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:32 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:33 info: Local Resource acquisition completed. (none)
heartbeat: 2003/02/10_13:53:33 info: local resource transition completed.
heartbeat: 2003/02/10_13:56:30 info: Link linuxha2.linux-ha.org:eth1 up.
heartbeat: 2003/02/10_13:56:30 info: Status update for node linuxha2.linux-ha.org: status up
heartbeat: 2003/02/10_13:56:30 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/02/10_13:56:30 info: Status update for node linuxha2.linux-ha.org: status active
heartbeat: 2003/02/10_13:56:30 info: remote resource transition completed.
heartbeat: 2003/02/10_13:56:30 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/02/10_13:56:31 info: Link linuxha2.linux-ha.org:/dev/ttyS0 up.

注意:你的日志可能根据您何时在linuxha2上启动Heartbeat而有所不同!!!笔者在linuxha2上启动Heartbeat的时间为13:56:30。

现在ping您的集群IP地址(本例中的192.168.85.3)。如果正常,使用ssh登陆到上面并验证您在linuxha1上。接下来确定指定的服务已经绑定在.3的地址上。将您的网页浏览器指向192.168.85.3来测试Apache。对于Samba,假设您已经配置了名为“test“的一个share,则映射驱动器”\\192.168.85.3\test“来测试Samba,具体的步骤可参照Samba的文档。然而,您也可以使用netbios 名参数使得您的Samba share列在集群名字下面而不是集群成员的主机名下面!

注意:如果您不能启用服务的IP地址,并且在ha-log中有类似如下的内容:

SIOCSIFADDR: No such device 
SIOCSIFFLAGS: No such device
SIOCSIFNETMASK: No such device
SIOCSIFBRDADDR: No such device
SIOCSIFFLAGS: No such device
SIOCADDRT: No such device

这意味着您需要在内核中编入IP aliasing支持。在/usr/src/linux/.config文件中查找“CONFIG_IP_ALIAS=y”,如果不存在这项内容将会是“CONFIG_IP_ALIAS is not set”,在这种情况下需要加入IP aliasing支持并重新编译内核。

如果这些都能正常工作,您便得到了可用性(availability)。现在检查是否有高可用性(High Availability)。

使linuxha1离线。切断电源,结束Heartbeat,任何您能想到的方式,但不要将串口和eth1 heartbeat信号线都切断。如果你那样做了,则在两个节点上都会启动服务,当你重新建立heartbeat连接时会产生混乱。现在ping集群IP,大概5-10秒钟之后会再次开始响应。再次远程登陆并验证登陆到了linuxha2上。如果这个过程花费了超过30秒,可能是哪里出了问题。

如果您到了这里,则可能已经正常工作,但也应该检查所有的heartbeat。首先检查串口heartbeat。从用于bcast heartbeat的eth1上拔出交叉线,等待大概10秒钟,然后查看linuxha2的/var/log/ha-log文件,确保没有类似这样的内容:

1999/08/16_12:40:58 node linuxha1.linux-ha.org: is dead  

如果出现了这样的内容,则您的串口heartbeat没有正常工作,而从节点已经进行了接管。为了避免问题出现,在主节点上停止Heartbeat,然后再次运行上面的测试。如果您的日志正常那么很好,重新连接交叉线。之后断开串口连接,等待10秒钟,再次检查linuxha2的日志。如果日志不正常,可以检查/var/log/ha-log和/var/log/ha-debug以获得更多线索。

 

附录A-制作以太网交叉线

线路图如下所示

连接器A引脚#

连接器B引脚#

1

3

2

6

3

1

4

2

5

7

6

8

7

4

8

5

Linux-HA 入门指南

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原文地址:http://www.cnblogs.com/LoveJenny/archive/2013/03/05/2943691.html 有很多时候,我们需
本文旨在帮助您快速安装、创建及运行GForms应用。 1. 启动GForms Eclipse 如果您没有GForms安装介质
1 . 仓库简介   没有 Maven 时,项目用到的 .jar 文件通常需要拷贝到 /lib 目录,项目多了,拷贝
原文地址:http://www.cnblogs.com/sinojelly/archive/2010/05/22/1741337.html CMake是一个比make
首先需要下载ActiveMQ,下面的链接给我们列出了所有版本: http://activemq.apache.org/download-ar
CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScri
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScri
出自:http://www.ibm.com/developerworks/cn/web/wa-lo-json/?ca=drs-tp3308 JSON 即 JavaScript Ob
JFreeChart也许对大家来说很陌生,JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目。 J
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号