zookeeper在windows下的伪集群模式


1.下载(本次测试环境是3.4.6的版本)

http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.6/


2.下载zookeeper-3.4.6.tar.gz后,解压即可


3.在 \zookeeper-3.4.6\conf\ 新建三个配置文件

zoo1.cfg:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:\\tmp\\zookeeper\\data\\1
dataLogDir=E:\\tmp\\zookeeper\\log\\1
clientPort=2181
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
zoo2.cfg:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:\\tmp\\zookeeper\\data\\2
dataLogDir=E:\\tmp\\zookeeper\\log\\2
clientPort=2182
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889

zoo3.cfg:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=E:\\tmp\\zookeeper\\data\\3
dataLogDir=E:\\tmp\\zookeeper\\log\\3
clientPort=2183
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889

4.在 \zookeeper-3.4.6\bin\ 新建三个server
拷贝zkServer.cmd三份,分别命名zkServer-1.cmd,zkServer-2.cmd,zkServer-3.cmd;
打开这三个.cmd,在set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain后面
添加一行,对应相应的配置文件:
set ZOOCFG=..\conf\zoo1.cfg(zkServer-1.cmd添加)
set ZOOCFG=..\conf\zoo2.cfg(zkServer-2.cmd添加)
set ZOOCFG=..\conf\zoo3.cfg(zkServer-3.cmd添加)


5.添加data和log文件夹


E:\tmp\zookeeper\ 下新建data文件夹,在data下创建1 2 3文件夹



E:\tmp\zookeeper\ 下新建log文件夹,在log下创建1 2 3文件夹





6.创建myid
分别在data\1,data\2,data\3下创建文件 myid(去掉后缀名),并分别添加内容 1、2、3


7.启动Server
控制台进入bin目录,分别输入:zkServer-x.cmd启动即可。

启动三个server文件后,用jps查看,会看到三个启动的java主进程。


也可输入:netstat -ano|findstr "2181"  查看端口是否监听


注:启动过程中zkServerXXX.cmd可能会报错:
2015-10-09 11:20:08,162 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:218  
1:QuorumCnxManager@382] - Cannot open channel to 3 at election address localhost  
/192.168.132.16:3889  
java.net.ConnectException: Connection refused: connect  
        at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)  
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketI  
mpl.java:85)  

        这是因为,zookeeper集群采用的是选举算法,当集群中的其他节点还没有启动的时候,选举算法就会出现异常,因为至少三台能选举出一个leader,2n+1台机器,可以选举n个leader,当全部启动起来后,就不会报异常,所以上述的报错是可以忽略的,尽管启动这三个节点即可。

这样在一台机器上搭建了zookeeper伪集群,并且启动成功。


8.C#客户端代码

代码下载参考这位博主的好文:http://www.cnblogs.com/shanyou/p/3221990.html

 class Watcher : IWatcher
    {
        public void Process(WatchedEvent @event)
        {
            //if (@event.Type == EventType.NodeDataChanged)
            //{
                Console.WriteLine("已经触发了" + @event.Type + "事件!");
            //}
        }
    }

 static void Main(string[] args)
        {

            //创建一个Zookeeper实例,第一个参数为目标服务器地址和端口,第二个参数为Session超时时间,第三个为节点变化时的回调方法 
            using (ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", new TimeSpan(0, 0, 0, 50000), new Watcher()))
            {
                //var stat = zk.Exists("/root",true);
                 
                ////创建一个节点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 
                List liststr =  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);
            }
            Console.Read();

        }

问题:还不清楚zookeeper客户端代码的具体用法,还需要摸索。


9.linux下环境搭建

参考这位博主的好文:http://blog.csdn.net/eric_sunah/article/details/43969603

其中,下载连接修改一下即可:

wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz


10.遗留问题

还没有用zookeeper搭建生产环境,计划是用thrift做服务,zookeeper服务治理,可用nginx做负载均衡,还没去做这件事。后续补上

你可能感兴趣的:(zookeeper)