1) 任务拆分java
任务拆分指的是把传统的单节点服务拆分红多个节点服务部署到不一样的机器上对外提供服务。好比一个传统服务有订单+支付+物流等3个模块,拆分红订单系统、支付系统、物流系统3个服务。
2) 节点分工node
如上面的服务拆分后,订单系统、支付系统、物流系统各司其职
说明:apache
分布式解决高可用,高并发的。vim
集群解决的是高可用。服务器
集群从物理上来定义,分布式一种工做方式。
例如:一个工做任务须要10个小时(单节点)
分布式:10台机器,任务只须要1个小时就可以完成
集群:10台机器,任务仍是10个小时。网络
若是让你设计一个分布式系统,你预见到什么问题?
1) 保证节点高可用(节点故障)
2) 数据的一致性
3) 通信异常
4) 网络分区
.......session
Zookeeper就是用来解决分布式协做中的难点的并发
zookeeper是google的chubby项目开源实现。最先是hadoop的子项目分布式
Zookeeper的使用场景:高并发
小米米聊、淘宝Taokeeper实际上是类zookeeper。
Kafka使用zookeeper。消息发布订阅,其中zk就是用于检测节点崩溃。实现主题的发现,而且保持主题的生产和消费状态。
Hbase三段查找,Root-Region=》Meta Region=》Region(Table)。hbase的元数据信息放在HBase。HMaster挂掉,立刻要节点恢复。
Hadoop。NameNode(SecondaryNameNode),HA Hadoop。通常状况下一个简单的hadoop集群,只有一个NameNode,若是NameNode挂掉,hadoop集群不可用。HA Haoop里面就要用到zk。
解决的问题:Master高可用(挂掉之后,谁来负责工做),保证惟一。
解决的问题:统一把配置文件存放zk,由ZK统一分发修改的内容到各台机器。
发布者(producer)将数据发布到zk节点上,供订阅者(consumer)动态获取
分布式环境访问同一个资源,由第三方配锁实现。
解决的问题:由zk统一进行协调,保证数据的一致性。
Worker集群监控。保证主数据和备份数据的一致
环境准备:
一台安装有jdk的虚拟机:192.168.152.130
cd /software
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -zxvf zookeeper-3.4.6.tar.gz
说明:这里配置的是伪分布式的zookeeper
注意:配置以前必定要在/etc/hosts里面配置主机映射,不然会报错误:
ERROR [master:3890:QuorumCnxManager$Listener@517] - Exception while listening
java.net.SocketException: Unresolved address
vim /etc/hosts
mkdir -p /zookeeper/zk1
mkdir -p /zookeeper/zk2
mkdir -p /zookeeper/zk3
vim zoo_sample.cfg
tickTime=2000 #session的会话时间 以ms为单位
initLimit=10 #服务器启动之后,master和slave通信的时间
syncLimit=5 #master和slave之间的心跳检测时间,检测slave是否存活
dataDir=/tmp/zookeeper #保存zk的快照和数据
clientPort=2181 #客户端访问zk的端口
cp zoo_sample.cfg zoo1.cfg
vim zoo1.cfg
配置:
#session的会话时间 以ms为单位
tickTime=2000
#服务器启动之后,master和slave通信的时间
initLimit=10
#master和slave之间的心跳检测时间,检测slave是否存活
syncLimit=5
#(这个目录能够自行指定)
dataDir=/zookeeper/zk1
#客户端访问zk的端口
clientPort=2181
#master对应于前面在hosts里面配置的主机映射 2888是数据同步和消息传递端口,3888是选举端口 server.1=master:2888:3888 #master对应于前面在hosts里面配置的主机映射 2889是数据同步和消息传递端口,3889是选举端口
server.2=master:2889:3889
#master对应于前面在hosts里面配置的主机映射 2890是数据同步和消息传递端口,3890是选举端口
server.3=master:2890:3890
cp zoo1.cfg zoo2.cfg
vim zoo2.cfg
#session的会话时间 以ms为单位 tickTime=2000 #服务器启动之后,master和slave通信的时间 initLimit=10 #master和slave之间的心跳检测时间,检测slave是否存活 syncLimit=5 #(这个目录能够自行指定) dataDir=/zookeeper/zk2 #客户端访问zk的端口 clientPort=2182 #master对应于前面在hosts里面配置的主机映射 2888是数据同步和消息传递端口,3888是选举端口 server.1=master:2888:3888 #master对应于前面在hosts里面配置的主机映射 2889是数据同步和消息传递端口,3889是选举端口
server.2=master:2889:3889
#master对应于前面在hosts里面配置的主机映射 2890是数据同步和消息传递端口,3890是选举端口
server.3=master:2890:3890
cp zoo1.cfg zoo3.cfg
vim zoo3.cfg
#session的会话时间 以ms为单位
tickTime=2000
#服务器启动之后,master和slave通信的时间
initLimit=10
#master和slave之间的心跳检测时间,检测slave是否存活
syncLimit=5
#(这个目录能够自行指定)
dataDir=/zookeeper/zk3
#客户端访问zk的端口
clientPort=2183
#master对应于前面在hosts里面配置的主机映射 2888是数据同步和消息传递端口,3888是选举端口 server.1=master:2888:3888 #master对应于前面在hosts里面配置的主机映射 2889是数据同步和消息传递端口,3889是选举端口
server.2=master:2889:3889
#master对应于前面在hosts里面配置的主机映射 2890是数据同步和消息传递端口,3890是选举端口
server.3=master:2890:3890
echo 1 >> /zookeeper/zk1/myid
echo 2 >> /zookeeper/zk2/myid
echo 3 >> /zookeeper/zk3/myid
说明:
myid文件内容分别为1,2,3对应于zk配置文件的server.1,server.2,server.3
分别启动三个zookeeper
cd /software/zookeeper-3.4.6/bin/
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo1.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo2.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo3.cfg
查看3个zookeeper的状态
cd /software/zookeeper-3.4.6/bin/
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo1.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo2.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo3.cfg
能够看到第2个zookeeper是leader,第1个和第3个为follower,到此zookeeper分布式搭建完成!!!
启动:
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo1.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo2.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo3.cfg
中止:
./zkServer.sh stop /software/zookeeper-3.4.6/conf/zoo1.cfg
./zkServer.sh stop /software/zookeeper-3.4.6/conf/zoo2.cfg
./zkServer.sh stop /software/zookeeper-3.4.6/conf/zoo3.cfg
查看状态:
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo1.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo2.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo3.cfg
server1..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server2..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server3..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
注意:
真分布必须是奇数台,由于必须知足n/2+1=m,m必须大于部署zk机器数的一半(n/2)可用才认为集群可用,并且奇数台更节省资源
2/2+1=2 一台不能坏
3/2+1=2 能够坏掉一台
4/2+1=3 只能坏一台
5/2+1=3 能够坏2台
zkCli.sh [-server ip:port]
示例:
链接到master(127.0.0.1 master)这台机器上2181的zookeeper
./zkCli.sh -server master 2181
ls、ls2
示例:
create [-s] [-e] path data acl
说明:
zk的节点分为两种:临时节点(随着zk session消亡而自动删除)、持久节点(一直存在)
-s: 顺序节点
-e: 临时节点
acl:访问权限控制
示例:
create /zk-test "123"
create -s /zk-test “test123”
屡次执行建立顺序节点的命令,能够看到zookeeper的内部会对顺序节点的名称进行自增控制
create -e /zk-test123 "test1234"
说明:
临时节点依赖于顺序节点,临时节点下不能再建立临时节点,顺序节点下才能够建立临时节点
create /zk-test ""
create /zk-test/test "1"
ls /zk-test/test
delete
示例:
删除节点zk-test,若是zk-test下面还有子节点得先删除子节点,才能删除zk-test
delete /zk-test/test
delete /zk-test
递归删除一个znode
rmr path
示例:
删除zk-test及其下面的子节点
rmr /zk-test
get
示例:
create /zk-123 “abc”
get /zk-123
结果说明:
结果
cZxid = #建立节点时zk内部本身分配的id
Ctime = #建立节点的时间
mZxid = #修改的id
mtime = 修改的时间
pZxid = 子节点最后一次被修改的id
cVersion = 0 #拥有的子节点被改的话,该值随着改变
dataVersion = 0 #数据版本
aclVersion = 0 # 访问控制权限的版本
ephemeralOwner = 0X0 #临时节点仍是持久节点 临时节点值不为0(值为当前会话id),持久节点值永远为0
dataLength = 3 #数据长度
numChildren = 0 #子节点个数
set /zk-123 “d”
connect host:port
示例:
链接到2181
connect master:2181
链接到2182
connect master:2182
链接到2183
connect master:2183
说明:
这个命令是在已经链接到zookeeper以后,在里面切换到其余zookeeper时使用
配额:给某个目录指定多少存储空间或者容许建立多少个节点
setquota -n|-b val path
参数说明:
n 指定能够设置多少个子节点
b 指定能够设置多大空间(byte)
示例:
setquota -n 5 /zk-123
create /zk-123/1 1
create /zk-123/2 2
create /zk-123/3 3
create /zk-123/4 4
create /zk-123/5 5
create /zk-123/6 6
说明:
对于配额不是硬性的提示,超过配额仍是能够继续建立,只不过在日志里面有提示
配额的用途:
限制子节点的建立个数和分配空间的大小,如指定某个session有多少空间能够用
listquota path
stat path
示例:
查看节点zk-123的状态
stat /zk-123