集中式特点

最大特点部署简单,不用考虑多节点部署和分布式协调问题

集中性问题

单点故障后整个服务不可用

扩容困难

对服务器性能要求高,大型服务器价格高

分布式特点

分布性:服务器分布在不同网络结点(服务器可分布在不同机房,甚至不同地点)

并发性:并发操作是很常见的(比如同一个分布式系统中的不同节点,共同访问共享资源)

无序性:进程之间的通信,可能会出现顺序不一致(服务器可能先接收到,客户端后发出的请求)

分布式面临的问题

网络通信:网络通信具有不可靠性(丢包,延迟,不可达)

网络分区:由于网络通信的不可靠,可能会引起网络分区(也称脑列),一个可互通的网络,被分成几个相互隔离的子网络。

三态:每一次请求,存在三种状态:成功、失败、超时

什么是zookeeper?

Zookeeper是一个开放源代码的分布式服务,是分布式一致性的解决方案。

Zookeeper 能做什么?

数据发布/订阅、负载均衡、分布式协调/通知、master选举、集群管理、分布式队列和分布式锁等

Zookeeper的分布式一致性特性

顺序一致性:同一个客户端发起的请求会严格按照顺序应用到zookeeper中(会按照发起请求的先后顺序进行处理)

原子性:所有的事务请求在整个服务集群的应用情况一定是一致的

单一视图:无论请求任何服务器,所看到的数据都是以一致的

可靠性:一旦应用了某个事务,那么该事务所引起的状态变化会被保留下来,除非另一个事务对其进行了改变

实时性:一旦事务应用成功,客户端能从服务器读到最新数据(实时性是一定时间段后并非马上)

Zookeeper设计目标

Zookeeper致力于提供高性能、高可用、能够控制顺序访问的分布式服务。

集群角色

传统集群角色Master-salve:master 负责谢操作

Zookeeper集群角色Leader-follower-observer:leader负责写操作

ZAB(zookeeper atomic broadcast)zookeeper原子广播协议

zookeeper使用ZAB协议作为其数据一致性核心算法

发现阶段:

follower提交事务(proposal)的epoch>>准leader根据接收到follwer的epoch后newepoch(生成新周期的epoch)>>follwer 发送ACK-E应答newepoch消息

同步阶段:

leader发送newleader(向各个follwer发送我是领导信息)>>follwer 发送ACK-LD 应答newleader信息>>leader发送cimmit-ld要求follwer提交历史事务

广播阶段:

leader进行propose提议>>follwer表决提议ACK>>leader发送cimmit要求follwer提交事务(proposal)

ZAB算法描述示意图




centos 操作系统下的软件清单_ZAB协议


Zookeeper centos7单机安装部署步骤

1.安装配置JDK环境,这里跳过

2.安装配置zookeeper

1. 创建 /lwl/services/zookeeper 文件夹:
mkdir -p /lwl/services/zookeeper

2. 进入目录

cd /lwl/services/zookeeper

3. 下载指定版本zookeeper

wget http://apache.fayea.com/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz

4. 解压zookeeper

tar -xzvf zookeeper-3.4.12.tar.gz

5. 进入zookeeper配置文件目录

cd zookeeper-3.4.12/conf/

6. 复制zoo-sample.cfg

cp zoo_sample.cfg zoo.cfg

7. vim或vi进入修改 zoo.cfg文件,配置数据存放路径和日志存放路径

vim zoo.cfg

#配置data存放路径

dataDir=/lwl/services/zookeeper/zookeeper-3.4.12/data

/#配置日志存放路径

dataLogDir=/lwl/services/zookeeper/zookeeper-3.4.12/logs

:wq保存修改并退出

如图


centos 操作系统下的软件清单_ZAB协议_02


8. 把zookeeper_home/bin添加到环境变量

vim /etc/profile

#添加环境变量配置

export ZOOKEEPER_HOME=/lwl/services/zookeeper/zookeeper-3.4.12

export PATH=$ZOOKEEPER_HOME/bin:$PATH

:wq保存退出


centos 操作系统下的软件清单_集群部署_03


9. 使配置立即生效

source /etc/profile

10. 启动zookeeper服务(提示是无效命令时,请检查环境变量配置8,9)

zkServer.sh start

启动效果如图


centos 操作系统下的软件清单_Zookeeper_04


11. 查看zookeeper状态

zkServer.sh status

集群部署配置

12. 点击安装好zookeeper后,在zoo.cfg 添加配置(集群下zoo.cfg应该是共享文件,可以使用Git或Svn版本管理起来)

#第一个port是follower与leader通信端口,第二个port是选举通信端口,

#:observer指定该服务为observer角色不参与投票

#server.id=host:port: port[:observer]

server.1=192.168.31.26:2888:3181:observer

server.2=192.168.31.150:2888:3181

server.3=192.168.31.186:2888:3181

...

指定为observer的服务器,需要在zoo.cfg 增加peerType=observer配置

13. 进入data目录,创建my文件并指定服务id

cd /lwl/services/zookeeper/zookeeper-3.4.12/data

vim myid

#指定id不同服务器id不能相同

1

:wq保存退出

集群配置踩坑

服务启动,查看日志显示java.net.NoRouteToHostException


centos 操作系统下的软件清单_分布式一致性_05


一、可能原因其它服务器未启动 ,启动其它服务器即可解决

二、其它服务器防火墙未关闭,简单起见关闭防火墙(实际应开启指定端口,并不关闭防火墙)

Centos7的防火墙默认使用firewall管理

firewalld的基本使用

启动: systemctl start firewalld

关闭: systemctl stop firewalld

查看状态: systemctl status firewalld

开机禁用 : systemctl disable firewalld

开机启用 : systemctl enable firewalld

简单起见直接关闭防火墙

systemctl stop firewalld

那怎么开启一个端口呢

添加

firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)

重新载入

firewall-cmd --reload

查看

firewall-cmd --zone= public --query-port=80/tcp

删除

firewall-cmd --zone= public --remove-port=80/tcp --permanent

如需使用 service iptables 需要yum安装,否则报错

Failed to start iptables.service:Unit not found,如图


centos 操作系统下的软件清单_centos 操作系统下的软件清单_06


启用步骤如下:

1. yum install iptables-services


centos 操作系统下的软件清单_Zookeeper_07


2. 启动iptables,并设置开机启动

#启动iptables

systemctl start iptables

#默认启动iptables

systemctl ebable iptables

#保存设置

service iptables save

3. 查看防火墙状态

systemctl status iptables


centos 操作系统下的软件清单_分布式一致性_08


4. 关闭防火墙

systemctl stop iptables