我之前在一片文章 用Nginx+Redis实现session共享的均衡负载 中做了一个负载均衡的实验,其主要架构如下:
把debian1作为调度服务器承担请求分发的任务,即用户访问的是debian1,然后debain1把请求按照一定的策略发送给应用服务器:debian2或者debain3,甚至更多的debain4、5、6……
状态和数据可以放在外部的分布式缓存服务和分布式数据库服务中,这样应用服务本身就是无状态的,所以机器增减都是很容易的,应用的高可用是有保证的(对于有状态的高可用不仅要注意机器增减与切换、还要注意备份冗余、数据一致性等问题)。但是当时忽略了一个地方,那就是调度服务器debian1本身的高可用性没有考虑到,存在单点问题。
高可用的首要想法就是双机热备,故障时自动切换,所以我们要给debian1加一个备机debain1′。我现在按照自己的知识粗浅的把解决方案分为两类:客户端有感知的高可用、对客户端透明的高可用,并分别挑选一个示例做一下实验。
注:下面实现高可用都用的是双机热备,为了方便,把调度服务器debian1简称为主机,把调度服务器debian1的备机debian1′简称为备机。
客户端有感知的高可用
客户端有感知的高可用,也就是需要客户端的配合,客户端自己去确认服务器的变更并切换访问的目标。比如说我们的主机、备机都在ZooKeeper(或者其他类似的注册中心比如redis)中进行注册,客户端监听ZooKeeper中服务器的信息,发现主机下线自己就切换访问备机即可。
ZooKeeper伪集群搭建
首先在本机搭建包含3个节点的ZooKeeper伪集群。在官网下载版本3.5.4-beta,解压,然后复制3份,每一份都要做如下操作:
进入conf文件夹 创建一个配置文件zoo.cfg。代码如下:
initLimit=10
syncLimit=5
clientPort=2181(每个节点不同:2181,3181,4181)
tickTime=2000
dataDir=E:/zookeeper-3.5.4-1/data(每个节点不同:3.5.4-2,3.5.4-3)
dataLogDir=E:/zookeeper-3.5.4-1/datalog(每个节点不同,同上)
server.1=192.168.*.*::2888:3888(实验机器的局域网IP或者直接localhost)
server.2=192.168.*.*::4888:5888
server.3=192.168.*.*::6888:7888
创