10月份的TechClub活动上,我分享了一个话题,时间过去很久了,现在抽空放出来和大家分享。
TechClub的活动正在吸引着越来越多的朋友参与,这是一个公益活动,希望能有更多的朋友能到这个平台上分享自己的经验。
再奉上一张活动现场照片:

生产环境跑的Linux服务器,默认的一些参数有时候需要调整,以下是个小总结,大部分内容来源自网络上别人的经验。
首先,调整网络方面的参数:
[root@banping conf]# vi /etc/sysctl.conf# add by banping net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 2097152 3145728 4194304 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 1024 65535
查看网络连接状态:
[root@banping ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV 3
CLOSE_WAIT 40
ESTABLISHED 73
FIN_WAIT1 6
FIN_WAIT2 2
TIME_WAIT 900
在OS级别设置打开文件的最大数目:
[root@banping conf]# vi /etc/security/limits.conf #add by banping * soft nofile 65536 * hard nofile 65536
设置单个进程能打开的句柄数:
[root@rtweb conf]# vi /etc/profile# add by banping ulimit -SHn 65536
查看每个进程打开的句柄数:
[root@banping ~]# lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
164 4522
163 19230
125 25142
......
前面是打开的句柄数,后面是进程ID,可以据此判断是什么进程。
最近弄了一台阿里云服务器,安装的是RedHat5.4 64位的系统。有点奇怪的是阿里云只提供CentOS 32位的系统,RH才有64位的。但是在使用yum的过程中报错:
[root@banping mysql-5.5.10]# yum install libaio-devel
Loaded plugins: rhnplugin, security
This system is not registered with RHN.
RHN support will be disabled.
Setting up Install Process
No package libaio-devel available.
Nothing to do
意思是这套RH没有在官网上注册,不能下载RH的软件包。后来我把yum替换成了CentOS的版本,过程如下:
首先看看有哪些yum包,然后卸载掉:
[root@banping mysql-5.5.10]# rpm -qa|grep yum
yum-rhn-plugin-0.5.4-13.el5
yum-3.2.22-20.el5
yum-metadata-parser-1.1.2-3.el5
yum-security-1.1.16-13.el5
yum-updatesd-0.9-2.el5
卸载要使用nodeps参数,否则由于依赖关系是无法卸载成功的:
rpm -e --nodeps yum-rhn-plugin-0.5.4-13.el5
......
然后可以从163的镜像下载CentOS的yum包:
[root@banping centos]# wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-3.2.22-37.el5.centos.noarch.rpm
[root@banping centos]# wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-16.el5.centos.noarch.rpm
[root@banping centos]# wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
安装新下载的包:
[root@banping centos]# rpm -ivh yum-*
找一个CentOS的包资源配置库,名为CentOS-Base.repo,放到/etc/yum.repos.d/路径:
wget http://www.linuxidc.com/files/2011/05/06/CentOS-Base.repo
生成缓存文件到/var/cache/yum路径:
[root@banping yum.repos.d]# yum makecache
这样就可以使用CentOS的yum了。
要在一台Linux上ssh到另外一台Linux服务器,而不需要每次都输入密码,其实很简单。比如要从A服务器登录到B服务器,那么首先在A服务器上生成公钥和私钥,用RSA加密算法:
[root@test awstats]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 9c:74:d0:05:48:c8:43:84:a8:44:8f:b6:a1:2f:8c:91 root@test.banping.com[root@test awstats]# cd /root/.ssh/ [root@test .ssh]# ll -rw------- 1 root root 1675 10-12 10:15 id_rsa -rw-r--r-- 1 root root 397 10-12 10:15 id_rsa.pub -rw-r--r-- 1 root root 1972 08-15 19:50 known_hosts
可见这里的id_rsa和id_rsa.pub就是私钥和公钥了,把公钥的内容放到B服务器的指定位置就可以了。
放到哪里呢?对应登录用户的home的.ssh目录下,文件名一般为authorized_keys,其实这个名字是任意的,是写在sshd_config文件里的:
[root@web-04 .ssh]# cd /etc/ssh
[root@web-04 ssh]# vi sshd_config
AuthorizedKeysFile .ssh/authorized_keys
这个authorized_keys文件可以放置多个其他服务器的公钥,如果你想让多台服务器都能无需输入密码就登录上来,把它们的公钥放这里就行了。不过安全第一,切不可为了省事而忽略了安全的问题。
引言
本篇要评测的NoSQL产品是Redis,可以把它的功能理解为一个Key-Value的数据结构操作,数据都保存在内存中定期刷新到磁盘,以极高的读写效率而备受关注。国内的新浪微博就大规模的使用了Redis来存储用户关系和计数。
介绍
按照官方的说法,Redis是用ANSI C开发的,能运行在大多数POSIX(Linux, *BSD, OS X 和Solaris等)系统上,官方没有支持Windows的版本。目前最新的版本是2.2.11,这个版本主要是修复了一个2.2.7版本中遍历方式优化带来的一个bug。
和普通的Key-Value结构不同,Redis的Key支持灵活的数据结构,除了strings,还有hashes、lists、 sets 和sorted sets等结构。正是这些灵活的数据结构,丰富了Redis的应用场景,能满足更多业务上的灵活存储需求。
Redis的数据都保存在内存中,而且底层实现上是自己写了epoll event loop部分,而没有采用开源的libevent等通用框架,所以读写效率很高。为了实现数据的持久化,Redis支持定期刷新(可通过配置实现)或写日志的方式来保存数据到磁盘。
安装和使用
由于没有第三方的包依赖关系,Redis的安装十分简单:
$ wget http://redis.googlecode.com/files/redis-2.2.11.tar.gz
$ tar xzf redis-2.2.11.tar.gz
$ cd redis-2.2.11
$ make
这样就安装完毕了,执行src目录下的redis-server可以启动Redis进程,不过最好先配置一下redis.conf文件,常用的几个要注意的参数如下:
daemonize yes
指定Redis以守护进程的方式运行。
pidfile /home/banping/redis/redis.pid
当Redis以守护进程方式运行时,把pid写入指定的文件。
port 6379
指定监听端口,默认端口为6379。
bind 192.168.0.35
绑定的主机IP地址。
logfile stdout
指定日志的记录方式,默认为标准输出。
databases 16
设置数据库的数量。
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改的时候,同步数据到磁盘文件。
rdbcompression yes
指定存储至本地数据库时是否压缩数据,默认为yes。
dbfilename dump.rdb
指定本地数据库文件名。
dir /home/banping/redis/data
指定本地数据库存放目录。
requirepass foobared
设置Redis连接密码,默认关闭。
maxclients 128
设置最大客户端连接数,默认无限制。
maxmemory <bytes>
指定Redis能使用的最大内存。
其他更详细的参数说明请参见官方文档。修改完配置文件后,我们可以用指定的配置文件启动Redis服务:
[root@localhost redis-2.2.10]# src/redis-server /home/banping/redis/redis-2.2.11/redis.conf
这样一个redis服务进程就启动了,它监听6379端口来提供服务。
测试说明
一、测试环境
Redis部署在一台PC 服务器上,配置如下:
CPU为Xeon 2.80GHz *4
内存为4G
硬盘为一块400G SATA盘
操作系统为64位CentOS 5.3版本
二、测试方法
这里仍然采用PHP客户端进行测试,Redis官方推荐了两个PHP客户端,一个是PHP程序包Predis,另一个是C开发的扩展包phpredis,我们这里采用后者,网址为https://github.com/nicolasff/phpredis ,可以编译到PHP运行环境中来使用。
为了不对测试服务器产生额外的影响,测试客户端部署在另外一台独立的服务器上,运行的PHP的版本是5.3.5,web server是Nginx 0.8.54,通过fastcgi的方式调用PHP服务。使用apache ab工具实现多个请求和并发操作。
测试过程中就使用上文提到的已经启动的Redis服务,首先是进行写操作,通过500个请求,每个请求写入10000条记录,并发度为2来共写入500万条数据,key为数字1到5000000,value大小为100个字节。然后是读操作,也是用500个请求,每个请求随机根据key值读出10000条记录,并发度为10共读出500万条记录,评测的重点是写入和读出数据的时间,以及在此过程中服务器的资源使用情况。
测试结果及总结
一、写操作
成功写入500万条记录,共耗时524秒,平均每秒写入数据9542笔。磁盘上的数据文件大小134M。写入过程中,服务器内存、CPU和磁盘等资源使用情况如下图所示:
可见,内存使用平稳上升,最后占用140M左右,主要用来缓存数据,对比数据文件的大小可以设想,在操作系统内存可用的情况下,内存的分配和数据文件的大小是大致相当的。内存占用会有临时的超过实际占用的几个点,而且会马上释放掉,CPU和磁盘IO都表现出周期性的上下波动,估计这些和Redis刷新数据到磁盘的实现机制有关,在高点的时候正好是数据写入磁盘的过程。总体来说占用资源很少,表现也很平稳。
二、读操作
成功读出500万条记录,共耗时184秒,平均每秒读出数据27174笔。
读数据过程中没有发生磁盘IO。CPU有所消耗,Idle值稳定在77左右,等待CPU资源的进程一直是1个。内存表现平稳没有波动。
通过以上测试结果可以看出,Redis数据操作都在内存完成,定期刷新到磁盘,占用的磁盘空间和内存大小由实际的数据量决定,在内存可用的情况下二者是一致的。从功能角度看Redis高效的读写效率和丰富的数据结构能满足很多互联网应用场景的需求,而且在高负载的情况下,数据内存化是趋势,总体来说Redis虽然还在不断发展之中,代码量也不多,但是一个轻量级的很有潜力的NoSQL产品,肯定会有越来越多的成功案例。
注:本文首发在IT168网站,版权所有,转载请注明出处。
技术组织
最近评论
历史归档
广告位





