安装单机habase报错,好像是zookeeper单机安装问题,单机还需要zookeeper单机安装么

转:Hbase集群安装过程中遇到的问题汇总
1、HRegionServer启动不正常
在namenode上执行jps,则可看到hbase启动是否正常,进程如下:
[root@master bin]# jps
26341 HMaster
7840 ResourceManager
7524 NameNode
7699 SecondaryNameNode
由上可见,hadoop启动正常。HBase少了一个进程,猜测应该是有个节点regionserver没有启动成功。
进入节点slave1 ,执行jps查看启动进程:
[root@master bin]# ssh slave1
Last login: Thu Jul 17 17:29:11 2014 from master
[root@slave1 ~]# jps
4296 DataNode
11261 HRegionServer
11184 QuorumPeerMain
由此可见Slave1节点正常。
进入节点slave2节点,执行jps查看启动进程:
[root@slave2 ~]# jps
3795 DataNode
11080 QuorumPeerMain
OK,问题找到了 HRegionServer没有启动成功。进入HBase日志:
09:28:19,392 INFO&
[regionserver60020] regionserver.HRegionServer: STOPPED: Unhandled:
org.apache.hadoop.hbase.ClockOutOfSyncException: Server
slave2,0498057 Reported time is too far out of sync with
master.& Time difference of ms & max
allowed of 30000ms
org.apache.hadoop.hbase.master.ServerManager.checkClockSkew(ServerManager.java:314)
org.apache.hadoop.hbase.master.ServerManager.regionServerStartup(ServerManager.java:215)
org.apache.hadoop.hbase.master.HMaster.regionServerStartup(HMaster.java:1292)
org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos$RegionServerStatusService$2.callBlockingMethod(RegionServerStatusProtos.java:5085)
org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2185)
org.apache.hadoop.hbase.ipc.RpcServer$Handler.run(RpcServer.java:1889)
根据错误日志,可得到slave2和maste机器时间差太多,查看各个系统的时间,果真如此,同步即可。另外一种方法就是配置hbase的配置文件:
配置:hbase.master.maxclockske
&&&&&&&&&&&&&&&
hbase.master.maxclockskew
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
Time difference of regionserver from master
(这种方法不推荐)
2、Zookeeper启动不正常。
  在启动hbase时,总是报错,提示zookeeper连接不上,查看zookeeper日志,发现:
  ClientCnxn$SendThread@966] - Opening socket connection to server slave1. Will
not attempt to authenticate using SASL (无法定位登录配置)。经过百度可得
由于hosts文件的问题,于是vi /etc/hosts 发现 ip
slave1配置中ip错误。汗!幸亏hbase和zookeeper都有日志。于是重启zookeeper和hbase,上述问题解决。
3、HBase shell执行list命令报错。
  在Hbase shell执行list命令报错:
关键错误信息:client.HConnectionManager$HConnectionImplementation:
Can't get connection to ZooKeeper: KeeperErrorCode = ConnectionLoss
/hbase。根据信息可以判断zk无法连接。执行jps查看zk都正常。查看hbase-site.xml中zk节点配置正常。根据经
验,应该是防火墙没有关闭,2181端口无法访问。ok执行service iptables
stop关闭防火墙,重启hbase。进入hbase shell,执行list:
hbase(main):001:0& list
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/root/hadoop/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/root/hadoop/hadoop-2.2.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See
for an explanation.
14:06:26,013 WARN& [main]
util.NativeCodeLoader: Unable to load native-hadoop library for
your platform... using builtin-java classes where applicable
0 row(s) in 1.0070 seconds
一切正常,问题解决。
4、HBase Shell 增删改异常。
  在hbase shell上做增删改就会报异常,
zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect。
经判断是hbase版本的jar包和hadoop中的jar包不兼容的问题。解决方法:将hadoop中hadoop-2.2.0相关的jar包copy过来(${HABASE_HOME}/lib)替换即可。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1&&& 基本信息
1.1&&&& 软件信息
hadoop-2.6.0
zookeeper-3.4.6
hbase-0.98.9-hadoop2
(以下示例中使用的操作系统是Centos 6.5,请将下载的3个tar包分别解压并放置在/usr/local/目录下)
(Hbase包中lib里可以看到zookeeper的jar包,从文件名可以确定使用的zookeeper版本)
1.2&&&& 集群组成:
Server Name
Hadoop Cluster
Zookeeper Ensemble
HBase Cluster
hadoopnamenode
Name node &&Resource manager
hadoop2ndnamenode
Secondary name node
hadoopdatanode1
Data node &&Node manager
Region server
hadoopdatanode2
Data node &&Node manager
Region server
hadoopdatanode3
Data node &&Node manager
Region server
2&&& Hadoop集群
2.1&&&& 配置
2.1.1&&&&& core-site.xml
&configuration&
&property&
&name&fs.defaultFS&/name&
&value&hdfs://hadoopnamenode:9000&/value&
&/property&
&/configuration&&
2.1.2&&&&& hdfs-site.xml
&configuration&
&property&
&name&dfs.namenode.name.dir&/name&
&value&file:/root/hadoopdata/namenode&/value&
&/property&
&property&
&name&dfs.datanode.data.dir&/name&
&value&file:/root/hadoopdata/datanode&/value&
&/property&
&property&
&name&dfs.namenode.secondary.http-address&/name&
&value&hadoop2ndnamenode:9001&/value&
&/property&
&/configuration&&
2.1.3&&&&& mapred-site.xml
&configuration&
&property&
&name&mapreduce.framework.name&/name&
&value&yarn&/value&
&/property&
&/configuration&&
2.1.4&&&&& yarn-site.xml
&configuration&
&property&
&name&yarn.nodemanager.aux-services&/name&
&value&mapreduce_shuffle&/value&
&/property&
&property&
&name&yarn.nodemanager.aux-services.mapreduce.shuffle.class&/name&
&value&org.apache.hadoop.mapred.ShuffleHandler&/value&
&/property&
&property&
&name&yarn.resourcemanager.resource-tracker.address&/name&
&value&hadoopnamenode:8025&/value&
&/property&
&property&
&name&yarn.resourcemanager.scheduler.address&/name&
&value&hadoopnamenode:8030&/value&
&/property&
&property&
&name&yarn.resourcemanager.address&/name&
&value&hadoopnamenode:8040&/value&
&/property&
&/configuration&
2.1.5&&&&& slaves
hadoopdatanode1
hadoopdatanode2
hadoopdatanode3
2.1.6&&&&& /etc/hosts
153.65.170.45
hadoopnamenode
153.65.171.174
hadoop2ndnamenode
153.65.171.20
hadoopdatanode1
153.65.170.204
hadoopdatanode2
153.65.170.85
hadoopdatanode3
2.1.7&&&&& ~/.bashrc
与上一篇博客介绍的Hadoop 1类似,为了方便起见,修改.bashrc设置环境变量,注意sbin最好也要加到path中:
export HADOOP_PREFIX=/usr/local/hadoop-2.6.0
export HADOOP_MAPRED_PREFIX=$HADOOP_PREFIX
export HADOOP_HDFS_PREFIX=$HADOOP_PREFIX
export HADOOP_YARN_PREFIX=$HADOOP_PREFIX
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin
2.1.8&&&&& 分发到集群的其它机器
把hadoop-2.6.0文件夹连同修改后的配置文件以及hosts文件,通过scp拷贝到其它四台机器上。
(并没有要求说所有的机器上都使用一样的配置文件,比如namenode的hdfs-site.xml应该是不需要dfs.datanode.data.dir配置,而datanode的hdfs-site.xml应该不需要dfs.namenode.name.dir配置。而也只有namenode上需要配置slaves文件。这里是为了简单起见,我们让所有机器上都保持一样的配置)
2.1.9&&&&& 设置ssh免密码访问
参见上一篇博客。
2.1.10&& 一些配置参数的解释
Hadoop 2中没有mapred.job.tracker了,新框架中已改为yarn-site.xml 中的 resouceManager 及 nodeManager具体配置项,新框架中历史 job 的查询已从Job tracker剥离,归入单独的mapreduce.jobtracker.jobhistory 相关配置。
yarn.resourcemanager.address---NodeManager 与 RM 通信的接口地址
yarn.resourcemanager.scheduler.address---NodeManger 需要知道 RM 主机的 scheduler 调度服务接口地址
yarn.resourcemanager.resource-tracker.address---NodeManager 需要向 RM 报告任务运行状态供 Resouce 跟踪,因此 NodeManager 节点主机需要知道 RM 主机的 tracker 接口地址
yarn.resourcemanager.webapp.address---各个 task 的资源调度及运行状况通过通过该 web 界面访问
2.2&&&& 创建目录
在namenode上创建: /root/hadoopdata/namenode
在3台datanode上创建: /root/hadoopdata/datanode
(也可以让hadoop自动创建)&
2.3&&&& 启动/关闭
start-dfs.sh,执行之后,使用jps命令查看java进程情况:
hadoopnamenode上有namenode进程,
hadoop2ndnamenode上有secondarynamenode进程,
hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode进程
start-yarn.sh,执行之后的java进程情况:
hadoopnamenode上有namenode, resourcemanager进程,
hadoop2ndnamenode上有secondarynamenode进程,
hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode, nodemanager进程
关闭的命令对应的是stop-dfs.sh, stop-yarn.sh
2.4&&&& 测试
hdfs dfsadmin -report //查看hdfs的一些基本信息
yarn node &list //查看yarn的一些基本信息
可以使用hadoop的share目录下的一些mapreduce示例程序进行测试,比如wordcount:
先使用copyFromLocal命令(后续有介绍用法)把一个本地文本文件放到hdfs的/book目录下,然后执行:
hadoop jar /usr/local/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount&& /book&& /out2
即对/book目录下的书进行单词统计,然后输出到/out2目录。
可以登录web界面检查hadoop是否运行正常:
hdfs管理界面同hadoop 1: http://hadoopnamenode:50070/&
yarn的管理界面不再是原来的50030端口,而是
2.5&&&& 注意事项
若namenode上的core-site.xml中的fs.defaultFS缺失,则启动时会报错。
若各机器上的yarn-site.xml中的yarn.resourcemanager.resource-tracker.address缺失,虽然resourcemanager与nodemanager进程能够正常启动,但是在执行yarn node -list会出现node数量为0的情况。
若各机器上的yarn-site.xml中的yarn.resourcemanager.scheduler.address或yarn.resourcemanager.address缺失,则在运行job时,会卡在INFO mapreduce.Job: Job job_9_0001 running in uber mode : false
2.6&&&& 几个Hadoop fs shell命令
hadoop fs -ls / ---列出hdfs根目录下的文件、目录
hadoop fs -ls /out2 ---列出out2目录下的文件、目录
hadoop fs -lsr / ---递归显示文件
hadoop fs -cat /out2/part-r-00000 ---打出文件内容
hadoop dfs -copyFromLocal& &local_FS_filename& &target_on_HDFS&
hadoop fs -du hdfs://namenodehost/user/hadoop ---查看目录大小
hadoop fs -rm /user/hadoop/file ---删除文件或空目录
hadoop fs -rmr /user/hadoop/dir ---删除文件或目录,递归之意
hafoop fs -tail /user/hadoop/sales.dat ---查看文件内容
dfs was deprecated in favor of "fs" command.
所以原来的hadoop dfs -copyFromLocal& &local_FS_filename& &target_on_HDFS&,现在的写法是
hadoop fs -copyFromLocal& &local_FS_filename& &target_on_HDFS&
hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test 这样生成的test是文件,而不是文件夹
所以一般hadoop fs -copyFromLocal /root/Downloads/small& /test,这样small下的文件会被copy到test文件夹下
又或者hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test4/,注意最后的/,前提是要用hadoop fs -mkdir先创建出test4目录
3&&& Zookeeper集群
3.1&&&& 配置
3.1.1&&&&& zoo.cfg
tickTime=2000
dataDir=/root/zookeeperdata
clientPort=2181
initLimit=5
syncLimit=2
server.1=hadoopnamenode:
server.2=hadoop2ndnamenode:
server.3=hadoopdatanode1:
3.1.2&&&&& 分发到集群的其它机器
把zookeeper文件夹连同修改后的配置文件通过scp拷贝到另外两台机器(hadoop2ndnamenode, hadoopdatanode)上。
3.1.3&&&&& 设置myid
hadoopnameonde上echo&1& & /root/zookeeperdata/myid
hadoop2ndnamenode上echo &2& & /root/zookeeperdata/myid
hadoopdatanode上echo&3& & /root/zookeeperdata/myid
3.1.4&&&&& 一些配置参数的解释
tickTime :心跳时间,单位毫秒。同时tickTime又是zookeeper中的基本单位,比如后面的initLimit=5就是指5个tickTime时间,在这里是10秒。&
dataDir :存储数据信息的本地目录。&
3.2&&&& 创建目录
在hadoopnamenode, hadoop2ndnamenode, hadoopdatanode1上创建dataDir中配置的目录/root/zookeeperdata。
3.3&&&& 启动/关闭
{ZOOKEEPER_HOME} /bin/zkServer.sh start
启动和关闭命令必须到zookeeper集群的每个机器上,没有像start-dfs.sh那样的命令可以一下子把整个集群启动。
关闭:{ZOOKEEPER_HOME} /bin/zkServer.sh stop
3.4&&&& 测试
{ZOOKEEPER_HOME} /bin/zkServer.sh status
以下是结果示例,可以看到各机器的角色是follower还是leader。
[root@hadoopnamenode zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[root@hadoop2ndnamenode zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[root@hadoopdatanode1 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
3.5&&&& 注意事项
对于一个包含3台server的Zookeeper集群,最多容许关闭一台(如果被关闭的是leader,则会重新选举出一个)。如果关闭两台,则剩下那台虽然进程QuorumPeerMain还在,但zkServer.sh status查看状态则显示Error contacting service. It is probably not running。
对于一个包含5台server的Zookeeper集群,最多容许关闭两台。关闭三台,则剩下两台虽然进程QuorumPeerMain还在,但也显示同样的错误。
(如果这个时候用Java程序去连接Hbase,则会提示:org.apache.hadoop.hbase.ZooKeeperConnectionException: Can't connect to ZooKeeper)
这里面有两个常见的疑问:
1) 当3台server关闭一台时,只剩下两台时,无法形成majority,那么它是如何选举出leader的?
2) 当5台server关闭三台时,剩下两台,为什么不能像1)中一样仍然正常工作?
这两个问题的答案是同一个,Zookeeper中的所谓majority voting机制,其majority是针对原始的server数量,不是指变化后的数量,这个原始的数量即你配置在zoo.cfg中的server个数。&
还有一个常见的问题是为什么推荐使用奇数个Zookeeper server,那是因为3个server与4个server能够提供的可靠性是一样的,3台server的集群允许其中一台server宕机,而4台server的集群也只能容许其中一台server宕机,因为如果两台server宕机,那么剩下两台,对比于原来的4台,2/4不够成大多数。
4&&& Hbase集群
4.1&&&& 配置
4.1.1&&&&& hbase-env.sh
其它不变,export HBASE_MANAGES_ZK=false,这表示不使用hbase自带的zookeeper,而使用外部的zookeeper(这里指我们在上面建的zookeeper)
4.1.2&&&&& hbase-site.xml
&configuration&
&property&
&name&hbase.rootdir&/name&
&value&hdfs://hadoopnamenode:9000/hbase&/value&
&description&The directory shared by region servers.&/description&
&/property&
&property&
&name&hbase.zookeeper.property.clientPort&/name&
&value&2181&/value&
&description&Property from ZooKeeper's config zoo.cfg. The port at which the clients will connect.
&/description&
&/property&
&property&
&name&zookeeper.session.timeout&/name&
&value&120000&/value&
&/property&
&property&
&name&hbase.zookeeper.quorum&/name&
&value&hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1&/value&
&/property&
&property&
&name&hbase.tmp.dir&/name&
&value&/root/hbasedata&/value&
&/property&
&property&
&name&hbase.cluster.distributed&/name&
&value&true&/value&
&/property&
&/configuration&
4.1.3&&&&& regionservers
hadoopdatanode1
hadoopdatanode2
hadoopdatanode3
4.1.4&&&&& 一些配置参数的解释
hbase.zookeeper.property.clientPort:指定zk的连接端口
zookeeper.session.timeout:RegionServer与Zookeeper间的连接超时时间。当超时时间到后,ReigonServer会被Zookeeper从RS集群清单中移除,HMaster收到移除通知后,会对这台server负责的regions重新balance,让其他存活的RegionServer接管.
hbase.zookeeper.quorum:默认值是&localhost,列出zookeepr ensemble中的servers
4.2&&&& 启动/关闭
bin/start-hbase.sh
bin/stop-hbase.sh
4.3&&&& 测试
在hadoopnamenode上执行
{HBASE_HOME}/bin/hbase shell
进入shell命令行,通过创建表等操作来检查不是不工作正常。
或者通过一个简单的Java程序来测试:
Configuration config = HBaseConfiguration.create();
config.set( "hbase.zookeeper.quorum", "hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1" );
config.set( "hbase.zookeeper.property.clientport", "2181" );
//config.set("zookeeper.znode.parent", "/hbase-unsecure"); // this is what most people miss :)
HBaseAdmin.checkHBaseAvailable( config );
= new HTable( config, "test" );
= new Scan();
//s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name"));
ResultScanner rs = t.getScanner( s );
for ( Result r : rs )
for ( Cell cell : r.rawCells() )
System.out.println( "RowName:" + new String( CellUtil.cloneRow( cell ) ) + " " );
System.out.println( "Timetamp:" + cell.getTimestamp() + " " );
System.out.println( "column Family:" + new String( CellUtil.cloneFamily( cell ) ) + " " );
System.out.println( "row Name:" + new String( CellUtil.cloneQualifier( cell ) ) + " " );
System.out.println( "value:" + new String( CellUtil.cloneValue( cell ) ) + " " );
} finally {
t.close();
System.out.println( "Done!" );
注意,java测试程序所在机器的hosts文件,注意必须有全FDQN(fully qualified domain name,&参见上面linux中的hosts文件),否则有java访问时会提示找不到&
4.4&&&& 注意事项
HBase集群需要依赖于一个Zookeeper ensemble。HBase集群中的所有节点以及要访问HBase的客户端都需要能够访问到该Zookeeper &ensemble。HBase自带了Zookeeper,但为了方便其他应用程序使用Zookeeper,最好使用单独安装的Zookeeper ensemble。
此外,Zookeeper ensemble一般配置为奇数个节点,并且Hadoop集群、Zookeeper ensemble、HBase集群是三个互相独立的集群,并不需要部署在相同的物理节点上,他们之间是通过网络通信的。
需要注意的是,如果要禁止启动hbase自带的zookeeper,那么,不仅仅需要刚才的export HBASE_MANAGES_ZK=false配置,还需要hdfs-site.xml中的hbase.cluster.distributed为true,否则你在启动时会遇到Could not start ZK at requested port of 2181&错误,这是因为hbase尝试启动自带的zookeeper,而我们已经启动了自己安装的那个zookeeper,默认都使用2181端口,所以出错。
还有,有时候会遇到stop-hbase.sh执行很长时间未结束,很可能的原因是你之前把zookeeper关闭了.
最后,Hbase不需要mapreduce,所以只要start-dfs.sh启动hdfs,然后到zookeeper各节点上启动zookeeper,最后再hbase-start.sh启动hbase即可.
阅读(...) 评论()Zookeeper(1)
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All
of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing
these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications
are deployed.
Reference Link: &http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
从官网下载最新的最稳定版本http://www.apache.org/dyn/closer.cgi/zookeeper/
在Linux下载的命令:wget&http://mirrors./apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
计划要安装主从,但先从单机开始,目录要规划好,可以在同一台机上部署三台,目录规划如下:
/usr/local/redis下zoo1,zoo2,zoo3
在zoo1下解压下载的压缩包,并创建data,datalog,logs文件夹。
配置文件cd&/usr/local/redis/zoo1/zookeeper-3.4.8/conf
cp zoo_sample.cfg &zoo.cfg
vi zoo.cfg添加或修改data文件夹目录
dataDir=/usr/local/redis/zoo1/data
dataLogDir=/usr/local/redis/zoo1/datalog
启动zookeeper
在zookeeper-3.4.8下运行命令,启动zookeeper
[root@JfbIpadServer02 /usr/local/redis/zoo1/zookeeper-3.4.8]#bin/zkServer.sh
ZooKeeper JMX enabled by default
Using config: /usr/local/redis/zoo1/zookeeper-3.4.8/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
使用命令客户端连接至zookeeper
[root@JfbIpadServer02 /usr/local/redis/zoo1/zookeeper-3.4.8]#bin/zkCli.sh
-server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTING) 0]
11:53:08,156
[myid:] - INFO &[main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x153c07ff35f0000, negotiated timeout = 30000
WatchedEvent state:SyncConnected type:None path:null
看到这个就已连接上了,回车后出现下面的命令提示行:
[zk: 127.0.0.1:2181(CONNECTED) 0]
可以运行一些命令进行测试查看
[zk: 127.0.0.1:2181(CONNECTED) 0]help
[zk: 127.0.0.1:2181(CONNECTED) 1]ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 2] create /zk_test my_data
Created /zk_test
[zk: 127.0.0.1:2181(CONNECTED) 3] ls / & & & & & & & & &&
[zookeeper, zk_test]
[zk: 127.0.0.1:2181(CONNECTED) 4] get /zk_test
cZxid = 0x2
ctime = Tue Mar 29 11:55:03 CST 2016
mZxid = 0x2
mtime = Tue Mar 29 11:55:03 CST 2016
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 5] set /zk_test junk
cZxid = 0x2
ctime = Tue Mar 29 11:55:03 CST 2016
mZxid = 0x3
mtime = Tue Mar 29 11:55:39 CST 2016
pZxid = 0x2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 6] get /zk_test
cZxid = 0x2
ctime = Tue Mar 29 11:55:03 CST 2016
mZxid = 0x3
mtime = Tue Mar 29 11:55:39 CST 2016
pZxid = 0x2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 7] delete /zk_test
[zk: 127.0.0.1:2181(CONNECTED) 8] get /zk_test
Node does not exist: /zk_test
[zk: 127.0.0.1:2181(CONNECTED) 9] ls /
[zookeeper]
单机zookeeper就安装并启动好了。
Running Replicated ZooKeeper
Running ZooKeeper in standalone mode is convenient for evaluation, some development, and testing. But in production, you should run ZooKeeper in replicated
mode. A replicated group of servers in the same application is called a quorum, and in replicated mode, all servers in the quorum have copies of the same configuration file.
For replicated mode, a minimum of three
servers are required, and it is strongly recommended that you have an odd number of servers. If you only have two servers, then you are in a situation where if one of them fails, there are not enough machines to form a majority quorum. Two servers is inherently&less&stable
than a single server, because there are two single points of failure.
其他两台,按照单机那台先部署。
进入data目录,创建一个myid的文件,里面写入一个数字,比如我这个是zoo1,那么就写一个1,zoo2对应myid文件就写入2,zoo3对应myid文件就写个3。
然后修改配置文件,The required conf/zoo.cfg file
for replicated mode is similar to the one used in standalone mode, but with a few differences. Here is an example:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/usr/local/redis/zoo1/data & & & #zoo1 zoo2 zoo3分别三台的目录
clientPort=2183 & & & & & & & & & & & & &#83 三台的端口
dataLogDir=/usr/local/redis/zoo1/datalog #zoo1 zoo2 zoo3分别三台的目录
server.1=127.0.0.1:
server.2=127.0.0.1:
server.3=127.0.0.1:
最后几行需要注意的地方就是 server.X 这个数字就是对应 data/myid中的数字。你在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配server.1,server.2,server.3就OK了。因为在同一台机器上,后面连着的2个端口3个server都不要一样,否则端口冲突,其中第一个端口用来集群成员的信息交换,第二个端口是在leader挂掉时专门用来进行选举leader所用。
进入zookeeper/bin目录中,./zkServer.sh start启动一个server,这时会报大量错误?其实没什么关系,因为现在集群只起了1台server,zookeeper服务器端起来会根据zoo.cfg的服务器列表发起选举leader的请求,因为连不上其他机器而报错,那么当我们起第二个zookeeper实例后,leader将会被选出,从而一致性服务开始可以使用,这是因为3台机器只要有2台可用就可以选出leader并且对外提供服务(2n+1台机器,可以容n台机器挂掉)。
接下来就可以使用了,我们可以先通过 zookeeper自带的客户端交互程序来简单感受下zookeeper到底做一些什么事情。进入zookeeper/bin(3个server中任意一个)下,./zkCli.sh –server 127.0.0.1:2182,我连的是开着2182端口的机器。输入help命令,查看结果:
ls(查看当前节点数据),
ls2(查看当前节点数据并能看到更新次数等数据) ,
create(创建一个节点) ,
get(得到一个节点,包含数据和更新次数等数据),
set(修改节点)
delete(删除一个节点)
通过上述命令实践,我们可以发现,zookeeper使用了一个类似文件系统的树结构,数据可以挂在某个节点上,可以对这个节点进行删改。另外我们还发现,当改动一个节点的时候,集群中活着的机器都会更新到一致的数据。&
通过java代码使用zookeeper&
Zookeeper的使用主要是通过创建其jar包下的Zookeeper实例,并且调用其接口方法进行的,主要的操作就是对znode的增删改操作,监听znode的变化以及处理。
package com.jh.sms.
import org.apache.zookeeper.CreateM
import org.apache.zookeeper.WatchedE
import org.apache.zookeeper.W
import org.apache.zookeeper.ZooDefs.I
import org.apache.zookeeper.ZooK
public class ZookeeperTest {
public static void zooTest()throws Exception{
//创建一个Zookeeper实例,第一个参数为目标服务器地址和端口,第二个参数为Session超时时间,第三个为节点变化时的回调方法
ZooKeeper zk = new ZooKeeper(&192.168.0.149:2181&, 500000,new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
//dosomething
System.out.println(event.getState().name()+& int: &+event.getState().getIntValue());
//创建一个节点root,数据是mydata,不进行ACL权限控制,节点为永久性的(即客户端shutdown了也不会消失)
zk.create(&/root&, &mydata&.getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//在root下面创建一个childone znode,数据为childone,不进行ACL权限控制,节点为永久性的
zk.create(&/root/childone&,&childone&.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
//取得/root节点下的子节点名称,返回List&String&
zk.getChildren(&/root&,true);
//取得/root/childone节点下的数据,返回byte[]
zk.getData(&/root/childone&, true, null);
//修改节点/root/childone下的数据,第三个参数为版本,如果是-1,那会无视被修改的数据版本,直接改掉
zk.setData(&/root/childone&,&childonemodify&.getBytes(), -1);
//删除/root/childone这个节点,第二个参数为版本,-1的话直接删除,无视版本
zk.delete(&/root/childone&, -1);
//关闭session
zk.close();
public static void main(String[] args)throws Exception {
ZookeeperTest.zooTest();
}运行后,可以在zookeeper集群上看到相应的数据:
[zk: 127.0.0.1:2182(CONNECTED) 1] ls /
[root, zookeeper, zk_test]
[zk: 127.0.0.1:2182(CONNECTED) 2] get /root
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5619次
排名:千里之外
原创:31篇
转载:11篇
(4)(11)(1)(9)(2)(3)(12)

我要回帖

更多关于 zookeeper mysql ha 的文章

 

随机推荐