redis緩衝mysql資料

來源:互聯網
上載者:User

標籤:mysql   資料庫   redis   


       redis (Remote Dictionary Server)是一個開源(BSD許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、緩衝和訊息中介軟體。它支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(雜湊類型)。Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複製。

     MySQL和Redis,自身都帶有資料同步的機制,像比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現的,這樣的資料複製其實還是一個非同步過程,只不過當伺服器都在同一內網時,非同步延遲幾乎可以忽略。那麼理論上我們也可以用同樣方式,分析MySQL的binlog檔案並將資料插入Redis。但是這需要對binlog檔案以及MySQL有非常深入的理解,同時由於binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現同步的工作量是非常大的。因此這裡選擇了一種開發成本更加低廉的方式,借用已經比較成熟的MySQL UDF,將MySQL資料首先放入Gearman中,然後通過一個自己編寫的PHP Gearman Worker,將資料同步到Redis。比分析binlog的方式增加了不少流程,但是實現成本更低,更容易操作。

      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資料庫的更新。  

     使用lib_mysqludf_json的原因是因為Gearman只接受字串作為入口參數,可以通過lib_mysqludf_json將MySQL中的資料編碼為JSON字串.


     lib_mysqludf_json UDF庫函數將關係資料對應為JSON格式。通常,資料庫中的資料對應為JSON格式,是通過程式來轉換的。

1. server2:
   配置redis:


   yum install -y mysql-server
   /etc/init.d/mysqld start
   netstat -antlpe        ##mysql連接埠3306已開
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/86/75/wKiom1e_HN7iLn1WAABaZagkjF8469.png-wh_500x0-wm_3-wmp_4-s_3167710958.png" title="Screenshot from 2016-08-25 19-09-51.png" alt="wKiom1e_HN7iLn1WAABaZagkjF8469.png-wh_50" />
   tar zxf redis-3.0.2.tar.gz
   cd redis-3.0.2
   yum install -y gcc  
   make
   make install    



   cd /root/redis-3.0.2/utils
   ./install_server.sh          ##安裝伺服器啟動程式  
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/86/74/wKioL1e_HP_yf18sAAEQAPZnYTA602.png-wh_500x0-wm_3-wmp_4-s_3509203757.png" title="Screenshot from 2016-08-25 19-13-13.png" alt="wKioL1e_HP_yf18sAAEQAPZnYTA602.png-wh_50" />   
   /etc/init.d/redis_6379 start
   redis-cli monitor    ##監控資料,okshi表示監控正常
   redis-cli            ##臨時設定redis的一些資料
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/86/74/wKioL1e_HRey4oeyAABDq0Hjk54605.png-wh_500x0-wm_3-wmp_4-s_416302089.png" title="Screenshot from 2016-08-25 19-21-23.png" alt="wKioL1e_HRey4oeyAABDq0Hjk54605.png-wh_50" /> 

 
   redis作為mysql快取服務器:
   cd /root
   yum install 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
 

   php -m        ##看到支援的軟體
   vim /etc/php.ini

date.timezone = Asia/Shanghai

 
    cat /etc/passwd
    vim /etc/php-fpm.d/www.conf

user = nginxgroup = nginx

    /etc/init.d/php-fpm restart

     配置nginx:
     vim /etc/nginx/conf.d/default.conf

location / {        root   /usr/share/nginx/html;        index    index.html index.htm  index.php;  } location ~ \.php$ {        root           html;        fastcgi_pass   127.0.0.1:9000;   ##fastcgi通訊        fastcgi_index  index.php;        ##fastcgi主檔案        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;        include        fastcgi_params;       }


    cd /usr/share/nginx/html/
    vim index.php

<?phpphpinfo()?>

    /etc/init.d/nginx start

網頁訪問http://172.25.85.2           



   nginx上運行php:

   yum install -y unzip
   unzip phpredis-master.zip

   cd phpredis-master
   phpize
   ./configure
   make
   make install

   cd /usr/lib64/php/modules/
   ls
   cd /etc/php.d
   cp mysql.ini redis.ini
   vim redis.ini
將內容修改為以下:

  extension=redis.so

   /etc/init.d/php-fpm reload
   php -m | grep redis


   mysql
   mysql> show databases;        ##查看有無test資料庫,沒有則建立一個。
   mysql> quit

   cd /root/redis
   mysql  < test.sql
   cat 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 BEGINmysql  < test.sql    SET @RECV=gman_do_background(‘syncToRedis‘,     json_object(NEW.id as `id`, NEW.name as `name`));   END$$#DELIMITER ;

   mysql
   mysql> use test;
   mysql> select * from test;

   mysql> grant all on *.* to [email protected] identified by ‘westos‘;
   mysql> quit


   mysql -uredis -pwestos
   mysql> use test;
   mysql> select * from test;
      650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/86/75/wKiom1e_Hgnj4jrtAAAn_9aTA9s117.png-wh_500x0-wm_3-wmp_4-s_2396733760.png" title="Screenshot from 2016-08-25 19-49-08.png" alt="wKiom1e_Hgnj4jrtAAAn_9aTA9s117.png-wh_50" /> 

    mysql> quit



   cp /root/test.php /usr/share/nginx/html/
   cd /usr/share/nginx/html/
   rm -rf index.php
   mv test.php index.php

檢測:
     網頁訪問http://172.25.85.2   ##已經完成redis對mysql的緩衝
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/86/74/wKioL1e_HjeyJIJHAAAYQFeIVsc679.png-wh_500x0-wm_3-wmp_4-s_2187318874.png" title="Screenshot from 2016-08-25 20-16-53.png" alt="wKioL1e_HjeyJIJHAAAYQFeIVsc679.png-wh_50" />
   redis-cli
127.0.0.1:6379> get 1
"test1"
127.0.0.1:6379> get 2
"test2"
127.0.0.1:6379> quit


   mysql
   mysql> use test;
   mysql> update test set name=‘westos‘ where id=1;
   mysql> quit
網頁訪問http://172.25.85.2     ##更新了mysql中的資料,但是redis中的資料不會自動更新




redis-cli127.0.0.1:6379> get 1"test1"redis-cli127.0.0.1:6379> del 1網頁訪問http://172.25.85.2redis-cli127.0.0.1:6379> set 1 westos網頁訪問http://172.25.85。2




   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資料庫的更新。  

2.配置gearman自動更新redis中的資料:
  cd /root/redis
  yum install -y gearmand-1.1.8-2.el6.x86_64.rpm libgearman-1.1.8-2.el6.x86_64.rpm
  /etc/init.d/gearmand start
  netstat -antlpe
  tar zxf gearman-1.1.2.tgz
  cd gearman-1.1.2
  phpize
  ./configure
  cd ..
  yum install -y libgearman-devel-1.1.8-2.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

  cd gearman-1.1.2
  ./configure
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/86/74/wKioL1e_HuGSC-mMAABdW2C0bSA185.png-wh_500x0-wm_3-wmp_4-s_2269101014.png" title="Screenshot from 2016-08-25 20-33-42.png" alt="wKioL1e_HuGSC-mMAABdW2C0bSA185.png-wh_50" />
  make
  make install

  cd /etc/php.d
  cp redis.ini gearman.ini
  vim gearman.ini
將內容修改為以下:

extension=gearman.so

  /etc/init.d/php-fpm reload
  php -m |grep gearman

  yum install -y mysql-devel
  cd /root/redis

lib_mysqludf_json UDF庫函數將關係資料對應為JSON格式。通常,資料庫中的資料對應為JSON格式,是通過程式來轉換的

  unzip lib_mysqludf_json-master.zip
  cd lib_mysqludf_json-master
  gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
  ls

  mysql
  mysql> show global variables like ‘plugin_dir‘;
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/86/74/wKioL1e_HwnRfycNAAAkNYLs70s301.png-wh_500x0-wm_3-wmp_4-s_305466965.png" title="Screenshot from 2016-08-25 20-38-37.png" alt="wKioL1e_HwnRfycNAAAkNYLs70s301.png-wh_50" />

     mysql> quit


  cd /root/lib_mysqludf_json-master
  cp lib_mysqludf_json.so /usr/lib64/mysql/plugin


#註冊UDF函數 

  mysql
  mysql> create function json_object returns string soname ‘lib_mysqludf_json.so‘;
  mysql> select * from mysql.func;
    650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/86/75/wKiom1e_HxnynDT3AAAipeXuOrE842.png-wh_500x0-wm_3-wmp_4-s_285639718.png" title="Screenshot from 2016-08-25 20-39-20.png" alt="wKiom1e_HxnynDT3AAAipeXuOrE842.png-wh_50" />

  mysql> quit



#安裝gearman-mysql-udf

這個外掛程式是用來管理調用 Gearman 的分布式的隊列。

  cd /root/redis
  tar zxf gearman-mysql-udf-0.6.tar.gz

  cd gearman-mysql-udf-0.6
  yum install -y gcc-c++
  ./configure --libdir=/usr/lib64/mysql/plugin/
  make
  make install

  cd /usr/lib64/mysql/plugin/
  mysql -p

#註冊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;
 650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/86/74/wKioL1e_HzXhokc7AAA8uoe-1L8392.png-wh_500x0-wm_3-wmp_4-s_3541939056.png" title="Screenshot from 2016-08-25 20-43-20.png" alt="wKioL1e_HzXhokc7AAA8uoe-1L8392.png-wh_50" />

     mysql> quit

   netstat -antlpe

#指定gearman的服務資訊
  mysql
  mysql> select gman_servers_set(‘127.0.0.1:4730‘);
  mysql> quit


#編寫mysql觸發器(根據實際情況編寫)
  cd /root/redis
  vim test.sql
將觸發器的注釋取消,在建表和插入資料語句前加上注釋
 

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 ;


  mysql  < test.sql

  mysql
  mysql> show triggers from test;

  mysql> quit

cp worker.php /usr/local/bin/
cd /usr/local/bin/
vim worker.php
nohup php worker.php  &
ps ax

mysql
mysql> use test;
mysql> update test set name=‘redhat‘ where id=1;
mysql> quit

網頁訪問http://172.25.19.1(重新整理)    ##更新     (待驗證)


redis-cli
127.0.0.1:6379> get 1
"redhat"



3.redis的主從複製
    如果設定了一個slave,不管是在第一次連結還是重新連結master的時候,slave會發送一個同步命令 然後master開始後台儲存,收集所有對修改資料的命令。當後台儲存完成,master會將這個資料檔案傳送到slave,然後儲存在磁碟,載入到記憶體中;master接著發送收集到的所有的修改資料的命令,這好比一個流命令,是redis協議本身來實現的。
 
   在server3和server4上:


   vim /etc/redis/6379.conf
slaveof 172.25.85.2 6379
   /etc/init.d/redis_6379 restart


     server2:
   vim /root/redis-3.0.2/sentinel.conf    ##配置sentinel

sentinel monitor mymaster 172.25.85.2  6379 2

   ##Sentinel 去監視一個名為 mymaster 的主伺服器, 這個主伺服器的 IP 位址為 127.0.0.1 , 連接埠號碼為 6379 , 而將這個主伺服器判斷為失效至少需要 2 個 Sentinel 同意 (只要同意 Sentinel 的數量不達標,自動故障遷移就不會執行)。

sentinel down-after-milliseconds mymaster 10000

   ##Sentinel 認為伺服器已經斷線所需的毫秒數。

sentinel failover-timeout mymaster 60000

     grep -v ^#  sentinel.conf >/etc/sentinel.conf

     redis-sentinel /etc/sentinel.conf
tu
     scp /etc/sentinel.conf [email protected]:/etc/
     scp /etc/sentinel.conf [email protected]:/etc/

    redis-cli  -h 172.25.45.7 -p 26379 info
tu
   

      server4:
    vim /etc/sentinel.conf


port 26379

dir "/tmp"
.
sentinel monitor mymaster 172.25. 6379 2

sentinel down-after-milliseconds mymaster 10000

sentinel failover-timeout mymaster 60000
   
sentinel parallel-syncs mymaster 1           ##選項指定了在執行容錯移轉時, 最多可以有多少個從伺服器同時對新的主伺服器進行同步, 這個數字越小, 完成容錯移轉所需的時間就越長。
    
    scp /etc/sentinel.conf [email protected]:/etc/

     然後再server7查看:redis-cli  -h 172.25.85.2 -p 26379 info  
tu


   
                      


redis緩衝mysql資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.