一、大型互联网架构演变历程
1. 淘宝技术这10年
1.1. 淘宝现状
高并发已经成为当前互联网企业面临的巨大挑战!例如2015年“双十一”全球狂欢节正式落下帷幕,天猫最终交易额也达到了创纪录的912.17亿元!参与交易国家和地区达到232个,双十一支付宝最高峰每秒处理的交易笔数是8.59万笔,在线人数峰值达到4500万。
2009年至2016年历史销售数据:
2016年:覆盖235个国家和地区,交易额超过1207亿元!
2015年:交易额已超912亿元!
2014年:交易额571亿元(最终数字)。
2013年:最终交易额352亿元。
2012年:达到191亿元,其中包括天猫商城132亿元,淘宝59亿元。
2011年2200家店铺参与,天猫双11的销售额已跃升到33.6亿元,淘宝和天猫共52亿。
2010年711家店铺参与,数字提高到9.36亿元;
2009年27个品牌参与,天猫双十一销售额为0.5亿元;
淘宝的核心技术(国内乃至国际的Top,这还是2011年的数据)
l拥有全国最大的分布式Hadoop集群(云梯,2000左右节点,24000核CPU,48000GB内存,40PB存储容量)
l全国分布80+CDN节点,能够自动找寻最近的节点提供服务,支持流量超过800Gbps
l不逊于百度的搜索引擎,对数十亿商品进行搜索,全球最大的电商平台
l顶尖的负载均衡系统,顶尖的分布式系统,顶尖的互联网思想,功能多样运行极其稳定
l丰富的生态产业以及先进的数据挖掘技术
l ……很多很多
1.2. 淘宝技术演变,摘自《淘宝技术这十年》
l马总在2003年4月7日秘密叫来阿里巴巴的十位员工,来到杭州一个隐秘的毛坯房,要求他们在一个月左右的时间内做出一个C2C网站。结果当然还是直接买的快,一个基于LAMP架构的网站,原名是PHPAuction,老美开发的一个拍卖网站。当然必须要做修改才能用。
l 2003年底,淘宝注册用户23万,PV 31万/day,半年成交额3371万
l很显然MySQL无法撑得起如此大的访问量,数据库瓶颈出现了。幸好阿里的DBA队伍足够强大,他们使用Oracle替代了MySQL。Oracle那时就已经有了强大的并发性访问设计——连接池,从连接池取连接的耗费比单独建立连接少很多。但是PHP当时并没有官方提供支持语言连接池特性,于是多隆前辈用Google(不会是Baidu)搜到了一个开源的SQL Relay,于是数据库软件方面的瓶颈暂时解决了。
l随之而来的是面临硬件性能瓶颈,阿里买了EMC的SAN存储设备,加上Oracle高性能RAC,硬件容量也暂时没问题了。
l因为SQL Relay的问题实在过于严重,2004年于是淘宝终于做出了跨时代的决策——使用Java重写网站。
l淘宝请了Sun的高级工程师来帮忙做Java架构。那么他们是如何做到修改编程语言而不改变网站使用呢——模块化替换,今天写好了A模块,另开一个新域名,将连接指向该模块,同时别的模块不变,等到全部模块完成的时候,原域名放弃。Sun公司坚持使用EJB作为控制层,加上使用iBatis作为持久层,一个可扩展且高效的Java EE应用诞生了。
l送走Sun的大牛们之后,阿里的数据存储又遇到了瓶颈,于是忍痛买了一台IBM小型机,也就有了IOE(IBM + Oracle + EMC)这样的传说
l 2004年底,淘宝注册用户400万,PV 4000万/day,全网成交额10个亿。
l 2005年Spring诞生了,早闻Spring框架在Web应用不可或缺,而在淘宝网,Spring也达到了Rod Johnson设计它的目的——替代EJB。
l 2005年底,淘宝注册用户1390万,PV 8931万/day,商品数目1663万个。
l考虑到未来的发展,这样的设施架构只是勉强可以应付现在的要求。于是,CDN技术派上用场了,一开始使用商用的ChinaCache,后来使用章文嵩博士搭建低耗能CDN网络,淘宝网的性能越来越好了。
l 2006年底,淘宝注册用户3000万,PV 15000万/day,商品数目5000万,全网成交额169亿元。
l淘宝在2007年之前,使用NetApp的商用存储系统,但是仍然不够应付迅速增长的趋势。同年Google公布了GFS的设计思想,参照它的思想,淘宝也开发了自己的文件系统——TFS每个用户在TFS上拥有1GB的图片存储空间,这些都得益于TFS集群的文件存储系统以及大量的图片服务器。淘宝使用实时生成缩率图,全局负载均衡以及一级和二级缓存来保证图片的访问优化与高效访问。
l淘宝的服务器软件使用Tengine,一个被优化过的nginx模块。
l淘宝分离出了UIC(User Information Center),供所有模块调用。多隆前辈再次为其编写出了TDBM,完全是基于内存的数据缓存(参考了memcached)。再然后,淘宝将TBstore和TDBM合并,写出了Tair,一个基于Key-Value的分布式缓存数据系统。然后升级了自己的iSearch系统。
l 2007年底,淘宝注册用户5000万,PV 25000万/day,商品数目1个亿,全网成交额433亿元。
l ...
l Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。Dubbo自2011年开源后,已被许多非阿里系公司使用。
2. 技术发展历程总结
2.1. 单节点架构
2.2. 集群架构
2.3. 集群+分布式架构
二、Linux安装
1/安装vmware软件
2/验证VMWARE是否安装成功
(有些同学的机器在安装vmware的时候会出现一个错误:virtual XT,这需要重启电脑<按F2/按DELET/.........>进入BIOS,开启这个虚拟加速开关)
(有些WINDOWS8/10系统会出现虚拟网卡安装失败的现象,这需要关闭windows的驱动程序安装签名验证)
3/启动vmware后的软件界面
4/新建虚拟机
5/选择自定义配置
6/选择硬件兼容标准
7/选择是否让vmware安装操作系统
8/选择将要安装的操作系统的类型
9/选择虚拟系统文件存放的目录
10/为虚拟机分配cpu/内存
11/选择虚拟机所连接的网络类型
12/选择为虚拟机创建一块新的虚拟磁盘
13/虚拟机创建完毕后,可以调整硬件配置(删除打印机、声卡等无用硬件)
14/往虚拟机的光驱中插入一张linux安装光盘的iso镜像文件
15/启动虚拟机,将自动进入centos安装界面
接下来按提示不断下一步即可(中间可以选择安装模式:desktop、minimal、server等,建议先用desktop,因为安装的工具软件比较全)
16/centos系统安装完后,需要设置网络
首先在vmware中,查看NAT网络模式中的虚拟路由器的网段和IP地址
17/接下来设置windows的vmnet8的ip地址和虚拟机中centos的ip地址,即可联网
NAT虚拟网络配置
桥接和hostonly虚拟网络配置
二、Linux操作系统概述
1.Linux简介
Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机
2.Linux介绍
Linux出现于1991年,是由芬兰赫尔辛基大学学生Linus Torvalds和后来加入的众多爱好者共同开发完成
3.Linux特点
多用户,多任务,丰富的网络功能,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面,出色的速度性能
开源
4.CentOS
主流:目前的Linux操作系统主要应用于生产环境,主流企业级Linux系统仍旧是RedHat或者CentOS
免费:RedHat 和CentOS差别不大,基于Red Hat Linux 提供的可自由使用源代码的企业CentOS是一个级Linux发行版本
更新方便:CentOS独有的yum命令支持在线升级,可以即时更新系统,不像RedHat 那样需要花钱购买支持服务!
CentOS6.X
CentOS官网:http://www.centos.org/
CentOS搜狐镜像:http://mirrors.sohu.com/centos/
CentOS网易镜像:http://mirrors.163.com/centos/
CentOS北京理工大学镜像:http://mirror.bit.edu.cn/centos/
三、Linux安装
环境:Windows7 ,Oracle VirtualBox, CentOS6.7
bin (binaries)存放二进制可执行文件
sbin (super user binaries)存放二进制可执行文件,只有root才能访问
etc (etcetera)存放系统配置文件
usr (unix shared resources)用于存放共享的系统资源
home 存放用户文件的根目录
root 超级用户目录
dev (devices)用于存放设备文件
lib (library)存放跟文件系统中的程序运行所需要的共享库及内核模块
mnt (mount)系统管理员安装临时文件系统的安装点
boot 存放用于系统引导时使用的各种文件
tmp (temporary)用于存放各种临时文件
var (variable)用于存放运行时需要改变数据的文件
四、Linux常用命令
1.Linux命令格式
命令格式:命令 -选项 参数
如:ls -la /usr
ls:显示文件和目录列表(list)
常用参数:
-l (long)
-a (all) 注意隐藏文件、特殊目录.和..
-t (time)
2.Linux命令分类
内部命令:属于Shell解析器的一部分
cd 切换目录(change directory)
pwd 显示当前工作目录(print working directory)
help 帮助
外部命令:独立于Shell解析器之外的文件程序
ls 显示文件和目录列表(list)
mkdir 创建目录(make directoriy)
cp 复制文件或目录(copy)
查看帮助文档
内部命令:help + 命令(help cd)
外部命令:man + 命令(man ls)
3.操作文件或目录常用命令
pwd 显示当前工作目录(print working directory)
touch 创建空文件
mkdir 创建目录(make directoriy)
-p 父目录不存在情况下先生成父目录 (parents)
cp 复制文件或目录(copy)
-r 递归处理,将指定目录下的文件与子目录一并拷贝(recursive)
mv 移动文件或目录、文件或目录改名(move)
rm 删除文件(remove)
-r 同时删除该目录下的所有文件(recursive)
-f 强制删除文件或目录(force)
rmdir 删除空目录(remove directoriy)
cat显示文本文件内容 (catenate)
more、less 分页显示文本文件内容
head、tail查看文本中开头或结尾部分的内容
haed -n 5 a.log 查看a.log文件的前5行
tail -F b.log 循环读取(follow)
4.常用命令
wc 统计文本的行数、字数、字符数(word count)
-m 统计文本字符数
-w 统计文本字数
-l 统计文本行数
find 在文件系统中查找指定的文件
find /etc/ -name "aaa"
grep 在指定的文本文件中查找指定的字符串
ln 建立链接文件(link)
-s 对源文件建立符号连接,而非硬连接(symbolic)
top 显示当前系统中耗费资源最多的进程
ps 显示瞬间的进程状态
-e /-A 显示所有进程,环境变量
-f 全格式
-a 显示所有用户的所有进程(包括其它用户)
-u 按用户名和启动时间的顺序来显示进程
-x 显示无控制终端的进程
kill 杀死一个进程
kill -9 pid
df 显示文件系统磁盘空间的使用情况
du 显示指定的文件(目录)已使用的磁盘空间的总
-h文件大小以K,M,G为单位显示(human-readable)
-s只显示各档案大小的总合(summarize)
free 显示当前内存和交换空间的使用情况
netstat 显示网络状态信息
-a 显示所有连接和监听端口
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-p 显示建立相关链接的程序名
ifconfig 网卡网络配置详解
ping 测试网络的连通性
5.备份压缩命令
gzip 压缩(解压)文件或目录,压缩文件后缀为gz
bzip2 压缩(解压)文件或目录,压缩文件后缀为bz2
tar 文件、目录打(解)包
gzip命令:
命令格式:gzip [选项] 压缩(解压缩)的文件名
-d将压缩文件解压(decompress)
-l显示压缩文件的大小,未压缩文件的大小,压缩比(list)
-v显示文件名和压缩比(verbose)
-num用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6
bzip2命令:
命令格式:bzip2 [-cdz] 文档名
-c将压缩的过程产生的数据输出到屏幕上
-d解压缩的参数(decompress)
-z压缩的参数(compress)
-num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6
tar命令:
-c 建立一个压缩文件的参数指令(create)
-x 解开一个压缩文件的参数指令(extract)
-z 是否需要用 gzip 压缩
-j 是否需要用 bzip2 压缩
-v 压缩的过程中显示文件(verbose)
-f 使用档名,在 f 之后要立即接档名(file)
6.关机重启命令
shutdown系统关机
-r 关机后立即重启
-h 关机后不重新启动
halt 关机后关闭电源 shutdown -h
reboot 重新启动 shutdown -r
7.学习Linux好习惯
善于查看man page(manual)等帮助文档
利用好Tab键
掌握好一些快捷键
ctrl + c(停止当前进程)
ctrl + r(查看命令历史)
ctrl + l(清屏,与clear命令作用相同)
五、vi/vim编辑器
vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大。
只有命令,没有菜单。
1.vim工作模式
2.插入命令
3.定位命令
4.替换/取消命令
5.删除命令
6.常用快捷键
六、用户和组账户管理
linux操作系统是一个多用户操作系统,它允许多用户同时登录到系统上并使用资源。系统会根据账户来区分每个用户的文件,进程,任务和工作环境,使得每个用户工作都不受干扰。
1.配置文件
保存用户信息的文件:/etc/passwd
保存密码的文件:/etc/shadow
保存用户组的文件:/etc/group
保存用户组密码的文件:/etc/gshadow
用户配置文件:/etc/default/useradd
2./etc/passwd格式
3.Linux用户分类
超级用户:(root,UID=0)
普通用户:(UID在500到60000)
伪用户:(UID在1到499)
系统和服务相关的:bin、daemon、shutdown等
进程相关的:mail、news、games等
为用户不能登陆系统,而且没有宿主目录
4./etc/shadow格式
5.用户组
每个用户至少属于一个用户组
每个用户组可以包含多个用户
同一个用户组的用户享有该组共有的权限
6./etc/group格式
7.操作用户命令
添加用户命令:useradd
-u 指定组ID(uid)
-g 指定所属的组名(gid)
-G 指定多个组,用逗号“,”分开(Groups)
-c 用户描述(comment)
-e 失效时间(expire date)
例子:
useradd -u 888 -g users -G sys,root -c "hr zhang" zhangsan
passwd zhangsan
修改用户命令:usermod(user modify)
-l 修改用户名 (login)usermod -l a b(b改为a)
-g 添加组 usermod -g sys tom
-G添加多个组 usermod -G sys,root tom
–L 锁定用户账号密码(Lock)
–U 解锁用户账号(Unlock)
删除用户命令:userdel(user delete)
-r 删除账号时同时删除目录(remove)
8.操作用户组命令
添加组:groupadd
-g 指定gid
修改组:groupmod
-n 更改组名(new group)
删除组:groupdel
groups 显示用户所属组
七、权限管理
1.三种基本权限
r 读权限(read)
w 写权限(write)
x 执行权限 (execute)
第1位:文件类型(d 目录,- 普通文件,l 链接文件)
第2-4位:所属用户权限,用u(user)表示
第5-7位:所属组权限,用g(group)表示
第8-10位:其他用户权限,用o(other)表示
第2-10位:表示所有的权限,用a(all)表示
完整信息:一个文件,所属用户具有读写执行权限;所属组的用户
有读写权限,没有执行权限;其他用户只有读权限
2.更改操作权限
chmod修改文件权限命令(change mode)
参数:-R 下面的文件和子目录做相同权限操作(Recursive递归的)
例如:chmod u+x a.txt
用数字来表示权限(r=4,w=2,x=1,-=0)
例如:chmod 750 b.txt
rwx用二进制表示是111,十进制4+2+1=7
r-x用二进制表示是101,十进制4+0+1=5
八、RPM软件包管理
RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括RedHat、CentOS、SUSE等Linux的分发版本都有采用,可以算是公认的行业标准了。RPM文件在Linux系统中的安装最为简便
1.RPM命令使用
rpm的常用参数
i:安装应用程序(install)
e:卸载应用程序(erase)
vh:显示安装进度;(verbose hash)
U:升级软件包;(update)
qa: 显示所有已安装软件包(query all)
结合grep命令使用
例子:rmp -ivh gcc-c++-4.4.7-3.el6.x86_64.rpm
2.YUM命令
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
例子(需要上网,没有网络可以建本地源):
yum install gcc-c++
yum remove gcc-c++
yum update gcc-c++
九、网络图解
十、软件安装
1. 修改Linux的基本配置
修改主机名
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=server1.itcast.cn
修改ip地址
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.101
NETMASK=255.255.255.0
service network restart
修改ip地址和主机名的映射关系
vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.101 server1.itcast.cn
关闭iptables并设置其开机启动/不启动
service iptables stop
chkconfig iptables on
chkconfig iptables off
2.安装JDK
上传jdk-7u45-linux-x64.tar.gz到Linux上
解压jdk到/usr/local目录
tar -zxvf jdk-7u45-linux-x64.tar.gz -C /usr/local/
设置环境变量,在/etc/profile文件最后追加相关内容
vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin
刷新环境变量
source /etc/profile
测试java命令是否可用
java -version
3.安装Tomcat
上传apache-tomcat-7.0.68.tar.gz到Linux上
解压tomcat
tar -zxvf apache-tomcat-7.0.68.tar.gz -C /usr/local/
启动tomcat
/usr/local/apache-tomcat-7.0.68/bin/startup.sh
查看tomcat进程是否启动
jps
查看tomcat进程端口
netstat -anpt | grep 2465
通过浏览器访问tomcat
http://192.168.0.101:8080/
4. 安装MySQL
上传MySQL-server-5.5.48-1.linux2.6.x86_64.rpm、MySQL-client-5.5.48-1.linux2.6.x86_64.rpm到Linux上
使用rpm命令安装MySQL-server-5.5.48-1.linux2.6.x86_64.rpm,缺少perl依赖
rpm -ivh MySQL-server-5.5.48-1.linux2.6.x86_64.rpm
安装perl依赖,上传6个perl相关的rpm包
rpm -ivh perl-*
再安装MySQL-server,rpm包冲突
rpm -ivh MySQL-server-5.5.48-1.linux2.6.x86_64.rpm
卸载冲突的rpm包
rpm -e mysql-libs-5.1.73-5.el6_6.x86_64 --nodeps
再安装MySQL-client和MySQL-server
rpm -ivh MySQL-client-5.5.48-1.linux2.6.x86_64.rpm
rpm -ivh MySQL-server-5.5.48-1.linux2.6.x86_64.rpm
启动MySQL服务,然后初始化MySQL
service mysql start
/usr/bin/mysql_secure_installation
测试MySQL
mysql -u root -p
十一、本地YUM源制作
1. YUM相关概念
1.1. 什么是YUM
YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
1.2. YUM的作用
在Linux上使用源码的方式安装软件非常满分,使用yum可以简化安装的过程
2. YUM的常用命令
安装httpd并确认安装
yum instll -y httpd
列出所有可用的package和package组
yum list
清除所有缓冲数据
yum clean all
列出一个包所有依赖的包
yum deplist httpd
删除httpd
yum remove httpd
3. 制作本地YUM源
为什么要制作本地YUM源
YUM源虽然可以简化我们在Linux上安装软件的过程,但是生成环境通常无法上网,不能连接外网的YUM源,说以接就无法使用yum命令安装软件了。为了在内网中也可以使用yum安装相关的软件,就要配置yum源。
3.1. YUM源的原理
YUM源其实就是一个保存了多个RPM包的服务器,可以通过http的方式来检索、下载并安装相关的RPM包
3.2. 制作本地YUM源
1.准备一台Linux服务器,用最简单的版本CentOS-6.7-x86_64-minimal.iso
2.配置好这台服务器的IP地址
3.上传CentOS-6.7-x86_64-bin-DVD1.iso到服务器
4.将CentOS-6.7-x86_64-bin-DVD1.iso镜像挂载到某个目录
mkdir /var/iso
mount -o loop CentOS-6.7-x86_64-bin-DVD1.iso /var/iso
5.修改本机上的YUM源配置文件,将源指向自己
备份原有的YUM源的配置文件
cd /etc/yum.repos.d/
rename .repo .repo.bak *
vi CentOS-Local.repo
[base]
name=CentOS-Local
baseurl=file:///var/iso
gpgcheck=1
enabled=1 #很重要,1才启用
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
添加上面内容保存退出
6.清除YUM缓冲
yum clean all
7.列出可用的YUM源
yum repolist
8.安装相应的软件
yum install -y httpd
9.开启httpd使用浏览器访问http://192.168.0.100:80(如果访问不通,检查防火墙是否开启了80端口或关闭防火墙)
service httpd start
10.将YUM源配置到httpd(Apache Server)中,其他的服务器即可通过网络访问这个内网中的YUM源了
cp -r /var/iso/ /var/www/html/CentOS-6.7
11.取消先前挂载的镜像
umount /var/iso
12.在浏览器中访问http://192.168.0.100/CentOS-6.7/
13.让其他需要安装RPM包的服务器指向这个YUM源,准备一台新的服务器,备份或删除原有的YUM源配置文件
cd /etc/yum.repos.d/
rename .repo .repo.bak *
vi CentOS-Local.repo
[base]
name=CentOS-Local
baseurl=http://192.168.0.100/CentOS-6.7
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
添加上面内容保存退出
14.在这台新的服务器上执行YUM的命令
yum clean all
yum repolist
15.安装相应的软件
yum install -y gcc
16、加入依赖包到私有yum的repository
进入到repo目录
执行命令: createrepo .