- Nginx Lua开发实战
- 李明江
- 15890字
- 2025-02-21 17:59:05
第2章 数据库的基本操作
Nginx应用系统通过以Nginx为核心,合理搭配Redis、Memcached、MySQL、Postgre-SQL、MongoDB等服务器,可起到数据内存缓存、内存数据库、关系型数据库、NoSQL数据库等作用。互联网系统上有各种关系型数据需要存储,需要用到关系型数据库。互联网要应对大量的高并发请求,就需要高速处理HTTP请求,需要用到各种数据缓存、页面缓存、操作缓存等。同时互联网上有大量的结构化非关系型数据要存储,还有各类音/视频、图片要缓存,需要用到各类内存型数据库、NoSQL数据库等,以形成完整的应用。所以本章将从这些数据库、缓存产品的作用、特点、安装方法、常用命令及配置文件解析展开。
2.1 Nginx应用中的数据库
在互联网公司,Nginx基本是标配组件,主要场景是负载均衡、反向代理、代理缓存、限流等场景,而把Nginx作为一个Web容器使用还不是那么广泛。但是因为Nginx的二次开发性非常好,所以很多公司会以Nginx为核心开发业务系统,在系统中容纳各种服务和组件,组成一个开放的、易于扩展的系统,以实现高容量和分布式的架构。
通常,互联网上的系统是分布式、集群式,由若干功能相同的服务器组成集群,以响应大并发请求。分布式系统提供并行处理能力和内存型数据缓存或存储功能。目前流行的架构是Hadoop, Map-Reduce式的并行处理架构提供了并行处理能力,一个任务被分解成多个Map处理任务,同时被多个系统或主机处理,结果经Reduce转换成用户响应。分布式存储也是类似的机制,互联网上的数据大量被存储在廉价主机的内存中,在根服务的调度下响应用户请求。这就需要用到各种关系型数据库存储关系型数据,用到内存缓存以缓存图片、音频、视频等数据,用到内存数据库以缓存和存储各种NoSQL和SQL数据。不同的应用使用不同的数据组件,以形成需要的应用功能。
一个常见的Nginx应用如图2-1所示。一个典型的应用可以使用Nginx作为负载均衡器或其他负载均衡器,将请求按负载均衡算法调度到后端的Nginx应用服务器上。Nginx使用Redis作为数据缓存,使用Memcached作为文件缓存,使用MongoDB持久化NoSQL数据,使用MySQL集群作为关系型数据库。Nginx还可以给其他类似Java或PHP服务做反向代理服务器或CGI缓存数据库。

图2-1 Nginx应用
以Nginx+Lua为核心的架构,可以使用Lua语言作为“胶水”,“黏合”各种流行数据库组件,在Lua的表达能力下形成各种复杂的应用。本章分别介绍常用的各种数据组件的主要特点、安装、部署和常用操作,以方便学习和使用这些组件,运营级的安装和配置请自行深入研究。根据尽量保证研发和使用一致性的原则,本文只介绍Linux下各组件的安装和使用方法,因为主流的系统都是基于Linux开发的。
各数据组件都有其定位和应用场景,理解各组件、合理地应用组件可以大大降低开发工作的难度,并实现大型的应用和系统。
● MySQL是关系型数据库,用于存储关系型数据。MySQL支持读写分区,可以通过代理分离读和写操作,实现高性能。在读写分离的机制下,一个MySQL簇由代理服务器、主服务器和从服务器构成。主服务器负责写入,多实例的从服务器负责读响应,主、从服务器之间通过数据同步/异步地写入数据。各服务器可以动态扩展以增容,自然地实现了备份。通过合理的配置,可以实现相当量级的并发访问。MySQL在大型互联网系统中得到广泛使用。基于读写分区的簇,在业务上再进行垂直分区,则可实现大型、超大型系统。在簇内还有分库、分表等技术,这些技术可以实现库内的大型数据存储。
● Redis是一个流行的内存数据库,与Memcached相似,但支持将内存的数据持久化到本地文件中,而且支持更多的数据种类,不仅仅支持简单的key/value类型的数据,同时支持list、set、hash等数据结构的存储。内存数据库解决了互联网上大并发和高速访问的问题。数据存放在内存中读写比从磁盘中读写速度快两个数量级。通常,在互联网系统中会将Redies/Memcached与MySQL/PostgreSQL组合使用,解决高速访问和数据持久化的问题。
● PostgreSQL是对象关系型数据库,支持大部分SQL标准,并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。PostgreSQL可以用许多方法扩展,例如,通过增加新的数据类型、函数、操作符、聚集函数、索引。PostgreSQL是支持数据种类最多的数据库,支持的接口也最丰富。PostgreSQL在数据库总的市场上占有的份额还不大,但上升很快。现在的云主机厂商越来越多地提供PostgreSQL数据库。
● Memcached是一个内存型数据库,用在动态Web应用上以减轻数据库负载。通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高访问速度。Memcached基于一个存储key/value对的HashMap。Memcached和Redis的应用场景很相似,区别是:①Redis支持更多的数据种类;②Redis支持主从数据备份;③Redis支持数据持久化。两种内存型数据库的性能都非常优秀。目前Redis应用在数据量较小的应用上,性能更优。Memcached用在动态系统中,如文件、图片缓存场景,可以减少数据库负载、提升性能。
● MongoDB是一个分布式NoSQL数据库,处理NoSQL非关系型数据存储。它的数据非常松散,面向集合及易存储对象类型数据存储,支持大型对象(如视频)的存储。MongoDB支持集合存储,数据被分组存储在数据集中,每个数据集在数据库中都有一个唯一的标识名,类似于key/value的模式。目前MongoDB的典型应用如:①网站实时数据处理,处理实时的插入、更新、查询,支持实时数据的复制和高伸缩性;②用于系统数据缓存,由它搭建的持久化缓存层可以避免下层数据源过载;③用于高伸缩场景。MongoDB非常适合数十或数百台服务器组成的数据库。其缺点是不支持级联的跨文档查询。
2.2 MySQL关系型数据库
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统,在Web应用方面是最好的RDBMS(Relational Database Management System,关系型数据库管理系统)应用软件之一。全球主流的互联网公司的系统基本上都使用MySQL数据库,可以看出其强大的功能和强劲的性能。MySQL 5.7现在已经可以轻松达到50万QPS(Queries Per Second,每秒查询率)的性能,并支持NoSQL接口,通过NoSQL接口可以达到100万QPS。
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的SQL语言是用于访问数据库最常用的标准化语言。MySQL软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境。
与其他的大型数据库(如Oracle、DB2、SQL Server等)相比,MySQL自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
Linux(作为操作系统)、Apache或Nginx(作为Web服务器)、MySQL(作为数据库)、PHP/Perl/Python(作为服务器端脚本解释器)这4种软件都是免费或开源软件(Free/Libre and Open Source Software, FLOSS),因此使用这4种软件不用花一分钱(除开人工成本)就可以建立一个稳定、免费的网站系统,被业界称为LAMP或LNMP组合。
MySQL支持单、复制、集群模式,分别适合小规模应用、中小规模应用和大规模应用,其应用场景非常广泛,在互联网系统中得到大量使用。基于Nginx的系统也遵循这样的原则和架构,可以组成低成本的系统。
MySQL用于存储关系型数据,和Redis、Memcached、MongoDB等组成高并发、分布式的大型系统。互联网的特点是使用不同特点的产品解决不同问题,对外提供高速响应、大并发的系统,所以合理地使用各种系统是最主要的方面。想要利用每种系统的特点而规避其缺点考验的是对技术和系统的熟练掌握与总体架构能力。
注意:关系型数据指的是二维表及其之间联系的一种数据类型,关系操作主要为查询、选择、投影、连接、并、交、差,以及增加、删除、修改、查询等普通操作。
非关系型数据及数据库指的是数据之间没有明确的范围和定义,不需要预定义表结构、模式。数据主要是key/value模式,数据模型简单,支持key/value数据、列簇存储的数据、key/value结构的文档数据以及图结构等。非关系型NoSQL数据库对数据一致性要求不高,但灵活性好,性能好。
所以对于数据的选择和使用,是基于对数据的分析和建模区分的。例如,用户的个人信息等就是结构化数据,一般使用MySQL存储。而网页检索记录、用户操作记录等信息就是NoSQL数据,一般使用NoSQL数据存储和查询更合适。通常中大型系统中的数据都是区别对待的。
2.2.1 yum安装方法
安装MySQL有两种方法:一种是通过源码自行编译安装,这种方式适合高级用户定制MySQL特性,这里不做说明;另一种是通过编译过的二进制文件进行安装。二进制文件安装的方法又分为两种:一种是不针对特定平台的通用安装方法,使用的二进制文件是扩展名为.tar.gz的压缩文件;另一种是使用RPM或其他包进行安装,这种安装进程会自动完成系统相关配置,所以比较方便。
MySQL运行需要很多依赖库,在安装过程中需要检查并逐一首先安装各种依赖库,过程比较复杂,所以在服务器联网的情况下,推荐使用yum安装。yum基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。利用yum,这些检查和依赖库安装都会自动完成。只有当服务器不可访问时才使用手工安装。
本文重点不是MySQL的安装和管理,所以只介绍yum安装方法,其他安装方法如有需要,请读者自行了解。
注意:yum是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须烦琐地一次次下载、安装。
可供yum下载的软件包包括Fedora本身的软件包以及源自RPM Fusion和RPM的FedoraExtras,全部是由Linux社区维护的,并且基本是自由软件。所有的包都有一个独立的GPG签名,主要是为了系统安全。而对于Fedora Core 4.0的用户,RPM的签名是自动导入并安装的。
yum在CentOS上是默认安装的。例如,使用下面的yum命令可列出可安装的MySQL库:
yum list installed | grep mysql
1.确认是否已经安装MySQL
查看自带MySQL是否已安装。不同的CentOS安装模式可能已经安装了集成的MySQL,使用下面命令检查其是否存在,如果存在则直接使用。
yum list installed | grep mysql
2.卸载自带MySQL
若有自带安装的MySQL,需要卸载CentOS系统自带MySQL数据库,使用下面命令卸载:
yum -y remove mysql-libs.x86_64
若有多个依赖文件,则依次卸载。
3.查看yum库上的MySQL版本信息
需要查看yum库上的MySQL版本信息时,使用命令:
yum list | grep mysql
或
yum -y list mysql*
4.使用yum安装MySQL数据库
当环境已经检查好,可以安装新的MySQL时,使用命令:
yum -y install mysql-server mysql mysql-devel
上面命令将mysql-server、mysql、mysql-devel都安装好,当结果显示为“Complete! ”时,即安装完毕。
注意:安装mysql只是安装了数据库,只有安装mysql-server才相当于安装了客户端。
5.查看MySQL数据库版本信息
查看新安装MySQL数据库版本信息时使用命令:
rpm -qi mysql-server
注意:使用root安装MySQL。
安装完成后,安装进程会在Linux中添加一个mysql组,以及属于mysql组的用户mysql。可通过id命令查看:
id mysql uid=496(mysql)gid=493(mysql) groups=493(mysql)
MySQL服务器安装之后虽然配置了相关文件,但并没有自动启动mysqld服务,需要自行启动:
service mysqld start Starting MySQL.. SUCCESS!
可以通过检查端口是否开启查看MySQL是否正常启动:
netstat -anp|grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 34693/mysqld
2.2.2 使用mysql测试服务
运行客户端程序mysql,在mysql/bin目录中,测试能否连接到mysqld。如果安装成功则应该可以运行mysql命令。注意,mysqld服务必须已经开启。
mysql Welcome to the MySQLmonitor. Commands end with ; or \g. Your MySQL connection idis 1 Server version: 5.7.16MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademarkof Oracle Corporation and/or its affiliates.Other names may be trademarks oftheir respective owners. Type 'help; ' or '\h' forhelp.Type '\c' to clear the current input statement. mysql>
对于yum安装,安装程序已经把可执行程序放到系统程序目录里,不需要修改环境变量,可以直接使用。
2.2.3 MySQL文件分布
以yum方式安装后的MySQL文件分布如表2-1所示。
表2-1 MySQL文件分布

2.2.4 数据库操作
除去安装部分提到的mysql命令行工具,推荐在Windows上使用Navicat工具进行可视化管理和调试。方便的工具可以提高工作效率。这里简单介绍一下Navicat工具。
Navicat是一个图形化的工具,下载并安装Navicat,运行后主界面如图2-2所示。

图2-2 Navicat运行主界面
首先需要创建一个连接,单击“连接”按钮,弹出选择数据库类型菜单,如图2-3所示。

图2-3 选择数据库类型
这里有5种常用数据库,在这里我们选择MySQL,然后弹出数据库连接信息配置界面,如图2-4所示。

图2-4 数据库连接信息配置界面
根据数据库配置信息,输入连接名、地址、端口(一般是默认端口)、用户名、密码,就可以连接数据库了。如果要检测数据是否正确,可以使用“连接测试”功能进行测试。
设置完成后,左侧列表将列出已经配置的数据库,双击即可连接到数据库,如图2-5所示。

图2-5 已经配置的数据库
对应连接上的所有数据库都会列出来,然后我们可以在上面执行各种操作。例如,新的数据库实现是空的,可以通过执行SQL脚本建立数据库,或使用图形化的界面手工建立数据库。例如,我们使用testserver库,单击testserver后,Navicat将列出这个库中的资源,如图2-6所示。

图2-6 testserver库资源
因为操作是全图形化的,所以具体的操作是比较容易理解和学习的,请读者自行研究。
2.3 Redis内存数据库
Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
与其他key-value缓存产品对比,Redis有以下3个特点:
● Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
● Redis不仅仅支持简单的key-value类型数据,同时提供list、set、zset、hash等数据结构的存储。
● Redis支持数据备份,即master-slave模式的数据备份。
Redis优势比较多:
● 性能极高:读速度是110000次/s,写速度是81000次/s。
● 丰富的数据类型:支持strings、lists、hashes、sets及ordered sets数据类型。
● 原子:Redis操作都是原子操作,还支持全并发原子操作。
● 丰富的特性:支持publish/subscribe、通知、key过期等特性。
● 持久化:支持以RDB和AOF方式将数据持久化到文件中。
● 数据复制:Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构。
Redis有着更复杂的数据结构并且提供原子操作,不同于其他数据库,Redis的数据类型都是基于基本数据结构的,无须进行额外的抽象。
Redis运行在内存中并且可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。Redis在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面,Redis是紧凑的以追加方式产生的,它并不需要进行随机访问,所以性能相对比较好。
2.3.1 Redis安装
Redis的下载地址为http://redis.io/download,从这里可以下载最新文档版本。
本书使用的最新文档版本为3.2.6,下载并安装,命令如下。
wget http://download.redis.io/releases/redis-3.2.6.tar.gz tar xzf redis-3.2.6.tar.gz cd redis-3.2.6 make
安装完Redis后redis-3.2.6目录下会出现编译后的Redis服务程序redis-serve,还有用于测试的客户端程序redis-cli,两个程序位于源码目录src下。
2.3.2 启动Redis服务
默认启动Redis服务的命令如下:
cd src ./redis-server
注意,以这种方式启动Redis使用的是默认配置。也可以通过启动参数告诉Redis使用指定配置文件,使用下面命令启动:
cd src ./redis-server redis.conf
redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。redis.conf的配置参数和选项直接注释在redis.conf中,需要的时候直接查看注释,然后配置相关选项就可以使用了。
启动Redis服务进程后,就可以使用测试客户端程序redis-cli和redis-server交互。例如:
cd src ./redis-cli redis>set foo bar OK redis>get foo "bar"
如果需要在远程Redis服务上执行命令,使用的也是redis-cli命令。
语法如下:
redis-cli -h host -p port -a password
下面实例演示了如何连接到主机为127.0.0.1、端口为6379、密码为mypass的Redis服务上。
redis-cli -h 127.0.0.1-p 6379-a "mypass" redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING PONG
2.3.3 Redis配置
Redis的配置文件位于Redis安装目录下,文件名为redis.conf。可以通过CONFIG命令查看配置项或设置配置项。
Redis CONFIG命令格式如下:
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
示例:
redis 127.0.0.1:6379> CONFIG GET loglevel 1)"loglevel" 2)"notice"
可以使用*号获取所有配置项:
redis 127.0.0.1:6379> CONFIG GET * 1)"dbfilename" 2)"dump.rdb" 3)"requirepass" 4)"" 5)"masterauth" 6)"" 7)"unixsocket" 8)"" 9)"logfile" 10)"" 11)"pidfile" 12)"" 13)"slave-announce-ip" 14)"" 15)"maxmemory" 16)"0" 17)"maxmemory-samples" 18)"5" 19)"timeout" 20)"0" 21)"auto-aof-rewrite-percentage" 22)"100" 23)"auto-aof-rewrite-min-size" 24)"67108864" 25)"hash-max-ziplist-entries" 26)"512" 27)"hash-max-ziplist-value" 28)"64" 29)"list-max-ziplist-size" 30)"-2" 31)"list-compress-depth" 32)"0" 33)"set-max-intset-entries" 34)"512" 35)"zset-max-ziplist-entries" 36)"128" 37)"zset-max-ziplist-value" 38)"64" 39)"hll-sparse-max-bytes" 40)"3000" 41)"lua-time-limit" 42)"5000" 43)"slowlog-log-slower-than" 44)"10000" 45)"latency-monitor-threshold" 46)"0" 47)"slowlog-max-len" 48)"128" 49)"port" 50)"6379" 51)"tcp-backlog" 52)"511" 53)"databases" 54)"16" 55)"repl-ping-slave-period" 56)"10" 57)"repl-timeout" 58)"60" 59)"repl-backlog-size" 60)"1048576" 61)"repl-backlog-ttl" 62)"3600" 63)"maxclients" 64)"10000" 65)"watchdog-period" 66)"0" 67)"slave-priority" 68)"100" 69)"slave-announce-port" 70)"0" 71)"min-slaves-to-write" 72)"0" 73)"min-slaves-max-lag" 74)"10" 75)"hz" 76)"10" 77) "cluster-node-timeout" 78)"15000" 79)"cluster-migration-barrier" 80)"1" 81)"cluster-slave-validity-factor" 82)"10" 83)"repl-diskless-sync-delay" 84)"5" 85)"tcp-keepalive" 86)"300" 87)"cluster-require-full-coverage" 88)"yes" 89)"no-appendfsync-on-rewrite" 90)"no" 91)"slave-serve-stale-data" 92)"yes" 93)"slave-read-only" 94)"yes" 95)"stop-writes-on-bgsave-error" 96)"yes" 97)"daemonize" 98)"no" 99)"rdbcompression" 100)"yes" 101)"rdbchecksum" 102)"yes" 103)"activerehashing" 104)"yes" 105)"protected-mode" 106)"yes" 107)"repl-disable-tcp-nodelay" 108)"no" 109)"repl-diskless-sync" 110)"no" 111)"aof-rewrite-incremental-fsync" 112)"yes" 113)"aof-load-truncated" 114)"yes" 115)"maxmemory-policy" 116)"noeviction" 117)"loglevel" 118)"notice" 119)"supervised" 120)"no" 121)"appendfsync" 122)"everysec" 123)"syslog-facility" 124)"local0" 125)"appendonly" 126)"no" 127)"dir" 128)"/root/redis-3.2.6/src" 129)"save" 130)"3600 1300 100 6010000" 131)"client-output-buffer-limit" 132)"normal 0 0 0 slave 26843545667108864 60 pubsub 335544328388608 60" 133)"unixsocketperm" 134)"0" 135)"slaveof" 136)"" 137)"notify-keyspace-events" 138)"" 139)"bind" 140)""
2.3.4 参数说明
Redis配置除了通过命令配置外,还可以通过直接编译redis.conf进行修改。默认的redis.conf对每一个配置项提供了详细的英文说明,需要使用的时候参照说明进行配置即可,本节主要介绍常用的配置项,方便学习时使用。
(1)daemonize no
Redis默认不以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程(daemonize yes)。
(2)pidfile /var/run/redis.pid
当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定。
(3)port 6379
该配置项用于指定Redis监听端口,默认端口为6379。
(4)bind 127.0.0.1
该配置项用于绑定主机地址。
(5)timeout 300
该配置项用于指定当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能。
(6)loglevel verbose
该配置项用于指定日志记录级别,Redis支持4个级别:debug、verbose、notice、warning,默认为verbose。
(7)logfile stdout
该配置项用于指定日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null。
(8)databases 16
该配置项用于设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库ID。
(9)save<seconds><changes>
该配置项用于指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合。
Redis默认配置文件中提供了3个条件:
save 900 1 save 300 10 save 6010000
这3个条件分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改,以及60秒内有10000个更改。
(10)rdbcompression yes
该配置项用于指定存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变得巨大。
(11)dbfilename dump.rdb
该配置项用于指定本地数据库文件名,默认值为dump.rdb。
(12)dir ./
该配置项用于指定本地数据库存放目录。
(13)slaveof<masterip><masterport>
该配置项用于当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步。
(14)masterauth<master-password>
当master服务设置了密码保护时,slave服务连接master的密码。
(15)requirepass foobared
该配置项用于设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭。
(16)maxclients 128
该配置项用于设置同一时间最大客户端连接数,默认无限制。Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数量,如果设置maxclients 0,表示不限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息。
(17)maxmemory<bytes>
该配置项用于指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的key,若当此方法处理后仍然到达最大内存设置,则将无法再进行写入操作,但仍然可以进行读取操作。Redis新的VM机制会把key存放在内存,value存放在swap区。
(18)appendonly no
该配置项用于指定是否在每次更新操作后进行日志记录,在默认情况下,Redis异步地把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为Redis本身同步数据文件是按save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。
(19)appendfilename appendonly.aof
该配置项用于指定更新日志文件名,默认为appendonly.aof。
(20)appendfsync everysec
该配置项用于指定更新日志条件,共有3个可选值。
1)no:表示等操作系统进行数据缓存同步到磁盘(快)。
2)always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)。
3)everysec:表示每秒同步一次(折中,默认值)。
(21)vm-enabled no
该配置项用于指定是否启用虚拟内存机制,默认值为no。简单地介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据存放到磁盘上,访问多的页面由磁盘自动换出到内存中。
(22)vm-swap-file /tmp/redis.swap
该配置项用于指定虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享。
(23)vm-max-memory 0
将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0时,其实是所有value都存在于磁盘中。默认值为0。
(24)vm-page-size 32
Redis swap文件分成了很多的page,一个对象可以保存在多个page中,但一个page不能被多个对象共享,vm-page-size是要根据存储的数据大小来设定的:如果存储很多小对象,page大小最好设置为32B或者64B;如果存储很大对象,则可以使用更大的page,如果不确定,就使用默认值。
(25)vm-pages 134217728
该配置项用于设置swap文件中的page数量,由于page表(一种表示页面空闲或使用的bitmap)是放在内存中的,在磁盘上每8个pages将消耗1B的内存。
(26)vm-max-threads 4
该配置项用于设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4。
(27)glueoutputbuf yes
该配置项用于设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启。
(28)hash-max-zipmap-entries 64、hash-max-zipmap-value 512
该配置项用于指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法。
(29)activerehashing yes
该配置项用于指定是否激活重置哈希,默认为开启。
(30)include /path/to/local.conf
该配置项用于指定包含其他的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而各个实例又同时拥有自己特定的配置文件。
2.3.5 数据类型
Redis支持5种数据类型:string(字符串)、hash(哈希)、lis(t列表)、se(t集合)及zse(t sorted set,有序集合)。
1. string(字符串)
string是Redis最基本的数据类型,可以理解成与memcached一样的类型,一个key对应一个value,一个key的最大存储容量为512MB。string类型是二进制安全的,即Redis的string可以包含任何数据。如JPG图片或者序列化的对象。
例如:
redis 127.0.0.1:6379> SET name "test" OK redis 127.0.0.1:6379> GET name"test"
在以上实例中,我们使用了Redis的SET和GET命令,键(key)为name,对应的值(value)为test。
2. hash(哈希)
Redis hash是一个key-value对集合。Redis hash是一个string类型的field和value的映射表,特别适合用于存储对象。
例如:
127.0.0.1:6379> HMSET user:1 username test password test points 200 OK 127.0.0.1:6379>HGETALL user:1 1)"username" 2)"test" 3)"password" 4)"test" 5)"points" 6)"200" 127.0.0.1:6379〉
以上实例中,hash数据类型存储了包含用户脚本信息的用户对象。实例使用了Redis HMSET、HGETALL命令,user:1为key值。
每个hash可以存储232-1个key-value对(40多亿)。
3. list(列表)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
例如:
redis 127.0.0.1:6379> lpush test redis(integer)1 redis 127.0.0.1:6379> lpush test mongodb(integer)2 redis 127.0.0.1:6379> lpush test rabitmq(integer)3 redis 127.0.0.1:6379> lrange test 0 10 1)"rabitmq" 2)"mongodb" 3)"redis" redis 127.0.0.1:6379>lrange test 5 10 (empty list or set)
列表最多可存储232-1个元素(40多亿)。
4. set(集合)
Redis的set是string类型的无序集合。集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。sadd命令用于添加一个string元素到key对应的set集合中,成功则返回1,如果元素已经在集合中则返回0, key对应的set不存在则返回错误。
例如:
redis 127.0.0.1:6379> sadd test redis(integer)1 redis 127.0.0.1:6379> sadd test mongodb(integer)1 redis 127.0.0.1:6379> sadd test rabitmq(integer)1 redis 127.0.0.1:6379> sadd test rabitmq(integer)0 redis 127.0.0.1:6379> smembers test 1)"rabitmq(integer)1" 2)"mongodb(integer)1" 3)"redis(integer)1"
注意:在以上实例中,rabitmq添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为232-1(40多亿)。
5. zset(有序集合)
Redis zset也是string类型元素的集合,且不允许重复的成员。不同的是,zset的每个元素都会关联一个double类型的分数。Redis正是通过分数为集合中的成员进行从小到大排序的。zset的成员是唯一的,但分数(score)可以重复。
例如:
redis 127.0.0.1:6379> zadd test 0 redis(integer)1 redis 127.0.0.1:6379> zadd test 0 mongodb(integer)1 redis 127.0.0.1:6379> zadd test 0 rabitmq(integer)1 redis 127.0.0.1:6379> zadd test 0 rabitmq(integer)0 redis 127.0.0.1:6379> ZRANGEBYSCORE test 01000 1)"mongodb(integer)1" 2)"rabitmq(integer)0" 3)"rabitmq(integer)1" 4) "redis(integer)1"
2.4 PostgreSQL关系型数据库
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES(现在已经更名为PostgreSQL)4.2版本为基础开发的对象关系型数据库管理系统(ORDBMS)。它是一个自由的对象关系型数据库服务器(数据库管理系统),在灵活的BSD风格许可证下发行。PostgreSQL提供了相对其他开源数据库系统(如MySQL和Firebird)和专有系统(如Oracle、Sybase、DB2和Microsoft SQL Server)之外的另一种选择。
PostgreSQL支持大部分SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL可以用许多方法扩展,例如,增加新的数据类型、函数、操作符、聚集函数、索引。PostgreSQL的特性覆盖了SQL-2/SQL-92和SQL-3/SQL-99,首先,它包括了目前世界上最丰富的数据类型支持。
从技术角度来讲,PostgreSQL采用的是比较经典的C/S(Client/Server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析从客户端发来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端程序编写,由数据库服务器提供统一的客户端C接口。不同的客户端接口都是源自这个C接口,如ODBC、JDBC、Python、Perl、C/C++、ESQL等。PostgreSQL支持的接口非常丰富,几乎支持所有类型数据库客户端接口。
要在CentOS 6.4上使用yum,首先要保证CentOS外网是连通的,如果外网不通,只能使用RPM包或源码的方法安装。本文主要研究在Lua中如何使用PostgreSQL,所以以yum简化安装过程为例。
这里使用PostgreSQL yum repository安装最新版本的PostgreSQL。
1.安装PostgreSQL yum repository
yum默认安装的PostgreSQL是8.X版本的,如果想体验新版本PostgreSQL的性能,需要安装9.X版本,这需要首先安装PostgreSQL yum repository。如果只想调试OpenRestry的PG访问代码,可以跳过本步,直接使用yum安装8.X版本的PG。
使用下面命令安装PostgreSQL yum repository:
yum -i http://download.postgresql.org/pub/repos/yum/9.6/redhat/ rhel-6.4-x86_64/pgdg-redhat96-9.6-3.noarch.rpm
只要命令正确,就可以看到安装成功。如果要使用最新版本的PG,可以在http://yum.postgresql.org上查找到对应RPM包的连接,然后执行rpm -i uri命令。
2.安装PostgreSQL
使用下面命令安装新版本PG:
yum install postgresql92-server postgresql92-contrib
如果没有安装PostgreSQL yum repository,使用下面的命令安装8.X版本:
yum install postgresql*-server postgresql*-contrib
3.查看安装
使用rpm命令查看是否安装成功:
rpm -qa | grep postgresql
如果看到了类似:
postgresql96-server-9.6.1-1PGDG.rhel6.x86_64 postgresql96-libs-9.6.1-1PGDG.rhel6.x86_64 postgresql96-9.6.1-PGDG.rhel6.x86-64 postgresql96-contrib-9.6.1-1PGDG.rhel6.x86_64
表示安装成功,否则根据错误提示修正错误后重新安装。
4.初始化并启动数据库
PG安装完成需要首先初始化:
service postgresql-9.6 initdb
看到Initializing database: [OK],就可以启动数据库了:
service postgresql-9.6 start
看到OK字样,表示PostgreSQL启动成功。
5.测试
首先切换到postgres用户:
su - postgres
执行psql命令查看数据库列表:
psql -l
看到下面的3个数据库列表,表示数据库启动并初始化成功:
List of databases Name |owner |Encoding | Collate |Ctype |Access privileges| postgres |postgres| UTF8 |en_us.UTF-8 |en_us.UTF-8| template0|postgres| UTF8 |en_us.UTF-8 |en_us.UTF-8| template1|postgres| UTF8 |en_us.UTF-8 |en_us.UTF-8| (3 rows)
注意:因为PostgreSQL是一个关系型数据库,所以管理和使用相对比较复杂,推荐使用Navicat进行图形化的操作。
2.5 Memcached内存数据库
Memcached是一个高性能分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高数据库驱动网站的速度。Memcached基于一个存储键/值对的HashMap。
Memcached是一套分布式快取系统,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开源软件,以BSD license授权协议发布。
Memcached的API使用32位循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换。由于Memcached通常只是当作快取系统使用,所以使用Memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的程序码更新Memcached内的资料。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件,已成为Mixi、Hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。Memcached的出现有效解决了以上这些问题。
Memcached是高性能的分布式内存缓存服务器,一般的使用目的是通过缓存数据库查询结果,减少数据库访问次数,从而提高动态Web应用的速度,提高可扩展性。
Memcached的守护进程(daemon)是用C编写的,但是客户端可以用任何语言来编写,并通过Memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其HashMap条目),当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
Memcached由Danga Interactive开发,其最新版本发布于2010年(作者为Anatoly Vorobey和Brad Fitzpatrick),用于提升LiveJournal . com访问速度。LiveJournal(LJ)每秒动态页面访问量达几千次,用户700万。Memcached将数据库负载大幅度降低,更好地分配资源,用户可以更快速地访问。
为了提高性能,Memcached中保存的数据都存储在Memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启Memcached、重启操作系统会导致全部数据消失。另外,内存容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。Memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
尽管Memcached是“分布式”缓存服务器,但服务器端并没有分布式功能。各个Memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。
2.5.1 Memcached安装
本书使用yum安装Memcached。Memcached依赖于libevent库,这些依赖yum都会自动安装。
安装命令:
yum -y install memcached
启动和停止命令:
service memcached start|stop
Memcached的配置是通过命令行进行的,如果只是学习Memcahced的使用,使用service命令就可以了。
注意:如果安装缺少其他支持,可以使用以下命令
yum groupinstall "Development Tools"
2.5.2 连接编辑
可以通过telnet命令并指定主机IP和端口来连接Memcached服务。
语法如下:
telnet HOST PORT
命令中的HOST和PORT为运行Memcached服务的IP和端口。
下面实例演示了如何连接到Memcached服务并执行简单的set和get命令。Memcached默认端口为11211。
telnet 127.0.0.111211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set foo 0 0 3 //保存命令 bar //数据 STORED //结果 get foo //取得命令 VALUE foo 0 3 //数据 bar //数据 END //结束行 quit
Memcached缺乏认证以及安全管制,因此应该将Memcached服务器放置在防火墙后。
2.5.3 管理Memcached服务
1.启动Memcached
一般情况下,可以使用类似如下形式,启动Memcached服务:
memcached -d -m 64-I 20m -u root -l 192.168.4.86-p 11211-c 1024-P /tmp /memcached.pid
上述命令行中,基于上面各个选项,以及其他一些选项的含义,表2-2列出了Memcached的常用选项。
表2-2 Memcached常用选项

-d参数有如下几个选项,可以使用-d参数启动和关闭Memcached而不用使用pid文件。
● -d install安装Memcached服务。
● -d uninstall:卸载Memcached服务。
● -d start:启动Memcached服务。
● -d restart:重启Memcached服务。
● -d stop:停止Memcached服务。
● -d shutdown:停止Memcached服务。
2.停止Memcached
可以在Linux下通过如下命令查询到Memcached进程号:
ps -ef | grep memcached
然后杀掉Memcached服务进程:
kill -9 <PID>
-9表示强制杀掉进程,或
kill -9 `cat /tmp/memcached.pid`
也可以使用-d参数关闭Memcached:
memcached -u root -d stop
2.5.4 Memcached命令
本节介绍Memcached常用命令,方便读者后续使用。
1. stats命令
该命令用于显示服务器信息、统计数据、结果示例数据等,例如:
stats STAT pid 19510 // Memcache进程ID STAT uptime 1466315 //已运行秒数 STAT time 1339671194 //服务器当前的UNIX时间戳 STAT version 1.4.4 // Memcache版本号 …… END
这里不再展开叙述每个选项的意义。
stats命令有若干个二级子项,如表2-3所示。
表2-3 stats命令二级子项

2. get命令
get命令用于获取缓存的数据,键为key。语法格式:
get<key>*
示例:
get basis_behavior_user
结果如下所示:
VALUE basis_behavior_user 0 451{"aaData":[["d1a2233dc382432b8e19e40254fdb98a", "100000002223484", "14025630463 19", "c4f82195815300bcf39a5232707ad9c1", "1", "0", "EBEST_W70", "4.0.4", "2.2.2.", "wifi", "", "EBEST", "19", "854*480", "H-yun35", "00:08:22:da:c1:ce", "863531010517866", "c4f821958 15300bcf39a5232707ad9c11402562805664", "460010255508963", "1901589461", "1402563045960" ,"429", "338", "23197", "1", "0", "0", "2014-06-12_16:50:46", "-1", "0", "3"]], "sEcho":1, "iTo talRecords":0, "iTotalDisplayRecords":0} END
也可以用get命令获取多个key对应的值,如下所示:
get name hobby VALUE name 1 7 1234567 VALUE hobby 0 25 tenis basketball football END
3. set命令
语法格式:
set<key><flags><exptime><bytes> [noreply] <value>
noreplay是可选参数,告诉服务器不需要回复。
示例:
set name 01800 7 shirdrn STORED get name VALUE name 0 7 shirdrn END
4. delete命令
delete命令用于删除缓存中指定键key对应的数据。语法格式:
delete key [noreply]
参数说明:
key:键值key-value结构中的key,用于查找缓存值。
noreply(可选):告知服务器不需要返回数据。
示例:
set tValue 0900 9 memcached STORED get tValue VALUE tValue 0 9 memcached END delete tValue DELETED get tValue END delete tValue NOT_FOUND
输出信息说明:
● DELETED:删除成功。
● ERROR:语法错误或删除失败。
● NOT_FOUND:key不存在。
5. add命令
语法格式:
add<key><flags><exptime><bytes> [noreply] <value>
示例:
add hobby 01800 10 basketball STORED get hobby VALUE hobby 0 10 basketball END
6. replace命令
replace命令用于覆盖一个已经存在的key及其对应value,替换时一定要保证替换后值的长度与原始长度相同,否则覆盖失败。
语法格式:
replace<key><flags><exptime><bytes> [noreply] <value>
示例:
get name VALUE name 0 7 shirdrn END replace name 01800 7 youak47 STORED get name VALUE name 0 7 youak47 END
7. append命令
append命令用于在一个已经存在的数据值(value)上追加(在数据值的后面追加)。
语法格式:
append<key><flags><exptime><bytes> [noreply] <value>
示例:
get hobby VALUE hobby 0 10 basketball END append hobby 01800 9 football STORED get hobby VALUE hobby 0 19 basketball football END
8. prepend命令
prepend命令用于在一个已经存在的数据值(value)上追加(在数据值的前面追加)。
语法格式:
prepend<key><flags><exptime><bytes> [noreply] <value>
示例:
get hobby VALUE hobby 0 19 basketball football END prepend hobby 01800 6 tenis STORED get hobby VALUE hobby 0 25 tenis basketball football END
9. incr命令
incr命令是计数命令,可以在原来已经存在的数字上进行累加求和计算,并存储新的数值。
语法格式:
incr<key><value> [noreply]
示例:
set active_users 01000000 7 1000000 STORED get active_users VALUE active_users 0 7 1000000 END incr active_users 99 1000099
10. decr命令
decr命令是计数命令,可以在原来已经存在的数字上进行减法计算,并存储新的数值。
语法格式:
decr<key><value> [noreply]
示例:
get active_users VALUE active_users 0 7 1000099 END decr active_users 3456 996643
11. flush_all命令
flush_all命令用于使缓存中的数据项失效,可选参数指定数据项在多少秒后失效。
语法格式:
flush_all [<time>] [noreply]
调用flush_all命令时,数据所占的内存并不会被释放,但会被标记为过期,不能再被读取。后续添加的值会根据算法逐渐占用之前释放的空间。
示例:
setuser 0 0 5 123456 STORED getuser VALUE user0 5 123456 END flush_all OK getuser END
12. version命令
version命令用于返回Memcached服务器的版本信息。
示例:
version VERSION 1.4.5
13. quit命令
quit命令用于退出Telnet终端。
2.6 MongoDB分布式NoSQL数据库
MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富、最像关系型数据库的;它支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是支持的查询语言非常强大,其语法类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的绝大部分功能,而且支持对数据建立索引。
MongoDB的设计目标是高性能、可扩展、易部署、易使用,存储数据非常方便。其主要功能特性如下。
1)面向集合存储,容易存储对象类型的数据。在MongoDB中,数据被分组存储在集合中,集合类似RDBMS中的表,一个集合可以存储无限多的文档。
2)模式自由,采用无模式结构存储。在MongoDB的集合中存储的数据是无模式的文档。采用无模式存储数据是集合区别于RDBMS表的一个重要特征。
3)支持完全索引,可以在任意属性上建立索引,包含内部对象。MongoDB的索引和RDBMS的索引基本一样,可以在指定属性、内部对象上创建索引以提高查询的速度。除此之外,MongoDB还提供创建基于地理空间的索引能力。
4)支持查询。MongoDB支持丰富的查询操作,支持SQL中的大部分查询。
5)强大的聚合工具。MongoDB除了提供丰富的查询功能外,还提供强大的聚合工具,如count、group等,支持使用MapReduce完成复杂的聚合任务。
6)支持复制和数据恢复。MongoDB支持主从复制机制,可以实现数据备份、故障恢复、读扩展等功能。而基于副本集的复制机制提供了自动故障恢复的功能,确保集群数据不会丢失。
7)使用高效的二进制数据存储,包括大型对象(如视频)。MongoDB支持以二进制格式存储数据,可以保存任何类型的数据对象。
8)自动处理分片,以支持云计算层次的扩展。MongoDB支持集群自动切分数据,对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。
9)支持Perl、PHP、Java、C#、JavaScript、Ruby、C和C++语言的驱动程序。MongoDB提供了当前所有主流开发语言的数据库驱动包,开发人员使用任何一种主流开发语言都可以轻松编程,实现访问MongoDB数据库。
10)文件存储格式为BSON(JSON的一种扩展)。BSON是二进制格式的JSON的简称,BSON支持文档和数组的嵌套。
11)可以通过网络访问。可以通过网络远程访问MongoDB数据库。
“面向集合”(collection-oriented),是指数据被分组存储在数据集中,这个数据集称为一个集合(collection)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。Nytro MegaRAID技术中的闪存高速缓存算法,能够快速识别数据库内大数据集中的热数据,提供一致的性能改进。
模式自由(schema-free),意味着对于存储在MongoDB数据库中的文件,我们不需要知道它的任何结构定义。
存储在集合中的文档,被存储为键-值(key-value)对的形式。键用于唯一标识一个文档,为字符串类型,而值可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)。
MongoDB适合使用的场景如下:
1)网站实时数据处理。MongoDB非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2)缓存。由于性能很高,MongoDB适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。
3)高伸缩性的场景。MongoDB非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持。
MongoDB不适用的场景如下:
1)要求高度事务性的系统。
2)传统的商业智能应用。
3)复杂的跨文档(表)级联查询。
2.6.1 MongoDB安装
本节介绍使用yum在CentOS系统上安装MongoDB以及后续配置的方法,但要保证CentOS外网连通。
1.配置yum源
运行yum命令查看MongoDB的包信息:
yum info mongo*
如果提示没有相关匹配的信息,说明CentOS系统中的yum源不包含MongoDB的相关资源,所以要在使用yum命令安装MongoDB前增加yum源,即在/etc/yum.repos.d/目录中增加*.repo yum源配置文件。
文件命名:
/etc/yum.repos.d/mongodb-org-3.4.repo
命令与内容:
vi /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
配置好yum源后,如果配置正确,执行下面的命令便可以查询MongoDB相关的信息:
yum info mongo*
当能看到MongoDB 3.X版本字样时,表示yum源已经配置正确,可以开始安装了。
2.安装MongoDB的服务器端
使用yum安装MongoDB:
sudo yum install -y mongodb-org
安装完成检查MongoDB程序文件:
# ls /usr/bin/mongo(tab键) mongo mongoexport mongooplog mongos mongod mongofiles mongoperf mongostat mongodump mongoimport mongorestore mongotop
这些就是MongoDB的程序文件。
MongoDB数据文件默认保存在/var/lib/mongo目录,日志文件保存在/var/log/mongodb,使用MongoDB作为运行用户。可以在/etc/mongod.conf里修改数据文件和日志文件的路径,参数为systemLog.path和storage.dbPath。
如果修改了运行MongoDB的用户,必须确保该用户对/var/lib/mongo和/var/log/mongodb两个目录有修改权限。
3.运行MongoDB
可以使用下面的命令运行MongoDB进程:
sudo service mongod start
4.确认MongoDB是否启动成功
通过检查/var/log/mongodb/mongod.log文件内容检查MongoDB是否启动成功,检查下面这行信息:
[initandlisten] waiting for connections on port <port>
<port>是在/etc/mongod.conf中配置的端口号,默认值是27017。
也可以使用下面命令让MongoDB在系统启动时自动运行:
sudo chkconfig mongod on
5.停止MongoDB
使用下面命令停止MongoDB进程:
sudo service mongod stop
6.重启MongoDB
使用下面命令重启MongoDB进程:
sudo service mongod restart
可以在/var/log/mongodb/mongod.log实时查看进程的状态。
7.测试MongoDB是否正常运行
进入mongodb的shell模式:
mongo
查看数据库列表:
show dbs
查看当前db版本:
db.version();
8.卸载MongoDB
(1)停止MongoDB
停止MongoDB:
sudo service mongod stop
(2)卸载安装包
卸载安装包:
sudo yum erase $(rpm -qa | grep mongodb-org)
(3)删除数据和日志目录
删除数据和日志目录:
sudo rm -r /var/log/mongodb sudo rm -r /var/lib/mongo
2.6.2 mongod.conf配置说明
MongoDB的配置文件为/etc/mongod.conf,下面是一个mongod.conf示例,对于每个配置项,以中文注释项的方式注释在文件内,具体内容如下。
# mongo.conf #日志保存位置 logpath=/var/log/mongo/mongod.log #以追加方式写入日志 logappend=true #在后台运行 fork = true #服务运行端口 #port = 27017 #数据库文件保存位置 dbpath=/var/lib/mongo #启用定期记录CPU利用率和 I/O 等待 #cpu = true # 是否以安全认证方式运行,默认是不认证的非安全方式 #noauth = true #auth = true # 详细记录输出 #verbose = true #用于开发驱动程序时的检查客户端接收数据的有效性 #objcheck = true #启用数据库配额管理,默认每个db可以有8个文件,可以用quotaFiles参数设置 #quota = true #设置oplog记录等级 # 0=off (默认) # 1=W # 2=R # 3=both # 7=W+some reads #oplog = 0 #动态调试项 #nocursors = true #忽略查询提示 #nohints = true # 禁用HTTP界面,默认为localhost:28017 #nohttpinterface = true # 关闭服务器端脚本,这将极大地限制功能 #noscripting = true #关闭扫描表,任何查询将会是扫描失败 #notablescan = true # 关闭数据文件预分配 #noprealloc = true # 为新数据库指定.ns文件的大小,单位为MB # nssize = <size> #监视服务器的账号token #mms-token = <token> # mongo监控服务器的名称 #mms-name = <server-name> # mongo监控服务器的ping 间隔 #mms-interval = <seconds> # 复制选项 #在复制中,指定当前是从关系 #slave = true #source = master.example.com # Slave only: specify a single database to replicate #only = master.example.com # or #master = true #source = slave.example.com
以上是默认配置文件中的一些参数,更多参数可以使用mongod -h命令查看:
# mongod -h Allowed options: General options: -h [ --help ] 显示本使用信息 --version 显示版本信息 -f [ --config ] arg 指定启动配置文件路径 -v [ --verbose ] 显示详细信息 --quiet 静默输出 --port arg 端口 --bind_ip arg 绑定IP,可以指定多个 --maxConns arg 最大并发连接数 --logpath arg 日志文件路径 --logappend 日志写入方式 --pidfilepath arg pid文件路径 --keyFile arg 集群认证私钥,仅适用于副本集 --unixSocketPrefix UNIX 域套接字的可选arg路径,(默认是/tmp) --fork 启动服务进程 --auth 使用认证方式运行 --cpu 定期显示的CPU和I/O等待利用率 --dbpath arg 数据库文件路径 --diaglog arg 0=off 1=W 2=R 3=both 7=W+some reads oplog记录等级 --directoryperdb 每个数据库存储到单独目录 --journal 记录日志,建议开启,在异常宕机时可以恢复一些数据 --journalOptions arg 日志参数 --ipv6 启用IPv6支持,IPv6默认关闭 --jsonp 允许JSONP通过HTTP访问,该方式存在安全隐患 --noauth 不带安全认证的方式 --nohttpinterface 禁用HTTP接口 --noprealloc 禁用数据文件的预分配,往往会损害性能 --noscripting 禁用脚本引擎 --notablescan 不允许表扫描 --nounixsocket 禁止UNIX 套接字监听 --nssize arg (=16) 为新数据设置ns文件的大小 --objcheck 检查客户端数据的有效性 --profile arg 0=off, 1=slow, 2=all --quota 启用数据库配额管理,默认每个db可以有8个文件,可以用quotaFiles 参数设置db --quotaFiles arg 数据库允许的文件数量,由--quota参数使用 --rest 开启rest API --repair 修复所有数据库 --repairpath arg 修复文件的根目录,默认为dbpath指定的目录 --slowms arg (=100) 大于多少秒才算慢查询(需要与--profile|配合才会生效) --smallfiles 最小的文件大小默认值 --syncdelay arg (=60) 与硬盘同步数据的时间,默认60秒,0表示不同步到硬盘(不建议) --sysinfo 打印一些诊断系统信息 --upgrade 如果必要,将数据库文件升级到新的格式(1.0到1.1+升级时所需的) Replication options: 复制选项 --fastsync 从一个dbpath快照开始同步 --autoresync 自动同步,如果从机的数据不是新的则自动同步 --oplogSize arg oplog的大小,单位为MB Master/slave options: 主/从配置选项 --master 主模式 --slave 从模式 --source arg 从服务器上指定主服务器地址,格式为<server:port> --only arg 从服务器上指定要复制的数据库 --slavedelay arg 指定从主服务器上同步数据的时间间隔,单位秒 Replica set options: 副本集选项 --replSet arg 参数:<名称>[<种子主机列表>] Sharding options: 分片设置选项 --configsvr 声明这是一个集群的配置数据库,默认的端口是27019,默认的路径是/data/configdb --shardsvr 声明这是集群的一个分片数据库,默认端口为27018 --noMoveParanoia 关闭moveChunk偏执型数据保存策略
2.7 小结
本章向用户介绍了在以Nginx为核心的系统中常用的几种数据库,包括关系型数据库MySQL、PostgreSQL,内存型数据库及缓存的Redis、Memcached, NoSQL数据库MongoDB。在一个小型的系统中,使用Nginx和这些数据库及缓存,可以快速搭建一个系统原型。
对于Redis数据库,需要注意以下两点:
● Redis本身是单线程的,因此可以设置每个实例在6~8GB之间,通过启动更多的实例提高吞吐量。例如,128GB的服务器上可以开启8GB ×10个实例,充分利用多核CPU的性能。
● 在实际项目中,为了提高吞吐量,往往需要使用主从策略,即数据写到主Redis,读取时从从Redis上读,这样可以通过挂载更多的从服务器提高吞吐量,而且可以通过主从机制,在叶子节点开启持久化方式防止数据丢失。更大型的系统则需要使用twemproxy实现Redis集群。