基於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