77:NoSQL之Memcached介紹及安裝 原

1、nosql非關係型數據庫;關係型的數據庫代表是mysql;

關係型的數據庫代表是mysql,可以使用sql語句(create insert update  select)等,是需要把數據庫存放到庫-表-行-字段裏,查詢的是也一行一行去匹配,當查詢量非常大的時候很耗費資源;

nosql的存儲原理非常簡單(數據類型爲k-v),一個鍵對應一個值,不存在繁瑣的關係鏈,比如mysql查詢的時候,需要找到庫-表-多個字段;

nosql數據可以存儲在內存中,查詢速度非常快;

nosql在性能雖然關係型數據庫,但是並不能完全代替關係型數據庫;比如:部署了論壇後,用戶訪問量太大,數據庫扛不住了,這個時候可以加一層緩存進來(內存裏),也就是nosql,可以減輕數據庫的壓力,

比如查詢完一個帖子後,先放到內存裏(帖子ID對應帖子內容)及是(key對應value)一條一條把論壇的帖子內容緩存到內存裏,當用戶再訪問的時候就不查詢mysql,直接查看緩存,減輕數據庫的壓力,這是最典型的用法了;

nosql沒有複雜的數據結構,擴展非常容易,支持分佈式;如:本來商品存在的A服務器,而A服務器有瓶頸了,那怎麼在B服務器上查詢A服務器的數據呢,mysql數據庫做不到,只有nosql可以增加服務器橫向擴展;

2、常見的nosql數據庫:

鍵值數據庫(k-v);memcachedredis適合存儲用戶信息,比如用戶會話(session)、參數、購物車,這些信息一般都和ID(鍵)掛鉤,這種情況下鍵值數據庫是一個很好的選擇;

用戶會話(session):用戶登錄信息,用來做session共享;

文檔數據庫mongodb,將數據以文檔的形式存儲,多個key-value組成的文檔,每個文檔都是一系列數據項的集合,每個數據項都有一個名詞與對應的值,值可以是簡單的數據類型,如字符串、數字、日期,也可以是複雜的類型,如有序列表和關聯對象,存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的;   列存儲:Hbase

3、memcached:是國外社區網站Livejournal團隊開發,目的是爲了通過緩存數據庫查詢結果,減少數據庫訪問次數,從而提高動態web站點性能;

官網:www.memcached.org

數據結構簡單(key-value),數據存放在內存裏;不支持持久化(一重啓服務,數據會丟失);

多線程,基於C/S架構;

語句libevent的事件處理,自主內存存儲處理;slab   allowcation

數據過期方式;Laze  expiration     LRU 

4、memcache的數據流向

5:slab  allcation:
Slab Allocation的原理
 將分配的內存分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱爲slab。
 Memcached的內存分配以Page爲單位,Page默認值爲1M,可以在啓動時通過-I參數來指定。
 Slab是由多個Page組成的,Page按照指定大小切割成多個chunk

6:Growth factor:來決定thunk的大小;

 Memcached在啓動時通過-f選項可以指定 Growth Factor因子。該值控制chunk大小的差異。默認值爲1.25。
 通過memcached-tool命令查看指定Memcached實例的不同slab狀態,可以看到各Item所佔大小(chunk大小)差距爲1.25 
 命令:# memcached-tool 127.0.0.1:11211 display

7:數據的過期方式;兩種: Lazy  expiration      LRU

Lazy  expiration  : memcached內部不會監視記錄是否過期,而是在get時查看時間戳,檢查記錄是否過期,這種技術成爲Lazy  expriation(懶惰的過期),不會在是否過期監視上耗費CPU時間;

LRU:memecache會優先使用已超時的記錄空間,當即便如此,也會發生追加新記錄時空間不足的情況,此時就需要使用LRU(least recently  used)刪除最近最少使用的空間,因此,當內存空間不足或者無法從slab獲取到新得空間時,就會從最近未使用的記錄中搜索,並將其分配給新的記錄,從緩存實用角度來看,該模型十分理想;存進去數據後一直未使用的,會隔一段時間去查詢下並標記,會讓下次覆蓋;

8:安裝memcached

安裝:yum  install  -y  memcached   libmemcached    libevent

啓動:systemctl   start   memcache

[root@localhost_001 ~]# yum list |grep memcached   
libmemcached.x86_64                       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.x86_64                    1.4.15-10.el7_3.1            base         [root@localhost_001 yum.repos.d]# yum  install  -y  memcached   libmemcached    libevent 
[root@localhost_001 yum.repos.d]# systemctl start memcached
[root@localhost_001 yum.repos.d]# ps aux |grep memcached
memcach+   1444  0.0  0.0 325604  1200 ?        Ssl  18:59   0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root       1451  0.0  0.0 112720   968 pts/0    R+   18:59   0:00 grep --color=auto memcached
[root@localhost_001 yum.repos.d]# netstat -lnpt |grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      1444/memcached      
tcp6       0      0 :::11211                :::*                    LISTEN      1444/memcached  

註釋:如上圖例,-u指定以memcache用戶運行,-p監聽的端口號,-m指定內存大小, -c指定併發數(concurrency);

註釋:如上圖例,memcache的監聽端口是11211,

9:那麼如果想自定義監聽端口或者內存大小併發數等;有如下兩種方法:(memcached沒有配置文件)

1:加上這個參數去啓動;/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024

[root@localhost_001 yum.repos.d]# /usr/bin/memcached -u memcached -p 11211 -m 128 -c 2048
[root@localhost_001 yum.repos.d]# ps aux |grep memcached
memcach+   1494  0.0  0.0 325604  1200 pts/0    Tl   19:06   0:00 /usr/bin/memcached -u memcached -p 11211 -m 128 -c 2048
root       1501  0.0  0.0 112720   968 pts/0    R+   19:07   0:00 grep --color=auto memcached

2:編輯/etc/sysconfig/memcached這個配置文件;

[root@localhost_001 yum.repos.d]# vim /etc/sysconfig/memcached 
cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

註釋:OPTIONS=""       表示監聽的主機;   -l  指定監聽IP,    -d   後臺啓動;

註釋:平時基本修改-m就可以了;

10:查看memcached的狀態;          memcache-tool    IP:端口  stats

memcached-tool    127.0.0.1:11211 stats

[root@localhost_001 ~]# 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        1826
            pointer_size          64
               reclaimed           0
            reserved_fds          20
           rusage_system    0.017159
             rusage_user    0.012256
                 threads           4
                    time  1542199271
       total_connections          11
             total_items           0
              touch_hits           0
            touch_misses           0
                  uptime         344
                 version      1.4.15

註釋:平時中重點關注兩個參數:  cmd_get      get_hits

cmd_get     表示總的get次數;

get_hist        表示命中率;

一般用get_hist  除以 cm_get來計算命中率;

(2):還可以使用nc命令:   安裝:    yum    install  -y     nc

echo   stats |nc 127.0.0.1 11211

[root@localhost_001 ~]# echo stats |nc 127.0.0.1 11211
STAT pid 1826
STAT uptime 832
STAT time 1542199759
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.027198
STAT rusage_system 0.024725
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 1024
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

可以看到 nc 命令查詢的結果和memcache查詢的結果是一樣子的;

如果查看libmemcached這個包後,還可以查詢它的服務狀態;

memstat --servers=127.0.0.1:11211

[root@localhost_001 ~]# memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
	 pid: 1826
	 uptime: 1101
	 time: 1542200028
	 version: 1.4.15
	 libevent: 2.0.21-stable
	 pointer_size: 64
	 rusage_user: 0.039654
	 rusage_system: 0.027262
	 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: 2068
	 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

註釋:有三種方法可以查詢memcache的狀態;

memcached-tool  127.0.0.1:11211 stats

echo stats  |nc  127.0.0.1 11211

memstat  --servers=127.0.0.1:11211

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章