大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
最小的基本单位是bit,按顺序给出所有单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。
1Byte = 8bit 1K = 1024Byte 1MB = 1024K 1G = 1024M
1T = 1024G 1P = 1024T 1E = 1024P 1Z = 1024E
1Y = 1024Z 1B = 1024Y 1N = 1024B 1D = 1024N
如上图所示,1986年,全球只有0.02EB也就是约21000TB的数据量,而到了2007年,全球就是280EB也就是约300000000TB的数据量,翻了14000倍。
而最近,由于移动互联网及物联网的出现,各种终端设备的接入,各种业务形式的普及,平均每40个月,全球的数据量就会翻倍!如果这样说还没有什么印象,可以再举个简单的例子,在2012年,每天会产生2.5EB的数据量。基于IDC的报告预测,从2013年到2020年,全球数据量会从4.4ZB猛增到44ZB!而到了2025年,全球会有163ZB的数据量!
由此可见,截至目前,全球的数据量已经大到爆了!而传统的关系型数据库根本处理不了如此海量的数据!
1)Volume(大量):
截至目前,人类生产的所有印刷材料的数据量是200PB,而历史上全人类总共说过的话的数据量大约是5EB。当前,典型个人计算机硬盘的容量为TB量级,而一些大企业的数据量已经接近EB量级。
2)Velocity(高速):
这是大数据区分于传统数据挖掘的最显著特征。根据IDC的“数字宇宙”的报告,预计到2020年,全球数据使用量将达到35.2ZB。在如此海量的数据面前,处理数据的效率就是企业的生命。
天猫双十一:2016年6分58秒,天猫交易额超过100亿
3)Variety(多样):
这种类型的多样性也让数据被分为结构化数据和非结构化数据。相对于以往便于存储的以数据库/文本为主的结构化数据,非结构化数据越来越多,包括网络日志、音频、视频、图片、地理位置信息等,这些多类型的数据对数据的处理能力提出了更高要求。
4)Value(低价值密度):
价值密度的高低与数据总量的大小成反比。比如,在一天监控视频中,我们只关心宋老师在健身那一分钟,如何快速对有价值数据“提纯”成为目前大数据背景下待解决的难题。
1)O2O:百度大数据+平台通过先进的线上线下打通技术和客流分析能力,助力商家精细化运营,提升销量。
2)零售:探索用户价值,提供个性化服务解决方案;贯穿网络与实体零售,携手创造极致体验。经典案例,子尿布+啤酒。
3)商品广告推荐:给用户推荐访问过的商品广告类型
4) 房产:大数据全面助力房地产行业,打造精准投策与营销,选出更合适的地,建造更合适的楼,卖给更合适的人。
5)保险:海量数据挖掘及风险预测,助力保险行业精准营销,提升精细化定价能力。
6)金融:多维度体现用户特征,帮助金融机构推荐优质客户,防范欺诈风险。
7)人工智能
1)党的十八届五中全会提出“实施国家大数据战略”,国务院印发《促进大数据发展行动纲要》,大数据技术和应用处于创新突破期,国内市场需求处于爆发期,我国大数据产业面临重要的发展机遇。
2)国际数据公司IDC预测,到2020年,企业基于大数据计算分析平台的支出将突破5000亿美元。目前,我国大数据人才只有46万,未来3到5年人才缺口达150万之多。
服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
在网络环境下,根据服务器提供的服务类型不同,分为文件服务器、数据库服务器、应用程序服务器、WEB服务器等
服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。
可以简单的理解为服务器就是一台电脑,只不过硬盘比普通的PC机更大,CPU比普通的PC机处理速度更快,网卡比普通的PC机更快。。。
服务器需要存储数据,免不了得要磁盘的支持,磁盘就是一类存储介质,专门用于存储我们各种类型的数据,其中磁盘按照接口类型又可以有好多种分类,接下来我们来简单看一下不同接口的各类磁盘的基本特性吧
SCSi传统服务器老传输接口,转速为10kr 15kr。但是由于受到线缆及其阵列卡和传输协议的限制,该盘片有固定的插法,例如要顺着末端接口开始插第一块硬盘,没有插硬盘的地方要插硬盘终结器等。该盘现已经完全停止发售。该盘只有3.5寸版。常见转速:10000转/分。
SAS 该盘分为两种协议,即SAS1.0及SAS 2.0接口,SAS1.0接口传输带宽为3.0GB/s转速有7.2kr 10kr 15kr。该盘现已被SAS2.0接口盘取代,该盘尺寸有2.5寸及3.5寸两种。SAS2.0接口传输带宽为6.0GB/s转速有10kr 15kr,常见容量为73.6G 146G 300G 600G 900G。常见转速:15000转/分(3G/s)。
FDE/SDE 该盘体前者为IBM研发的SAS硬件加密硬盘,该盘体性能等同于SAS硬盘,但是由于本身有硬件加密系统,可以保证涉密单位数据不外泄,该盘主要用于高端2.5寸存储及2.5寸硬盘接口的机器上。SED盘雷同,厂家不一样。
SATA硬盘:用SATA接口的硬盘又叫串口硬盘,是以后PC机的主流发展方向,因为其有较强的纠错能力,错误一经发现能自动纠正,这样就大大的提高了数据传输的安全性。新的SATA 使用了差动信号系统“differential-signal-amplified-system”。这种系统能有效的将噪声从正常讯号中滤除,良好的噪声滤除能力使得SATA只要使用低电压操作即可,和 Parallel ATA 高达5V的传输电压相比,SATA 只要0.5V(500mv) 的峰对峰值电压即可操作于更高的速度之上。“比较正确的说法是:峰对峰值‘差模电压’”。常见转速:7200转/分。5000转/分
SSD 该盘为固态硬盘,与个人PC不同的是该盘采用一类固态硬盘检测系统检测出场,并采用SAS2.0协议进行传输,该盘的性能也将近是个人零售SSD硬盘的数倍以上。
基本介绍:交换机(Switch)意为“开关”是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。
主要作用:交换机的主要功能包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。交换机还具备了一些新的功能,如对VLAN(虚拟局域网)的支持、对链路汇聚的支持,甚至有的还具有防火墙的功能
网卡(Network Interface Card)是物理上连接计算机与网络的硬件设备,是计算机与局域网通信介质间的直接接口。由于网络技术的不同,网卡的分类也有所不同,如大家所熟知的ATM网卡、令牌环网卡和以太网网卡等。据统计,目前约有80 %的局域网采用以太网技术。
接口方式
当前台式机和笔记本电脑中常见的总线接口方式都可以从主流网卡厂商那里找到适用的产品。但值得注意的是,市场上很难找到ISA接口的100M网卡。1994年以来,PCI总线架构日益成为网卡的首选总线,目前已牢固地确立了在服务器和高端桌面机中的地位。即将到来的转变是这种网卡将推广有的桌面机中。PCI以太网网卡的高性能、易用性和增强了的可靠性使其被标 准以太网网络所广泛采用,并得到了PC业界的支持。
技术方向
目前,以太网网卡有10M、100M、10M/100M及千兆网卡。对于大数据量网络 来说,服务器应该采用千兆以太网网卡,这种网卡多用于服务器与交换机之间的连接,以提高整体系统的响应速率.
对于通常的文件共享等应用来说,10M网卡就已经足够了,但对于将来可能的语音和视频等应用来说,100M 网卡将更利于实时应用的传输。
局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。
为了方便管理维护众多的服务器,以及在服务器出现问题时候快读的定位解决问题,我们可以使用机架的形式,将众多的服务器归纳到一个个的机架里面去。机架之间的通信问题可以使用交换机来组织成为局域网
互联网数据中心(Internet Data Center)简称IDC,就是电信部门利用已有的互联网通信线路、带宽资源,建立标准化的电信专业级机房环境,为企业、政府提供服务器托管、租用以及相关增值等方面的全方位服务
IDC主机托管主要应用范围是网站发布、虚拟主机和电子商务等。比如网站发布,单位通过托管主机,从电信部门分配到互联网静态IP地址后,即可发布自己的www站点,将自己的产品或服务通过互联网广泛宣传;虚拟主机是单位通过托管主机,将自己主机的海量硬盘空间出租,为其他客户提供虚拟主机服务,使自己成为ICP服务提供商;电子商务是指单位通过托管主机,建立自己的电子商务系统,通过这个商业平台来为供应商、批发商、经销商和最终用户提供完善的服务。
IDC即互联网数据中心。它是伴随着互联网不断发展的需求而迅速发展起来的,成为了新世纪中国互联网产业中不可或缺的重要一环。它为互联网内容提供商(ICP)、企业、媒体和各类网站提供大规模、高质量、安全可靠的专业化服务器托管、空间租用、网络批发带宽以及ASP、EC等业务。
IDC是对入驻(Hosting)企业、商户或网站服务器群托管的场所;是各种模式电子商务赖以安全运作的基础设施,也是支持企业及其商业联盟其分销商、供应商、客户等实施价值链管理的平台。
IDC起源于ICP对网络高速互联的需求,而且美国仍然处于世界领导者位置。在美国,运营商为了维护自身利益,将网络互联带宽设得很低,用户不得不在每个服务商处都放一台服务器。为了解决这个问题,IDC应运而生,保证客户托管的服务器从各个网络访问速度都没有瓶颈。
IDC不仅是数据存储的中心,而且是数据流通的中心,它
应该出现在Internet网络中数据交换最集中的地方。它是伴随着人们对主机托管和虚拟主机服务提出了更高要求的状况而产生的,从某种意义上说,它是由ISP的服务器托管机房演变而来的。具体而言,随着Internet的高速发展,网站系统对带宽、管理维护日益增长的高要求对很多企业构成了严峻的挑战。于是,企业开始将与网站托管服务相关的一切事物交给专门提供网络服务的IDC去做,而将精力集中在增强核心竞争力的业务中去。可见,IDC是Internet企业分工更加细化的产物。
目前我国比较大的机房主要在北京、上海、广州、唐山等地
磁盘RAID的基本介绍:
1988 年美国加州大学伯克利分校的 D. A. Patterson 教授等首次在论文 “A Case of Redundant Array of Inexpensive Disks” 中提出了 RAID 概念 [1] ,即廉价冗余磁盘阵列( Redundant Array of Inexpensive Disks )。由于当时大容量磁盘比较昂贵, RAID 的基本思想是将多个容量较小、相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量、性能、可靠性。随着磁盘成本和价格的不断降低, RAID 可以使用大部分的磁盘, “廉价” 已经毫无意义。因此, RAID 咨询委员会( RAID Advisory Board, RAB )决定用 “ 独立 ” 替代 “ 廉价 ” ,于时 RAID 变成了独立磁盘冗余阵列( Redundant Array of Independent Disks )。但这仅仅是名称的变化,实质内容没有改变.
RAID0 是一种简单的、无数据校验的数据条带化技术。实际上不是一种真正的 RAID ,因为它并不提供任何形式的冗余策略。 RAID0 将所在磁盘条带化后组成大容量的存储空间(如图 2 所示),将数据分散存储在所有磁盘中,以独立访问方式实现多块磁盘的并读访问。由于可以并发执行 I/O 操作,总线带宽得到充分利用。再加上不需要进行数据校验,RAID0 的性能在所有 RAID 等级中是最高的。理论上讲,一个由 n 块磁盘组成的 RAID0 ,它的读写性能是单个磁盘性能的 n 倍,但由于总线带宽等多种因素的限制,实际的性能提升低于理论值。
RAID0 具有低成本、高读写性能、 100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复。 因此, RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用,如视频、音频存储、临时数据缓存空间等
RAID1 称为镜像,它将数据完全一致地分别写到工作磁盘和镜像 磁盘,它的磁盘空间利用率为 50% 。 RAID1 在数据写入时,响应时间会有所影响,但是读数据的时候没有影响。 RAID1 提供了最佳的数据保护,一旦工作磁盘发生故障,系统自动从镜像磁盘读取数据,不会影响用户工作。
RAID1 与 RAID0 刚好相反,是为了增强数据安全性使两块 磁盘数据呈现完全镜像,从而达到安全性好、技术简单、管理方便。 RAID1 拥有完全容错的能力,但实现成本高。 RAID1 应用于对顺序读写性能要求高以及对数据保护极为重视的应用,如对邮件系统的数据保护
RAID2 称为纠错海明码磁盘阵列,其设计思想是利用海明码实现数据校验冗余。海明码是一种在原始数据中加入若干校验码来进行错误检测和纠正的编码技术,其中第 2n 位( 1, 2, 4, 8, … )是校验码,其他位置是数据码。因此在 RAID2 中,数据按位存储,每块磁盘存储一位数据编码,磁盘数量取决于所设定的数据存储宽度,可由用户设定。图 4 所示的为数据宽度为 4 的 RAID2 ,它需要 4 块数据磁盘和 3 块校验磁盘。如果是 64 位数据宽度,则需要 64 块 数据磁盘和 7 块校验磁盘。可见, RAID2 的数据宽度越大,存储空间利用率越高,但同时需要的磁盘数量也越多。
海明码自身具备纠错能力,因此 RAID2 可以在数据发生错误的情况下对纠正错误,保证数据的安全性。它的数据传输性能相当高,设计复杂性要低于后面介绍的 RAID3 、 RAID4 和 RAID5 。
但是,海明码的数据冗余开销太大,而且 RAID2 的数据输出性能受阵列中最慢磁盘驱动器的限制。再者,海明码是按位运算, RAID2 数据重建非常耗时。由于这些显著的缺陷,再加上大部分磁盘驱动器本身都具备了纠错功能,因此 RAID2 在实际中很少应用,没有形成商业产品,目前主流存储磁盘阵列均不提供 RAID2 支持。
RAID3 (图 5 )是使用专用校验盘的并行访问阵列,它采用一个专用的磁盘作为校验盘,其余磁盘作为数据盘,数据按位可字节的方式交叉存储到各个数据盘中。RAID3 至少需要三块磁盘,不同磁盘上同一带区的数据作 XOR 校验,校验值写入校验盘中。 RAID3 完好时读性能与 RAID0 完全一致,并行从多个磁盘条带读取数据,性能非常高,同时还提供了数据容错能力。向 RAID3 写入数据时,必须计算与所有同条带的校验值,并将新校验值写入校验盘中。一次写操作包含了写数据块、读取同条带的数据块、计算校验值、写入校验值等多个操作,系统开销非常大,性能较低。
如果 RAID3 中某一磁盘出现故障,不会影响数据读取,可以借助校验数据和其他完好数据来重建数据。假如所要读取的数据块正好位于失效磁盘,则系统需要读取所有同一条带的数据块,并根据校验值重建丢失的数据,系统性能将受到影响。当故障磁盘被更换后,系统按相同的方式重建故障盘中的数据至新磁盘。
RAID3 只需要一个校验盘,阵列的存储空间利用率高,再加上并行访问的特征,能够为高带宽的大量读写提供高性能,适用大容量数据的顺序访问应用,如影像处理、流媒体服务等。目前, RAID5 算法不断改进,在大数据量读取时能够模拟 RAID3 ,而且 RAID3 在出现坏盘时性能会大幅下降,因此常使用 RAID5 替代 RAID3 来运行具有持续性、高带宽、大量读写特征的应用。
RAID4 与 RAID3 的原理大致相同,区别在于条带化的方式不同。 RAID4 (图 6 )按照 块的方式来组织数据,写操作只涉及当前数据盘和校验盘两个盘,多个 I/O 请求可以同时得到处理,提高了系统性能。 RAID4 按块存储可以保证单块的完整性,可以避免受到其他磁盘上同条带产生的不利影响。
RAID4 在不同磁盘上的同级数据块同样使用 XOR 校验,结果存储在校验盘中。写入数据时, RAID4 按这种方式把各磁盘上的同级数据的校验值写入校验 盘,读取时进行即时校验。因此,当某块磁盘的数据块损坏, RAID4 可以通过校验值以及其他磁盘上的同级数据块进行数据重建。
RAID4 提供了 非常好的读性能,但单一的校验盘往往成为系统性能的瓶颈。对于写操作, RAID4 只能一个磁盘一个磁盘地写,并且还要写入校验数据,因此写性能比较差。而且随着成员磁盘数量的增加,校验盘的系统瓶颈将更加突出。正是如上这些限制和不足, RAID4 在实际应用中很少见,主流存储产品也很少使用 RAID4 保护。
RAID5 应该是目前最常见的 RAID 等级,它的原理与 RAID4 相似,区别在于校验数据分布在阵列中的所有磁盘上,而没有采用专门的校验磁盘。对于数据和校验数据,它们的写操作可以同时发生在完全不同的磁盘上。因此, RAID5 不存在 RAID4 中的并发写操作时的校验盘性能瓶颈问题。另外, RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时,并行操作量的能力也随之增长,可比 RAID4 支持更多的磁盘,从而拥有更高的容量以及更高的性能。
RAID5 (图 7)的磁盘上同时存储数据和校验数据,数据块和对应的校验信息存保存在不同的磁盘上,当一个数据盘损坏时,系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。与其他 RAID 等级一样,重建数据时, RAID5 的性能会受到较大的影响。
RAID5 兼顾存储性能、数据安全和存储成本等各方面因素,它可以理解为 RAID0 和 RAID1 的折中方案,是目前综合性能最佳的数据保护解决方案。 RAID5 基本上可以满足大部分的存储应用需求,数据中心大多采用它作为应用数据的保护方案。
将虚拟机文件夹复制三份,并分别重命名, 并使用VM打开重命名
每台机器的内存 = ( 总内存 - 4 ) / 3
IP | 主机名 | 环境配置 | 安装 |
---|---|---|---|
192.168.174.100 | node01 | 关防火墙和selinux, host映射, 时钟同步 | JDK |
192.168.174.110 | node02 | 关防火墙和selinux, host映射, 时钟同步 | JDK |
192.168.174.120 | node03 | 关防火墙和selinux, host映射, 时钟同步 | JDK |
每台虚拟机更改mac地址:
vim /etc/udev/rules.d/70-persistent-net.rules
00:50:56:39:84:1A
每台虚拟机更改IP地址:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
每台虚拟机修改对应主机名(重启后永久生效)
vi /ect/sysconfig/network
HOSTNAME=node01
每台虚拟机设置ip和域名映射
vim /etc/hosts
关机重启linux系统即可进行联网了
第二台第三台机器重复上述步骤,并设置IP网址为192.168.174.110,192.168.174.120
三台机器执行以下命令(root用户来执行)
service iptables stop #关闭防火墙
chkconfig iptables off #禁止开机启动
enforcing
强制模式permissive
宽容模式disable
关闭# 修改selinux的配置文件
vi /etc/selinux/config
第一步:三台机器生成公钥与私钥
在三台机器执行以下命令,生成公钥与私钥
ssh-keygen -t rsa
执行该命令之后,按下三个回车即可
第二步:拷贝公钥到同一台机器
三台机器将拷贝公钥到第一台机器
三台机器执行命令:
ssh-copy-id node01
第三步:复制第一台机器的认证到其他机器
将第一台机器的公钥拷贝到其他机器上
在第一天机器上面指向以下命令
scp /root/.ssh/authorized_keys node02:/root/.ssh
scp /root/.ssh/authorized_keys node03:/root/.ssh
## 安装
yum install -y ntp
## 启动定时任务
crontab -e
#查看时间与日期
date
随后在输入界面键入
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;#分钟、小时、天、月、星期
#每分钟与阿里的ntp4同步时间(到分种)
grep命令 命令是一种强大的文本搜索工具
格式: grep [option] pattern [file] 可使用 —help 查看更多参数。 使用实例:
ps -ef | grep sshd #查找指定 ssh 服务进程
ps -ef | grep sshd | grep -v grep #查找指定服务进程,排除 gerp 本身
grep -n 'hello' a.txt #从文件中查找关键词,并显示行号
find命令
find 命令在目录结构中搜索文件,并对搜索结果执行指定的操作。使用实例:
find . -name "*.log" -ls #在当前目录查找以.log 结尾的文件, 并显示详细信息。
find /root/ -perm 777 #查找/root/目录下权限为 777 的文件
find . -size +100M #查找当前目录大于 100M 的文件
Locate命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法
是先建立一个包括系统内所有档案名称及路径的数据库。之后当寻找时就只需查
询这个数据库( /var/lib/locatedb)。
Linux 系统自动创建这个数据库, 默认每天自动更新一次,所以使用 locate
命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,
先使用 updatedb 命令,手动更新数据库。
yum -y install mlocate
使用实例:
locate /etc/sh #搜索 etc 目录下所有以 sh 开头的文件
locate pwd #查找和 pwd 相关的所有文件
添加普通用户
useradd hadoop #这个就表示我们创建了一个普通用户
passwd hadoop #表示我们需要给hadoop这个普通用户设置一个密码
切换用户:
su - hadoop
chmod 777 a.txt #表示给某个文件赋予所有人的所有权限
chmod u-x a.txt #取消a.txt文件,用户“执行”权限
chmod g+x a.txt #添加a.txt文件,组“执行”权限
chown -R hadoop:hadoop a.txt #改变某个文件或者文件夹的所属的用户以及用户组
service iptables status #查看防火墙状态
service iptables stop #关闭防火墙
service --status-all # 查看系统所有的后台服务进程
service sshd status # 查看指定的后台服务进程的状态
service sshd stop
service sshd start
service sshd restart
配置后台服务进程的开机自启或关闭
chkconfig iptables on #配置防火墙开机开启
chkconfig iptables off #配置防火墙开机关闭
chkconfig httpd on #让httpd服务开机自启
chkconfig httpd off #让httpd服务开机不要自启
Shell 编程一般指 shell 脚本编程。
语法:
使用 vi 编辑器新建一个文件 hello.sh
#!/bin/bash
echo "Hello World !"
执行:
方式1:
sh hello.sh
方式2
chmod +x ./hello.sh #使脚本具有执行权限,给所以用户加执行权
./hello.sh #执行脚本
变量前后无空格,其他前后都有空格
局部变量
#!/bin/bash
str="hello"
echo ${str}world
环境变量
echo $PATH
echo $HOME
符号 | 含义 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 |
$$ | 脚本运行的当前进程 ID 号 |
$! | 后台运行的最后一个进程的 ID 号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。不是一体返回 |
$? | 显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。如果函数有返回值,可以代表函数返回值 |
#!/bin/bash
echo "第一个参数为: $1";
echo "参数个数为: $#";
echo "传递的参数作为一个字符串显示: $*";
执行:
./test.sh 1 2 3
#!/bin/bash
a=1;
b=2;
echo `expr $a + $b`;
echo $((a+b));
echo $[a+b];
#!/bin/bash
read -p "please input your name:" NAME ## read命令用于从控制台读取输入数据
## printf '%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]
then
echo "hello ${NAME}, welcome !"
else
echo "Get out Please!"
fi
方式1:
#!/bin/bash
for N in 1 2 3
do
echo $N
done
方式2:
#!/bin/bash
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
rpm -qa | grep java
rpm -e java-1.6.0-openjdk-1.6.0.41-1.13.13.1.el6_8.x86_64 tzdata-java-2016j-1.el6.noarch java-1.7.0-openjdk-1.7.0.131-2.6.9.0.el6_8.x86_64
#shell
mkdir -p /export/softwares #软件包存放目录
mkdir -p /export/servers #安装目录
yum install -y lrzsz
rz
#上传jdk到/export/softwares路径下去,并解压
tar -zxvf jdk-8u141-linux-x64.tar.gz -C ../servers/
vim /etc/profile
添加如下内容
export JAVA_HOME=/export/servers/jdk1.8.0_141
export PATH=:$JAVA_HOME/bin:$PATH
修改完成之后记得 source /etc/profile生效
source /etc/profile
scp -r jdk1.8.0 node02:/export/servers
yum install mysql mysql-server mysql-devel
/etc/init.d/mysqld start
#开机mysql服务自启
chkconfig --add mysqld
chkconfig --list(查看服务列表)
chkconfig --level 345 mysqld on
reboot
/usr/bin/mysql_secure_installation
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
/data/host1
, /data/host2
, 这个路径也可以理解为是 Znode 的 Name/data/host1
, 其值是一个字符串 "192.168.0.1"
数据发布/订阅系统,需要发布者将数据发布到Zookeeper的节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
发布/订阅一般有两种设计模式:推模式和拉模式,服务端主动将数据更新发送给所有订阅的客户端称为推模式;客户端主动请求获取最新数据称为拉模式.
Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知,客户端接收到此通知后,主动到服务端获取最新的数据。
命名服务是分步式系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体,在分布式环境中,上层应用仅仅需要一个全局唯一的名字。Zookeeper可以实现一套分布式全局唯一ID的分配机制。
通过调用Zookeeper节点创建的API接口就可以创建一个顺序节点,并且在API返回值中会返回这个节点的完整名字,利用此特性,可以生成全局ID,其步骤如下
Zookeeper中特有的Watcher注册与异步通知机制,能够很好地实现分布式环境下不同机器,甚至不同系统之间的协调与通知,从而实现对数据变更的实时处理。通常的做法是不同的客户端都对Zookeeper上的同一个数据节点进行Watcher注册,监听数据节点的变化(包括节点本身和子节点),若数据节点发生变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并作出相应处理。
在绝大多数分布式系统中,系统机器间的通信无外乎心跳检测、工作进度汇报和系统调度。
① 心跳检测,不同机器间需要检测到彼此是否在正常运行,可以使用Zookeeper实现机器间的心跳检测,基于其临时节点特性(临时节点的生存周期是客户端会话,客户端若宕机后,其临时节点自然不再存在),可以让不同机器都在Zookeeper的一个指定节点下创建临时子节点,不同的机器之间可以根据这个临时子节点来判断对应的客户端机器是否存活。通过Zookeeper可以大大减少系统耦合。
② 工作进度汇报,通常任务被分发到不同机器后,需要实时地将自己的任务执行进度汇报给分发系统,可以在Zookeeper上选择一个节点,每个任务客户端都在这个节点下面创建临时子节点,这样不仅可以判断机器是否存活,同时各个机器可以将自己的任务执行进度写到该临时节点中去,以便中心系统能够实时获取任务的执行进度。
③ 系统调度,Zookeeper能够实现如下系统调度模式:分布式系统由控制台和一些客户端系统两部分构成,控制台的职责就是需要将一些指令信息发送给所有的客户端,以控制他们进行相应的业务逻辑,后台管理人员在控制台上做一些操作,实际上就是修改Zookeeper上某些节点的数据,Zookeeper可以把数据变更以时间通知的形式发送给订阅客户端。
分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问一个或一组资源时的一致性,主要分为排它锁和共享锁。
排它锁又称为写锁或独占锁,若事务T1对数据对象O1加上了排它锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任何类型的操作,直到T1释放了排它锁。
① 获取锁,在需要获取排它锁时,所有客户端通过调用接口,在/exclusive_lock节点下创建临时子节点/exclusive_lock/lock。Zookeeper可以保证只有一个客户端能够创建成功,没有成功的客户端需要注册/exclusive_lock节点监听。
② 释放锁,当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此时,所有在/exclusive_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获取。
共享锁又称为读锁,若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都被释放。在需要获取共享锁时,所有客户端都会到/shared_lock下面创建一个临时顺序节点
有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己任务再交给C团队继续做。这就有点像业务系统的工作流一样,一环一环地传下 去.
分布式环境下,我们同样需要一个类似单进程队列的组件,用来实现跨进程、跨主机、跨网络的数据共享和数据传递,这就是我们的分布式队列。
Zookeeper集群是一个基于主从架构的高可用集群
每个服务器承担如下三种角色中的一种
Leader 一个Zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及Observer间的心跳。所有的写操作必须要通过Leader完成再由Leader将写操作广播给其它服务器。
Follower 一个Zookeeper集群可能同时存在多个Follower,它会响应Leader的心跳。Follower可直接处理并返回客户端的读请求,同时会将写请求转发给Leader处理,并且负责在Leader处理写请求时对请求进行投票。
Observer 角色与Follower类似,但是无投票权。
Leader选举是保证分布式数据一致性的关键所在。当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举。
若进行Leader选举,则至少需要两台机器,这里选取3台机器组成的服务器集群为例。在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Leader选举,当第二台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。选举过程如下
(1) 每个Server发出一个投票。由于是初始情况,Server1和Server2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid, ZXID)来表示,此时Server1的投票为(1, 0),Server2的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
(2) 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。
(3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下
· 优先检查ZXID。ZXID比较大的服务器优先作为Leader。
· 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。
对于Server1而言,它的投票是(1, 0),接收Server2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时Server2的myid最大,于是更新自己的投票为(2, 0),然后重新投票,对于Server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。
(4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于Server1、Server2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了Leader。
(5) 改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。
在Zookeeper运行期间,Leader与非Leader服务器各司其职,即便当有非Leader服务器宕机或新加入,此时也不会影响Leader,但是一旦Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮Leader选举,其过程和启动时期的Leader选举过程基本一致过程相同。
集群规划
服务器IP | 主机名 | myid的值 |
---|---|---|
192.168.174.100 | node01 | 1 |
192.168.174.110 | node02 | 2 |
192.168.174.120 | node03 | 3 |
第一步:下载zookeeeper的压缩包,下载网址如下
http://archive.apache.org/dist/zookeeper/
我们在这个网址下载我们使用的zk版本为3.4.9
下载完成之后,上传到我们的linux的/export/softwares路径下准备进行安装
第二步:解压
解压zookeeper的压缩包到/export/servers路径下去,然后准备进行安装
cd /export/software
tar -zxvf zookeeper-3.4.9.tar.gz -C ../servers/
第三步:修改配置文件
第一台机器修改配置文件
cd /export/servers/zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
mkdir -p /export/servers/zookeeper-3.4.9/zkdatas/
vim zoo.cfg
#myid,pID,version
dataDir=/export/servers/zookeeper-3.4.9/zkdatas
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少小时清理一次
autopurge.purgeInterval=1
# 集群中服务器地址,2888通信,3888投票
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第四步:添加myid配置
在第一台机器的
/export/servers/zookeeper-3.4.9/zkdatas /这个路径下创建一个文件,文件名为myid ,文件内容为1
echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid
第五步:安装包分发并修改myid的值
安装包分发到其他机器
第一台机器上面执行以下两个命令
scp -r /export/servers/zookeeper-3.4.9/ node02:/export/servers/
scp -r /export/servers/zookeeper-3.4.9/ node03:/export/servers/
第二台机器上修改myid的值为2
echo 2 > /export/servers/zookeeper-3.4.9/zkdatas/myid
第三台机器上修改myid的值为3
echo 3 > /export/servers/zookeeper-3.4.9/zkdatas/myid
第六步:三台机器启动zookeeper服务
这个命令三台机器都要执行
/export/servers/zookeeper-3.4.9/bin/zkServer.sh start
查看启动状态
/export/servers/zookeeper-3.4.9/bin/zkServer.sh status
设置一键启动
#创建启动脚本
cd /export/servers/zk/ ##在某一台即可
vi startZK.sh
i
#脚本文件如下:
#!/bin/sh
echo "启动zookeeper中...."
for host in node01 node02 node03
do
ssh -q $host "source /etc/profile; /export/servers/zookeeper-3.4.9/bin/zkServer.sh start"
done
echo "启动完成....."
设置一键关闭
#关闭脚本: shutdownZK.sh
cd /export/servers/zk/
vi shutdownZK.sh
i
#脚本文件如下:
#!/bin/sh
echo "关闭zookeeper中...."
for host in node01 node02 node03
do
ssh -q $host "source /etc/profile; /export/servers/zookeeper-3.4.9/bin/zkServer.sh stop"
done
echo "shutdownZK以关闭....."
servers/`
scp -r /export/servers/zookeeper-3.4.9/ node03:/export/servers/
第二台机器上修改myid的值为2
echo 2 > /export/servers/zookeeper-3.4.9/zkdatas/myid
第三台机器上修改myid的值为3
echo 3 > /export/servers/zookeeper-3.4.9/zkdatas/myid