[toc]
Memcached基礎
一、什麼是NoSQL?
-
非關係型數據庫就是NoSQL,
-
關係型數據庫代表MySQL
-
對於關係型數據庫來說,是需要把數據存儲到庫、表、行、字段裏,++查詢的時候根據條件一行一行地去匹配++,當量非常大的時候就很耗費時間和資源,尤其是數據是需要從磁盤裏去檢索
-
NoSQL數據庫存儲原理非常簡單(典型的數據類型爲k-v),不存在繁雜的關係鏈,比如mysql查詢的時候,需要找到對應的庫、表(通常是多個表)以及字段。
-
NoSQL數據可以存儲在內存裏,查詢速度非常快
-
NoSQL在性能表現上雖然能優於關係型數據庫,但是它並不能完全替代關係型數據庫
- NoSQL因爲沒有複雜的數據結構,擴展非常容易,支持分佈式
1.1 大白話理解 關係型數據庫和非關係型數據庫
1.1.1 關係型數據庫:
例如京東或者淘寶這些大型電商平臺,有着很龐大的數據結構體系,有用戶表,商品表,用戶信息,商品信息,等當產生一個訂單的時候,或者查詢數據,是哪個用戶,在什麼時間,購買了哪些商品,當調取一個用戶在某個時間買了什麼東西的時候這些數據是存在一定的關聯的。
1.1.2 非關係型數據庫:
NoSQL的存在就是不需要這些錯綜複雜的理念,一個key對應一個value。例如一個用戶下對應着他的採購訂單。且數據全部存在閃存中。不需要再次從磁盤中調取。
-
但是++NoSQL是不可以替代Mysql獨立存在的++。
-
例如現實運維環境中,我們一臺WEB安裝了一個Discuz,隨着訪問量的增加,數據庫扛不住那麼大的壓力;怎麼辦呢?我們設置一個NoSQL,當用戶讀取完畢後會直接放在NoSQL中,當用戶再次讀取的時候,會直接從緩存中讀取,不需要再次從數據庫中讀取。帖子的ID就類似於Key,帖子的內容就類似於Value。
-
NoSQL因爲沒有複雜的數據結構,擴展非常容易,支持分佈式。所以擴展也比較容易。如果你的A服務器受到瓶頸,增加服務器讓讓其繼續緩存唄,因爲不像關係型數據庫需要互相關聯,NoSQL直接橫向擴展即可!
- mysql的話只有前面說到的主主,主從,多主多從針對從進行負載均衡。要麼就是分庫分表,前提是關聯的數據庫不可以分開,不關聯的數據庫可以分開。
1.2 常見NoSQL數據庫
1.2.1 k-v形式的:memcached、redis
適合儲存用戶信息,比如會話、配置文件、參數、購物車等等。這些信息一般都和ID(鍵)掛鉤,這種情景下鍵值數據庫是個很好的選擇。
1.2.2 文檔數據庫:mongodb
將數據以文檔的形式儲存。每個文檔都是一系列數據項的集合。每個數據項都有一個名稱與對應的值,值既可以是簡單的數據類型,如字符串、數字和日期等;也可以是複雜的類型,如有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的,數據可以使用XML、JSON或者JSONB等多種形式存儲。
1.2.3 列存儲 Hbase
1.2.4 圖 Neo4J、Infinite Graph、OrientDB
二、Memcached介紹
2.1 Memcached概念
- Memcached是國外社區網站LiveJournal團隊開發,目的是爲了通過緩存數據庫查詢結果,減少數據庫訪問次數,從而提高動態web站點性能。
- 官方站點 http://www.memcached.org/
- 數據結構簡單(k-v),數據存放在內存裏
多線程 - 基於c/s架構,協議簡單(你需要先啓動一個服務,然後用這個服務進行通信??)
- 基於libevent的事件處理
- 自主內存存儲處理(slab allowcation)
- 數據過期方式:Lazy Expiration 和 LRU
Memcached的數據流向
2.2 Memcached的數據流向
一般使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態web應用的速度、提高可擴展性!
正常的作業流程是:
用戶發起請求給NGINX,然後再次調用PHP,PHP和mysql打交道,當用戶PHP獲取到請求轉給NGINX,NGINX再次把請求數據交給用戶。
如果併發量很大,請求mysql的隊列比較多,這時候我們就需要增加一個緩存層Memcached。這樣訪問過的數據全部丟在緩存中,當再次請求這個數據的時候就直接從Memcached讀取即可!
2.3 Slab allocation
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
命令:
2.4 Memcached的數據過期方式
Lazy Expiration
Memcached 內部不會監視記錄是否過期,而是在get時查看記錄的時間戳,檢查記錄是否過期。這種技術被稱爲lazy(惰性)expiration。因此,Memcached不會在過期監視上耗費CPU時間。
LRU
Memcached會優先使用已超時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名爲Least Recently Used(LRU)機制來分配空間。顧名思義,這是刪除“最近最少使用”的記錄的機制。因此,當內存空間不足時(無法從slab class獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。
三、 安裝memcached
查看下memcached的版本號
[root@xaviyunserver ~]# yum list |grep memcache
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
collectd-memcachec.x86_64 5.8.0-3.el7 epel
dmlite-plugins-memcache.x86_64 0.8.8-1.el7 epel
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
pcp-pmda-memcache.x86_64 3.11.8-7.el7 base
php-ZendFramework-Cache-Backend-Libmemcached.noarch
php-pecl-memcache.x86_64 3.0.8-4.el7 base
php-pecl-memcached.x86_64 2.2.0-1.el7 epel
python-memcached.noarch 1.48-4.el7 base
rubygem-memcache-client.noarch 1.8.5-13.el7 epel
uwsgi-router-memcached.x86_64 2.0.16-1.el7 epel
3.1 開始正式安裝並啓動:
[root@xaviyunserver ~]# yum install -y memcached
[root@xaviyunserver ~]# systemctl start memcached
查看安裝信息:
[root@xaviyunserver ~]# 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:*
[root@xaviyunserver ~]# ps aux |grep memcache
memcach+ 3223 0.0 0.0 325564 1180 ? Ssl 21:50 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 3230 0.0 0.0 112660 964 pts/0 R+ 21:51 0:00 grep --color=auto memcache
3.2 配置參數
- 比如加上監聽的ip,可以把OPTIONS=”” 改爲OPTIONS=”127.0.0.1″
- 其中-m 指定memcached分配內存(常用)
- -c 指定最大併發數
- -u 指定運行memcached服務的用戶
方法一,按照命令路徑的方式直接更改-u,-m,-c等參數
/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
方法二 vim /etc/sysconfig/memcached
vim /etc/sysconfig/memcached
四、 查看memcached狀態
[root@xaviyunserver ~]# 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 3223
pointer_size 64
reclaimed 0
reserved_fds 20
rusage_system 0.011338
rusage_user 0.027654
threads 4
time 1527171113
total_connections 11
total_items 0
方法一:
memcached-tool 127.0.0.1:11211 stats
或
方法二:
yum install -y nc
echo stats |nc 127.0.0.1 11211
安裝nc,yum install -y nc
查看nc的安裝源
[root@xaviyunserver ~]# rpm -qf `which nc`
nmap-ncat-6.40-13.el7.x86_64
方法三:
安裝libmemcached後,可以使用命令
yum install -y libmemcachedmemstat --servers=127.0.0.1:11211
以上三種查看memcached服務狀態。