一,规划三台zk服务器构成集群

ip:172.18.1.1        机器名:zk1     对应myid: 1
ip:172.18.1.2 机器名:zk2 对应myid: 2
ip:172.18.1.3 机器名:zk3 对应myid: 3

说明:为什么zookeeper集群的数量需要是单数?

1,为了容错,增删改操作中需要半数以上服务器通过才算成功,

2,防脑裂,一个zookeeper集群中,必需有且只能有一台leader服务器

当leader服务器宕机时,剩下的服务器会通过半数以上投票选出一个新的leader服务器

集群总数共2台时,半数是1,半数以上最少是2,也就是一台也不能宕机

集群总数共3台时,半数是1.5,半数以上最少是2,也就是允许一台能宕机
集群总数共4台时,半数是2,半数以上最少是3,也就是允许一台能宕机 集群总数共5台时,半数是2.5,半数以上最少是3,也就是允许两台能宕机,
集群总数共6台时,半数是3,半数以上最少是4,也就是允许两台能宕机,

可见

允许两台能宕机:5台比6台成本更低

允许一台能宕机:3台比4台成本更低

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,在每台服务器上安装zookeeper之安装java

说明:jdk的安装包请从java官方站下载

1,解压并安装

[root@zookeeper ~]# cd /usr/local/source/
[root@zookeeper source]# tar -zxvf jdk-13.0.2_linux-x64_bin.tar.gz
[root@zookeeper source]# mkdir /usr/local/soft
[root@zookeeper source]# mv jdk-13.0.2 /usr/local/soft/

2,配置环境变量:

[root@zookeeper source]# vi /etc/profile

在末尾处添加环境变量:

export JAVA_HOME=/usr/local/soft/jdk-13.0.2
export JRE_HOME=${JAVA_HOME}/jre
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

使环境变量生效:

[root@zookeeper source]# source /etc/profile

3,查看版本,检验安装是否生效

[root@zookeeper source]# java --version
java 13.0.2 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)

三,在每台服务器上安装zookeeper之安装zookeeper

1,安装wget,供文件下载时使用:

[root@zookeeper source]# yum install wget

2,下载zookeeper

[root@zookeeper source]# wget https://downloads.apache.org/zookeeper/zookeeper-3.6.0/apache-zookeeper-3.6.0-bin.tar.gz

3,解压,安装

[root@zookeeper source]# tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
[root@zookeeper source]# mv apache-zookeeper-3.6.0-bin/ /usr/local/soft/

4,创建数据和日志目录

[root@zookeeper source]# mkdir -p /data/zookeeper
[root@zookeeper source]# mkdir -p /data/zookeeper/data
[root@zookeeper source]# mkdir -p /data/zookeeper/datalogs
[root@zookeeper source]# mkdir -p /data/zookeeper/logs

说明:

data:数据目录

datalogs:事务日志

logs:zk应用的日志

5,生成配置文件:

[root@zookeeper source]# cd /usr/local/soft/apache-zookeeper-3.6.0-bin/conf/
[root@zookeeper conf]# cp zoo_sample.cfg zoo.cfg

6,设置配置文件:

[root@zookeeper conf]# vi zoo.cfg

内容:

dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/datalogs
admin.enableServer=false

说明:admin.enableServer=false 用来关闭zk内置的web管理器

dataDir 定义了zk的数据目录

dataLogDir 定义了zk的事务日志

7,配置环境变量

[root@zookeeper conf]# vi /etc/profile

在末尾增加以下内容:

export ZK_HOME=/usr/local/soft/apache-zookeeper-3.6.0-bin
export PATH=$ZK_HOME/bin:$PATH

使环境变量生效:

[root@zookeeper conf]# source /etc/profile

8,测试启动和停止zookeeper

[root@zookeeper conf]# zkServer.sh start
[root@zookeeper conf]# zkServer.sh stop

四,在每台服务器上安装zookeeper之使zookeeper支持systemd

1,修改zkEnv.sh这个脚本

[root@zookeeper conf]# vi /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkEnv.sh

添加如下一行

JAVA_HOME=/usr/local/soft/jdk-13.0.2

到ZOOBINDIR=一行的上方

说明:为了解决从systemctl启动时找不到java而报错

2,找到ZOO_LOG_DIR一行,修改为:

ZOO_LOG_DIR="/data/zookeeper/logs"

用来记录zk运行时的日志

3,增加service文件,用来供systemd启动使用:

[root@zookeeper conf]# vi /etc/systemd/system/zookeeper.service

内容:

[Unit]
Description=zookeeper.service
After=network.target
ConditionPathExists=/usr/local/soft/apache-zookeeper-3.6.0-bin/conf/zoo.cfg [Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkServer.sh start
ExecStop=/usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkServer.sh stop [Install]
WantedBy=multi-user.target

3,测试启动/停止zk:

[root@zookeeper conf]# systemctl daemon-reload
[root@zookeeper conf]# systemctl start zookeeper
[root@zookeeper conf]# systemctl stop zookeeper

五,在每台服务器上安装zookeeper之查看当前已安装zk的版本:

1,安装nc,查看版本时作为工具使用

[root@zookeeper conf]# yum install nc

2,显示版本时会报错

[root@zookeeper conf]# echo stat|nc 127.0.0.1 2181
stat is not executed because it is not in the whitelist.

解决:

[root@zookeeper conf]# vi /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/zkServer.sh

在这个fi下面添加一行

ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
fi

新加一行:

ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

保存退出后重启服务:

[root@zookeeper conf]# systemctl stop zookeeper
[root@zookeeper conf]# systemctl start zookeeper

3,再次查看zk版本

[root@zookeeper conf]# echo stat|nc 127.0.0.1 2181
Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT
Clients:
/127.0.0.1:47654[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 5

六,在三台zookeeper服务器上做集群配置

1,配置文件中增加集群配置

[root@zk1 ~]# vi /usr/local/soft/apache-zookeeper-3.6.0-bin/conf/zoo.cfg

添加如下配置内容

#cluster
server.1=172.18.1.1:2888:3888
server.2=172.18.1.2:2888:3888
server.3=172.18.1.3:2888:3888

说明:server.n  n是一个数字,表示zookeeper服务器的序号

2888是在集群中follower连接到leader时使用的端口,

也就是:leader上开放此端口,follower连接到leader此端口访问数据

3888:集群内进行leader选举时使用的端口

说明:三台机器上都添加此集群配置,   配置内容相同

2,给每个机器指定id

在每台机器上zoo.cfg里dataDir指定的目录下,生成一个id值文件:myid

说明:myid内的值,要和本机ip对应的zoo.cfg中序号一致

zk1(172.18.1.1)上

[root@zk1 ~]# vi /data/zookeeper/data/myid
[root@zk1 ~]# more /data/zookeeper/data/myid
1

zk2(172.18.1.2)上

[root@zk2 ~]# vi /data/zookeeper/data/myid
[root@zk2 ~]# more /data/zookeeper/data/myid
2

zk3(172.18.1.3)上

[root@zk3 ~]# vi /data/zookeeper/data/myid
[root@zk3 ~]# more /data/zookeeper/data/myid
3

七,逐台启动服务器,检查各zookeeper的状态

1,启动zk服务

在三台机器上分别执行:

systemctl start zookeeper

2,分别在三台机器上检查状态:

[root@zk1 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

它的工作模式是: follower

[root@zk2 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

它的工作模式是: leader

[root@zk3 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

它的工作模式是: follower

3,mode也可以用stat这个四字命令查看,例子:

[root@zk1 ~]# echo stat | nc 172.18.1.1 2181
Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT
Clients:
/172.18.1.1:59284[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/1.9375/41
Received: 34
Sent: 33
Connections: 1
Outstanding: 0
Zxid: 0x100000004
Mode: follower
Node count: 6

4,单机方式运行的zookeeper服务的mode是什么?

[root@zk /]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone

可以看到,其Mode是standalone

八,测试:连接到zk服务,创建一个znode

1,在zk3上创建节点:

[root@zk3 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost(CONNECTED) 1] create /demo 'this is a demo'
Created /demo
[zk: localhost(CONNECTED) 2] ls /
[demo, zookeeper]

2,从zk1上查看节点:

[root@zk1 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 2] get /demo
this is a demo

可见创建的节点已同步到了zk1

九,测试:模拟zk集群一个节点发生故障后的处理?

1,当前zk2是leader,我们停掉它,然后看各服务器的mode变化:

停掉zk2

[root@zk2 ~]# systemctl stop zookeeper

zk1上查看状态

[root@zk1 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

zk1仍然是follower

zk3上查看状态

[root@zk3 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

zk3变成了leader

2,重新启动zk2:

[root@zk2 ~]# systemctl start zookeeper

再次查看状态,变成了 follower

[root@zk2 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/soft/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

3,在zk1上写入数据,从zk2上观察效果

[root@zk1 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 1] create /demo2 'demo2'
Created /demo2
[zk: localhost(CONNECTED) 2] get /demo2
demo2

回到zk2

[root@zk2 ~]# zkCli.sh -server localhost
[zk: localhost(CONNECTED) 1] get /demo2
demo2

4,结论:zookeeper的集群模式能有效的防止单点故障

十,查看centos的版本

[root@localhost liuhongdi]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

centos8平台安装zookeeper3.6集群的更多相关文章

  1. centos8安装fastdfs6.06集群方式三之:storage的安装/配置/运行

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...

  2. centos8安装fastdfs6.06集群方式二之:tracker的安装/配置/运行

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...

  3. centos8安装fastdfs6.06集群方式一之:软件下载与安装

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...

  4. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  5. Cloudera Manager安装之利用parcels方式安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(四)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  6. MySQL集群---②Windows平台搭建MySQL CLUSTER集群

    原文:http://blog.csdn.net/mazhaojuan/article/details/42211857 本文将通过两台电脑来简单介绍一下Windows平台如何搭建MySQL集群. My ...

  7. kubernetes(K8S)快速安装与配置集群搭建图文教程

    kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...

  8. flink初识及安装flink standalone集群

    flink architecture 1.可以看出,flink可以运行在本地,也可以类似spark一样on yarn或者standalone模式(与spark standalone也很相似),此外fl ...

  9. 4. 利用MySQL Shell安装部署MGR集群 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 安装准备 2. 利用MySQL Shell构建MGR集群 3. MySQL Shell接管现存的MGR集群 4 ...

随机推荐

  1. (课堂笔记)第三章:F5 LTM 负载均衡理论

    BIG-IP LTM负载均衡理论 ------F5 BIG-IP LTM负载均衡策略---------- 1.1 LTM VS工作模式F5 BIG-IP LTM的内部对于数据包的处理方式,即是VS的工 ...

  2. Java I/O流 复制文件速度对比

    Java I/O流 复制文件速度对比 首先来说明如何使用Java的IO流实现文件的复制: 第一步肯定是要获取文件 这里使用字节流,一会我们会对视频进行复制(视频为非文本文件,故使用之) FileInp ...

  3. SpringMVC-12-SSM回顾与总结

    12.SSM回顾与总结

  4. SSO单点登录可以自己实现吗?--开源软件诞生10

    ERP与SSO的恩怨情仇--第10篇 用日志记录“开源软件”的诞生 赤龙 ERP 开源地址: 点亮星标,感谢支持,与开发者交流 kzca2000 码云:https://gitee.com/redrag ...

  5. k8s数据管理(八)

    volume 我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可以使用 ...

  6. netty全局分析1

    这个系列都是别人的分析文 https://www.jianshu.com/p/ac7fb5c2640f 一丶 Netty基础入门 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.U ...

  7. java 泛型学习随笔

    对于java 泛型 编译时处理,运行时擦除的特点理解 对于编译时处理 在使用泛型相关的类或方法时,如果声明时的类型和具体使用时的类型不一致则直接会编译不通过 对于运行时擦除 当在运行时对两个相同类型但 ...

  8. Final终态类和Finally

  9. 十分钟快速上手NutUI

    本文将会从 NutUI 初学者的使用入手,对 NutUI 做了一个快速的概述,希望能帮助新人在项目中快速上手. 文章包括以下主要内容 安装引入 NutUI NutUI 组件的使用 NutUI 主题和样 ...

  10. python中yield的用法详解——最简单,最清晰的解释(转载)

    原文链接 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的, ...