nosql介紹,memrcached介紹,安裝memcached,檢視memcachedq狀態
21.1 nosql介紹
NoSQL(Not Only SQL)意即“不僅僅是SQL”,泛指非關係型的資料庫。隨著網際網路web2.0網站的興起,傳統的關係資料庫在應付web2.0網站,特別是超大規模和高併發的SNS型別的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。NoSQL資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題。與之相對應的關係型資料庫代表是:mysql、oracle、sql server等。
對於關係型資料庫來說,是需要把資料儲存到庫、表、行、欄位裡,查詢的時候根據條件一行一行地去匹配,當量非常大的時候就很耗費時間和資源,尤其是資料是需要從磁盤裡去檢索
NoSQL資料庫儲存原理非常簡單(典型的資料型別為k-v),不存在繁雜的關係鏈。比如像關係型資料庫mysql在查詢的時候,就得需要去找到對應的庫 >>> 表(通常是多個表) >>> 欄位,經過這樣的一個過程才能查詢到相應的資料。
NoSQL除了儲存原理簡單,而且NoSQL資料還可以儲存在記憶體裡,查詢速度非常快。NoSQL在效能表現上雖然能優於關係型資料庫,但是它並不能完全替代關係型資料庫,因為有些應用需要複雜的關係鏈,那麼NoSQL就無法勝任了。NoSQL因為沒有複雜的關係、資料結構,擴充套件非常容易,支援分散式等應用,例如最經常被應用於分散式快取。
常見NoSQL資料庫:
k-v形式的:memcached、redis 適合儲存使用者資訊,比如會話(session)、配置檔案、引數、購物車等等。這些資訊一般都和ID(鍵)掛鉤,這種情景下鍵值資料庫是個很好的選擇。
文件資料庫:mongodb 將資料以文件的形式儲存。每個文件都是一系列資料項的集合。每個資料項都有一個名稱與對應的值,值既可以是簡單的資料型別,如字串、數字和日期等;也可以是複雜的型別,如有序列表和關聯物件。資料儲存的最小單位是文件,同一個表中儲存的文件屬性可以是不同的,資料可以使用XML、JSON或者JSONB等多種形式儲存。
列儲存 Hbase
圖 Neo4J、Infinite Graph、OrientDB
21.2 memrcached介紹
Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashmap。其守護程序(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。
Memcached是國外社群網站LiveJournal團隊開發,其最新版本釋出於2010年,作者為Anatoly Vorobey和Brad Fitzpatrick。目的是為了通過快取資料庫查詢結果,減少資料庫訪問次數,從而提高動態web站點效能。官方站點 http://×××w.memcached.org/
Memcached 特點:
資料結構簡單(k-v),資料存放在記憶體裡,所以資料不是持久化儲存的,不能落地。這意味著重啟伺服器或者重啟Memcached服務就會丟失原來儲存的資料。所以在重啟前需要先把資料寫到磁碟之後再重啟才能保證資料不丟失。
多執行緒
基於c/s架構,協議簡單
基於libevent的事件處理
自主記憶體儲存處理(slab allowcation)
資料過期方式:Lazy Expiration 和 LRU
Memcached的資料流向:
Slab Allocation的原理:
將分配的記憶體分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱為slab。
Memcached的記憶體分配以Page為單位,Page預設值為1M,可以在啟動時通過-I引數來指定。
Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。
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獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從快取的實用角度來看,該模型十分理想。
21.3 安裝memcached
memcached可以通過yum安裝,當然也可以去官網下載相應的原始碼包進行編譯安裝,如果是初次接觸的話,先用最簡單的安裝方式或許會比較好一點,先來看看yum中可以安裝的memcached版本:
[[email protected] ~]# yum list |grep memcached libmemcached.x86_64 1.0.16-5.el7 @base memcached.x86_64 1.4.15-10.el7_3.1 @base libmemcached.i686 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-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.17.1-1.el7 epel [[email protected] ~]# yum install -y memcached libmemcached libevent 已載入外掛:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirrors.aliyun.com * extras: mirrors.neusoft.edu.cn * updates: mirrors.neusoft.edu.cn 軟體包 memcached-1.4.15-10.el7_3.1.x86_64 已安裝並且是最新版本 軟體包 libevent-2.0.21-4.el7.x86_64 已安裝並且是最新版本 正在解決依賴關係
啟動memcached服務:
[[email protected] ~]# systemctl start memcached
檢視程序:
[[email protected] ~]# ps aux |grep memcached memcach+ 68183 0.0 0.1 344080 1668 ? Ssl 15:37 0:00 /usr/bin/memcached -umemcached -p 11211 -m 64 -c 1024 root 68243 0.0 0.0 112720 984 pts/1 S+ 15:38 0:00 grep --color=auto memcached
-u指定執行該服務的使用者,-p指定監聽埠,-m指定分配給這個程序的記憶體大小,單位是m,-c指定最大併發數量
檢視埠:
[[email protected] ~]# netstat -lntp |grep memcached tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 68183/memcached tcp6 0 0 :::11211 :::* LISTEN 68183/memcached
有兩種方式可以更改memcached的服務引數,第一種是使用絕對路徑來啟動,然後通過選項來指定引數,例如:
[[email protected] ~]# /usr/bin/memcached -u memcached -p 11200 -m 32 -c 2024
第二種方式是修改配置檔案:
[[email protected] ~]# vim /etc/sysconfig/memcached PORT=USER=MAXCONN=CACHESIZE=OPTIONS=
如果需要加上監聽的ip,可以把OPTIONS="" 改為OPTIONS="127.0.0.1"
21.4 檢視memcached狀態
memcached裡有一個memcached-tool,這個工具是用來檢視memcached的狀態的,如下示例:
[[email protected] ~]# 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
我們平時需要關注get_hits(命中數量)以及curr_items(存在memcached中的專案)的值,使用get_hits的值除以curr_items的值,可以計算出命中率。這是為了檢測memcached是否有快取了資料以及是否能被正常的訪問這些快取的資料。
除了memcached-tool之外,還可以使用nc來檢視memcached的狀態,安裝命令如下:
[[email protected] ~]# yum install -y nc 已載入外掛:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirrors.aliyun.com * extras: mirrors.neusoft.edu.cn * updates: mirrors.neusoft.edu.cn 軟體包 2:nmap-ncat-6.40-13.el7.x86_64 已安裝並且是最新版本 無須任何處理
檢視狀態的命令如下:
[[email protected] ~]# echo stats |nc 127.0.0.1 11211 STAT pid 68183 STAT uptime 803 STAT time 1543045875 STAT version 1.4.15 STAT libevent 2.0.21-stable STAT pointer_size 64 STAT rusage_user 0.019452 STAT rusage_system 0.041881 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 1025 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
這和使用memcached-tool來檢視的效果基本上是差不多的。
若安裝libmemcached了,還可以使用如下命令檢視memcached服務狀態:
[[email protected] ~]# memstat --servers=127.0.0.1:11211 Server: 127.0.0.1 (11211) pid: 68183 uptime: 863 time: 1543045935 version: 1.4.15 libevent: 2.0.21-stable pointer_size: 64 rusage_user: 0.021719 rusage_system: 0.041881 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: 2070 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