mysql 觸發器 Varnish:高速http緩存 varnish cdn 推送平臺

sendfile(數據直接從 kernal的buffer出去)適合小文件
Aio(nginx)全異步(與事件驅動io的區別是:數據會到達mem纔會通知,其實也不需要通知 可以直接返回給客戶端) 支持:mmap event drive(處理大文件)

上一回說到,在數據庫修改後,redis裏面的數據不能做到自動更新,必須手動刪除更改過的數據 根據以上問題我們做出如下改進:
所以接下來就要通過 mysql 觸發器將改變的數據同步到 redis 中

配置 gearman 實現數據同步
Gearman 是一個支持分佈式的任務分發框架:
Gearman Job Server: Gearman 核心程序,需要編譯安裝並以守護進程形式運行在後臺。
Gearman Client:可以理解爲任務的請求者。
Gearman Worker:任務的真正執行者,一般需要自己編寫具體邏輯並通過守護進程方式
運行,Gearman Worker 接收到 GearmanClient 傳遞的任務內容後,會按順序處理。

大致流程:下面要編寫的 mysql 觸發器,就相當於 Gearman 的客戶端。修改表,插入表就相當於直接
下發任務。然後通過 lib_mysqludf_json UDF 庫函數將關係數據映射爲 JSON 格式,然後
在通過 gearman-mysql-udf 插件將任務加入到Gearman 的任務隊列中,最後通過
redis_worker.php,也就是 Gearman 的worker 端來完成 redis 數據庫的更新。

dd1:
cd /root/redis
安裝gearman軟件包:
yum install gearmand-1.1.8-2.el6.x86_64.rpm libgearman-1.1.8-2.el6.x86_64.rpm
/etc/init.d/php-fpm start
netstat -antlpe
wKiom1jiVOTR-yC8AAEb2IV4LEs326.png-wh_50
dd1:
安裝php的gearman擴展
tar zxf gearman-1.1.2.tgz
cd gearman-1.1.2
phpize
rpm -ivh libgearman-devel-1.1.8-2.el6.x86_64.rpmlibevent-devel-1.4.13-4.el6.x86_64.rpm libevent-doc-1.4.13-4.el6.noarch.rpmlibevent-headers-1.4.13-4.el6.noarch.rpm
./configure
make && make install
cd /etc/php.d/
cp mysql.ini gearman.ini
vim gearman.ini

wKioL1jiVPHQWQMoAAA6rd766f8147.png-wh_50
/etc/init.d/php-fpm restart

查看php已經安裝過的擴展:
php -m | grep gearman
php -m | grep mysql
php -m | grep redis

wKiom1jiVP3AkwqyAAE6Ur-8rOA619.png-wh_50
cd redis/
scp gearman-mysql-udf-0.6.tar.gz 172.25.42.12
scp lib_mysqludf_json-master.zip 172.25.42.12:
scp libevent-* libgearman-* 172.25.42.12:


dd3:
/etc/init.d/mysqld start
tar zxf gearman-mysql-udf-0.6.tar.gz
yum install mysql-devel -y
rpm -ivh libgearman-devel-1.1.8-2.el6.x86_64.rpmlibevent-devel-1.4.13-4.el6.x86_64.rpm libevent-doc-1.4.13-4.el6.noarch.rpmlibevent-headers-1.4.13-4.el6.noarch.rpm
cd gearman-mysql-udf-0.6
./configure --libdir=/usr/lib64/mysql/plugin/
make && make install
cd /usr/lib64/mysql/plugin/

進入mysql環境:
註冊 UDF 函數
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME
'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_servers_set RETURNS STRINGSONAME
'libgearman_mysql_udf.so';

查看函數
mysql> select * from mysql.func;
wKiom1jiVQjgvfssAAEbDvW25nE368.png-wh_50
安裝 lib_mysqludf_json
lib_mysqludf_jsonUDF 庫函數將關係數據映射爲 JSON 格式。通常,數據庫中的數據映射爲 JSON 格式,是通過程序來轉換的
unzip lib_mysqludf_json-master.zip
cd lib_mysqludf_json-maste
gcc $(mysql_config --cflags) -shared -fPIC -olib_mysqludf_json.so
lib_mysqludf_json.c

查看 mysql 的模塊目錄:
mysql> show global variables like 'plugin_dir'
拷貝 lib_mysqludf_json.so 模塊:
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
註冊 UDF 函數
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
'lib_mysqludf_json.so'

查看函數
mysql> select * from mysql.func;
wKioL1jiVRfDGZoFAAEhotf5aeQ938.png-wh_50
指定 gearman 的服務信息
mysql>SELECT gman_servers_set('172.25.42.10:4730');
編寫 mysql 觸發器 test.sql

wKiom1jiVSLBrhlQAADbVMv5G4Y467.png-wh_50
mysql < test.sql
查看觸發器
mysql> SHOW TRIGGERS FROM test

wKioL1jiVTCyNak7AADmPj-JVY0142.png-wh_50

wKioL1jiVTGwnIDwAADcWSWDWd8026.png-wh_50


dd1:
編寫 gearman 的 worker 端
nohup php worker.php &>/dev/null & (後臺運行)
wKiom1jiVT2QsUEvAADXLRi999U109.png-wh_50
測試:
更新 mysql 中的數據

wKioL1jiVUjzbLpLAACsg-Qocfo076.png-wh_50
mysql> update test set name='test1' where id=1
wKiom1jiVVPBxiRDAABnC_p9V1A094.png-wh_50
mysql> update test set name='dangdang' where id=1

wKioL1jiVWPCRvODAACcboIViRE263.png-wh_50

wKiom1jiVWTx_rUeAABspmQhL8M437.png-wh_50


Varnish:高速http緩存:
dd1:
varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
rpm –ivh

wKioL1jiVXDjA21yAACrKkeZn28769.png-wh_50
vim /etc/sysconfig/varnish

wKiom1jiVX7wNlciAAEarwUXq2A945.png-wh_50
cd /etc/varnish/
vim default.vcl

wKioL1jiVYmiR8ntAADu8nFQKTU032.png-wh_50
/etc/init.d/varnish start

dd3:/etc/init.d/httpd start
wKiom1jiVZOAJhUeAAAtZcVsNqo596.png-wh_50
###
通過 varnishadm 手動清除緩存
# varnishadm ban.url .*$
#清除所有
# varnishadm ban.url /index.html
#清除 index.html 頁面緩存
# varnishadm ban.url /admin/$
#清除 admin 目錄緩存


vim default.vcl
###
查看緩存命中情況
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}

測試緩存命中:

wKiom1jiVaTToGcAAACRkAiKGY8831.png-wh_50

wKioL1jiVaXz7UF8AACSVny81gU745.png-wh_50


定義多個不同域名站點的後端服務器:
backend default {
  .host = "172.25.42.12";
  .port = "80";
}

backend web {
  .host = "172.25.42.11";
  .port = "80";
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?dd.org") {
set req.http.host = "www.dd.org";
set req.backend = default;
} elsif (req.http.host ~ "^bbs.dd.org") {
set req.backend = web;
} else {error 404 "westos cache";
}
測試:www.dd.org 和 dd.org 是同一個緩存

wKioL1jiVbKjXO78AAAqHZNhKpQ827.png-wh_50 

而bbs.dd.org是一個緩存

wKiom1jiVb2TXb0WAAA2cw9AiAg006.png-wh_50


#
當訪問 www.dd.org 域名時從 default 上取數據,訪問 bbs.dd.org 域名時到web 取數據,訪問其他頁面報錯 //注意:測試主機加解析

負載均衡:(域名負載均衡)
訪問www.dd.org 時 兩臺主機響應它
避免再開一臺虛擬機 給dd2 做虛擬主機(一個ip 多個域名)
wKioL1jiVcrS6yRSAAD6bR8ezJ4470.png-wh_50
dd1:

vim default.vcl
director lb round-robin {
{.backend = default;}
{.backend = web;}
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?dd.org") {
set req.http.host = "www.dd.org";
set req.backend = lb;
return (pass); (
測試用)
} elsif (req.http.host ~ "^bbs.dd.org") {
set req.backend = web;
} else {error 404 "westos cache";
}
}

wKiom1jiVd_Q52y4AACj8ez_h5s125.png-wh_50

wKiom1jiVd_RFvoGAAAvlvNMdRU852.png-wh_50

wKioL1jiVd_Ruf9HAAAu6VTqix8443.png-wh_50


varnish cdn 推送平臺 (清空緩存)
#需要安裝 php 支持
# unzip bansys.zip -d /var/www/html
# vi /var/www/html/bansys/config.php
#只保留如下設置,其餘註釋掉
<?php
$var_group1 = array(
'host' => array('172.25.42.10'),
'port' => '80',
);
//varnish 羣組定義
//對主機列表進行綁定
$VAR_CLUSTER = array(
'www.dd.org' => $var_group1,
);

vim /etc/varnish/default.vcl
/etc/init.d/varnish reload

測試:

wKiom1jiVfDwBJBpAABVRaS5GXM386.png-wh_50


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章