一、云計算的前世今生
所有的新事物都不是突然冒出來的寓免,都有前世和今生癣诱。云計算也是IT技術不斷發(fā)展的產物。 要理解云計算袜香,需要對IT系統(tǒng)架構的發(fā)展過程有所認識撕予。 請看下IT系統(tǒng)架構的發(fā)展到目前為止大致可以分為3個階段:
1、 物理機架構 這一階段蜈首,應用部署和運行在物理機上实抡。 比如企業(yè)要上一個ERP系統(tǒng),如果規(guī)模不大欢策,可以找3臺物理機吆寨,分別部署Web服務器、應用服務器和數據庫服務器踩寇。 如果規(guī)模大一點啄清,各種服務器可以采用集群架構,但每個集群成員也還是直接部署在物理機上俺孙。 我見過的客戶早期都是這種架構辣卒,一套應用一套服務器,通常系統(tǒng)的資源使用率都很低鼠冕,達到20%的都是好的添寺。
2、虛擬化架構 決定了物理服務器的計算能力越來越強懈费,虛擬化技術的發(fā)展大大提高了物理服務器的資源使用率计露。 這個階段,物理機上運行若干虛擬機,應用系統(tǒng)直接部署到虛擬機上票罐。 虛擬化的好處還體現(xiàn)在減少了需要管理的物理機數量叉趣,同時節(jié)省了維護成本。
3该押、云計算架構 虛擬化提高了單臺物理機的資源使用率疗杉,隨著虛擬化技術的應用,IT環(huán)境中有越來越多的虛擬機蚕礼,這時新的需求產生了: 如何對IT環(huán)境中的虛擬機進行統(tǒng)一和高效的管理烟具。 有需求就有供給,云計算登上了歷史舞臺奠蹬。
二朝聋、OpenStack 簡介
1、什么是云計算:云計算是一種按使用量付費的模式囤躁,這種模式提供可用的冀痕、便捷的、按需的網絡訪問狸演, 進入可配置的計算資源共享池(資源包括網絡言蛇,服務器,存儲宵距,應用軟件腊尚,服務)
2、云計算所包含的幾個層次服務:
?SaaS( Software as a Service): 把在線軟件作為一種服務满哪。
?Paas( Platform as a Service): 把平臺作為一種服務跟伏。
?Iaas( Infrastructure as a Service):把硬件設備作為一種服務。
3翩瓜、OpenStack:是由Rackspace和NASA共同開發(fā)的云計算平臺, 是一個開源的 IaaS(基礎設施及服務)云計算平臺携龟,讓任何人都可以自行建立和提供云端運算服務兔跌,每半年發(fā)布一次,用Python語言編寫
4峡蟋、Opens tack歷史
5坟桅、OpenStack社區(qū)與鏈接
社區(qū): www.openstack.org, wiki.openstack.org
郵件列表:?http://wiki.openstack.org/MailingLists#General_List?http://wiki.openstack.org/MailingLists#Development_List?http://wiki.openstack.org/MailingLists#Operators
如何貢獻代碼: http://wiki.openstack.org/HowToContribute
源代碼管理 :http://wiki.openstack.org/GerritWorkflow
文檔 :http://docs.openstack.org
三、openstack架構及優(yōu)勢
OpenStack為私有云和公有云提供可擴展的彈性的云計算服務蕊蝗,這種服務云必須是簡單部署并且擴展性強仅乓。
1、模塊松耦合
2蓬戚、組件配置較為靈活
3夸楣、二次開發(fā)容易四、openstack構成組件
OpenStack共享服務組件:
數據庫服務( Database Service ):MairaDB 及 MongoDB
消息傳輸(Message Queues):RabbitMQ
緩存(cache): Memcached?時間(time sync):NTP
存儲(storge provider):ceph、GFS豫喧、LVM石洗、ISICI等
高可用及負載均衡:pacemaker、HAproxy紧显、keepalive讲衫、lvs等
OpenStack核心組件:
身份服務( Identity Service ):Keystone
計算( Compute ): Nova
鏡像服務( Image Service ): Glance
網絡 & 地址管理( Network ): Neutron
對象存儲( Object Storage ): Swift
塊存儲 (Block Storage) : Cinder
UI 界面 (Dashboard) : Horizon
測量 (Metering) : Ceilometer
部署編排 (Orchestration) : Heat
[云計算openstack共享組件——時間同步服務ntp(2)
一、標準時間講解
地球分為東西十二個區(qū)域孵班,共計 24 個時區(qū)
格林威治作為全球標準時間即 (GMT 時間 )涉兽,東時區(qū)以格林威治時區(qū)進行加,而西時區(qū)則為減篙程。
地球的軌道并非正圓枷畏,在加上自轉速度逐年遞減,因此時間就會有誤差在計算時間的時房午,最準確是使用“原子震蕩周期”所計算的物理時鐘矿辽。這種時鐘被稱為標準時間即— Coordinated Universal Time(UTC)
UTC 的準確性毋庸置疑,美國的 NIST F-1 原子鐘 2000 年才將產生 1 秒誤差郭厌。
隨著時間的誤差袋倔,有些工作是無需進行時間精確即可以完成。但有些工作就必須精確時間從而可以完成目標任務折柠。
因此時間的同步有了需求宾娜。目前所使用的就是 Network Time Protocol 協(xié)議。即網絡時間協(xié)議扇售。
二前塔、ntp時鐘同步服務
NTP 工作請求
(1) 客戶端將采用隨機端口向 NTP 服務器 (UDP:123) 發(fā)出時間同步請求
(2)NTP 服務器收到請求后會將發(fā)出調校時間
(3)NTP 客戶端接收到 NTP 服務器的消息后,以進行調整承冰,從而完成時間同步
同步服務器時間方式有2個:一次性同步(手動同步)华弓、通過服務自動同步。
1困乒、一次性同步時間:ntpdate 時間服務器的域名或ip地址
Ip地址查看可以訪問:http://www.ntp.org.cn/pool.php
ntpdate 120.25.108.11(選擇阿里云的)
2寂屏、NTP 服務器實現(xiàn)
(1)NTP 服務器安裝
yum install ntp -y
(2)查看 NTP 配置文件是否存在
ls -l /etc/ntp.conf
(3)NTP 所涉及的程序
ntpd
ntpdate
tzdata -update
(4)相關時間程序
date
hwclock
(5)NTP 所涉及文件
(6)NTP 服務
NTP 服務屬于 C/S 架構模式 , 在建立本地服務時最好與上層服務器進行時間同步來給本地提供時間同步服務
ntp.conf 說明
restrict 來管理 NTP 權限控制
用法 : restrict [ip] mask [netmask] parameter
server 進行設置上端同步 NTP
用法 : server [ip or hostname] [prefer]
讓本地的ntpd與本地硬件時間同步
vi /etc/ntp.conf :
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
systemctl start ntpd
(7)Linux 客戶端同步
- 手動同步
ntpdate 192.168.1.100 - 配置文件
vim /etc/ntp.conf
server 192.168.1.100
systemctl start ntpd
(8)查看上層 NTP 服務狀態(tài)
ntpq –p
[云計算openstack共享組件——消息隊列rabbitmq(3)
一、MQ 全稱為 Message Queue, 消息隊列( MQ )
是一種應用程序對應用程序的通信方法娜搂。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信迁霎,而無需專用連接來鏈接它們。
消息傳遞指的是程序之間通過在消息中發(fā)送數據進行通信百宇,而不是通過直接調用彼此來通信考廉,直接調用通常是用于諸如遠程過程調用的技術。排隊指的是應用程序通過隊列來通信携御。隊列的使用除去了接收和發(fā)送應用程序同時執(zhí)行的要求昌粤。
排隊指的是應用程序通過 隊列來通信既绕。隊列的使用除去了接收和發(fā)送應用程序同時執(zhí)行的要求。
二婚苹、AMQP 即 Advanced Message Queuing Protocol
高級消息隊列協(xié)議岸更,是應用層協(xié)議的一個開放標準,為面向消息的中間件設計膊升。消息中間件主要用于組件之間的解耦怎炊,消息的發(fā)送者無需知道消息使用者的存在,反之亦然廓译。
AMQP 的主要特征是面向消息评肆、隊列、路由(包括點對點和發(fā)布 / 訂閱)非区、可靠性瓜挽、安全。
三征绸、 Rabbitmq概念:
屬于一個流行的開源消息隊列系統(tǒng)久橙。屬于AMQP( 高級消息隊列協(xié)議 ) 標準的一個 實現(xiàn)。是應用層協(xié)議的一個開放標準管怠,為面向消息的中間件設計淆衷。用于在分布式系統(tǒng)中存儲轉發(fā)消息,在 易用性渤弛、擴展性祝拯、高可用性等方面表現(xiàn)不俗。
消息中間件主要用于組件之間的解耦她肯,消息的發(fā)送者無需知道消息使用者的存在佳头,反之亦然。
AMQP 的主要特征是面向消息晴氨、隊列康嘉、路由(包括點對點和發(fā)布 / 訂閱)、可靠性籽前、安全凄鼻。
RabbitMQ特點:
使用Erlang編寫
支持持久化
支持HA
提供C# , erlang,java聚假,perl,python闰非,ruby等的client開發(fā)端
四膘格、什么是耦合、解耦合
一财松、耦合
1瘪贱、耦合是指兩個或兩個以上的體系或兩種運動形式間通過相互作用而彼此影響以至聯(lián)合起來的現(xiàn)象纱控。
2、在軟件工程中菜秦,對象之間的耦合度就是對象之間的依賴性甜害。對象之間的耦合越高,維護成本越高球昨,因此對象的設計應使類和構件之間的耦合最小尔店。
3、分類:有軟硬件之間的耦合主慰,還有軟件各模塊之間的耦合嚣州。耦合性是程序結構中各個模塊之間相互關聯(lián)的度量。它取決于各個模塊之間的接口的復雜程度共螺、調用模塊的方式以及哪些信息通過接口该肴。
二争剿、解耦
1形真、解耦,字面意思就是解除耦合關系抱究。
2雏蛮、在軟件工程中涎嚼,降低耦合度即可以理解為解耦,模塊間有依賴關系必然存在耦合底扳,理論上的絕對零耦合是做不到的铸抑,但可以通過一些現(xiàn)有的方法將耦合度降至最低。
3衷模、設計的核心思想:盡可能減少代碼耦合鹊汛,如果發(fā)現(xiàn)代碼耦合,就要采取解耦技術阱冶。讓數據模型刁憋,業(yè)務邏輯和視圖顯示三層之間彼此降低耦合,把關聯(lián)依賴降到最低木蹬,而不至于牽一發(fā)而動全身至耻。原則就是A功能的代碼不要寫在B的功能代碼中,如果兩者之間需要交互镊叁,可以通過接口尘颓,通過消息,甚至可以引入框架晦譬,但總之就是不要直接交叉寫疤苹。
五、RabbitMQ中的概念名詞
Broker:簡單來說就是消息隊列服務器實體敛腌。
Exchange:消息交換機卧土,它指定消息按什么規(guī)則惫皱,路由到哪個隊列。
Queue:消息隊列載體尤莺,每個消息都會被投入到一個或多個隊列旅敷。?Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來颤霎。
Routing Key:路由關鍵字媳谁, exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機捷绑,一個broker里可以開設多個vhost韩脑,用作不同用戶的權限分離。
producer:消息生產者粹污,就是投遞消息的程序段多。
consumer:消息消費者,就是接受消息的程序壮吩。
channel:消息通道进苍,在客戶端的每個連接里,可建立多個channel鸭叙,每個?channel代表一個會話任務觉啊。
六、RabbitMQ工作理
MQ 是消費 - 生產者模型的一個典型的代表沈贝,一端往消息隊列中不斷寫入消息杠人,而另一端則可以讀取或者訂閱隊列中的消息。 MQ 則是遵循了 AMQP協(xié)議的具體實現(xiàn)和產品宋下。在項目中嗡善,將一些無需即時返回且耗時的操作提取出來,進行了異步處理学歧,而這種異步處理的方式大大的節(jié)省了服務器的請求響應時間罩引,從而提高了系統(tǒng)的吞吐量。
( 1)客戶端連接到消息隊列服務器枝笨,打開一個channel袁铐。
( 2)客戶端聲明一個exchange,并設置相關屬性横浑。
( 3)客戶端聲明一個queue剔桨,并設置相關屬性。
( 4)客戶端使用routing key徙融,在exchange和queue之間建立好綁定關系领炫。
( 5)客戶端投遞消息到exchange。
( 6) exchange接收到消息后张咳,就根據消息的key和已經設置的binding帝洪,進?行消息路由,將消息投遞到一個或多個隊列里
七脚猾、Rabbitmq 的 metadata
元數據可以持久化在 RAM 或 Disc. 從這個角度可以把 RabbitMQ 集群中的節(jié)點分成兩種 :RAM Node和 Disk Node.
RAM Node 只會將元數據存放在RAM
Disk node 會將元數據持久化到磁盤葱峡。
單節(jié)點系統(tǒng)就沒有什么選擇了 , 只允許 disk node, 否則由于沒有數據冗余一旦重啟就會丟掉所有的配置信息 . 但在集群環(huán)境中可以選擇哪些節(jié)點是 RAM node.在集群中聲明(declare) 創(chuàng)建 exchange queue binding, 這類操作要等到所有的節(jié)點都完成創(chuàng)建才會返回 :
如果是內存節(jié)點就要修改內存數據 ,
如果是 disk node 就要等待寫磁盤 , 節(jié)點過多這里的速度就會被大大的拖慢 .
有些場景 exchang queue 相當固定 , 變動很少 ,那即使全都是 disc node, 也沒有什么影響 . 如果使用 Rabbitmq 做 RPC( RPC :Remote Procedure Call—遠程過程調用), RPC 或者類似 RPC 的場景這個問題就嚴重了 , 頻繁創(chuàng)建銷毀臨時隊列 , 磁盤讀寫能力就很快成為性能瓶頸了。所以 , 大多數情況下 , 我們盡量把 Node 創(chuàng)建為RAM Node. 這里就有一個問題了 , 要想集群重啟后元數據可以恢復就需要把集群元數據持久化到磁盤 , 那需要規(guī)劃 RabbitMQ 集群中的 RAM Node 和 Disc Node 龙助。
只要有一個節(jié)點是 Disc Node 就能提供條件把集群元數據寫到磁盤 ,RabbitMQ 的確也是這樣要求的 : 集群中只要有一個 disk node 就可以 , 其它的都可以是 RAM node. 節(jié)點加入或退出集群一定至少要通知集群中的一個 disk node 砰奕。
如果集群中 disk node 都宕掉 , 就不要變動集群的元數據 . 聲明 exchange queue 修改用戶權限 , 添加用戶等等這些變動在節(jié)點重啟之后無法恢復 。
有一種情況要求所有的 disk node 都要在線情況在才能操作 , 那就是增加或者移除節(jié)點 .RAM node 啟動的時候會連接到預設的 disk node 下載最新的集群元數據 . 如果你有兩個 disk node(d1 d2), 一個 RAM node 加入的時候你只告訴 d1, 而恰好這個 RAM node 重啟的時候 d1 并沒有啟動 , 重啟就會失敗 . 所以加入 RAM 節(jié)點的時候 , 把所有的disk node 信息都告訴它 ,RAM node 會把 disk node 的信息持久化到磁盤以便后續(xù)啟動可以按圖索驥 .
八提鸟、Rabbitmq 集群部署
一军援、前期準備
(1)條件:準備3臺linux系統(tǒng),確保配置好源称勋,及epel源
(2)三臺機器能夠靜態(tài)解析彼此
(3)設置可以無密鑰登陸
二胸哥、安裝過程:
(1)所有node安裝rabbtimq和erlang軟件包:
yum install -y erlang rabbitmq-server.noarch
systemctl enable rabbitmq-server.service
systemctl start rabbitmq-server.service
systemctl status rabbitmq-server.service
查看監(jiān)聽端口:
netstat -lantp | grep 5672
配置文件:
vim /etc/rabbitmq/rabbitmq.config
(2)node1:修改guest密碼為admin(默認用戶為:guest 密碼為:guest)
rabbitmqctl change_password guest admin
(3)node1:添加一個openstack的用戶,并設密碼為admin赡鲜。并設置權限和成為管理員
node1:
rabbitmqctl add_user openstack admin
rabbitmqctl set_permissions openstack "." "." ".*"
rabbitmqctl set_user_tags openstack administrator
(4)node1:編輯rabbittmq變量文件
vim /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NODE_PORT=5672
ulimit -S -n 4096
RABBITMQ_SERVER_ERL_ARGS="+K true +A30 +P 1048576 -kernel inet_default_connect_options [{nodelay,true},{raw,6,18,<<5000:64/native>>}] -kernel inet_default_listen_options [{raw,6,18,<<5000:64/native>>}]"
RABBITMQ_NODE_IP_ADDRESS=172.16.254.60
(5)node1:將rabbittmq變量文件拷貝到其他兩節(jié)點空厌,之后并修改相應節(jié)點的ip
scp /etc/rabbitmq/rabbitmq-env.conf con2:/etc/rabbitmq/
scp /etc/rabbitmq/rabbitmq-env.conf con3:/etc/rabbitmq/
查看rabbitmq插件
/usr/lib/rabbitmq/bin/rabbitmq-plugins list
(6)所有node 開啟rabbitmq的web管理頁面
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management mochiweb webmachine rabbitmq_web_dispatch amqp_client rabbitmq_management_agent
或者:rabbitmq-plugins enable rabbitmq_management
systemctl restart rabbitmq-server.service
systemctl status rabbitmq-server.service
(7)node1發(fā)送erlang.cookie到其他節(jié)點配置集群
rabbitmqctl cluster_status
scp /var/lib/rabbitmq/.erlang.cookie con2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie con3:/var/lib/rabbitmq/.erlang.cookie
(8)node2和node3停止應用,并以ram的方式加入node1節(jié)點银酬,之后重啟應用
systemctl restart rabbitmq-server.service
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@con1
rabbitmqctl start_app
(9)node1檢查集群狀態(tài)
[root@con1 conf]# rabbitmqctl cluster_status
Cluster status of node rabbit@con1 ...
[{nodes,[{disc,[rabbit@con1]},{ram,[rabbit@con3,rabbit@con2]}]},
{running_nodes,[rabbit@con3,rabbit@con2,rabbit@con1]},
{cluster_name,<<"rabbit@con1">>},
{partitions,[]},
{alarms,[{rabbit@con3,[]},{rabbit@con2,[]},{rabbit@con1,[]}]}]
(10)登陸驗證:http://172.16.254.60:15672/#/ guest/admin
其他命令:
(1)添加管理員:
rabbitmqctl add_user mqadmin mqadmin
rabbitmqctl set_user_tags mqadmin administrator
rabbitmqctl set_permissions -p / mqadmin "." "." ".*"
(2)更改節(jié)點類型(內存型或磁盤型)
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc 或 rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
(3)從集群移除節(jié)點(或者重置節(jié)點)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
(4)從某個節(jié)點移除集群中其他節(jié)點
rabbitmqctl forget_cluster_node rabbit@node3
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
1. 保證集群中至少有一個磁盤類型的節(jié)點以防數據丟失嘲更,在更改節(jié)點類型時尤其要注意。
2. 若整個集群被停掉了揩瞪,應保證最后一個 down 掉的節(jié)點被最先啟動赋朦,若不能則要使用 forget_cluster_node 命令將其移出集群
3. 若集群中節(jié)點幾乎同時以不可控的方式 down 了此時在其中一個節(jié)點使用 force_boot 命令重啟節(jié)點
[云計算openstack共享組件——Memcache 緩存系統(tǒng)(4)
一、緩存系統(tǒng)
一李破、靜態(tài)web頁面:
1宠哄、在靜態(tài)Web程序中,客戶端使用Web瀏覽器(IE喷屋、FireFox等)經過網絡(Network)連接到服務器上琳拨,使用HTTP協(xié)議發(fā)起一個請求(Request),告訴服務器我現(xiàn)在需要得到哪個頁面屯曹,所有的請求交給Web服務器狱庇,之后WEB服務器根據用戶的需要,從文件系統(tǒng)(存放了所有靜態(tài)頁面的磁盤)取出內容恶耽。之后通過Web服務器返回給客戶端密任,客戶端接收到內容之后經過瀏覽器渲染解析,得到顯示的效果偷俭。
2浪讳、為了讓靜態(tài)web頁面顯示更加好看,使用javascript/VBScript/ajax(AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML)涌萤,是指一種創(chuàng)建交互式網頁應用的網頁開發(fā)技術淹遵。)但是這些特效都是在客戶端上借助于瀏覽器展現(xiàn)給用戶的口猜,所以在服務器上本身并沒有任何的變化。
3透揣、靜態(tài)web無法連接數據庫济炎;
4、靜態(tài)web資源開發(fā)技術:HTML辐真;
5须尚、由于現(xiàn)在的web頁面中,大量使用JS侍咱,導致瀏覽器打開頁面耐床,就會占用大量的內存,服務端的壓力是減輕了楔脯,但壓力轉移到了客戶端撩轰。
二、動態(tài)web頁面:
1淤年、動態(tài)WEB中钧敞,程序依然使用客戶端和服務端,客戶端依然使用瀏覽器(IE麸粮、FireFox等)溉苛,通過網絡(Network)連接到服務器上,使用HTTP協(xié)議發(fā)起請求(Request)弄诲,現(xiàn)在的所有請求都先經過一個WEB Server來處理愚战。
如果客戶端請求的是靜態(tài)資源(.htm或者是.htm),則將請求直接轉交給WEB服務器齐遵,之后WEB服務器從文件系統(tǒng)中取出內容寂玲,發(fā)送回客戶端瀏覽器進行解析執(zhí)行。
2梗摇、如果客戶端請求的是動態(tài)資源(.jsp拓哟、.asp/.aspx、.php)伶授,則先將請求轉交給WEB Container(WEB容器)断序,在WEB Container中連接數據庫,從數據庫中取出數據等一系列操作后動態(tài)拼湊頁面的展示內容糜烹,拼湊頁面的展示內容后违诗,把所有的展示內容交給WEB服務器,之后通過WEB服務器將內容發(fā)送回客戶端瀏覽器進行解析執(zhí)行疮蹦。
在大型海量并發(fā)訪問網站及openstack等集群中诸迟,對于關系型數據庫,尤其是大型關系型數據庫,如果對其進行每秒上萬次的并發(fā)訪問阵苇,并且每次訪問都在一個有上億條記錄的數據表中查詢某條記錄時壁公,其效率會非常低,對數據庫而言绅项,這也是無法承受的贮尖。
緩沖系統(tǒng)的使用可以很好的解決大型并發(fā)數據訪問所帶來的效率低下和數據庫壓力等問題,緩存系統(tǒng)將經常使用的活躍數據存儲在內存中避免了訪問重復數據時趁怔,數據庫查詢所帶來的頻繁磁盤i/o和大型關系表查詢時的時間開銷,因此緩存系統(tǒng)幾乎是大型網站的必備功能模塊薪前。
緩存系統(tǒng)可以認為是基于內存的數據庫润努,相對于后端大型生產數據庫而言基于內存的緩存數據庫能夠提供快速的數據訪問操作,從而提高客戶端的數據請求訪問反饋示括,并降低后端數據庫的訪問壓力铺浇。
二、Memcached概念
Memcached 是一個開源的垛膝、高性能的分布式內存對象緩存系統(tǒng)鳍侣。通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高網站訪問速度吼拥,加速動態(tài)WEB應用倚聚、減輕數據庫負載。
Memcached是一種內存緩存凿可,把經常需要存取的對象或數據緩存在內存中惑折,內存中,緩存的這些數據通過API的方式被存取枯跑,數據經過利用HASH之后被存放到位于內存上的HASH表內惨驶,HASH表中的數據以key-value的形式存放,由于Memcached沒有實現(xiàn)訪問認證及安全管理控制敛助,因此在面向internet的系統(tǒng)架構中粗卜,Memcached服務器通常位于用戶的安全區(qū)域。
當Memcached服務器節(jié)點的物理內存剩余空間不足纳击,Memcached將使用最近最少使用算法(LRU续扔,LastRecentlyUsed)對最近不活躍的數據進行清理,從而整理出新的內存空間存放需要存儲的數據评疗。
Memcached在解決大規(guī)模集群數據緩存的諸多難題上有具有非常明顯的優(yōu)勢并且還易于進行二次開發(fā)测砂,因此越來越多的用戶將其作為集群緩存系統(tǒng),此外百匆,Memcached開放式的API砌些,使得大多數的程序語言都能使用Memcached,如javac、C/C++C#存璃,Perl仑荐、python、PHP纵东、Ruby 各種流行的編程語言粘招。
由于Memcached的諸多優(yōu)勢,其已經成為眾多開源項目的首選集群緩存系統(tǒng)偎球。如openstacksd的keystone身份認證項目洒扎。就會利用Memcached來緩存租戶的Token等身份信息,從而在用戶登陸驗證時無需查詢存儲在MySQL后端數據庫中的用戶信息衰絮,這在數據庫高負荷運行下的大型openstack集群中能夠極大地提高用戶的身份驗證過程袍冷,在如web管理界面Horizon和對象存儲Swift項目也都會利用Memcached來緩存數據以提高客戶端的訪問請求響應速率。
三猫牡、Memcached緩存流程
1. 檢查客戶端請求的數據是否在 Memcache 中胡诗,如果存在,直接將請求的數據返回淌友,不在對數據進行任何操作煌恢。
2. 如果請求的數據不在 Memcache 中,就去數據庫查詢震庭,把從數據庫中獲取的數據返回給客戶端瑰抵,同時把數據緩存一份 Memcache 中
3. 每次更新數據庫的同時更新 Memcache 中的數據庫。確保數據信息一致性归薛。
- 當分配給 Memcache 內存空間用完后谍憔,會使用LRU(least Recently Used ,最近最少使用 ) 策略加到其失效策略主籍,失效的數據首先被替換掉习贫,然后在替換掉最近未使用的數據。
四千元、Memcached功能特點
協(xié)議簡單
其使用基于文本行的協(xié)議苫昌,能直接通過 telnet 在Memcached 服務器上存取數據基于 libevent 的事件處理
libevent 利用 C 開發(fā)的程序庫,它將 BSD 系統(tǒng)的kqueue,Linux 系統(tǒng)的 epoll 等事件處理功能封裝成為一個接口幸海,確保即使服務器端的鏈接數祟身。加也能發(fā)揮很好的性能。 Memcached 利用這個庫進行異步事件處理物独。內置的內存管理方式
Memcached 有一套自己管理內存的方式袜硫,這套方式非常高效,所有的數據都保存在Memcached內置的內存中挡篓,當存入的數據占滿空間時婉陷,使用 LRU 算法自動刪除不使用的緩存帚称,即重用過期的內存空間。Memecached 不考慮數據的容災問題秽澳,一旦重啟所有數據全部丟失闯睹。節(jié)點相互獨立的分布式
各個 Memecached 服務器之間互不通信,都是獨立的存取數據担神,不共享任何信息楼吃。通過對客戶端的設計,讓 Memcached 具有分布式妄讯,能支持海量緩存和大規(guī)模應用孩锡。
五、使用Memcached應該考慮的因素
1. Memcached服務單點故障
在Memcached集群系統(tǒng)中每個節(jié)點獨立存取數據亥贸,彼此不存在數據同步鏡像機制浮创,如果一個Memcached節(jié)點故障或者重啟,則該節(jié)點緩存在內存的數據全部會丟失砌函,再次訪問時數據再次緩存到該服務器
2. 存儲空間限制
Memcache緩存系統(tǒng)的數據存儲在內存中,必然會受到尋址空間大小的限制溜族,32為系統(tǒng)可以緩存的數據為2G讹俊,64位系統(tǒng)緩存的數據可以是無限的,要看Memcached服務器物理內存足夠大即可
3. 存儲單元限制
Memcache緩存系統(tǒng)以 key-value 為單元進行數據存儲煌抒,能夠存儲的數據key尺寸大小為250字節(jié)仍劈,能夠存儲的value尺寸大小為1MB,超過這個值不允許存儲
4. 數據碎片
Memcache緩存系統(tǒng)的內存存儲單元是按照Chunk來分配的寡壮,這意味著不可能贩疙,所有存儲的value數據大小正好等于一個Chunk的大小,因此必然會造成內存碎片况既,而浪費存儲空間
5. 利舊算法局限性
Memcache緩存系統(tǒng)的LRU算法这溅,并不是針對全局空間的存儲數據的,而是針對Slab的棒仍,Slab是Memcached中具有同樣大小的多個Chunk集合
6.數據訪問安全性
Memcache緩存系統(tǒng)的慢慢Memcached服務端并沒有相應的安全認證機制通過悲靴,通過非加密的telnet連接即可對Memcached服務器端的數據進行各種操作