NoSQL介绍
什么是NoSQL?
非关系型数据库就是NoSQL,关系型数据库代表MySQL
首先NoSQL是一个数据库,它是用来存储数据的,类似于关系型数据库.
典型的数据库有Oracle、Mysql 、SQL Server都属于关系型数据库,关系型数据库它们都有一个共同的特点,就是可以使用SQL语句,比如创建库(create database )、创建表(create table)、查询(select ).
但对于非关系型数据库来说就没有这些SQL语句.
对于关系型数据库来说,是需要把数据库存储到库、表、行、字段里,查询的时候根据条件一行一行地区匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索.
NoSQL数据库存储原理非常简单(典型的数据类型为key-value),不存在繁杂的关系链,比如Mysql查询的时候,需要找到对应的库、表(通常多个表)以及字段,不需要一行一行去匹配,也不存在多个表相互去关联.
例如Mysql数据库,查询一个数据,会涉及到很多个表,比如典型的商品售卖,京东or淘宝,电子商务的网站,要用户下一个订单或者我们查一个订单,可能会需要很多个表,比如用户表、商品表,用户是谁,什么时候注册的,用户的属性是什么(男or女),年龄多少等; 商品表什么时候上架的,属于哪一大品类,价格等; 当产生一个订单时候,是一个哪用户在什么时间购买了哪一个商品,它需要结合用户表和商品表来去查询,这也就是关系型的数据库.
NoSQL数据可以存储在内存里,查询速度非常快
NoSQL在性能表现上虽然能优越于关系型数据库,但是它并不能完全替代关系型数据库
毕竟设计的NoSQL就是这么简单,当有比较复杂的需要,NoSQL是不满足的,那么拿NoSQL来做什么呢?
用于一些能够满足的一些应用,例如我们有一个discuz论坛,当用户访问非常大的时候,这Mysql数据库顶不住了,这时我们可以给它加一层缓存,那么就可以使用NoSQL来做缓存,缓存就是在内存里,比如查询一个帖子,把帖子查询过来,查完了之后放到内存里去(就是放到NoSQL去),帖子有一个帖子ID,帖子ID对应帖子的内容,也可以理解为帖子ID为K,帖子内容为V, 把论坛的帖子内容一条一条的缓存到NoSQL里,当用户访问的时候我们就不需要查询数据库里面的内容,直接查缓存,这样的话就很快,减轻Mysql数据库的查询压力.
NoSQL因为没有复杂的数据库结构,扩展非常容易,支持分布式
因为NoSQL没有复杂的数据库结构,所以说它扩展非常容易,比如说关系型数据库Mysql,有用户表或商品表等,需要多个表组合在一起去查询订单信息,当数据量越来越多,本来数据存在服务器A,但现在服务器A现在已经达到一定的瓶颈,想要加一台服务器过来,如何在B服务器上查A服务器上的数据呢,两个数据库结合在一起这就很麻烦了,在目前的技术手段是不能实现的,没有办法A和B服务器两个数据库结合在一起.但是NoSQL就可以实现,因为它不存A表和B表之间的关联,加一台服务器过来就可以继续存储数据,所以说它支持分布式,即使访问量很大, 我们也可以以增加服务器的方式横向扩展,而Mysql就不可以,Mysql只能做主从或者一主多从,来达到数据同步.
常见的NoSQL数据库
K-V形式的:
memcached、radis适合存储用户信息,比如会话、配置文件、参数、购物车等.这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择.
文档数据库:
mongodb将数据以为文档形式存储,每个文档都是一系列数据项的集合. 每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象. 数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或JSONB等多种形式存储.
列存储 Hbase
图 Neo4J、Infinite、Graph、 OrientDB
memcached介绍
memcached是介绍其中一种k-v形式的NoSQL,在LAMP和LNMP架构中mecached的角色是缓存,它可以存储论坛的帖子或一些数字,比如帖子的更新量,在线人数等信息是很容易存储在mecached里面的.
Memcached是国外社区网站LiveJournal团队开发的,目的是为了通过缓存数据库查询结果,以达到减少数据库查询次数,从而提高动态web站点的性能.
官方站点http://www.memcached.org/
数据结构简单(k-v形式),数据存放在内存里
(memcached数据不支持持久化,也就意味着当重启memcached或重启服务的时候,存储在内存的数据就会丢失,如果数据比较重要的话,需要特别注意一下,当需要重启服务的时候先数据导入磁盘,重启之后再把数据导出到memcached)
多线程
基于c/s架构,协议简单
基于libevent的事件处理
自主内存存储处理(slab allocation)
数据过期方式:Lazy Expiration 和LRU
Memcached的数据流向
例如有一个数据库MySQL, 有一个web服务器(Nginx+php-fpm), 正常的话php和Mysql打交道,Nginx调用php进行数据的交互,比如我们查询一个帖子内容,那肯定是用户发起请求给nginx,Nginx把这个php的请求交给php的脚本,php交给php-fpm服务,php-fpm解析完这个脚本之后,发现是查询某一个帖子内容,就去mysql数据库查找数据库,查询到数据最终由nginx返回给用户,这一个正常数据流向.
但这样去Mysql数据库查询数据速度有点,因为并发量很大,这时候可以给加缓存层,可以把查询到的结果缓存到内存里,当用户再次查询的时候,直接在内存里拿到结果返回给用户,不需要去Mysql数据库里面去查询,从而降低了查询Mysql的次数.
自主内存存储处理(slab allocation)
slab Allocation的原理:将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab.
Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定.
slab是由多个Page组成的,Page按照指定大小切割成多个chunk.
Growth factor是决定chunk的大小,Memcached在启动时通过-f选项可以指定Growth factor因子.该值控制chunk大小的差异,默认值是1.25.
通过mecached-tool命令查看指定Memcached实例的不同slab状态,可以看到各个ltem所占大小,(chunk大小)差距为1.25
chunks属于最小的单元,其次就是Page,Page包含了多个chunks, 而slab包含了多个Page.
Memcached的数据过期方式
Lazy Expiration:
memcached内部不会监控记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期.这种技术被称为Lazy Expiration. 因此memcached不会在过期监视上耗费CPU时间.
LRU:
Memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新的记录时空间不足的情况,此时就要使用为Least Recently Used (LRU)机制来分配空间。顾名思义,这是删除“最近最少使用“ 的记录的机制.因此,当内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度俩看,该模型十分理想.
安装memcached
直接yum安装即可
yum install -y memcached
启动memcached
systemctl start memcached
查看进程
ps aux |grep memcached
memcach+ 2180 0.0 0.1 325556 1184 ? Ssl 15:43 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 2187 0.0 0.0 112664 968 pts/0 S+ 15:43 0:00 grep --color=auto memcached
监听的端口11211
netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 2180/memcached
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1379/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2107/sendmail: acce
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1997/php-fpm: maste
tcp6 0 0 :::11211 :::* LISTEN 2180/memcached
tcp6 0 0 :::22 :::* LISTEN 1379/sshd
memcached没有配置文件,在/etc/sysconfig/memcached可以自定义端口,最大的连接数、内存
vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
OPTIONS //可以指定主机
CACHESIZE //内存
MAXCONN //最大连接数
USER //用户
PORT //端口
查看memcached状态
说明: memcached-tool 命令是查看memcached状态的.
平时需要关注 get_hits( 查询成功未获取到数据的总次数)和 curr_items(Memcached 当前存储 的内容数量) 的数字.
get_hits的数字除以 curr_items 的数字 是为计算命中率,当我们把缓存做好了, 若没有访问到
那么这个缓存就没有起到任何的作用.
memcached-tool 127.0.0.1:11211 stats
#127.0.0.1:11211 Field Value
accepting_conns 1
auth_cmds 0
auth_errors 0
bytes 0
bytes_read 33
bytes_written 54
cas_badval 0
cas_hits 0
cas_misses 0
cmd_flush 0
cmd_get 0
cmd_set 0
cmd_touch 0
conn_yields 0
connection_structures 11
curr_connections 10
curr_items 0
decr_hits 0
decr_misses 0
delete_hits 0
delete_misses 0
evicted_unfetched 0
evictions 0
expired_unfetched 0
get_hits 0
get_misses 0
hash_bytes 524288
hash_is_expanding 0
hash_power_level 16
incr_hits 0
incr_misses 0
libevent 2.0.21-stable
limit_maxbytes 67108864
listen_disabled_num 0
pid 2180
pointer_size 64
reclaimed 0
reserved_fds 20
rusage_system 0.146913
rusage_user 0.058765
threads 4
time 1507625378
total_connections 12
total_items 0
touch_hits 0
touch_misses 0
uptime 3992
version 1.4.15
time Memcached 当前的UNIX时间
uptime Memcached 运行时间,单位:秒
version Memcached 的版本号
rusage_user 该进程累计的用户时间,单位:秒
rusage_system 该进程累计的系统时间,单位:秒
curr_items Memcached 当前存储的内容数量
total_items Memcached 启动以来存储过的内容总数
bytes Memcached 当前存储内容所占用的字节数(*/1024/1024=mb)
curr_connections 当前连接数量
total_connections Memcached 运行以来接受的连接总数
connection_structures Memcached 分配的连接结构的数量
cmd_get 查询请求总数
cmd_set 存储(添加/更新)请求总数
get_hits 查询成功获取数据的总次数
get_misses 查询成功未获取到数据的总次数
bytes_read Memcached 从网络读取到的总字节数
bytes_written Memcached 向网络发送的总字节数
limit_maxbytes Memcached 在存储时被允许使用的字节总数
nc命令
[root@root-01 ~]# nc
\-bash: nc: 未找到命令
yum 安装nc命令
[root@root-01 ~]# yum install -y nc
nc命令查看memcached状态
说明:nc命令查看到的结果和memcached查看到的结果基本上是一致的.
[root@root-01 ~]# echo stats |nc 127.0.0.1 11211
STAT pid 2180
STAT uptime 5414
STAT time 1507626800
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.092976
STAT rusage_system 0.185952
STAT curr_connections 10
STAT total_connections 13
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 39
STAT bytes_written 1081
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
libmemcached 包
yum安装libmemcached命令
yum install -y libmemcached
安装了libmemcached的包之后,就可以使用memstat命令可以查看memcached的服务状态
[root@root-01 ~]# memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
pid: 2180
uptime: 6052
time: 1507627438
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.120223
rusage_system: 0.194207
curr_connections: 10
total_connections: 14
connection_structures: 11
reserved_fds: 20
cmd_get: 0
cmd_set: 0
cmd_flush: 0
cmd_touch: 0
get_hits: 0
get_misses: 0
delete_misses: 0
delete_hits: 0
incr_misses: 0
incr_hits: 0
decr_misses: 0
decr_hits: 0
cas_misses: 0
cas_hits: 0
cas_badval: 0
touch_hits: 0
touch_misses: 0
auth_cmds: 0
auth_errors: 0
bytes_read: 56
bytes_written: 2126
limit_maxbytes: 67108864
accepting_conns: 1
listen_disabled_num: 0
threads: 4
conn_yields: 0
hash_power_level: 16
hash_bytes: 524288
hash_is_expanding: 0
bytes: 0
curr_items: 0
total_items: 0
expired_unfetched: 0
evicted_unfetched: 0
evictions: 0
reclaimed: 0