一,规划三台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. 发现新世界:神级浏览器插件TamperMonkey(暴力猴)

    由于谷歌浏览器各种受限 于是我就先使用火狐浏览器尝试此插件 步骤非常简单. 1.在火狐浏览器内打开如下网址:https://addons.mozilla.org/zh-CN/firefox/addon ...

  2. Burp Suite抓包使用步骤

    Burp Suite抓包工具的操作步骤见安装步骤那篇博客 检查是否存在漏洞,就看拦截之后修改过的数据是否写进了数据库 举例一.上传文件 1.打开Burp.调整Proxy-Intercept-Inter ...

  3. git如何在远程某个分支的基础上新建分支

    1.任意新建文件夹,右击git bash here $ git init(将此目录变成本地仓库) 2.$ git remote add origin 'https://git............g ...

  4. Java语言的优势

    首先, Java语言是一种纯粹的面向对象的编程语言.这样就决定了Java语言更能直接客观地反映现实生活中的对象,因此Java语言更适合大型的复杂系统开发. 其次, Java语言是一种平台无关的语言.  ...

  5. Linux实战(5):Centos8安装python

    Centos8正式版已经发布了,已经尝鲜的小伙伴们会发现与其他Linux发行版不同,CentOS 8默认不安装Python.接下来的操作指导大家如何安装python3. 转自链接 安装python3 ...

  6. nginx.config 多个方案解决跨域问题

    #user nobody; user sam owner; worker_processes 1; #error_log logs/error.log; #error_log logs/error.l ...

  7. Win10系统安装Tensorflow-GPU和VSCode构建Tensorflow开发环境

    [前言] 1. 最近因为上课需要安装Anaconda和Tensorflow-GPU,Anaconda安装很容易,但Tensorflow-GPU版本的安装较为复杂,因为需要考虑版本匹配的一些问题,很容易 ...

  8. 熬夜23天吃透,九大核心专题,成功收割了阿里、百度、美团3家offer

    前言 今年受疫情影响非常大,春招和金三银四都要比往年来得更迟一些.春招结束之后,我特意把自己的面试经历顺了顺,总结出了不少的经验.对了,这次一共收割了3个大厂offer,分别是蚂蚁金服.美团和网易,特 ...

  9. 你没有看错,爬网页数据,C# 也可以像 Jquery 那样

    一:背景 1. 讲故事 前段时间搞了一个地方性民生资讯号,资讯嘛,都是我抄你的,你抄官媒的,小市民都喜欢奇闻异事,所以就存在一个需求,如何去定向抓取奇闻异事的地方号上的新闻,其实做起来很简单,用逻辑回 ...

  10. 有关java反射的几个小方法的作用和区别

    1.Class类中 getXXX()和getDeclaredXXX()的作用和区别: 前者获取某个类的所有公共(public)的字段(or方法or构造函数),包括父类.后者获取所有的字段(or方法or ...