分布式协调服务 Zookeeper
分布式环境的特点
1.分布性
基于一个硬件或者多个硬件设备以及多个软件组成的分布在不同网络计算机上的系统架构,通过消息传递进行通信协调。
在空间上部署是可以任意的,网络架构可以分布在不同的机柜、机房、城市等。
2.并发性
程序运行过程中,并发操作是很常见的。比如同一个分布式系统中的多个节点,同时访问一个共享资源。数据库,分布式存储。
3.无序性
比如两个节点A、B通信,A发过去的消息和B接收到的消息的顺序可能不一致。因为网络问题等。
分布式环境下面临的问题
1.网络通信
网络本身的不可靠信(比如光纤被挖断,机房没电等),因此会涉及到网络通信的问题。
2.网络分区(脑裂)
当网络发生异常导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式架构的所有节点,只有部分节点能够正常通信
例如mysql中,有1个master和5个slave,当网络延迟变大,可能其中部分slave会选举出新的master,就会出现两个master的情况。
3.三态
在分布式架构里面,除了成功、失败、超时
4.分布式事务
ACID(原子性、一致性、隔离性、持久性)
中心化和去中心化
冷备和热备
分布式架构里面,很多的架构思想采用的是:当集群发生故障的时候,集群中的人群会自动“选举”出一个新的领导。
最典型的是: zookeeper / etcd
经典的CAP/BASE理论
CAP
C(一致性 Consistency): 所有节点上的数据,时刻保持一致
A 可用性(Availability):每个请求都能够收到一个响应,无论响应成功或者失败
P 分区容错 (Partition-tolerance):表示系统出现脑裂以后,可能导致某些server与集群中的其他机器失去联系
CP / AP
CAP理论仅适用于原子读写的Nosql场景,不适用于数据库系统
BASE
基于CAP理论,CAP理论并不适用于数据库事务(因为更新一些错误的数据而导致数据出现紊乱,无论什么样的数据库高可用方案都是
徒劳) ,虽然XA事务可以保证数据库在分布式系统下的ACID特性,但是会带来性能方面的影响;
eBay尝试了一种完全不同的套路,放宽了对事务ACID的要求。提出了BASE理论
Basically available : 数据库采用分片模式, 把100W的用户数据分布在5个实例上。如果破坏了其中一个实例,仍然可以保证
80%的用户可用
soft-state: 在基于client-server模式的系统中,server端是否有状态,决定了系统是否具备良好的水平扩展、负载均衡、故障恢复等特性。
Server端承诺会维护client端状态数据,这个状态仅仅维持一小段时间, 这段时间以后,server端就会丢弃这个状态,恢复正常状态
Eventually consistent:数据的最终一致性
初识Zookeeper
开源的分布式协调服务 Yahoo创建的,基于google chubby(分布式锁实现)
Zookeeper是什么
分布式数据一致性的解决方案。
Zookeeper能做什么
数据的发布/订阅(配置中心:disconf),负载均衡(dubbo利用了zookeeper机制实现负载均衡),命名服务,master选举(kafka,hadoop,hbase)
分布式队列,分布式锁等等。
1.顺序一致性
从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中
2.原子性
所有的事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的,也就是说,要么整个集群中的所有机器都成功应用了某一事务、
要么全都不应用
3.可靠性
一旦服务器成功应用了某一个事务数据,并且对客户端做了响应,那么这个数据在整个集群中一定是同步并且保留下来的
4.实时性
一旦一个事务被成功应用,客户端就能够立即从服务器端读取到事务变更后的最新数据状态;(zookeeper仅仅保证在一定时间内,近实时)
Zookeeper安装
克隆三台服务器,端口号为:
192.168.0.111
192.168.0.112
192.168.0.113
1.修改配置文件
安装完zookeeper后,在conf文件夹中,复制zoo_sample.cfg
cp zoo_sample.cfg zoo.cfg
之后再在个节点中,vim zoo.cfg
server.1=192.168.0.111:2888:3181
server.2=192.168.0.112:2888:3181
server.3=192.168.0.113:2888:3181
server.id=host:port:port
id:取值1~255,用id识别该机器在集群中的机器序号
2888:任意配置,只要不与系统端口冲突,follower和leader节点交换信息的端口号
3181:任意配置,只要不与系统端口冲突。标识Leader选举的端口
2.在/tmp/zookeeper/下
vim myid 然后就写入一个数字,服务器对应的id号(如1,2,3)
3.启动zookeeper
./zkServer.sh start
zookeeper集群, 包含三种角色: leader / follower /observer
observer
observer 是一种特殊的zookeeper节点。可以帮助解决zookeeper的扩展性(如果大量客户端访问我们zookeeper集群,需要增加zookeeper集群机器数量。
从而增加zookeeper集群的性能。 导致zookeeper写性能下降, zookeeper的数据变更需要半数以上服务器投票通过。造成网络消耗增加投票成本)
- observer不参与投票。 只接收投票结果。
- 不属于zookeeper的关键部位。