亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

部署Memcache服務

發布時間:2020-08-07 01:31:35 來源:網絡 閱讀:207 作者:mb5d03569e7eb16 欄目:系統運維

博文結構
Memcache簡介
Memcache工作流程
Memcache調度算法
Memcache實現原理
安裝Memcache

一.Memcache簡介

Memcache是一套自由、開源、高性能、分布式的高速緩存系統。由于Memcache通過在內存中緩存數據和對象來減少讀取數據庫的次數。目前被許多網站使用以提升網站的訪問速度,尤其對于一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著。

memcache是一套分布式的高速緩存系統,可以提高網站訪問的速度,尤其是對于一些大型的公司或者頻繁訪問數據庫的網站訪問速度提升效果十分顯著,memecache是一個開源免費的軟件,memcache通過鍵值對的方式將數據緩存在內存當中,減少從后端數據庫讀取數據的次數。

二.Memcache工作流程

MemCache 雖然被稱為”分布式緩存”,但是 MemCache 本身完全不具備 分布式的功能,MemCache 集群之間不會相互通信(與之形成對比的,比如 JBoss Cache,某 臺服務器有緩存數據更新時,會通知集群中其他機器更新緩存或清除緩存數據),所謂的” 分布式”,完全依賴于客戶端程序的實現,就像上面這張圖的流程一樣。 同時基于這張圖,理一下 MemCache 一次寫緩存的流程:

部署Memcache服務

(1)應用程序輸入需要寫入緩存的數據;

(2)API將Key輸入路由算法模塊,理由算法根據Key和Memcache集群服務器列表得到服務器的編號;

(3)由服務器編號得到Memcache及其IP地址和端口號;

(4)API調用通信模塊和指定編號的服務器通信,講數據寫入該服務器,完成一次分布式緩存的寫操作;

三、Memcache調度算法

  • 余數Hash

簡單的路由算法可以使用余數 Hash:用服務器數目和緩存數據 KEY 的 hash 值相除,余數為服 務器列表下標編號,假如某個 str 對應的 HashCode 是 52、服務器的數目是 3,取余數得到 1, str 對應節點 Node1,所以路由算法把 str 路由到 Node1 服務器上。由于 HashCode 隨機性比 較強,所以使用余數 Hash 路由算法就可以保證緩存數據在整個 MemCache 服務器集群中有 比較均衡的分布。

比如Memcache服務器集群由3臺變成4臺,假設有HashCode為0~19的20個數據,如圖

部署Memcache服務

現在擴容到 4 臺,加粗標紅的表示命中

部署Memcache服務

在網站業務中,大部分的業務數據度操作請求上事實上是 通過緩存獲取的,只有少量讀操作會訪問數據庫,因此數據庫的負載能力是以有緩存為前提 而設計的。當大部分被緩存了的數據因為服務器擴容而不能正確讀取時,這些數據訪問的壓 力就落在了數據庫的身上,這將大大超過數據庫的負載能力,嚴重的可能會導致數據庫宕機。
這個問題有解決方案,解決步驟為:

(1)在網站訪問量低谷,通常是深夜,技術團隊加班,擴容、重啟服務器 
(2)通過模擬請求的方式逐漸預熱緩存,使緩存服務器中的數據重新分布 
  • 一致性 Hash 算法

一致性 Hash 算法通過一個叫做一致性 Hash 環的數據結構實現 Key 到緩存服務器的 Hash 映射。
簡單地說,一致性哈希將整個哈希值空間組織成一個虛擬的圓環(這個環被稱為一致性 Hash 環),如假設某空間哈希函數 H 的值空間是 0~2^32-1(即哈希值是一個 32 位無符號),整個哈希空間如下:

部署Memcache服務

然后將各個服務器使用 H 進行一個哈希計算,具體可以使用服務器的 IP 地址或者主機名 作為關鍵字,這樣每臺機器能確定其在上面的哈希環上的位置了,并且是按照順時針排列, 這里我們假設三臺節點 memcache 經計算后位置如下 :

部署Memcache服務

接下來使用相同算法計算出數據的哈希值 h,并由此確定數據在此哈希環上的位置 假如我們有數據 A、B、C、D、4 個對象,經過哈希計算后位置如下:

部署Memcache服務

根據一致性哈希算法,數據 A 就被綁定到了 server01 上,D 被綁定到了 server02 上,B、C 在 server03 上,是按照順時針找最近服務節點方法 。
這樣得到的哈希環調度方法,有很高的容錯性和可擴展性:

假設 server03 當機:

部署Memcache服務

可以看到此時 C、B 會受到影響,將 B、C 節點被重定位到 Server01。一般的,在一致性哈希 算法中,如果一臺服務器不可用,則受影響的數據僅僅是此服務器到其環空間中前一臺服務 器(即順著逆時針方向行走遇到的第一臺服務器)之間數據,其它不會受到影響。 考慮另外一種情況,如果我們在系統中增加一臺服務器 Memcached Server 04:

部署Memcache服務

此時 A、D、C 不受影響,只有 B 需要重定位到新的 Server04。

一致性哈希算法對于節點的增減都只需重定位環空間中的一小部分數據,
具有較好的容錯性和可擴展性

一致性哈希的缺點:在服務節點太少時,容易因為節點分部不均勻而造成數據傾斜問題。我 們可以采用增加虛擬節點的方式解決。 更重要的是,集群中緩存服務器節點越多,增加/減少節點帶來的影響越小,很好理解。換 句話說,隨著集群規模的增大,繼續命中原有緩存數據的概率會越來越大,雖然仍然有小部 分數據緩存在服務器中不能被讀到,但是這個比例足夠小,即使訪問數據庫,也不會對數據 庫造成致命的負載壓力。

四.MemCache實現原理

Memcache的數據存放在內存中,32位機器最多只能使用2GB的內存弓箭,64位機器可以認為沒有顯示
如圖:Memcache的數據存儲機制(內存分配機制): 固定空間分配

部署Memcache服務

(1)Memcache將內存空間分為一組slab;
(2)每個slab下又有若干個page,每個page默認是1M,如果一個slab占用100M內存的話,那么這個slab下應該有100個page;
(3)每個page里面包含一組chunk,chunk是真正存放數據的地方,同一個slab里面的chunk的大小是固定的;
(4)有相同大小chunk的slab被組織在一起,稱為slab_class;

Memcache內存分配的方式稱為allocator(分配運算),slab的數量是有限的,幾個、十幾個或者幾十個,這個和啟動參數的配置相關;

Memcache中的value存放的地方是由value的大小決定的,value總是會存放到與chunk大小最接近的一個slab中。

Memcache的特點:

  • 訪問數據庫的速度比傳統的關系型數據庫要快(因為Memcache是存放在內存中的,而傳統的關系型數據庫是存放在磁盤中);
  • Memcache的數據存放在內存中,就意味著只要Memcache重啟,數據便會丟失。
  • 由于現在大部分都是64位操作系統,這里就不介紹內存對32位系統的影響了;

memcache的工作流程

部署Memcache服務

1、檢查客戶端的請求數據是否在 memcached 中,如果有,直接把請求數據返回,不再對數據庫進行任何操作,路徑操作為①②③⑦;
2、如果請求的數據不在 memcached 中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到 memcached 中(memcached 客戶端不負責,需要程序明確實現),路徑操作為①②④⑤⑦⑥;
3、每次更新數據庫的同時更新 memcached 中的數據,保證一致性;
4、當分配給 memcached 內存空間用完之后,會使用 LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,然后再替換掉最近未使用的數據;

Memcached的特征

  • 基于文本行協議:常見的協議http、ftp、smtp都是基于文本行的,所謂基于文本行,指的是信息以文本傳遞

  • 基于libevent事件處理:libevent是利用c語言開發的程序庫,bsd系統的kqueue(BSD是unix的衍生版本),linux系統的epoll等事件,所有數據都保存在內存中,數據訪問速度塊

  • 所有數據都保存在內存中,數據訪問速度塊

分布式

各個memcached服務器之間互不通信,各自獨立存取數據,不共享任何信息,服務器并不具備分布式功能,分布式部署取決于memcache客戶端,Memcache的安裝分為兩個過程,memcache服務器端的安裝和memcached客戶端的安裝

五.安裝Memcache

Memcache的搭建需要借助于LAMP或LNMP,本篇博文采用LNMP結構

安裝環境如下:
192.168.148.129   Memcache
192.168.148.130   php
192.168.148.131   nginx
192.168.148.136   mysql
  • 安裝nginx

下載nginx軟件包

[root@bogon ~]#  useradd -M -s /sbin/nologin nginx
[root@bogon ~]#  yum -y install openssl-devel
[root@bogon ~]# tar zxf pcre-8.39.tar.gz -C /usr/src
[root@bogon ~]#  tar zxf zlib-1.2.8.tar.gz -C /usr/src
[root@bogon ~]#  tar zxf nginx-1.14.0.tar.gz -C /usr/src
[root@bogon ~]#  cd /usr/src/nginx-1.14.0/
[root@bogon  nginx-1.14.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx --with-http_dav_module \
--with-http_stub_status_module --with-http_addition_module \
--with-http_sub_module --with-http_flv_module --with-http_mp4_module \
--with-pcre=/usr/src/pcre-8.39 --with-zlib=/usr/src/zlib-1.2.8 \
--with-http_ssl_module --with-http_gzip_static_module && make && make install
[root@bogon ~]#  ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
[root@bogon ~]#  nginx
[root@bogon ~]#  netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      8460/nginx: master  
  • 安裝PHP服務器

下載php軟件包

[root@localhost ~]# yum -y install libxml2-devel lzip2-devel libcurl-devel  libmcrypt-devel openssl-devel bzip2-devel 
[root@localhost ~]# tar zxf libmcrypt-2.5.7.tar.gz 
[root@localhost ~]# cd libmcrypt-2.5.7/
[root@localhost libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install
[root@localhost ~]# tar zxf php-5.6.27.tar.gz 
[root@localhost ~]# cd php-5.6.27/
[root@localhost php-5.6.27]# ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets \
--enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib \
--with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt  \
--with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d \
--with-bz2 --enable-maintainer-zts && make && make install
[root@localhost php-5.6.27]# cp php.ini-production /etc/php.ini
[root@localhost php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.6.27]# chmod +x /etc/init.d/php-fpm 
[root@localhost php-5.6.27]# chkconfig --add php-fpm
[root@localhost php-5.6.27]# chkconfig php-fpm on
[root@localhost php-5.6.27]# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf
[root@localhost php-5.6.27]# vim /usr/local/php5.6/etc/php-fpm.conf
修改內容如下: 
pid = run/php-fpm.pid 
listen = 192.168.31.141:9000    \\本地ip地址(千萬不能用127.0.0.1)
pm.max_children = 50 
pm.start_servers = 5 
pm.min_spare_servers = 5 
pm.max_spare_servers = 35 
[root@localhost php-5.6.27]# service php-fpm start
Starting php-fpm  done
[root@localhost php-5.6.27]# netstat -anpt | grep php-fpm
tcp        0      0 192.168.148.130:9000    0.0.0.0:*               LISTEN      130988/php-fpm: mas 
  • 安裝MySQL數據庫

下載mysql腳本一鍵安裝

[root@bogon ~]# mysql -u root -p123
mysql> create database testdb1;
mysql> use testdb1;
mysql> grant all on *.* to xws@'192.168.148.%' identified by '123456';
mysql> create table test1(id int not null auto_increment,name varchar(20) default null,primary  key (id)) engine=innodb auto_increment=1 default charset=utf8;
mysql> insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');
mysql> select * from test1;
+----+------+
| id | name |
+----+------+
|  1 | tom1 |
|  2 | tom2 |
|  3 | tom3 |
|  4 | tom4 |
|  5 | tom5 |
+----+------+
5 rows in set (0.00 sec)
nginx操作如下:
[root@bogon nginx-1.14.0]# vim /usr/local/nginx/conf/nginx.conf  //修改如下(大約在43行)

        location / {
            root   html;
            index  index.php index.html index.htm;
        }
          location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   192.168.148.130:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
[root@bogon nginx-1.14.0]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@bogon nginx-1.14.0]# nginx -s reload

php操作如下:

[root@bogon ~]# mkdir -p /var/www/html
[root@bogon ~]# vim /var/www/html/test.php
<?php
phpinfo();
?>
[root@bogon ~]# vim /var/www/html/test1.php
<?php
$link=mysqli_connect('192.168.148.136','xws','123456');
if($link) echo "恭喜你,數據庫連接成功!!!"; else echo "connect shibai";
mysqli_close($link);
?>

客戶端訪問如下

部署Memcache服務

部署Memcache服務

  • 安裝Memecache

下載memcache

[root@bogon ~]# tar zxf libevent-2.0.22-stable.tar.gz -C /usr/src/
[root@bogon ~]# cd /usr/src/libevent-2.0.22-stable/
[root@bogon libevent-2.0.22-stable]# ./configure && make && make install 
[root@bogon ~]# tar zxf memcached-1.4.33.tar.gz -C /usr/src/
[root@bogon ~]# cd /usr/src/memcached-1.4.33/
[root@bogon memcached-1.4.33]# ./configure --prefix=/usr/local/memcached \
> --with-libevent=/usr/local/ && make && make install
[root@bogon ~]# memcached -d -m 2048 -l 192.168.1.7 -p 11211 -c 10240 -P /usr/local/memcached/memcached.pid -u root
[root@bogon ~]# netstat -anpt | grep 11211
  • php操作如下(安裝Memecache客戶端)
[root@bogon ~]# tar zxf memcache-3.0.8.tgz -C /usr/src/
[root@bogon ~]# cd /usr/src/memcache-3.0.8/
[root@bogon memcache-3.0.8]# /usr/local/php5.6/bin/phpize
[root@PHP memcache-3.0.8]# ./configure --enable-memcache \
--with-php-config=/usr/local/php/bin/php-config && make && make install
//執行后會顯示memcache.so存放的路徑
[root@PHP ~]# echo "extension = /usr/local/php/lib/php/extensions/no-debug-zts-20131226/memcache.so" >> /etc/php.ini
//在PHP主配置文件中填寫memcache.so模塊存放的路徑
[root@PHP ~]# systemctl restart php-fpm
[root@PHP ~]# vim /var/www/html/test2.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.1.129', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 600) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 600 seconds)<br/>";
$get_result = $memcache->get('key');
echo "Data from the cache:<br/>";
var_dump($get_result);
?>
//此測試腳本是顯示memcached的版本
//并且向里面插入了一個緩存時間為600秒的鍵值對“test=123”,其ID為“key”

客戶端訪問如下:

部署Memcache服務

在PHP服務器上安裝telnet工具測試

[root@PHP ~]# yum -y install telnet
[root@PHP ~]# telnet 192.168.148.129 11211           //登陸到memcached的11211端口
Trying 192.168.148.129...
Connected to 192.168.148.129.
Escape character is '^]'.
get key              //查詢ID為“key”的鍵值對,可以看到我們測試腳本寫入的“test=123”
VALUE key 1 66
O:8:"stdClass":2:{s:8:"str_attr";s:4:"test";s:8:"int_attr";i:123;}
END
//在進行上面的get驗證時,需要將test2.php文件中插入的鍵值對的保存時間值改大一些
//或者重新訪問一下,以免緩存失效,查詢不到
quit                     //退出當前環境
Connection closed by foreign host.
[root@PHP ~]# 
測試Memcache緩存數據庫
[root@PHP ~]# vim /var/www/html/test4.php 
<?php
$memcachehost = '192.168.1.7';                      //指定Memcache服務器地址
$memcacheport = 11211;                                 //指定其開放的端口號
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from test1 limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
$conn=mysql_connect("192.168.1.8","lzj","123456");                        //指定數據庫服務器的IP地址、用戶及密碼
mysql_select_db(testdb1);
$result=mysql_query($query);
while ($row=mysql_fetch_assoc($result))
{
$arr[]=$row;
}
$f = 'mysql';
$memcache->add($key,serialize($arr),0,30);
$data = $arr ;
}
else{
$f = 'memcache';
$data_mem=$memcache->get($key);
$data = unserialize($data_mem);
}
echo $f;
echo "<br>";
echo "$key";
echo "<br>";
//print_r($data); 
foreach($data as $a)
{
echo "number is <b><font color=#FF0000>$a[id]</font></b>";
echo "<br>";
echo "name is <b><font color=#FF0000>$a[name]</font></b>";                    //突出顯示信息的字體顏色
echo "<br>";
}
?>
//經常需要修改的地方已經標注了!而且這個測試腳本在Memcache軟件中也有
第一次進行訪問

部署Memcache服務

第二次進行訪問(刷新之后)

部署Memcache服務

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通州市| 景谷| 扶绥县| 绥滨县| 新巴尔虎左旗| 祁东县| 钟祥市| 沈丘县| 含山县| 长岭县| 文水县| 洛川县| 柘城县| 大埔区| 高州市| 大同县| 喜德县| 区。| 东方市| 通化市| 海丰县| 新疆| 英德市| 民乐县| 开原市| 监利县| 尼勒克县| 凉城县| 大冶市| 项城市| 古浪县| 神木县| 巧家县| 大埔区| 仪陇县| 来凤县| 开化县| 烟台市| 大兴区| 体育| 贡觉县|