集群与分布式;Zookeeper的集群搭建

1.集群概述

1.1 什么是集群

1.1.1 集群概念
集群是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。

1.1.2 集群的特点
集群拥有以下两个特点:

  1. 可扩展性:集群的性能不限制于单一的服务实体,新的服务实体可以动态的添加到集群,从而增强集群的性能。
  2. 高可用性:集群当其中一个节点发生故障时,这台节点上面所运行的应用程序将在另一台节点被自动接管,消除单点故障对于增强数据可用性、可达性和可靠性是非常重要的。

1.1.3 集群的两大能力
集群必须拥有以下两大能力:

  1. 负载均衡:负载均衡把任务比较均匀的分布到集群环境下的计算和网络资源,以提高数据吞吐量。单机的Tomcat最大并发数为几百,Nginx为5万,redis和solr都吃内存,理论上内存越大能承载并发就越大,有人测试过十万级并发。
    
  2. 错误恢复:如果集群中的某一台服务器由于故障或者维护需要无法使用,资源和应用程序将转移到可用的集群节点上。这种由于某个节点的资源不能工作,另一个可用节点中的资源能够透明的接管并继续完成任务的过程,叫做错误恢复。
    

负载均衡和错误恢复要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图必须是相同的。

1.2 集群与分布式的区别

说到集群,可能大家会立刻联想到另一个和它很相近的一个词----“分布式”。那么集群和分布式是一回事吗?有什么联系和区别呢?
相同点:
分布式和集群都是需要有很多节点服务器通过网络协同工作完成整体的任务目标。
不同点:
分布式是指将业务系统进行拆分,即分布式的每一个节点都是实现不同的功能。而集群每个节点做的是同一件事情。

2.Zookeeper集群

2.1 Zookeeper集群简介

2.1.1 为什么搭建Zookeeper集群
大部分分布式应用需要一个主控、协调器或者控制器来管理物理分布的子进程。目前,大多数都要开发私有的协调程序,缺乏一个通用机制,协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器,zookeeper提供通用的分布式锁服务,用以协调分布式应用。所以说zookeeper是分布式应用的协作服务。
zookeeper作为注册中心,服务器和客户端都要访问,如果有大量的并发,肯定会有等待。所以可以通过zookeeper集群解决。

下面是zookeeper集群部署结构图:
在这里插入图片描述
2.1.2 Leader选举
Leader服务器在整个正常运行期间有且仅有一台,集群会通过选举的方式选举出Leader服务器,由它同统一处理集群的事务性请求以及集群内各服务器的调度。

首先我们来看看什么是leader选举。其实这个很好理解,leader选举就像总统选举一样,每人一票,获得多数票的人就当选为总统了。在zookeeper集群中也是一样,每个节点都会投票,如果某个节点获得超过半数以上的节点的投票,则该节点就是leader节点了。
以一个简单的例子来说明整个选举的过程.
假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的.假设这些服务器依序启动,来看看会发生什么 。
1)服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是LOOKING状态
2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1,2还是继续保持LOOKING状态.
3)服务器3启动,根据前面的理论分析,服务器3成为服务器1,2,3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的leader.
4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1,2,3,4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了.
5)服务器5启动,同4一样,当小弟
6) 当老大宕机, 所有小弟会重新投票给id最大的小弟,变为老大. 所以当半数以上服务器都宕机后, id最大的也无法再得票超过半数, 所以整个集群系统瘫痪
7)当半数以上服务器故障时,整个集群系统瘫痪

2.2 搭建Zookeeper集群

2.2.1 搭建要求
真实的集群是需要部署在不同的服务器上的,但是在我们测试时同时启动十几个虚拟机内存会吃不消,所以我们通常会搭建伪集群,也就是把所有的服务都搭建在一台虚拟机上,用端口进行区分。
这里要求搭建一个三个节点的Zookeeper集群(伪集群)。
在这里插入图片描述
在这里插入图片描述
配置虚拟机开机自动联网(不配每次都要手动打开网络)
cd /etc/sysconfig/network-scripts/
打开当前虚拟机使用的虚拟网卡的配置文件, 每台虚拟机名字不同, 可ifconfig查看
vi ifcfg-ens33
将文件中的
ONBOOT=no
改为
ONBOOT=yes

3)重启并以root账号登录

4)安装JDK
虚拟机自带,可使用命令确认:
java -version
看到版本号输出代表已有jdk安装
在这里插入图片描述
5)Zookeeper压缩包上传到虚拟机任意目录
zookeeper-3.4.6.tar.gz
本例放到root的home目录

6)将Zookeeper解压,创建data目录,将conf下zoo_sample.cfg文件改名为zoo.cfg
cd ~
tar -zxvf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6/
mkdir data
cd conf
cp zoo_sample.cfg zoo.cfg

7)建立/usr/local/zookeeper-cluster目录,将解压后的Zookeeper复制到以下三个目录:
/usr/local/zookeeper-cluster/zookeeper-1
/usr/local/zookeeper-cluster/zookeeper-2
/usr/local/zookeeper-cluster/zookeeper-3
因为选举要半数以上,所以推荐搭建奇数台

mkdir /usr/local/zookeeper-cluster
cp -r ~/zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-1
cp -r ~/zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-2
cp -r ~/zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-3

8)配置每一个Zookeeper的dataDir(zoo.cfg)clientPort分别为2181 2182 2183 集群地址
vim /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
修改:
dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data
clientPort=2181
server.1=172.16.52.215:2881:3881
server.2=172.16.52.215:2882:3882
server.3=172.16.52.215:2883:3883
在这里插入图片描述
vim /usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
修改:
dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data
clientPort=2182
server.1=172.16.52.215:2881:3881
server.2=172.16.52.215:2882:3882
server.3=172.16.52.215:2883:3883
在这里插入图片描述

vim /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
修改:
dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data
clientPort=2183
server.1=172.16.52.215:2881:3881
server.2=172.16.52.215:2882:3882
server.3=172.16.52.215:2883:3883
在这里插入图片描述
2.2.3 配置集群
1)在每个zookeeper的data目录下创建一个myid文件,内容分别是1、2、3。这个文件就是记录每个服务器的ID
echo 1 >/usr/local/zookeeper-cluster/zookeeper-1/data/myid
echo 2 >/usr/local/zookeeper-cluster/zookeeper-2/data/myid
echo 3 >/usr/local/zookeeper-cluster/zookeeper-3/data/myid

2.2.4 启动集群
/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh start

1)启动后我们查询一下每个实例的运行状态
先查询第一个服务
/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh status
在这里插入图片描述
2)再查询第二个服务Mod为leader表示是领导者(主)
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
在这里插入图片描述

3)查询第三个为跟随者(从)
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh status
在这里插入图片描述
2.2.5 模拟集群异常
1)首先测试从服务器挂掉
把3号服务器停掉
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh stop
观察1号和2号状态变化(并无变化)
/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
在这里插入图片描述
结论:3个节点的集群,从服务器挂掉,集群正常

2)再把1号服务器(从服务器)也停掉
当半数以上服务器故障时,整个集群系统瘫痪
/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh stop
查看2号主服务器的状态(已经停止)
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
在这里插入图片描述
结论:3个节点的集群,2个从服务器都挂掉,主服务器也无法运行。因为可运行的机器没有超过集群总数量的半数。

3)再次把1号服务器启动起来,发现2号服务器又开始正常工作了。而且依然是领导者。
/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh start
查看2号主服务器的状态(也启动并还是领导者)
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
在这里插入图片描述

4)启动3号服务器,并停掉2号服务器
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh stop
观察1号和3号的状态(产生新的领导者)
/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh status
在这里插入图片描述
结论;当集群中的主服务器挂了,集群中的其他服务器会自动进行选举状态,然后产生新的leader

5)重新启动2号服务器
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh start
查看2号服务器状态
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
在这里插入图片描述

2.4 zookeeper集群开机自动启动
2.4.1 设置自动运行脚本可执行权限
chmod +x /etc/rc.d/rc.local

2.4.2 编辑自动运行脚本
增加启动tomcat、zookeeper
vim /etc/rc.d/rc.local
添加如下内容:
/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh start

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值