1. 程式人生 > >基於redis的資料庫的複製

基於redis的資料庫的複製

redis與資料庫結合,作為資料庫資料的快取提供給前端

整體思想是:客戶端通過nginx和php訪問後端資料庫時,先在redis這個資料庫快取中查詢,看是否含有想要的資料,如果沒有就去後端資料庫查詢, 將查詢到資料返回給客戶端一份,另外在redis中快取一份….下次如果訪問相同的資料就直接去redis,縮短時間同時也減輕資料庫的查詢壓力 在server1,2裡面下載redis 在sever1裡面做 /etc/init.d/mysqld  stop tar  zxf     redis-4.0.8.tar.gz   ###得到一個redis的包 ls cd  redis-4.0.8 ls

yum  instal   -  gcc make  &&  make  install cd   utils/ ./install_server.sh

redis-cli info    #觀察資訊 netstat  -antlupe    ##產看埠號,6379並沒有執行到我們想要的埠上,我們要去改配置檔案

cd  /etc/redis/ ls vim   6379.conf bind   0.0.0.0    ##將bind設定為本機所有介面

/etc/init.d/redis_6379  restart

netstat  -antlupe   ##產看埠   ###此時應該設定好了 redis-cli set  name  wubian get name     ##會有所顯示

在sever2裡面做 /etc/init.d/mysqld  stop tar  zxf     redis-4.0.8.tar.gz   ###得到一個redis的包 ls cd  redis-4.0.8 ls

yum  instal   -  gcc make  &&  make  install cd   utils/

./install_server.sh  ###直接回車,這都是檔案目錄

redis-cli info    #觀察資訊 netstat  -antlupe    ##產看埠號,6379並沒有執行到我們想要的埠上,我們要去改配置檔案 cd  /etc/redis/ ls vim   6379.conf bind   0.0.0.0    ##將bind設定為本機所有介面 slaveof  172.25.17.1  6379   ###設定他為172.25.17.1的從slave

/etc/init.d/redis_6379  restart netstat  -antlupe   ##產看埠   ###此時應該設定好了

redis-cli get  name    ##可以看見同步過來了

在sever3裡面做 /etc/init.d/mysqld  stop tar  zxf     redis-4.0.8.tar.gz   ###得到一個redis的包 ls cd  redis-4.0.8 ls yum  instal   -  gcc

make  &&  make  install cd   utils/ ./install_server.sh  ###直接回車,這都是檔案目錄的設定,採用預設即可

redis-cli info    #觀察資訊 netstat  -antlupe    ##產看埠號,6379並沒有執行到我們想要的埠上,我們要去改配置檔案 cd  /etc/redis/ ls vim   6379.conf bind   0.0.0.0    ##將bind設定為本機所有介面 slaveof  172.25.17.1  6379   ###設定他為172.25.17.1的從slave

/etc/init.d/redis_6379  restart netstat  -antlupe   ##產看埠   ###此時應該設定好了

redis-cli info     ###產看資訊,檢視主master是不是server1 get  name    ###產看資訊有沒有同步或來

在主master裡面做 redis-cli set  user  westos get user     

###在slave裡面做 redis-cli get   user     ##產看資訊有沒有同步或來    ###但是不能刪除資訊,因為他是slave

####實現資料庫的高可用 ####在主master裡面做 cd  /root/redis-4.0.8 ls cp sentinel.conf  /etc/redis/ ls cd   /etc/redis ls  ##有兩個檔案   6379.conf  sentinel.conf vim    sentinel.conf ###改正bind   0.0.0.0 protected-mode   no port  26379

sentinel   monitor   mymaster   172.25.17.1  6379 2  ##填主master的ip,6379是埠號,2是他的slave數 sentinel  down-after-milliseconds  mymater   10000 sentinel  parallel-syncs   mymaster  1

scp    sentinel.conf   server2:/etc/redis/ scp    sentinel.conf   server3:/etc/redis/

redis-server  /etc/redis/sentinel.conf   --sentinel     ###觀看情況

###在server2和server3裡面也做同樣的事情 redis-server  /etc/redis/sentinel.conf   --sentinel     ###觀看情況此時的路徑在/etc/redis裡面 ####另外開一個shell,進行連線,主要連線master redis-cli  -p   6379 info shutdown    ###讓主master裡面掛掉,然後在前端看誰變成master了

####伺服器server2變成了master

####然後重啟原來master vim  /etc/redis/6379.conf bind   0.0.0.0    ##將bind設定為本機所有介面 slaveof  172.25.17.2  6379   ###設定他為172.25.17.2的從slave

/etc/init.d/redis_6379  start redis-cli info   ###檢視主資訊,設否和自己設定的一樣 get   user get  name   ##資訊是否能同步過來

####資料庫的負載均衡叢集 ##首先停掉redis服務 在server1裡面做 /etc/init.d/redis_6379   stop ps  ax   ###檢視後端程序 cd    /usr/local/ ls mkdir   cluster cd   cluster mkdir   700{1..6} ls cd   7001 vim    redis.conf 裡面寫 port   7001 cluster-enabled  yes cluster-config-file  nodes.conf cluster-node-timeout   5000 appendonly  yes daemonize   yes   ##打入後臺

redis-server  redis.conf

ps  ax   ###顯示有沒有在後臺執行

redis-cli  -p   7001 info   ###測試能不能進去 ls   ###此時有三個檔案   appendonly.aof   nodes.conf  redis.conf cp   redis.conf   ../7002 cp   redis.conf   ../7003 cp   redis.conf   ../7004 cp   redis.conf   ../7005 cp   redis.conf   ../7006 cd    ../7002 vim  redis.conf port   7002    ##將埠號改為對應的號 redis-server  redis.conf    ##必須在這個檔案下重啟,否則就沒有程序在跑 cd    ../7003 vim  redis.conf port   7003    ##將埠號改為對應的號 redis-server  redis.conf    ##必須在這個檔案下重啟,否則就沒有程序在跑 cd    ../7004 vim  redis.conf port   7004    ##將埠號改為對應的號 redis-server  redis.conf    ##必須在這個檔案下重啟,否則就沒有程序在跑 cd    ../7005 vim  redis.conf port   7005    ##將埠號改為對應的號 redis-server  redis.conf    ##必須在這個檔案下重啟,否則就沒有程序在跑 cd    ../7006 vim  redis.conf port   7006    ##將埠號改為對應的號 redis-server  redis.conf    ##必須在這個檔案下重啟,否則就沒有程序在跑 cd cd    redis-4.0.8 cd   src ls cp   redis-trib.rb  /usr/local/bin  #加入環境變數 cd redis-trib.rb   --help    ###直到他要ruby語言 yum   install  -y    ruby   rubygems ###還要需要別的包 rubygems,redis-4.0.1.gem yum  install -y  rubygems-1.3.7.5.el6.noarch.rpm gem   list   gem   install  --local  redis-4.0.1.gem  ##此時回報錯,要求ruby的版本大於2.2.2 rpm   -q   ruby     ##產看本機ruby的版本 ###需要到官網下載ruby包和他的依賴性libyaml-0.1.3-4.el6_6.x86_64.rpm yum  install  ruby-2.2.3-1.el6.x86_64.rpm  libyaml-0.1.3-4.el6_6.x86_64.rpm   -y gem   install  --local  redis-4.0.1.gem

gem  list   ##產看有哪些模組

redis-trib.rb   #產看用法

redis-trib.rb    create  --replicas  1  127.0.0.1:7001  127.0.0.1:7002  127.0.0.1:7003  127.0.0.1:7004  127.0.0.1:7005  127.0.0.1:7006     ###數字1的意思是一個master只有一個slave

###然後可以看出來誰是master,誰是誰的slave redis-trib.rb  info   127.0.0.1:7001 redis-trib.rb  info   127.0.0.1:7002 redis-trib.rb  info   127.0.0.1:7003 redis-trib.rb  info   127.0.0.1:7004 redis-trib.rb  info   127.0.0.1:7005 redis-trib.rb  info   127.0.0.1:7006

redis-trib.rb  check  127.0.0.1:7001   #總體檢視誰是master,誰是slave

redis-cli  -c   -p   7001   ##-c 代表叢集  -p  代表埠,不加-c,寫不進去東西 set  name  wxh   ##可以看見他寫進那個服務裡面了,這是內部的演算法,內部自由分配 get  name

redis-cli  -c   -p   7006 get  name   ###和7001進去一樣,都是寫進同一個地方,也從同一個地方讀取

###每一個叢集都可以有增加和刪除的功能,相當與每一個都是主 redis-cli  -c  -p  7004 del   name   ##刪除名字 shutdown   ##讓7002停掉服務,那麼他對應的slave就會接管服務 redis-cli  -c  -p   7004 shutdown     ##7004也聽掉了,那麼整個服務就聽掉了,因為hash槽不夠了 ####恢復停掉的服務 cd  /usr/local/cluster cd  7002 redis-server   redis.conf

cd  ../7004 redis-server   redis.conf

redis-trib.rb  check  127.0.0.1:7001 ##檢視服務有沒有起來,應該7004還是master,應該在7004沒有掛掉之前,他就是master,所以再次起來的時候,他還是master

cat    appendonly.aof     ##檢視做過的步驟

一.實現資料庫,php,nginx和redis的架構 #####下載所有關於 redis的包 cd redis   ##切進去有包的位置 yum  install    -y   php* cd   /etc/php.d/ vim    /etc/php.ini ##改時區  date.timezone = Asia/Shanghai

cd  /etc/php-fpm.d/ ls   ###www.conf   vim  www.conf ###改user=nginx  group=nginx

/etc/init.d/php-fpm  start  ##服務起不來,可能沒有nginx,yum  install  nginx

netstat  -antlupe  |  grep   :9000  ##監聽9000埠

cd /etc/nginx cd  conf.d ls vim   default.conf ###開啟location  - \.php$ {                root html;                fastcgi_pass   127.0.0.1:9000;                fastcgi_index  index.php;                fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;                include   fastcgi_params;      }   location /{     root  /usr/share/nginx/html;     index  index.php   index.html  index.html;  #將php頁面優先載入     }

/etc/init.d/nginx  start cd  /usr/share/nginx/html ls vim  index.html <?php phpinfo() ?>

php -m   ###發現redis沒有載入進去 /etc/init.d/php-fpm    restart ###進入瀏覽器裡面看 http://172.25.17.11  ##可以看加php頁面

cd cd  redis cp  test.php    /usr/share/nginx/html/index.php將php測試頁面的程式碼(該程式碼是查詢資料庫中資料)放在預設釋出目錄下 php -m  |  grep  redis   ##發現並沒有這個模組,所以我們進行熱載入 php  -m  |  grep  mysql   ##有mysql這個模組 cd  /usr/share/nginx/html vim   index.php###改為master的ip ##另外開一臺虛擬機器 yum  install  -y   mysql-server /etc/init.d/mysqld  start ###在server1裡面做 cd  /usr/share/nginx/html vim   index.php###改資料庫的ip ###在上面開的一臺虛擬機器值中做 mysql show  databases; grant  select   on   test.*  to [email protected]'%'  identified  by  'westos'

###在server1裡面做 cd   cd redis cat  test.sql scp   test.sql   [email protected]:/root  ##將寫好的資料考到有資料庫的ip內 ###在上面開的一臺虛擬機器值中做 mysql    <    test.sql  ##將資料倒入資料庫內 mysql use  test; select  *  from    test;   ##驗證資料有沒有倒入資料庫中

###在server1裡面做原始碼編譯php與redis的連線軟體—phpredis-master.zip yum  install  unzip cd  redis unzip   phpredis-master.zip

cd   phpredis-master ls phpize  ##熱載入

./configure make  &&   make  install /etc/init.d/php-fpm  reload

cd   /usr/lib64/php/modules/ ls   ###有mysql.so 檔案

.在php中動態載入redis模組 cd  /etc/php.d/ ls cp   mysql.ini   redis.ini vim  redis.ini extension=redis.so

cat   redis.ini /etc/init.d/php-fpm  reload php  -m |  grep   redis  ##資料在瀏覽器才能顯示,但是在資料更新時,他卻不會變

cd cd redis yum install   -y   gearmand-1.1.8-2.el6.x86_64.rpm   libgearman-*   libevent-* /etc/init.d/gearmand  start netstat  -antlupe    |  grep  :4730 scp    gearman-mysql-udf-0.6.tar.gz   lib_mysqludf_json-master.zip  [email protected]:/root  ##傳給有資料庫的ip ###在上面開的一臺虛擬機器值中做 mysql show  global   variables  like  'plugin_dir';###主要看外掛的位置 yum  install  unzip unzip  lib_mysqludf_json-master.zip

cd     lib_mysqludf_json-master ls yum install   -y   gcc   mysql-devel   gcc  $(mysql_config  --cflags)  -shared  -fPIC  -o   lib_mysqludf_json.so   lib_mysqludf_json.c

cp   lib_mysqludf_json.so  /usr/lib64/mysql/plugin mysql create  function  json_object  returns  string soname  'lib_mysqludf_json.so';

# 註冊 UDF 函式 json_object(作用是利用該函式可以將資料庫中的資料構造為json格式)

select    *  from   mysql.func;  ##載入了一個函式

3.安裝 gearman-mysql-udf,這個外掛是用來管理呼叫 Gearman 的分散式的佇列 tar  zxf  gearman-mysql-udf-0.6.tar.gz ls cd    gearman-mysql-udf-0.6 ls ./configure  --libdir=/usr/lib64/mysql/plugin/  --with-mysql##會報錯,應該缺少依賴性

在server1裡面做 cd cd  redis scp    libgearman-*  [email protected]:/root scp     libevent-*  [email protected]:/root ###在server4裡面做 yum  install   libgearman-*  libevent-*  -y cd    gearman-mysql-udf-0.6 ls ./configure  --libdir=/usr/lib64/mysql/plugin/  --with-mysql make  &&  make  install cd   /usr/lib64/mysql/plugin ls   ###有libgearman_mysql_udf.so.0.0.0  ##這個檔案

登陸mysql,再次註冊函式 mysql create  function  gman_do_background  returns  string soname  'libgearman_mysql_udf.so'; create  function  gman_servers_set  returns  string soname  'libgearman_mysql_udf.so'; select   *  from  mysql.func;  ##有三個函式載入成功 select   gman_servers_set('172.25.17.1:4730');

# 指定 gearman 的服務資訊

在server1裡面做 netstat  -antlupe  |  grep  :4730   #埠有沒有開 在sever4裡面做

5.編輯觸發器檔案

什麼是觸發器: 觸發器(trigger)是SQL server 提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發, 比如當對一個表進行操作(insert,delete, update)時就會啟用它執行。觸發器經常用於加強資料的完整性約束和業務規則等

vim  test.sql

###註釋寫入的資料,取消註釋的函式 mysql   <  test.sql mysql   show   triggers   from    test;檢視觸發器是否匯入

在server1裡面做在php中動態加入模組gearman cd cd redis ll  worker.php

work是中間搬運資料的“程序”,由php語言編寫

tar  zxf   gearman-1.1.2.tgz cd   gearman-1.1.2 phpize ./configure make  &&  make  install

cd   /usr/lib64/php/modules/ ls   ##有gearman.so  

cd   /etc/php.d/ ls cp  redis.ini  gearman.ini vim gearman.ini extension=gearman.so

/etc/init.d/php-fpm  reload php  -m  ## 看mysql   redis   gearman 模組有沒有在內

cd   cd  redis vim  worker.php ####redis  寫的是主master的ip $redis->connect('172.25.17.2',6379);

mv    worker.php  /usr/local/ nohup  php   /usr/local/worker.php   &.啟動worker程序並將其打入後臺 在sever4裡面做 mysql use  test; update  test  set   name='redhat'  where id=1;  ##更新資料,發現redis也更新了,頁面也更新了 select  *  from  test;

##在瀏覽器可以看見他更新了 在主master裡面get 1    發現他也更新了  ##這樣變成功了

整體思路 client  ->  nginx  --> php-fpm  ->  redis(cache) ->  mysql update  ->  mysql -->  trigger  -->udf(json,gearman)->gearmand:4730-->worker(php,java,python)->redis