一、准备条件:
- 系统中安装java rpm -ivh jdk-7u45-linux-i586.rpm
- 如果没有java则需要安装1.6版本以上的JDK
如果安装JDK,需要在/etc/profile中增加:
JAVA_HOME=/usr/java/jdk1.7.0_45
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
PATH =$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
- 如果防火墙未关闭,则需要关闭防火墙: service iptables stop
- 2181端口被占用,需要等待客户端释放该端口的占用
- 需要清除日志文件,不然启动之后会占用大量内存
二、安装cppunit1.10.2
1.解压缩 tar –xvzf
2../configure
3.make && make install
4.ACLOCAL=”aclocal –I/usr/local/share/aclocal/” autoreconf -if
5. autoreconf –if
三、安装zookeeper
1.进入/home/server1/zookeeper-3.4.5/zookeeper-3.4.5/src/c目录下,
2. ./configure
3.make && make install
4.修改/etc/profile,增加export LD_LIBRARY_PATH=/usr/local/lib
5.再root权限下执行export LD_LIBRARY_PATH=/usr/local/lib或者ldconfig
四、配置(伪)集群服务
1. 一台机器上跑三个server,如在/home/server1、/home/server2、/home/server3;分别放置zookeeper解压缩文件
2. 在每个server上都配置好zoo.cfg文件
如:我的目录是/home/server1/zookeeper-3.4.5/zookeeper-3.4.5/conf/zoo.cfg
内容如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=/home/server1/data
dataLogDir=/home/server1/dataLog
# the port at which the clients will connect
clientPort=2181(伪集群中每个server的监听端口必须不一致,否则有的服务启动不了)
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=127.0.0.1:2888:3888(myid为1)
server.2=127.0.0.1:2889:3889(myid为2)
server.3=127.0.0.1:2890:3890(myid为3)
6、配置每个server的myid文件
文件位置在zoo.cfg中配置的data目录,如我的为:dataDir=/home/server/data
myid的值与zoo.cfg中的server.x一致
Zookeeper其它介绍
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。
在Zookeeper集群中,主要分为三者角色,而每一个节点同时只能扮演一种角色,这三种角色分别是:
(1)Leader 接受所有Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部的数据交换(同步);
(2)Follower 直接为客户端服务并参与提案的投票,同时与Leader进行数据交换(同步);
(3)Observer 直接为客户端服务但并不参与提案的投票,同时也与Leader进行数据交换(同步);
图1 zookeeper集群整体架构
官网: http://zookeeper.apache.org/
Paxos算法:是一个基于消息传递的一致性算法。CAP:一致性(CONSISTENCY)、可用性(AVAILABILITY)、分区容忍性(PARTITION TOLERANCE)。
CAP理论并非严格的三选二,大多数情况下,A和C是可以兼得的,因为大多数情况下,P都不存在。P只有在结点之间通信延迟大于可接受的范围时才出现(结点之间开始近似隔离,状态开始不一致),即P一旦出现,我们选择继续提供服务那么状态就肯定不一致,也就等于放弃了C;我们选择不提供服务,那么就等于放弃了A。通俗一点,P并不是目标,也不是手段,它是伴随着“多结点,网络,数据,共享”的要求而必然出现的,出现的原因是因为网络的不可靠性及结点通信延迟(延迟的原因可能是由于硬件,网络,或者压力太大而无法及时响应)。
节点:
挥发节点:
计数节点:
Watch监测功能:
常用C API接口
1. zhandle_t *zookeeper_init(const char *host, watcher_fn fn,
int recv_timeout,
const clientid_t * clientid,
void *context, int flags);
2. zookeeper_close(zhandle_t * zh);
3. int zoo_exists(zhandle_t * zh, const char *path, int watch,
struct Stat *stat);
4. int zoo_delete(zhandle_t * zh, const char *path, int version);
5. int zoo_set(zhandle_t * zh, const char *path,
const char *buffer, int buflen, int version);
6. int zoo_get(zhandle_t * zh, const char *path, int watch,
char *buffer, int *buffer_len, struct Stat *stat);
7. int zoo_get_children(zhandle_t * zh, const char *path,
int watch, struct String_vector *strings);
其它一致性数据库
OpenReplica (Python)
Doozer (Go)
三种开源实现比较
| ZooKeeper | OpenReplica | Doozer |
功能 |
|
|
|
性能 |
|
|
|
资源消耗 | 由于一致性协议带来的额外网络交互,消息开销,以及本地log的IO开销,再加上ZK本身每1000条批量处理1次的优化策略,写入的平均响应时间总会在50-60ms之上。但是整体的TPS还是可观的。单个写入数据的体积越大,响应时间越长,TPS越低,这也是普遍规律了。压测过程中log文件对磁盘的消耗很大。实际运行中应该使用自动脚本定时删除历史log和snapshot文件。 |
|
|
成熟度 |
| 1.可利用资源较少,技术文档较少 | 1.主分支已经不再活跃,fork分支有持续更新 |
编程语言 | 基于 JRE, 提供 Java/C 两种API接入 | Python | Go |
适用场景 |
|
|
|