集中式特点
最大特点部署简单,不用考虑多节点部署和分布式协调问题
集中性问题
单点故障后整个服务不可用
扩容困难
对服务器性能要求高,大型服务器价格高
分布式特点
分布性:服务器分布在不同网络结点(服务器可分布在不同机房,甚至不同地点)
并发性:并发操作是很常见的(比如同一个分布式系统中的不同节点,共同访问共享资源)
无序性:进程之间的通信,可能会出现顺序不一致(服务器可能先接收到,客户端后发出的请求)
分布式面临的问题
网络通信:网络通信具有不可靠性(丢包,延迟,不可达)
网络分区:由于网络通信的不可靠,可能会引起网络分区(也称脑列),一个可互通的网络,被分成几个相互隔离的子网络。
三态:每一次请求,存在三种状态:成功、失败、超时
什么是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算法描述示意图
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保存修改并退出
如图
8. 把zookeeper_home/bin添加到环境变量
vim /etc/profile
#添加环境变量配置
export ZOOKEEPER_HOME=/lwl/services/zookeeper/zookeeper-3.4.12
export PATH=$ZOOKEEPER_HOME/bin:$PATH
:wq保存退出
9. 使配置立即生效
source /etc/profile
10. 启动zookeeper服务(提示是无效命令时,请检查环境变量配置8,9)
zkServer.sh start
启动效果如图
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
一、可能原因其它服务器未启动 ,启动其它服务器即可解决
二、其它服务器防火墙未关闭,简单起见关闭防火墙(实际应开启指定端口,并不关闭防火墙)
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,如图
启用步骤如下:
1. yum install iptables-services
2. 启动iptables,并设置开机启动
#启动iptables
systemctl start iptables
#默认启动iptables
systemctl ebable iptables
#保存设置
service iptables save
3. 查看防火墙状态
systemctl status iptables
4. 关闭防火墙
systemctl stop iptables