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版本:
[root@aminglinux-149 ~]# 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 [root@aminglinux-149 ~]# 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服務:
[root@aminglinux-149 ~]# systemctl start memcached
查看進程:
[root@aminglinux-149 ~]# 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指定最大併發數量
查看端口:
[root@aminglinux-149 ~]# 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的服務參數,第一種是使用絕對路徑來啓動,然後通過選項來指定參數,例如:
[root@aminglinux-149 ~]# /usr/bin/memcached -u memcached -p 11200 -m 32 -c 2024
第二種方式是修改配置文件:
[root@aminglinux-149 ~]# vim /etc/sysconfig/memcached PORT=USER=MAXCONN=CACHESIZE=OPTIONS=
如果需要加上監聽的ip,可以把OPTIONS="" 改爲OPTIONS="127.0.0.1"
21.4 查看memcached狀態
memcached裏有一個memcached-tool,這個工具是用來查看memcached的狀態的,如下示例:
[root@aminglinux-149 ~]# 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的狀態,安裝命令如下:
[root@aminglinux-149 ~]# 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 已安裝並且是最新版本 無須任何處理
查看狀態的命令如下:
[root@aminglinux-149 ~]# 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服務狀態:
[root@aminglinux-149 ~]# 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