linux 学习笔记-076-NoSQL-nosql 介绍,memrcached 介绍与安装,查看 memcached 状态

发布于 2018-04-27  311 次阅读


NoSQL 介绍

非关系型数据库就是 NoSQL,关系型数据库代表 MySQL

对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索

NoSQL 数据库存储原理非常简单(典型的数据类型为 k-v),不存在繁杂的关系链,比如 mysql 查询的时候,需要找到对应的库、表(通常是多个表)以及字段。

NoSQL 数据可以存储在内存里,查询速度非常快

NoSQL 在性能表现上虽然能优于关系型数据库,但是它并不能完全替代关系型数据库

NoSQL 因为没有复杂的数据结构,扩展非常容易,支持分布式,可以随便增减服务器,但 Mysql 却不行,Mysql 只能做主从或者分库分表(也只能把不关联的库和表做分离)

NoSQL 最典型的用法是用作站点的缓存,减轻 Mysql 数据库的压力

常见 NoSQL 数据库

k-v 形式的:memcached、redis 适合储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和 ID(键)挂钩,这种情景下键值数据库是个很好的选择。

文档数据库:mongodb 将数据以文档的形式储存。每个文档都是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用 XML、JSON 或者 JSONB 等多种形式存储。

列存储:Hbase

图:Neo4J、Infinite Graph、OrientDB

memcached 介绍

Memcached 是国外社区网站 LiveJournal 团队开发,目的是为了通过缓存数据库查询结果,减少数据库访问次数,从而提高动态 web 站点性能。

官方站点:http://www.memcached.org/

数据结构简单(k-v),数据存放在内存里,意味着重启服务器或者重启 Memcached 服务,将会丢失存储在内存中的数据,为避免数据丢失的情况,可以在重启服务器或者重启 Memcached 服务之前先把在内存中的数据保存到本地磁盘,等重启完之后再导入

多线程

基于 c/s 架构,协议简单

基于 libevent 的事件处理

自主内存存储处理(slab allowcation)

数据过期方式:Lazy Expiration 和 LRU

Memcached 的数据流向

linux 学习笔记-076-NoSQL-nosql 介绍,memrcached 介绍与安装,查看 memcached 状态

Slab allocation

Slab Allocation 的原理

将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk 的集合),每个 chunk 集合被称为 slab。

Memcached 的内存分配以 Page 为单位,Page 默认值为 1M,可以在启动时通过-I 参数来指定。

Slab 是由多个 Page 组成的,Page 按照指定大小切割成多个 chunk。

linux 学习笔记-076-NoSQL-nosql 介绍,memrcached 介绍与安装,查看 memcached 状态

Growth factor

Memcached 在启动时通过-f 选项可以指定 Growth Factor 因子。该值控制 chunk 大小的差异。默认值为 1.25。

通过 memcached-tool 命令查看指定 Memcached 实例的不同 slab 状态,可以看到各 Item 所占大小(chunk 大小)差距为 1.25

命令:# memcached-tool 127.0.0.1:11211 display

Memcached 的数据过期方式

Lazy Expiration:

Memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,Memcached 不会在过期监视上耗费 CPU 时间。

LRU:

Memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从 slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

安装 memcached

01

yum 安装 Memcached 并启动,yum list 可以见到,需要安装的是 memcached 是 1.4 版本,不过不影响使用

[root@am-01:~#] yum list | grep memcached

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

libmemcached.i686                        1.0.16-5.el7                  base    

libmemcached.x86_64                      1.0.16-5.el7                  base    

libmemcached-devel.i686                  1.0.16-5.el7                  base    

libmemcached-devel.x86_64                1.0.16-5.el7                  base    

memcached.x86_64                         1.4.15-10.el7_3.1             base    

memcached-devel.i686                     1.4.15-10.el7_3.1             base    

memcached-devel.x86_64                   1.4.15-10.el7_3.1             base    

opensips-memcached.x86_64                1.10.5-3.el7                  epel    

php-ZendFramework-Cache-Backend-Libmemcached.noarch

php-pecl-memcached.x86_64                2.2.0-1.el7                   epel    

python-memcached.noarch                  1.48-4.el7                    base    

uwsgi-router-memcached.x86_64            2.0.16-1.el7                  epel   

[root@am-01:~#] yum -y install memcached

[root@am-01:~#] systemctl start memcached

02

memcached 没有配置文件,如果想修改启动参数,可以在使用过程中更改参数,其中-u 指定了以哪个用户运行 memcached,-p 指定了监听端口,-m 指定了给 memcached 分配的内存大小,-c 指定了并发数,这些都可以做修改

[root@am-01:~#] ps -aux | grep memcached

memcach+  68728  0.0  0.1 325568  1180 ?        Ssl  23:40   0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024

[root@am-01:~#] netstat -lntp

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      68728/memcached 

tcp6       0             0           :::11211                       :::*                    LISTEN      68728/memcached

03

使用命令行方式启动 memcached 并指定参数,-l 配置 IP

[root@am-01:~#] /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024

04

修改/etc/sysconfig/memcached 文件的内容去定义启动参数,比如加上监听的 ip,可以把 OPTIONS="" 改为 OPTIONS="127.0.0.1"

[root@am-01:~#] vim /etc/sysconfig/memcached

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""

查看 Memcached 运行状态

01

使用 memcached-tool 查看 memcached 的运行状态,需关注 curr_items(缓存的项目数)、cmd_get(get 次数)和 get_hits(总命中数),日常是把 get_hits 的数值除以 cmd_get 的数值乘以 100%,从而求出缓存命中率

缓存命中率:用来查看缓存有没有成功,即(get_hits/cmd_get)*100%

[root@am-01:~#] 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           7

           bytes_written           0

              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       68728

            pointer_size          64

               reclaimed           0

            reserved_fds          20

           rusage_system    0.071171

             rusage_user    0.000000

                 threads           4

                    time  1524844880

       total_connections          11

             total_items           0

              touch_hits           0

            touch_misses           0

                  uptime        1254

                 version      1.4.15

02

使用 nc 工具(nmap-ncat)查看 memcached 的运行状态

[root@am-01:~#] yum -y install nc

[root@am-01:~#] rpm -qf `which nc`

nmap-ncat-6.40-7.el7.x86_64

[root@am-01:~#] echo stats |nc 127.0.0.1 11211

STAT pid 68728

STAT uptime 1761

STAT time 1524845387

STAT version 1.4.15

STAT libevent 2.0.21-stable

STAT pointer_size 64

STAT rusage_user 0.000000

STAT rusage_system 0.098293

STAT curr_connections 10

STAT total_connections 12

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 13

STAT bytes_written 1026

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

03

安装 libmemcached,使用 memstat 查看 memcached 的运行状态

[root@am-01:~#] yum -y install libmemcached

[root@am-01:~#] memstat --servers=127.0.0.1:11211

Server: 127.0.0.1 (11211)

pid: 68728

uptime: 1912

time: 1524845538

version: 1.4.15

libevent: 2.0.21-stable

pointer_size: 64

rusage_user: 0.000000

rusage_system: 0.106469

curr_connections: 10

total_connections: 13

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: 30

bytes_written: 2072

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