AWS EC2 Db1 Db2 Db3 搭建zookeeper集群

1 安装准备
系统:CentOS -7.6
zookeeper版本:zookeeper-3.4.6
JDK 1.8.0 (aws-centos环境默认没有安装jdk)

安装JDK可参考(可源码安装或YUM安装):    https://www.cnblogs.com/faberbeta/p/java-jdk.html
zookeeper下载链接:           https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/

yum install wget  java-1.8.0* -y

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

2 单机安装过程

创建zookeeper目录 解压文件
mkdir /service
tar -zvxf zookeeper-3.4.6.tar.gz  -C /service

创建zookeeper数据和日志存放目录
mv   /service/zookeeper-3.4.6   /service/zk
mkdir -p /service/zk/data /service/zk/logs
sed -i 's#$ZOO_LOG_DIR/zookeeper.out#/service/zk/logs/zookeeper.out#g'  /service/zk/bin/zkServer.sh

配置变量环境并使之生效
echo "export ZOOKEEPER_HOME=/service/zk" >> /etc/profile
echo 'export PATH=$ZOOKEEPER_HOME/bin:$PATH' >>  /etc/profile
source  /etc/profile

配置zoo.cfg文件
cd  /service/zk/conf
cp  zoo_sample.cfg   zoo.cfg
sed  -i  's#dataDir=/tmp/zookeeper#dataDir=/service/zk/data#g'   zoo.cfg
sed  -i  's%# example sakes.%dataLogDir=/service/zk/logs%g'  zoo.cfg

启动本地zookeeper
zkServer.sh   start
zkServer.sh   status


3 zookeeper集群安装过程
以aws云服务器为例

主机名         IP地址         myid        搭建路径
zk1       172.31.30.180      1        /service/zk
zk2       172.31.22.22          2        /service/zk
zk3        172.31.28.17          3        /service/zk


同单机一样安装,配置有以下不同。我这里有三台机器,所有机器zk配置应该保持一致。
把ID写入zookeeper安装目录下data/myid文件:
机器1: 172.31.30.180
echo 1 > /service/zk/data/myid
机器2: 172.31.22.22    
echo 2 > /service/zk/data/myid
机器3: 172.31.28.17
echo 3 > /service/zk/data/myid

三台机器配置hosts文件
echo 172.31.30.180 zk1 >> /etc/hosts
echo 172.31.22.22  zk2 >> /etc/hosts
echo 172.31.28.17  zk3 >> /etc/hosts

编辑zoo.cfg文件,添加一下配置:
# zk 节点配置,server.x,x为data/myid文件中的数字
server.1=172.31.30.180:2888:3888
server.2=172.31.22.22:2899:3899
server.3=172.31.28.17:2877:3877

依次启动,然后查看状态:
zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/appl/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
三台机器有一个leader,两个follower即为正确。

安装验证
[root@zk1 ~]# jps
可查看zookeeper的主进程 QuorumPeerMain

测试:去到每个zk的bin目录,执行脚本  ./zkServer.sh status,会看到他是leader还是follower,然后停掉leader,看看哪个follower会升成leader然后把停掉的节点启动,看看是不是变成follower了

客户端连接测试
[root@zk2 ~]# zkCli.sh  -server 172.31.30.180:2181

连接一个zk集群
zkCli.sh -server 172.31.30.180:2181,172.31.22.22:2181,172.31.28.17:2181


注意事项
Note:一定要谨记将logs文件夹重建,因为里面的version-2里面会保存原有记录,此记录有可能与新集群有冲突。还有dataDir也要重建,原有的节点快照都会导致新集群出现问题。

Note:zookeeper重启会自动清除zookeeper.out日志,所以如果出错要注意先备份这个文件

Note:连接到这个 ZooKeeper 集合体的客户端在 ZooKeeper 对象构造函数中应当使用 slave51:2181、slave52:2181、slave53:2181 作为主机字符串。这在搭建 Hadoop HA 模式中将会用到。

Note:你运行一个zookeeper也是可以的,但是在生产环境中,你最好部署3,5,7个节点。部署的越多,可靠性就越高,当然最好是部署奇数个,偶数个不是不可以的,但是zookeeper集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳。

Note:你需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘。 (独立磁盘可以确保zookeeper是高性能的。).如果你的集群负载很重,不要把Zookeeper和RegionServer运行在同一台机器上面

Zoo.cfg文件属性
属性        意义
tickTime    时间单元,心跳和最低会话超时时间为tickTime的两倍

dataDir        数据存放位置,存放内存快照和事务更新日志

clientPort    指定了 ZooKeeper 用于监听客户端连接的端口(通常使用 2181 端口)

initLimit    设定了所有 Follower 与 Leader 进行连接并同步的时间范围。如果在设定的时间段内,半数以上的跟随者未能完成同步,Leader 便会宣布放弃领导地位,然后进行另外一次 Leader 选举。如果这种情况经常发生可以通过日志中的记录发现这种情况),则表明设定的值太小。Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 ZooKeeper 服务器还没有收到 Follower 的返回信息,那么表明这个Follower 连接失败。总的时间长度就是 5*2000=10 秒

syncLimit    这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个,如果在设定的时间段内,一个跟随者未能完成同步,会自己重启。所有关联到跟随者的客户端将连接到另一个跟随者

server.id=host:port:port
server.A=B:C:D    集群结点列表:
A :是一个数字,表示这个是第几号服务器;
B :是这个服务器的 ip 地址或者主机名;
C :表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D :表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 ZooKeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。


搭建zookeeper集群遇到的问题:

问题一:
3个不同的AWS服务器中安装了zookeeper,运行zookeeper服务器时,在所有实例中都出现以下错误

日志报错:WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] 
  - Cannot open channel to 2 at election address /x.x.x.x:3888
java.net.ConnectException: Connection refused

问题解决:集群的每个节点需要定义本地服务器的私网IP,而不是公网IP。如果zoo.cfg文件
server.1=0.0.0.0:2888:3888
server.2=192.168.10.10:2888:3888
server.3=192.168.2.1:2888:3888
这里的ip为公网ip,服务器之间则无法连接到端口


问题二:

日志报错 java.net.NoRouteToHostException: No route to host

问题解决:1.zoo.cfg配置错误,或者hosts文件缺少映射
    2.防火墙没关闭

问题三:bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg

Error contacting service. It is probably not running


问题解决:可运行 ./zkServer.sh start-foreground 查看

zookeeper的运行需要JVM环境,可以使用java和java -version命令来验证

如果没有安装jdk,则安装即可

或 netstat -apn | grep 2181  查看端口是否被占用 如果端口被其他服务占用则更换端口即可

问题四: java.net.BindException: Cannot assign requested address (Bind failed)

问题解决:检查zoo.cfg文件是否有错误,检查文件内服务器对应的本地IP是否正确

如果遇到无法正常打开,可先查看状态,查看日志,针对日志报错信息处理问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值