如何查看zookeeper是否启动
Limit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
(4)创建myid文件
cd /home/myuser/zooA/data
sudosh -c 'echo "1" >> myid'
其他文件夹类似创建myid文件,zookeeperB为2,zookeeperC为3
(5)启动zookeeper
cd /home/myuser/zookeeperA/bin
sudo sh zkServersh start
查看zookeeper状态[root@weibo bin]# sh zkServersh status
JMX enabled by default
Using config: /home/weibo/zookeeperA/bin//conf/zoocfg
Mode: follower
启动OK,依次启动另外两台zookeeper,启动第一台zookeeper后,你可以观察bin下的zookeeperout可以看到报错,connection
refused,没有关系,zookeeper需要等待其他另个节点的加入,全部启动之后就正常了。
(6)客户端连接zookeeper
[root@weibo bin]# sh zkClish
Connecting to localhost:2181
2013-05-10 15:00:25,363 [myid:] - INFO [main:Environment@100] - Client environment:zookeeperversion=345-1392090, built>configs:保存上传的配置文件信息
clusterstatejson:集群状态json
aliases:别名json
live_node:当solr服务器启动的时候,会注册到这里
overseer:保存shard信息
overseer_elect:节点选举
collections:所有的collection
Zab协议全称是 Zookeeper Atomic BroadCast (Zookeeper 原子广播),Zookeeper是通过Zab协议来保证分布式事务的一致性。
1Zab协议是zookeeper专门设计的一种 支持崩溃恢复 的 原子广播协议, 是Zookeeper保证数据一致性的核心算法。
2在Zookeeper当中依赖Zab协议来保证数据的一致性,基于这个协议,zookeeper实现了一种主备模型,(Leader+Follower)的架构在保证集群中各个副本之间数据的一致性。 Leader负责处理写事务请求,然后Leader将数据同步到Follower节点上。
3zookeeper客户端会随机连接到集群中的一个节点上,如果是读请求,就会从当前节点进行读取数据,如果是写的请求,就会将事务请求提交到Leader节点,leader节点接收到事务提交,就会广播该事务,如果超过一半节点写入成功,那么该事务就会被提交。
1Zab协议需要确保那些已经在leader服务器上提交的事务最终被所有服务器提交。
2Zab协议需要确保那些在leader服务器上被提出而没有被提交的事务。
1使用主进程(leader)来接受客户端并处理客户端的事务请求,并采用Zab的原子广播协议,将服务器数据变更的状态以事务提议的形式广播到所有的follower副本上去。
2当主进程出现异常,整个zk集群依然能够正常运行。
Zab协议每个leader需要经过三个阶段:发现、同步、广播
发现 :要求Zookeeper集群必须选取出一个leader进程,同时leader需要维护一个follower可用客户端列表,将来客户端可以和这些follower进行通信。
同步 :Leader要将本身的数据与follower进行同步,实现多副本存储,也体现了CAP中的高可用和分区容错。follower将队列中未处理完的消息消费完成后,写入到本地日志中。
广播 :leader接受客户端提出的事务请求,将新的事务请求广播给follower节点。
Zab协议核心:定义了事务请求的处理方式。
1所有的事务请求必须由一个全局唯一的服务器来协调处理(Leader 服务器),其余的服务器是follower服务器。
2leader服务器负责将客户端提出的事务请求,转换成一个事务proposal,并将事务proposal分发给集群中follower服务器,也就是向所有follower节点发送数据广播请求。
3分发之后leader服务器需要等待follower服务器的反馈,在Zab协议中,只要超过半数的follower服务器进行确认了,那么leader就会再次向所有的follower发送commit消息,要求将上一个事务进行提交。
Zab协议包括两种模式: 崩溃恢复 和 消息广播
协议过程
当整个集群启动过程中,或者leader服务器出现宕机或者网络终端等异常时,Zab协议就会进入崩溃恢复模式,选举出新的leader。
当选举出新的leader之后,同时集群中有过半的服务器与该leader服务器完成了状态同步(数据同步),Zab协议就会退出崩溃恢复模型,进入消息广播模式。
如果新增一台服务器加入集群中,当前集群中已经选举出leader,那么加入进来的服务器自动进入恢复模式,找到leader服务器进行状态同步,完成同步后,与其他follower一起参与到广播流程中。
Zookeeper集群中,数据副本的传递策略采用的是消息广播模式。Zab协议中Leader等待follower 的ACK反馈消息,当到达半数以上follower成功反馈即可,不需要等所有的follower全部反馈。
leader服务器出现宕机和网络原因等导致leader与过半的follower服务器不能联系,就会自动进入崩溃恢复模式。
在Zab协议中,为了保证程序的正常运行,整个恢复过程结束后需要重新选出一个leader服务器,因此Zab协议需要一个高效且可靠的算法,来保证快速选举出leader。
Leader算法不仅让leader自己知道自己已经被选取为leader,还需要让集群中的所有服务器快速的感知到选举出的新leader服务器。
崩溃恢复包括两个部分: Leader选举 和 数据恢复
Zab 协议如何保证数据一致性
假设两种异常情况:
1、一个事务在 Leader 上提交了,并且过半的 Folower 都响应 Ack 了,但是 Leader 在 Commit 消息发出之前挂了。
2、假设一个事务在 Leader 提出之后,Leader 挂了。
要确保如果发生上述两种情况,数据还能保持一致性,那么 Zab 协议选举算法必须满足以下要求:
Zab 协议崩溃恢复要求满足以下两个要求 :
1) 确保已经被 Leader 提交的 Proposal 必须最终被所有的 Follower 服务器提交 。
2) 确保丢弃已经被 Leader 提出的但是没有被提交的 Proposal 。
根据上述要求
Zab协议需要保证选举出来的Leader需要满足以下条件:
1) 新选举出来的 Leader 不能包含未提交的 Proposal 。
即新选举的 Leader 必须都是已经提交了 Proposal 的 Follower 服务器节点。
2) 新选举的 Leader 节点中含有最大的 zxid 。
这样做的好处是可以避免 Leader 服务器检查 Proposal 的提交和丢弃工作。
Zab 如何数据同步
1)完成 Leader 选举后(新的 Leader 具有最高的zxid),在正式开始工作之前(接收事务请求,然后提出新的 Proposal),Leader 服务器会首先确认事务日志中的所有的 Proposal 是否已经被集群中过半的服务器 Commit。
2)Leader 服务器需要确保所有的 Follower 服务器能够接收到每一条事务的 Proposal ,并且能将所有已经提交的事务 Proposal 应用到内存数据中。等到 Follower 将所有尚未同步的事务 Proposal 都从 Leader 服务器上同步过啦并且应用到内存数据中以后,Leader 才会把该 Follower 加入到真正可用的 Follower 列表中。
Zab 数据同步过程中,如何处理需要丢弃的 Proposal
在 Zab 的事务编号 zxid 设计中,zxid是一个64位的数字。
其中低32位可以看成一个简单的单增计数器,针对客户端每一个事务请求,Leader 在产生新的 Proposal 事务时,都会对该计数器加1。而高32位则代表了 Leader 周期的 epoch 编号。
epoch 编号可以理解为当前集群所处的年代,或者周期。每次Leader变更之后都会在 epoch 的基础上加1,这样旧的 Leader 崩溃恢复之后,其他Follower 也不会听它的了,因为 Follower 只服从epoch最高的 Leader 命令。
每当选举产生一个新的 Leader ,就会从这个 Leader 服务器上取出本地事务日志充最大编号 Proposal 的 zxid,并从 zxid 中解析得到对应的 epoch 编号,然后再对其加1,之后该编号就作为新的 epoch 值,并将低32位数字归零,由0开始重新生成zxid。
Zab 协议通过 epoch 编号来区分 Leader 变化周期 ,能够有效避免不同的 Leader 错误的使用了相同的 zxid 编号提出了不一样的 Proposal 的异常情况。
基于以上策略
当一个包含了上一个 Leader 周期中尚未提交过的事务 Proposal 的服务器启动时,当这台机器加入集群中,以 Follower 角色连上 Leader 服务器后,Leader 服务器会根据自己服务器上最后提交的 Proposal 来和 Follower 服务器的 Proposal 进行比对,比对的结果肯定是 Leader 要求 Follower 进行一个回退操作,回退到一个确实已经被集群中过半机器 Commit 的最新 Proposal 。
本文根据https://wwwjianshucom/p/2bceacd60b8a进行编写。
Apache Zookeeper是我最近遇到的最酷的技术,我是在研究Solr Cloud功能的时候发现的。Solr的分布式计算让我印象深刻。你只要开启一个新的实例就能自动在Solr Cloud中找到。它会将自己分派到某个分片中,并确定出自己是一个Leader(源)还是一个副本。不一会儿,你就可以在你的那些服务器上查询到了。即便某些服务器宕机了也可以继续工作。非常动态、聪明、酷。
将运行多个应用程序作为一个逻辑程序并不是什么新玩意。事实上,我在几年前就已写过类似的软件。这种架构比较让人迷惑,使用起来也费劲。为此Apache Zookeeper提供了一套工具用于管理这种软件。
为什么叫Zoo?“因为要协调的分布式系统是一个动物园”。
在本篇文章中,我将说明如何使用PHP安装和集成Apache ZooKeeper。我们将通过service来协调各个独立的PHP脚本,并让它们同意某个成为Leader(所以称作Leader选举)。当Leader退出(或崩溃)时,worker可检测到并再选出新的leader。
ZooKeeper是一个中性化的Service,用于管理配置信息、命名、提供分布式同步,还能组合Service。所有这些种类的Service都会在分布式应用程序中使用到。每次编写这些Service都会涉及大量的修bug和竞争情况。正因为这种编写这些Service有一定难度,所以通常都会忽视它们,这就使得在应用程序有变化时变得难以管理应用程序。即使处理得当,实现这些服务的不同方法也会使得部署应用程序变得难以管理。
虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,由Andrei Zmievski在2009创建并维护。你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。
要使用该扩展你首先要安装ZooKeeper。可以从官方网站下载。
$ tar zxfv zookeeper-345targz
$ cd zookeeper-345/src/c
$ /configure --prefix=/usr/
$ make
$ sudo make install
这样就会安装ZooKeeper的库和头文件。现在准备编译PHP扩展。
$ cd$ git clone https://githubcom/andreiz/php-zookeepergit
$ cd php-zookeeper
$ phpize
$ /configure
$ make
$ sudo make install
将“zookeeperso”添加到PHP配置中。
$ vim /etc/php5/cli/confd/20-zookeeperini
因为我不需要运行在web服务环境下,所以这里我只编辑了CLI的配置。将下面的行复制到ini文件中。
extension=zookeeperso
使用如下命令来确定扩展是否已起作用。
$ php -m | grep zookeeper
zookeeper
现在是时候运行ZooKeeper了。目前唯一还没有做的是配置。创建一个用于存放所有service数据的目录。
$ mkdir /home/you-account/zoo
$ cd$ cd zookeeper-345/
$ cp conf/zoo_samplecfg conf/zoocfg
$ vim conf/zoocfg
找到名为“dataDir”的属性,将其指向“/home/you-account/zoo”目录。
$ bin/zkServersh start
$ bin/zkClish -server 127001:2181[zk: 127001:2181(CONNECTED) 14] create /test 1
Created /test[zk: 127001:2181(CONNECTED) 19] ls /[test, zookeeper]
此时,你已成功连到了ZooKeeper,并创建了一个名为“/test”的znode(稍后我们会用到)。ZooKeeper以树形结构保存数据。这很类似于文件系统,但“文件夹”(译者注:这里指非最底层的节点)又和文件很像。znode是ZooKeeper保存的实体。Node(节点)的说法很容易被混淆,所以为了避免混淆这里使用了znode。
因为我们稍后还会使用,所以这里我们让客户端保持连接状态。开启一个新窗口,并创建一个zookeeperdemo1php文件。
<php
class ZookeeperDemo extends Zookeeper {
public function watcher( $i, $type, $key ) {
echo "Insider Watcher\n";
// Watcher gets consumed so we need to set a new one
$this->get( '/test', array($this, 'watcher' ) );
}
}
$zoo = new ZookeeperDemo('127001:2181');$zoo->get( '/test', array($zoo, 'watcher' ) );
while( true ) {
echo '';
sleep(2);}
现在运行该脚本。
$ php zookeeperdemo1php
此处应该会每隔2秒产生一个点。现在切换到ZooKeeper客户端,并更新“/test”值。
[zk: 127001:2181(CONNECTED) 20] set /test foo
这样就会静默触发PHP脚本中的“Insider Watcher”消息。怎么会这样的?
ZooKeeper提供了可以绑定在znode的监视器。如果监视器发现znode发生变化,该service会立即通知所有相关的客户端。这就是PHP脚本如何知道变化的。Zookeeper::get方法的第二个参数是回调函数。当触发事件时,监视器会被消费掉,所以我们需要在回调函数中再次设置监视器。
现在你可以准备创建分布式应用程序了。其中的挑战是让这些独立的程序决定哪个(是leader)协调它们的工作,以及哪些(是worker)需要执行。这个处理过程叫做leader选举,在ZooKeeper Recipes and Solutions你能看到相关的实现方法。
这里简单来说就是,每个处理(或服务器)紧盯着相邻的那个处理(或服务器)。如果一个已被监视的处理(也即Leader)退出或者崩溃了,监视程序就会查找其相邻(此时最老)的那个处理作为Leader。
在真实的应用程序中,leader会给worker分配任务、监控进程和保存结果。这里为了简化,我跳过了这些部分。
创建一个新的PHP文件,命名为workerphp。
<php
class Worker extends Zookeeper {
const CONTAINER = '/cluster';
protected $acl = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone' ) );
private $isLeader = false;
private $znode;
public function __construct( $host = '', $watcher_cb = null, $recv_timeout = 10000 ) {
parent::__construct( $host, $watcher_cb, $recv_timeout );
}
public function register() {
if( ! $this->exists( self::CONTAINER ) ) {
$this->create( self::CONTAINER, null, $this->acl );
}
$this->znode = $this->create( self::CONTAINER '/w-',
null,
$this->acl,
Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );
$this->znode = str_replace( self::CONTAINER '/', '', $this->znode );
printf( "I'm registred as: %s\n", $this->znode );
$watching = $this->watchPrevious();
if( $watching == $this->znode ) {
printf( "Nobody here, I'm the leader\n" );
$this->setLeader( true ); }
else {
printf( "I'm watching %s\n", $watching );
}
}
public function watchPrevious() {
$workers = $this->getChildren( self::CONTAINER );
sort( $workers );
$size = sizeof( $workers );
for( $i = 0 ; $i < $size ; $i++ ) {
if( $this->znode == $workers[ $i ] ) {
if( $i > 0 ) {
$this->get( self::CONTAINER '/' $workers[ $i - 1 ], array( $this, 'watchNode' ) );
return $workers[ $i - 1 ];
}
return $workers[ $i ];
}
}
throw new Exception( sprintf( "Something went very wrong! I can't find myself: %s/%s",
self::CONTAINER,
$this->znode ) );
}
public function watchNode( $i, $type, $name ) {
$watching = $this->watchPrevious();
if( $watching == $this->znode ) {
printf( "I'm the new leader!\n" );
$this->setLeader( true );
}
else {
printf( "Now I'm watching %s\n", $watching ); }
}
public function isLeader() {
return $this->isLeader;
}
public function setLeader($flag) {
$this->isLeader = $flag;
}
public function run() {
$this->register();
while( true ) {
if( $this->isLeader() ) {
$this->doLeaderJob();
}
else {
$this->doWorkerJob();
}
sleep( 2 );
}
}
public function doLeaderJob() {
echo "Leading\n";
}
public function doWorkerJob() {
echo "Working\n";
}
}
$worker = new Worker( '127001:2181' );$worker->run();
打开至少3个终端,在每个终端中运行以下脚本:
# term1
$ php workerphp
I'm registred as: w-0000000001Nobody here, I'm the leader
Leading
# term2
$ php workerphp
I'm registred as: w-0000000002I'm watching w-0000000001
Working
# term3
$ php workerphp
I'm registred as: w-0000000003I'm watching w-0000000002
Working
现在模拟Leader崩溃的情形。使用Ctrl+c或其他方法退出第一个脚本。刚开始不会有任何变化,worker可以继续工作。后来,ZooKeeper会发现超时,并选举出新的leader。
虽然这些脚本很容易理解,但是还是有必要对已使用的Zookeeper标志作注释。
$this->znode = $this->create( self::CONTAINER '/w-', null, $this->acl, Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );
每个znode都是EPHEMERAL和SEQUENCE的。
EPHEMRAL代表当客户端失去连接时移除该znode。这就是为何PHP脚本会知道超时。SEQUENCE代表在每个znode名称后添加顺序标识。我们通过这些唯一标识来标记worker。
在PHP部分还有些问题要注意。该扩展目前还是beta版,如果使用不当很容易发生segmentation fault。比如,不能传入普通函数作为回调函数,传入的必须为方法。我希望更多PHP社区的同仁可以看到Apache ZooKeeper的好,同时该扩展也会获得更多的支持。
ZooKeeper是一个强大的软件,拥有简洁和简单的API。由于文档和示例都做的很好,任何人都可以很容易的编写分布式软件。让我们开始吧,这会很有趣的。
由于服务器内存比较多,以前用的是zookeeper的默认内存,启动的时候没有对内存进行修改,为了让zookeeper能更好的工作,现在对zookeeper的启动内存进行指定。
首先 zookeep的内存大小指定的的配置文件在bin/zkEnvsh,如下:
其中$ZOOCFGDIR/javaenv是就是设置jvm内存大小的文件,这个文件默认情况下是没有的,需要手动创建,
然后重新启动zk,然后你会发现,zk的jvm设置生效了,神奇吧:
一、Zookeeper 的搭建方式
Zookeeper 安装方式有三种,单机模式和集群模式以及伪集群模式。
Zookeeper 通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务继续。
为什么一定要超过半数呢? 这跟 Zookeeper 的复制策略有关:Zookeeper 确保对 znode 树的每一个修改都会被复制到集合体中超过半数的机器上。
二、配置JDK环境
三、Zookeeper 单机模式搭建
1、下载 ZooKeeper :http://mirrorshusteducn/apache/zookeeper/
2、解压
3、配置环境变量
非必须操作
4、修改 Zookeeper 的配置文件 conf/zoocfg
5、启动 ZooKeeper
四、Zookeeper 集群模式搭建
Zookeeper 集群模式搭建方案:
1、解压
2、配置环境变量
非必须操作
3、修改 Zookeeper 的配置文件
zookeeper参数说明
A :其中 A 是一个数字,表示这个是服务器的编号;B :是这个服务器的 ip 地址;C :Leader 选举的端口;D :Zookeeper 服务器之间的通信端口。
4、添加服务器标识配置 dataDir/myid
5、将修改后的zookeeper分发到其他节点
6、启动
分别在3个节点启动zookeeper
查看状态
五、 Zookeeper 伪集群模式搭建
只需将zookeper复制3份到不同的位置,配置如下
zookeeper服务脚本
安装zookeeper首先要安装JDK,Linux有自带的OPENJDK,要卸载然后重新安装。
1 java -version 查看JDK版本
2 rpm -qa | grep java 查找有哪些java相关的包
3 rpm -e --nodeps tzdata-java-2015e-1e16noarch 卸载,--nodeps 就是no depends的意思,忽略相关依赖强制卸载
4 mkdir /export/server 创建zookeeper和 JDK安装的目录
5
mv jdk180_65targz /export/server 把jdk安装包移动到/export/server文件夹
cd /export/server 进入该文件夹, ls查看可以看到安装包
tar -zxvf jdk180_65targz 把JDK上传到linux系统中,然后执行tar解压操作
6 vi /etc/profile 编辑/etc目录下的profile文件,也就是配置环境变量的配置文件。
7 打开文件后,按大写的G直接跳到文件的最后一行,然后按 i 进入编辑文件状态,在末尾添加这三行配置信息
export JAVA_HOME=/export/server/jdk180_65 配置一个JAVA_HOME的变量,值是jdk安装的目录,这个JAVA_HOME在下面两行会用到
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=:$JAVA_HOME/lib/dtjar:$JAVA_HOME/lib/toolsjar
编辑完毕,按ESC退出文件编辑状态,然后输入 指令 :wq (冒号+wq) 回车退出并保存该文件。
8 source /etc/profile 刷新profile文件到系统内存。
9 在任意目录下 输入 java -v 查看JDK版本
以上JDK安装完毕,接下来安装zookeeper。
10 和上传JDK一样,把zookeeper-3410targz文件放到/export/server目录下,并进行解压。(忘记了就去看第5步)
tar -zxvf zookeeper-3410targz
解压之后要进行相关的配置(软件安装无非就是解压+配置)
这里主要有两个重要要改的地方:1zookeeper服务启动后数据文件保存在哪里? 2 zookeeper通常是会集群化,也就是启动好几台zookeeper同时提供服务的,因此在每台zookeeper服务的配置文件里面都要配置上其它zookeeper服务的ip和端口。 第二点不懂的话直接看配置文件就好了。
11 首先实现第一点,创建zookeeper数据保存目录
mkdir /export/data/zkdata 创建zkdata文件夹,用于存在zookeeper数据(这条如果报错了,说明你应该先执行mkdir /export/data/创建data目录)
12 接下来进行配置
cd zookeeper/conf/ 配置文件放在该目录下,ll可以查看有哪些文件,如图
其中有个zoo_samplecfg 文件,这个文件是自带的一个模板,就是告诉你配置文件要照着这个样子去抄。。。
然后有个重要的东西就是:zookeeper启动的时候,默认是会读取该文件路径下配置文件zoocfg的,但是这里默认是i没有这个文件的。所以我们直接复制一个zoo_samplecfg 重命名为zoocfg就OK了。但是要进去做自己的相关配置改动。 复制文件命令是:
cp zoo_samplecfg zoocfg
13 vi zoocfg 开始编辑配置文件了,打开可以看见一堆你可能看不懂的东西,但是不重要因为大多数都是注释掉的东西。新手就别管那么多了。
这里我们主要要修改的是两个东西,哪两个? 前面黑体字有说过了:数据存放目录,集群中各个zookeeper服务的ip port。
同样的,按 i 进入编辑模式,找到dataDir=/tmp。。。这一行。 这一行就是设置数据存放的目录。 把它改成我们自己新建的目录:
dataDir=/export/data/zkdata/ 这样第一点就配置完了。
实际上到这里一台zookeeper服务已经安装完毕了,但是说过了,zookeeper是集群,所以得多搞几个服务器。我这里用了三台虚拟机,复制三台。ip分别是192168209128 / 192168209129 / 192168209130,这三台同样的安装JDK 和zookeeper。 重复前面的操作就行,也可以直接复制虚拟机。
同样的在zoocfg里面,大写的G到最后一行。在末尾加上这三行配置:
server1=192168209128:2888:3888 #三台服务对应server 1 2 3 ,对应三个ip。 后面两个端口分别是 心跳端口2888 和选举端口。
server2=192168209129:2888:3888
server3=192168209130:2888:3888
然后保存退出就OK了。
13 最后一步: 就是给三台zookeeper服务设置id。在哪里设置呢?
就是在zookeeper保存文件的目录下创建一个/export/data/zkdata/myid 文件。 文件名不能乱写,就得是是这个,选举的时候很关键的。
我们有三台zookeeper server,每台的myid文件数字 不一样,你得进入三台服务器分别编辑这个文件。
第一台服务器,vi myid 编辑该文件,写入一个数字 1
第二台服务器,vi myid 编辑该文件,写入一个数字 2
第三台服务器,vi myid 编辑该文件,写入一个数字 3
14 最后你启动一下zookeeper试试安装成功了没 。
/export/server/zookeeper/bin/zkServersh start 启动zookeeper的指令。可以看到日志打印出来的是默认Using zoocfg这个配置文件。三台服务你都要启动,zookeeper会根据你配置的三个ip port去发送心跳,自动建立集群。 并且根据myid去选举哪个server是leader,哪个是follower。
这里呢就安装完毕了! 动手操作也就14步是不是很简单。但是搞清楚原理才是最主要的。
zookeeper集群中增加机器需要重启
该命令的输出列表中应该有mod_so模块。如果所有这些条件均已具备,则可以很容易地借助apxs安装你自己的DSO模块以扩展Apache服务器的功能:
$ apxs -i -a -c mod_fooc
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_fooc
ld -Bshareable -o mod_fooso mod_fooo
cp mod_fooso /path/to/apache/modules/mod_fooso
chmod 755 /path/to/apache/modules/mod_fooso
[activating module 'foo' in /path/to/apache/etc/httpdconf]
$ apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_soc(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started
$ _
linux如何启动,停止,查看服务?
可以通过servicexxxstart/stop/resrart控制,可以通过systemctl,也可以通过/etc/initd/xxxservice来控制。
Linux启动、关闭、重启网络服务的两种方式?
第一种就是楼上说的直接service服务名称start/restart/stop第二种可以直接进入/etc/initd目录,服务的脚本文件都存放在此目录中,可以直接执行对其start/restart/stop如:#cd/etc/initd#/ntpdrestart关闭ntpd:启动ntpd:#
linux中开启服务的命令?
1
启动Nginx服务--在sbin目录下启动命令:/nginx关闭命令:/nginx-sstop和/nginx-squit刷新配置文件:/nginx-sreload(每次对Nginx的配置文件nginxconf修改后,都要进行重新加载配置文件)
2
进程查看进程ps-ef|grep-ixxxx-i大概是ignore是忽略的意思这里是忽略大小写。杀死进程kill-9xxxx
3
防火墙开启防火墙serviceiptablesstart关闭防火墙serviceiptablesstop查看防火墙的状态serviceiptablesstatus永久关闭防火墙chkconfigiptablesoff
4
启动zookeeper服务--在zookeeper的bin目录下开启zoo
linux进入系统的两种方式?
Linux启动、关闭、重启网络服务的两种方式:1、使用service脚本来调度网络服务,如:启动servicenetworkstart;关闭servicenetworkstop;重启servicenetworkrestart;2、直接执行网络服务的管理脚本,如:启动/etc/initd/networkstart;关闭/etc/initd/networkstop;重启/etc/initd/networkrestart。
Linux下。启动、重启、停止。服务的命令是多少?
启动直接点开机键就可以了,重启reboot就可以了关机,init3、shutdown-fnow、halt都可以关机,重启服务services服务restart停止服务services服务stop开始服务services服务start服务状态services服务status
0条评论