【Zookeeper】Zookeeper服务搭建(单体服务简易版)

在最近的一个项目中,涉及到多端接口的交互,原本的rest方式调用复杂度大大增加。因此考虑使用注册中心和RPC等组件来实现,经过挑选,选择了Zookeeper作为注册中心配合Dubbo实现rpc调用。

Zookeeper简述

Apache为了解决分布式环境中资源配置问题的解决方案。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

环境安装

在进行之前,我们需要保证服务器中带有jdk1.8的环境,java的环境配置十分清晰,这里不再赘述。

首先去官方选择我们要下载的Zookeeper版本,Zookeeper官网-Release,拿到真正的下载连接后,我们用wget等工具下载到服务器中。

相应的解压工具进行解压,我们对apache-zookeeper-<版本号>-bin这一很复杂的名字重新命名为zookeeper继续下面的步骤。

环境配置

安装好后需要进行配置,在zookeeper的根目录下的conf文件夹中由配置文件的模板,我们复制一份命名为zoo.cfg(在后面启动时zookeeper会默认读取conf/zoo.cfg作为配置)

编辑配置文件前,记得把指定的数据文件夹和日志文件夹mkdir出来,防止报错。

下面时我本机的配置,仅作参考:

# 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

# 数据文件夹和日志文件夹,提前需要先mkdir出来
dataDir=/home/admin/zookeeper/data
dataLogDir=/home/admin/zookeeper/logs

# 对外界提供服务的接口
clientPort=2181

# 默认情况下,zookeeper会在8080端口上运行一个admin的web,但是服务器原本8080端口跑了另外的服务,因此改成8081
admin.serverPort=8081

# 指定最大连接数
maxClientCnxns=60

服务启动

编辑保存好配置文件后,进入bin目录下,运行sudo ./zkServer.sh start启动服务,可以看到类似下面的输出:

ZooKeeper JMX enabled by default
Using config: /home/admin/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

这串输出并不能认为是成功启动,接着我们需要用自带的客户端工具检测服务是否真的运行,./zkCli.sh -server 127.0.0.1:2181,其中2181是我们向外暴露服务的端口,和上一部分的配置文件中的一致。

如果服务成功启动,我们可以看到类似[zk: 127.0.0.1:2181(CONNECTED) 0]在控制台中出现,其中的CONNECTED表示已经成功连接zookeeper服务。

至此在本机的服务已经部署完毕,想要将服务供外部使用,我们还需要将进入服务器的流量转发到localhost:2181这个socket中。网上有些使用修改hosts文件的方式让zookeeper服务绑定到公网IP上,但是这里我们主要是为了配合Dubbo使用,而且没有集群配置,这里就不修改hosts了。这里我们使用nginx对流量进行转发。

nginx转发部分配置:

stream {

    upstream zookeeper {
       hash $remote_addr consistent;
       server 127.0.0.1:2181 weight=5 max_fails=3 fail_timeout=30s;
    }
    server {
       listen 2182;                              # outer port when using zookeeper service.
       proxy_connect_timeout 15s;
       proxy_timeout 300s;
       proxy_pass zookeeper;
    }

}

经过nginx转发后,外部使用这台服务器可以使用<公网ip>:2182的方式进行。

注意,如果我们使用的服务器的云供应商对端口进行了封锁,会导致我们指定的端口tcp流量进不去,需要去相应云提供商的控制台打开相应端口的管控。(这里当时卡住好久,外部访问nginx暴露的2182端口一直连接不上,一直以为是自己的环境配置有问题,后来联想到之前的mysql服务暴露出3307端口转发本地3306也没成功,因此可能是云服务商的防火墙拦住了,关闭云提供商的防火墙竟然一切畅通…)

参考文章

[1] segmentfault 可能是全网把 ZooKeeper 概念讲的最清楚的一篇文章 Snailclimb

你可能感兴趣的:(总结,tricks,经验总结)