NoSQL介绍、memcached介绍、安装memcached、 查看memcached状态

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的次数.

113305_HvzH_3662885.png


自主内存存储处理(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.
120344_bxgT_3662885.png


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

 

转载于:https://my.oschina.net/AnnaWu/blog/1548701

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值