用redis做mysql緩存器

實驗環境
server5    lnmp架構   172.25.11.5
server6    redis      172.25.11.6
server7    mysql端    172.25.11.7
在server5中:

1.安裝nginx和php

cd redis/
yum install -y nginx-1.8.0-1.el6.ngx.x86_64.rpm 
php-5.3.3-38.el6.x86_64.rpm
php-cli-5.3.3-38.el6.x86_64.rpm
php-common-5.3.3-38.el6.x86_64.rpm
php-devel-5.3.3-38.el6.x86_64.rpm
php-fpm-5.3.3-38.el6.x86_64.rpm
php-gd-5.3.3-38.el6.x86_64.rpm
php-mbstring-5.3.3-38.el6.x86_64.rpm
php-mysql-5.3.3-38.el6.x86_64.rpm
php-pdo-5.3.3-38.el6.x86_64.rpm

2.配置php

vim /etc/php.ini  # 更改它的時區
  946 date.timezone =Asia/Shanghai
id nginx   # 查看nginx用戶是否建立
cd /etc/php-fpm.d/
vim www.conf  # 將39行和41行改爲nginx
 39 user = nginx
 40 ; RPM: Keep a group allowed to write in log dir.
 41 group = nginx
/etc/init.d/php-fpm start
netstat -antlp

這裏寫圖片描述
3.配置nginx

cd /etc/nginx/conf.d/
vim default.conf 編輯配置文件,要更改的行已列出 
 8     location / {
 9         root   /usr/share/nginx/html;
 10         index  index.php index.html index.htm;
 11     }
 30     location ~ \.php$ {
 31         root           html;
 32         fastcgi_pass   127.0.0.1:9000;
 33         fastcgi_index  index.php;
 34         fastcgi_param  SCRIPT_FILENAME  //usr/share/nginx/html$fastcgi_scrip    t_name;
 35         include        fastcgi_params;
 36     }
nginx -s reload   #  重新加載nginx
/etc/init.d/nginx start  #  打開nginx
cd /usr/share/nginx/html/
vim index.php   #  寫一個php測試頁面
<?php
phpinfo()
?>

驗證:在瀏覽器訪問看能否看到php頁面,172.25.11.5

cd /usr/share/nginx/html/
cd redis/ # 這裏面有一個之前寫好的test.php
cp test.php /usr/share/nginx/html/index.php # 將其複製到nginx的默認發佈目錄裏
vim /usr/share/nginx/html/index.php
<?php
        $redis = new Redis();
        $redis->connect('172.25.11.6',6379) or die ("could net connect redis server");
  #      $query = "select * from test limit 9";
        $query = "select * from test";
        for ($key = 1; $key < 10; $key++)
        {
                if (!$redis->get($key))
                {
                        $connect = mysql_connect('172.25.11.7','redis','westos');
                        mysql_select_db(test);
                        $result = mysql_query($query);
                        //如果沒有找到$key,就將該查詢sql的結果緩存到redis
                        while ($row = mysql_fetch_assoc($result))
                        {
                                $redis->set($row['id'],$row['name']);
                        }
                        $myserver = 'mysql';
                        break;
                }
                else
                {
                        $myserver = "redis";
                        $data[$key] = $redis->get($key);
                }
        }

        echo $myserver;
        echo "<br>";
        for ($key = 1; $key < 10; $key++)
        {
                echo "number is <b><font color=#FF0000>$key</font></b>";

                echo "<br>";

                echo "name is <b><font color=#FF0000>$data[$key]</font></b>";

                echo "<br>";
        }
?>
cd  # 切到root下
yum install unzip -y
unzip phpredis-master.zip
cd phpredis-master
phpize  # 創建新的預編譯
./configure  ##編譯
make 
make install  # 安裝
修改php配置:
cd /etc/php.d/
cp mysql.ini redis.ini   # 複製一個redis.ini文件出來
vim redis.ini   # 編輯redis.ini
更改內容爲:
     extension=redis.so
/etc/init.d/php-fpm reload
php -m | grep redis   # 查看php擴展
cd /root/redis/
scp test.sql server3:  # 將寫好的test.sql發到server3中,再到3中導入數據庫
test.sql內容爲:
use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

#DELIMITER $$
#CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
#    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
#  END$$
#DELIMITER ;

在server6中:

將reids配置文件裏,之前的slaveof 172.25.11.5 6379 行註釋掉
讓server2的redis成爲master,可以用redis-cli登陸,info查看是否變爲master

在server7中:
yum install -y mysql-server  # 安裝系統自帶的mysql
/etc/init.d/mysqld start   # 打開數據庫
[root@server7 ~]# mysql    # 登陸
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+

mysql> grant all on test.* to redis@'%' identified by 'westos';
# 進行遠程登錄用戶授權
[root@server7 ~]# vim test.sql   ##查看下內容
[root@server7 ~]# mysql < test.sql  ##導入數據庫
[root@server7 ~]# mysql
mysql> use test;
mysql> select * from test;   ##發現導入成功

這裏寫圖片描述
瀏覽器中輸入:172.25.11.5
這裏寫圖片描述

配置 gearman 實現數據同步

Gearman 是一個支持分佈式的任務分發框架:
Gearman Job Server: Gearman 核心程序,
需要編譯安裝並以守護進程形式運行在後臺。
Gearman Client:可以理解爲任務的請求者。
Gearman Worker:任務的真正執行者,一般需要自己編寫具體邏輯並通過
守護進程方式運行,Gearman Worker 接收到 Gearman Client
傳遞的任務內容後,會按順序處理。
大致流程:下面要編寫的 mysql 觸發器,就相當於 Gearman 的客戶端。
修改表,插入表就相當於直接下發任務。
然後通過 lib_mysqludf_json UDF 庫函數將關係數據映射爲 JSON 格式,
然後在通過 gearman-mysql-udf 插件將任務加入到
Gearman 的任務隊列中,
最後通過redis_worker.php,
也就是 Gearman 的 worker 端來完成 redis 數據庫的更新。

在server1中:
[root@server5 ~]# cd redis/
[root@server5 redis]# 
yum install -y gearmand-1.1.8-2.el6.x86_64.rpm 
 libgearman-devel-1.1.8-2.el6.x86_64.rpm
 libgearman-1.1.8-2.el6.x86_64.rpm
 libevent-1.4.13-4.el6.x86_64.rpm
 libevent-devel-1.4.13-4.el6.x86_64.rpm
 libevent-doc-1.4.13-4.el6.noarch.rpm
 libevent-headers-1.4.13-4.el6.noarch.rpm
[root@server5 local]# /etc/init.d/gearmand start
Starting gearmand:                                         [  OK  ]
[root@server5 redis]# scp gearman-mysql-udf-0.6.tar.gz server3:   
[root@server5 redis]# scp lib_mysqludf_json-master.zip server3:
[root@server5 redis]# scp libgearman-* server3:    
[root@server5 redis]# scp libevent-* server3:
[root@server5 redis]# cp worker.php /usr/local/
[root@server5 redis]# tar zxf gearman-1.1.2.tgz
[root@server5 redis]# cd gearman-1.1.2
[root@server5 gearman-1.1.2]# phpize 
[root@server5 gearman-1.1.2]# make && make install
[root@server5 gearman-1.1.2]# cd /etc/php.d/
[root@server5 php.d]# cp redis.ini gearman.ini
[root@server5 php.d]# vim gearman.ini
            寫入:     extension=gearman.so
[root@server5 php.d]# /etc/init.d/php-fpm reload  # 重新加載php配置
[root@server5 php.d]# php -m | grep gearman    # 查看php擴展
gearman
[root@server5 php.d]# cd /usr/local/
[root@server5 local]# vim worker.php 
編寫 gearman 的 worker 端:
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('172.25.11.6', 6379);

while($worker->work());
function syncToRedis($job)
{
        global $redis;
        $workString = $job->workload();
        $work = json_decode($workString);
        if(!isset($work->id)){
                return false;
        }
        $redis->set($work->id, $work->name);
}
?>
[root@server5 local]# nohup php /usr/local/worker.php &  
 ###在後臺運行worker.php
[root@server5 local]# netstat -antlp   ###查看端口是否打開

在server3中:

[root@server7 ~]# yum install -y unzip
[root@server7 ~]# unzip lib_mysqludf_json-master.zip
[root@server7 ~]# cd lib_mysqludf_json-master
ls  ##會看見一些的文件,最主要要有lib_mysqludf_json.so
yum install -y gcc mysql-devel 
要執下面這個命令,首先解決gcc,mysql-devel 這兩個軟件依賴性
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

lib_mysqludf_json UDF 庫函數將關係數據映射爲 JSON 格式。
通常,數據庫中的數據映
射爲 JSON 格式,是通過程序來轉換的。
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
拷貝 lib_mysqludf_json.so 模塊
cd /usr/lib64/mysql/plugin
[root@server7 plugin]# mysql  登陸數據庫
mysql> show global variables like 'plugin_dir';
查看 mysql 的模塊目錄:
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin |
+---------------+-------------------------+
註冊 UDF 函數:
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
    -> 'lib_mysqludf_json.so';
  1. 安裝 gearman-mysql-udf 這個插件是用來管理調用 Gearman 的分佈式的隊列。
cd  /root
[root@server7 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz 
yum install -y libgearman-* libevent-*  
[root@server7 ~]# cd gearman-mysql-udf-0.6
 ./configure --libdir=/usr/lib64/mysql/plugin/ 
 ###進行源碼編譯
 make && make install   ###安裝
[root@server7 ~]# mysql
註冊 UDF 函數:
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME
    -> 'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME
    -> 'libgearman_mysql_udf.so';

mysql> select * from mysql.func;
####查看函數
mysql> SELECT gman_servers_set('172.25.11.5:4730');
###指定 gearman 的服務信息

這裏寫圖片描述
這裏寫圖片描述

mysql < test.sql
這裏test.sql要做點改變,將2,3行註釋,5,6,7,8,9註釋去掉

mysql> SHOW TRIGGERS FROM test; ###查看觸發器

這裏寫圖片描述

mysql> use test
Database changed
mysql> update test set name='westos'; ###將名字更新爲westos

這裏寫圖片描述
這裏寫圖片描述

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