Category: UNIX/Linux

UNIX/Linux命令行提示符显示当前完整路径的方法

查看默认方式:

vim /etc/bashrc

PS1='\h:\W \u\$ '

我们先了解命令释义:

  • \u 当前用户账号
  • \h 当前主机名
  • \W 当前路径最后一个目录
  • \w 当前绝对路径(当前用户目录会以 ~代替)
  • $PWD 当前全路径
  • \$ 显示命令行’$'或者’#'符号

知道命令代表的意义后,
如果要修改命令提示符的显示方式,我们可以修改环境变量PS1

  1. 命令行提示符完全显示完整的工作目录名称:
    PS1='[\u@\h $PWD]\$ '

  2. 命令行提示符只列出最后一个目录:
    PS1='[\u@\h \W]\$ '

  3. 命令行提示符显示完整工作目录,当前用户目录会以 ~代替:
    PS1='[\u@\h \w]\$ '

修改完成后,执行: source /etc/bashrc 使配置生效即可。

当然,如果你不想改变全局,只想改变当前用户的,则 vim ~/.bashrc 即可

秒懂系列|Apache和NGINX退出自动重启

有时候,我们的Web服务器如Apache、NGINX可能因为某些原因退出了,这时候如果没有及时发现,就会影响服务,所以搞个自动重启是很有必要滴

Apache

#!/bin/sh
HTTPD_NUM=`ps aux | grep -P "(bin/httpd)|(./httpd)" | grep -v "vim" | grep -v "grep" | wc -l`
if [ ${HTTPD_NUM} -eq 0 ]; then
    /usr/local/apache/bin/apachectl restart
fi

Nginx

#!/bin/sh
NGINX_NUM=`ps aux | grep -P "nginx" | grep -v "vim" | grep -v "grep" | wc -l`
if [ ${NGINX_NUM} -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
fi

加入crontab,每分钟检查一次

* * * * * /bin/bash /data/cron/apache_restart.sh > /dev/null 2 >& 1
* * * * * /bin/bash /data/cron/nginx_restart.sh > /dev/null 2 >&1

原理很简单,就是判断是否有进程,如果木有了,执行重启操作!

-bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory

[code lang="shell"]
./configure --prefix=/usr/local/jpeg --enable-shared --enable-static
[/code]

-bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory

今天在编译 jpeg-6b 的时候,出现一行这样的错误,

看见 ^M 就联想到了 Window 下的 dos 格式
[code lang="shell"]
vim ./configure
[/code]

:set ff
fileformat=dos

我X,果然是!

这是 Linux 和 Windows 换行符的差异导致的,
说明 configure 这个文件是作者在 Window 写的,并且没有将文件格式设置成 unix 格式(一般的编辑器都有这项设置),
所以在 Linux 打开时,在每行后面会加个 ctrl+m 就是 ^M
所以 /bin/sh 就变成了 /bin/sh^M
所以脚本就不能运行了
[code lang="shell"]dos2unix configure[/code]
我把文件格式转换之后,就OK了!

如果你的系统不支持 dos2unix,你也可以
[code lang="shell"]
vim ./configure
[/code]

:set ff=unix
:wq

用10条命令在1分钟内检查Linux服务器性能

如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断。

通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解。

  • uptime
  • dmesg | tail
  • vmstat 1
  • mpstat -P ALL 1
  • pidstat 1
  • iostat -xz 1
  • free -m
  • sar -n DEV 1
  • sar -n TCP,ETCP 1
  • top

其中一些命令需要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,也就是所谓的USE方法。

下面我们来逐一介绍下这些命令,有关这些命令更多的参数和说明,请参照命令的手册。

uptime

$ uptime
23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02

这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。

命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

上面例子中的输出,可以看见最近1分钟的平均负载非常高,且远高于最近15分钟负载,因此我们需要继续排查当前系统中有什么进程消耗了大量的资源。可以通过下文将会介绍的vmstat、mpstat等命令进一步排查。

dmesg | tail

$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.

该命令会输出系统日志的最后10行。示例中的输出,可以看见一次内核的oom kill和一次TCP丢包。这些日志可以帮助排查性能问题。千万不要忘了这一步。

vmstat 1

$ vmstat 1
procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
34 0 0 200889792 73708 591828 0 0 0 5 6 10 96 1 3 0 0
32 0 0 200889920 73708 591860 0 0 0 592 13284 4282 98 1 1 0 0
32 0 0 200890112 73708 591860 0 0 0 0 9501 2154 99 1 0 0 0
32 0 0 200889568 73712 591856 0 0 0 48 11900 2459 99 0 0 0 0
32 0 0 200890208 73712 591860 0 0 0 0 15898 4840 98 1 1 0 0

vmstat(8) 命令,每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列:

r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。
free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。
si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。
us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。
上述这些CPU时间,可以让我们很快了解CPU是否出于繁忙状态。一般情况下,如果用户时间和系统时间相加非常大,CPU出于忙于执行指令。如果IO等待时间很长,那么系统的瓶颈可能在磁盘IO。

示例命令的输出可以看见,大量CPU时间消耗在用户态,也就是用户应用程序消耗了CPU时间。这不一定是性能问题,需要结合r队列,一起分析。

mpstat -P ALL 1

$ mpstat -P ALL 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
07:38:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78
07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99
07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00
07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03

该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。

pidstat 1

$ pidstat 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
07:41:02 PM UID PID %usr %system %guest %CPU CPU Command
07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/0
07:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave
07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java
07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java
07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java
07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat
07:41:03 PM UID PID %usr %system %guest %CPU CPU Command
07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave
07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java
07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java
07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass
07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat

pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。如上的输出,可以看见两个JAVA进程占用了将近1600%的CPU时间,既消耗了大约16个CPU核心的运算资源。

iostat -xz 1

$ iostat -xz 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
73.96 0.00 3.73 0.03 0.06 22.21
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09
xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25
xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26
dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04
dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00
dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03

iostat命令主要用于查看机器磁盘IO情况。该命令输出的列,主要含义是:

r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
%util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。
如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。

free –m

$ free -m
total used free shared buffers cached
Mem: 245998 24545 221453 83 59 541
-/+ buffers/cache: 23944 222053
Swap: 0 0 0

free命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。需要注意的是,第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。

如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。

sar -n DEV 1

$ sar -n DEV 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00
12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00
12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00
12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00
12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。如示例输出中,eth0网卡设备,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,没有达到1Gbit/sec的硬件上限。

sar -n TCP,ETCP 1

$ sar -n TCP,ETCP 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:17:19 AM active/s passive/s iseg/s oseg/s
12:17:20 AM 1.00 0.00 10233.00 18846.00
12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:20 AM 0.00 0.00 0.00 0.00 0.00
12:17:20 AM active/s passive/s iseg/s oseg/s
12:17:21 AM 1.00 0.00 8359.00 6039.00
12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:21 AM 0.00 0.00 0.00 0.00 0.00

sar命令在这里用于查看TCP连接状态,其中包括:

active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
retrans/s:每秒TCP重传数量;
TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。

top

$ top
top - 00:15:40 up 21:56, 1 user, load average: 31.09, 29.87, 29.92
Tasks: 871 total, 1 running, 868 sleeping, 0 stopped, 2 zombie
%Cpu(s): 96.8 us, 0.4 sy, 0.0 ni, 2.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 25190241+total, 24921688 used, 22698073+free, 60448 buffers
KiB Swap: 0 total, 0 used, 0 free. 554208 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20248 root 20 0 0.227t 0.012t 18748 S 3090 5.2 29812:58 java
4213 root 20 0 2722544 64640 44232 S 23.5 0.0 233:35.37 mesos-slave
66128 titancl+ 20 0 24344 2332 1172 R 1.0 0.0 0:00.07 top
5235 root 20 0 38.227g 547004 49996 S 0.7 0.2 2:02.74 java
4299 root 20 0 20.015g 2.682g 16836 S 0.3 1.1 33:14.42 java
1 root 20 0 33620 2920 1496 S 0.0 0.0 0:03.82 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:05.35 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:06.94 kworker/u256:0
8 root 20 0 0 0 0 S 0.0 0.0 2:38.05 rcu_sched

top命令包含了前面好几个命令的检查的内容。比如系统负载情况(uptime)、系统内存使用情况(free)、系统CPU使用情况(vmstat)等。因此通过这个命令,可以相对全面的查看系统负载的来源。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

但是,top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。

总结

排查Linux服务器性能问题还有很多工具,上面介绍的一些命令,可以帮助我们快速的定位问题。例如前面的示例输出,多个证据证明有JAVA进程占用了大量CPU资源,之后的性能调优就可以针对应用程序进行。

FROM:http://www.infoq.com/cn/news/2015/12/linux-performance

Linux实现IP和端口转发方法

应用场景举例:
实现下面两个Shell

mysql -h10.13.34.119 -P3306 -uroot -p123456
mysql -h10.13.34.120 -P3307 -uroot -p123456

都是同样访问 10.13.34.119:3306 这个数据库服务器
这时候我们就需要将 10.13.34.120:3307 映射到 10.13.34.119:3306 了

第一种:利用iptable

iptables,大家都知道,网络防火墙,就是用于实现Linux下访问控制的东东
先打开IP转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

添加NAT规则,并重启iptables:

service iptables stop
iptables -t nat -A PREROUTING --dst 10.13.34.119 -p tcp --dport 3306 -j DNAT --to-destination 10.13.34.120:3307
iptables -t nat -A POSTROUTING --dst 10.13.34.120 -p tcp --dport 3307 -j SNAT --to-source 10.13.34.119
service iptables save
service iptables start

第二种:使用SSH协议转发

ssh的三个强大的端口转发命令:
- 转发到远端:ssh -C -f -N -g -L 本地端口:目标IP:目标端口 用户名@目标IP
- 转发到本地:ssh -C -f -N -g –R 本地端口:目标IP:目标端口 用户名@目标IP
- ssh -C -f -N -g -D listen_port user@Tunnel_Host

这里我们使用第一种,只需在 10.13.34.120 这个机器执行以下命令:

ssh -C -f -N -g root@10.121.34.119 -L 3307:10.121.34.119:3306

-C :压缩数据传输。
-f :后台认证用户/密码,通常和 -N 连用,不用登录到远程主机。
-N :不执行脚本或命令,通常与 -f 连用。
-g :在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
-L :转发规则,本地端口:目标IP:目标端口

如此,当你使用

mysql -h10.13.34.120 -P3307 -uroot -p123456

时,就会自动转发到 10.121.34.119:3306

vim 多行、批量、列块操作

在windows word中用鼠标拖动,反白显示,表示选中文本块。在vim中也有此功能,可以对块整体操作。

一、可视模式

按v启用可视模式,之后移动光标可以选择。
如:倒流’s Bolg
如果想整行操作,则用大写的V,再移动光标可以按行为单位进行选择。

二、列块操作

在 word中有一个功能,按alt加鼠标拖动,可以拖出矩形块,在vim同样具有此功能。
如:倒流’s Bolg

方法是:
control+v,启用块可视模式,之后移动鼠标,可以选中某一个矩形块,对于有规律的表格可以用这个功能。
目前当前光标所在的位置是右下角,可以在这个块的四角进行移动光标,方法就是按o,O来切换四个顶点。

实例一

把上图中source列,移到open前面
(1)control+v,选中source列
(2)d 剪切列
(3)在open的前面,按p粘贴。
结果如下:倒流’s Bolg

实例二

在选定行的vim行前面加上// ,一般在语言中表示注释
(1)control+v选定列(vim)
(2)按Shift+i 插入 //
(3)按esc
结果如下:倒流’s Bolg

注意:在windows系统中 control+v被系统占用了,所以改为control+q完成相同的功能。

 

秒懂系列|Linux给普通用户添加sudo权限

[shiliang@localhost ~]$ sudo ifup eth0
[sudo] password for shiliang:
shiliang is not in the sudoers file. This incident will be reported.

提示用户 shiliang 不在sudoers文件里.我们要做的就是把 shiliang 添加到sudoers文件里,怎么做呢?

1.进入超级用户模式:

[shiliang@localhost ~]$ su -
Password:

2.添加sudoers文件写权限:

[root@localhost ~]# chmod u+w /etc/sudoers

3.添加 shiliang 到sudoers文件里

[root@localhost ~]# vim /etc/sudoers
root    ALL=(ALL)   ALL
shiliang  ALL=(ALL)   ALL

在 "root ALL=(ALL) ALL" 这行下添加 "shiliang ALL=(ALL) ALL"

4.撤消sudoers写权限. 记得撤消写权限

[root@localhost ~]# chmod u-w /etc/sudoers

通过以下4步,成功将 shiliang 这个用户添加到 sudoers 文件里,当然 shiliang 也获得了sudo权限.

Google 开源了 Material Design 图标,免费下载

Material Design Icons 是 Google Material Design 规范的官方开源图标集,将近 800 个图标。
图标分类涵盖:动作、告警、音频视频、通信、内容、设备、编辑器、文件、硬件、图像、地图、导航、通知、社交等等。

图标格式:

  • SVG 格式,24 像素和 48 像素。
  • SVG 和 CSS sprites
  • 适用于 Web 的 1x, 2x PNG 格式图标 icon
  • 适用于 iOS 的 1x, 2x, 3x PNG 格式图标
  • 所有图标的 Hi-dpi 版本 (hdpi, mdpi, xhdpi, xxhdpi, xxxhdpi) (PNG)

在线查看这些图标:https://material.io/guidelines/style/icons.html
打包下载:https://github.com/google/material-design-icons/releases

大型网站系统架构的演化

一个成熟的大型网站(如淘宝、京东等)的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性,
它总是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式、技术架构、设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线。
所以成熟的系统架构是随业务扩展而完善出来的,并不是一蹴而就;不同业务特征的系统,会有各自的侧重点,
例如淘宝,要解决海量的商品信息的搜索、下单、支付,
例如腾讯,要解决数亿的用户实时消息传输,
例如百度,它要处理海量的搜索请求,他们都有各自的业务特性,系统架构也有所不同。
尽管如此我们也可以从这些不同的网站背景下,找出其中共用的技术,这些技术和手段可以广泛运行在大型网站系统的架构中,下面就通过介绍大型网站系统的演化过程,来认识这些技术和手段。

一、最开始的网站架构

最初的架构,应用程序、数据库、文件都部署在一台服务器上,如图:
云厉的博客

二、应用、数据、文件分离

随着业务的扩展,一台服务器已经不能满足性能需求,故将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。
云厉的博客

三、利用缓存改善网站性能

在硬件优化性能的同时,同时也通过软件进行性能优化,在大部分的网站系统中,都会利用缓存技术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80%的访问请求,最终落在20%的数据上),所以我们可以对热点数据进行缓存,减少这些数据的访问路径,提高用户体验。
云厉的博客

缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理等,这个后面再讲。本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,OSCache就是常用的本地缓存组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。分布式缓存的特点是,可以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。

四、使用集群改善应用服务器性能

应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。
云厉的博客

常用的负载均衡技术硬件的有F5,价格比较贵,软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx是七层负载均衡和HAProxy支持四层、七层负载均衡,可以根据报文内容选择内部服务器,因此LVS分发路径优于Nginx和HAProxy,性能要高些,而Nginx和HAProxy则更具配置性,如可以用来做动静分离(根据请求报文特征,选择静态资源服务器还是应用服务器)。

五、数据库读写分离和分库分表

随着用户量的增加,数据库成为最大的瓶颈,改善数据库性能常用的手段是进行读写分离以及分表,读写分离顾名思义就是将数据库分为读库和写库,通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切换则是对一个数据库特大的表进行拆分,例如用户表。垂直切分则是根据业务不同来切换,如用户业务、商品业务相关的表放在不同的数据库中。
云厉的博客

六、使用CDN和反向代理提高网站性能

假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访问是较慢的,这是由于四川和北京分别属于电信和联通的不同发达地区,北京用户访问需要通过互联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。

而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有没有缓存数据才会继续走应用服务器获取,也减少了获取数据的成本。反向代理有Squid,Nginx。
云厉的博客

七、使用分布式文件系统

用户一天天增加,业务量越来越大,产生的文件越来越多,单台的文件服务器已经不能满足需求。需要分布式的文件系统支撑。常用的分布式文件系统有NFS。
云厉的博客

八、使用NoSql和搜索引擎

对于海量数据的查询,我们使用nosql数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NOSQL有mongodb和redis,搜索引擎有lucene。
云厉的博客

九、将应用服务器进行业务拆分

随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信或者同享数据库来实现。
云厉的博客

十、搭建分布式服务

这时我们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服务、安全服务,这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务框架搭建分布式服务。淘宝的Dubbo是一个不错的选择。
云厉的博客

文章来源:http://www.cnblogs.com/leefreeman/p/3993449.html

ubuntu中Libreoffice汉化方法

libreoffice是一个跨平台的office办公软件,功能强大,文档格式类型兼容Microsoft Office办公套件,通过在ubuntu,xubuntu软件中心安装之后都是英文版本的,如何汉化,能够更加方便的使用呢?

方法很简单,只要安装了两个语言包即可:

libreoffice-l10n-zh-cn
libreoffice-help-zh-cn

直接在软件中心搜索并安装

倒流’s Bolg

微信公众号:程序员到架构师

最新文章

Return Top