MySQL與Redis數據庫結合(一)——lnmp+redis+mysql實現讀寫分離

一 、redis結合lnmp架構做mysql的緩存服務器實現讀寫分離

讀寫分離:用戶讀的時候訪問redis,用戶寫的時候訪問mysql。

原理:server1做web服務器,通過nginx訪問redis(使用server2做redis),如果有則直接訪問,如果沒有,則使用server3做mysql

實驗環境

主機名(ip) 角色
server1 (172.25.1.1) 前端服務器nginx
server2 (172.25.1.2) redis數據緩存
server3(172.25.1.3) mysql數據庫

(一)在server1中配置nginx和php

1、首先將server1中的其他服務都關閉並刪除,關閉redis服務及所有的redis-server

  • 注意:如果做過ssl服務,可能在安裝php時會有影響<php安裝時會安裝最新的openssl,而之前mysql使用的是舊的openssl,會導致php安裝失敗>,可以用yum remove 移除。
[root@server1 ~]# /etc/init.d/redis_6379 stop
[root@server1 ~]# killall -9 redis-server
	##沒有命令killall,
[root@server1 ~]# yum whatprovides /usr/bin/killall  ##查找
[root@server1 ~]# yum install psmisc-22.20-11.el7.x86_64 -y ##安裝
  • 補充:如果要刪除相關服務的模塊,可以使用以下命令:
[root@server1 ~]# rpm -qa | grep mysql
[root@server1 ~]# rpm -e `rpm -qa | grep mysql`
#強行刪除
[root@server1 ~]# rpm -e `rpm -qa | grep mysql` --nodeps

2、配置nginx

[root@server1 ~]# ls
[root@server1 ~]# tar zxf nginx-1.14.0.tar.gz 
[root@server1 ~]# cd nginx-1.14.0
[root@server1 nginx-1.14.0]# vim src/core/nginx.h
#在此文件下將debug註釋
[root@server1 nginx-1.14.0]# vim auto/cc/gcc 
#下載nginx編譯和安裝時所需要的依賴性
[root@server1 nginx-1.14.0]# yum install -y gcc pcre-devel zlib-devel -y
#由於此實驗只是簡單的做一個web服務器,所以不需要添加別的模塊,編譯時只寫安裝到的路徑即可
[root@server1 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.14.0]# make && make install 
[root@server1 nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/


在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

3、編輯配置文件/usr/local/nginx/conf/nginx.conf

[root@server1 nginx-1.14.0]# vim /usr/local/nginx/conf/nginx.conf
	user nginx nginx; #指定登陸用戶 登陸組
[root@server1 nginx-1.14.0]# useradd nginx  

在這裏插入圖片描述

在這裏插入圖片描述

[root@server1 nginx-1.14.0]# vim /usr/local/nginx/conf/nginx.conf
location / {
            root   html;
            index  index.php index.html index.htm;
        }
 location ~ \.php$ {
              root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }

在這裏插入圖片描述

在這裏插入圖片描述
4、檢測配置文件語法nginx -t,此時會出現報錯:

[root@server1 nginx-1.14.0]# nginx -t	
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] mkdir() /var/temp/nginx/client” failed (2: No such file or directory)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

解決: 創建目錄

[root@server1 nginx-1.14.0]# mkdir -p /var/temp/nginx/client

在這裏插入圖片描述在這裏插入圖片描述
5、啓動nginx

[root@server1 nginx-1.14.0]# nginx
[root@server1 nginx-1.14.0]# ps ax | grep nginx

在這裏插入圖片描述
在這裏插入圖片描述

6、安裝php,在網上下載安裝包,並啓動

[root@server1 ~]# cd rhel7/
[root@server1 rhel7]# ls
gearmand-1.1.12-18.el7.x86_64.rpm
libevent-devel-2.0.21-4.el7.x86_64.rpm
libgearman-1.1.12-18.el7.x86_64.rpm
libgearman-devel-1.1.12-18.el7.x86_64.rpm
libzip-0.10.1-8.el7.x86_64.rpm
openssl-1.0.2k-16.el7.x86_64.rpm
openssl-libs-1.0.2k-16.el7.x86_64.rpm
php-cli-5.4.16-46.el7.x86_64.rpm
php-common-5.4.16-46.el7.x86_64.rpm
php-fpm-5.4.16-46.el7.x86_64.rpm
php-mysql-5.4.16-46.el7.x86_64.rpm
php-pdo-5.4.16-46.el7.x86_64.rpm
php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm
php-pecl-redis-2.2.8-1.el7.x86_64.rpm
php-process-5.4.16-46.el7.x86_64.rpm
php-xml-5.4.16-46.el7.x86_64.rpm
[root@server1 rhel7]# yum install -y *
[root@server1 rhel7]# systemctl start php-fpm

在這裏插入圖片描述
出現了錯誤:

Error: Package: 1:openssl-devel-1.0.1e-60.el7.x86_64 (@rhel7.3)
           Requires: openssl-libs(x86-64) = 1:1.0.1e-60.el7
           Removing: 1:openssl-libs-1.0.1e-60.el7.x86_64 (@anaconda/7.3)
               openssl-libs(x86-64) = 1:1.0.1e-60.el7
           Updated By: 1:openssl-libs-1.0.2k-16.el7.x86_64 (/openssl-libs-1.0.2k-16.el7.x86_64)
               openssl-libs(x86-64) = 1:1.0.2k-16.el7
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

這就是因爲安裝了舊版本的openssl-devel,解決辦法:yum remove openssl-devel-1.0.1e-60.el7.x86_64 -y即可。

在這裏插入圖片描述再次安裝,便成功。
在這裏插入圖片描述在這裏插入圖片描述開啓php服務並查看其9000端口是否成功開啓

在這裏插入圖片描述
在這裏插入圖片描述此時,server1的nginx和php就安裝完成了。

(二)在server2中配置redis

之前我們已經配置過redis,這裏只需要修改即可

1、編輯配置文件(如果之前做過redis主從複製,則需要將之前在配置文件中的內容刪除)

[root@server2 ~]# cd /etc/redis/
[root@server2 redis]# ls
6379.conf  sentinel.conf
[root@server2 redis]# vim 6379.conf 
	70 bind 0.0.0.0 #確認監聽端口
[root@server2 redis]# /etc/init.d/redis_6379 restart
[root@server2 redis]# netstat -antlp

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述2、

redis-cli
127.0.0.1:6379> info

在這裏插入圖片描述

在這裏插入圖片描述

(三)在server3上安裝mysql

1、安裝mariadb:

[root@server3 ~]# yum install mariadb-server -y

在這裏插入圖片描述
2、打開數據庫並進行安全初始化

[root@server3 ~]# cd /var/lib/mysql/
[root@server3 mysql]# rm -rf *
##如果有之前的數據庫數據,刪除
[root@server3 mysql]# systemctl start mariadb
[root@server3 mysql]# mysql_secure_installation 

在這裏插入圖片描述
3、以超級用戶登錄mysql後,設置redis用戶有所有的權限

[root@server3 mysql]# mysql -uroot -predhat
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database test;
MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'redhat';
MariaDB [(none)]> flush privileges;

在這裏插入圖片描述

4、將tset.sql(是一些數據)導入數據庫test中

[root@server3 ~]# mysql -uroot -predhat < test.sql

在這裏插入圖片描述

在這裏插入圖片描述在這裏插入圖片描述

5、測試是否將test.sql成功導入

[root@server3 ~]# mysql -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> use test;
MariaDB [test]> show tables;
MariaDB [test]> select * from test;

在這裏插入圖片描述

(四)建立php和redis,mysql的連接

在這裏插入圖片描述
編寫test.php文件,重啓nginx

<?php
        $redis = new Redis();
        $redis->connect('172.25.2.2',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.2.3','redis','redhat');
                        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>";
        }

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

(五)瀏覽器訪問測試

1.在瀏覽器中輸入172.25.2.1,此時顯示的數據是從mysql中獲取的
在這裏插入圖片描述
2、再次刷新一下瀏覽器,發現顯示的數據發生了改變,此時的數據是從redis中獲取的(因爲從測試頁中可以看出來,從mysql中或從redis中獲取的數據是不一樣的),之後無論怎麼刷新,此時的數據都是從redis中獲取的

在這裏插入圖片描述
此時在server2上也可以查看到

在這裏插入圖片描述
此時就需要考慮一個問題:如果此時mysql數據發生變更,redis會同步嗎?

3、測試redis是否會隨mysql數據更新而更新,在server3上,更新數據:

MariaDB [test]> update test set name='westos' where id=1;

在這裏插入圖片描述
在server2上查看:發現數據沒有變。

在這裏插入圖片描述
從瀏覽器訪問:數據沒變,說明redis不會隨mysql數據更新而更新。
在這裏插入圖片描述
此時,我們就出現了 新的問題如果在mysql中更新數據,發現redis中仍然會有對應的key,數據不會更新,此時就會出現mysql和redis數據不一致的情況。

那麼我們如何將mysql端修改的數據及時更新到redis端呢?我們在下一篇博客中,解決此問題。

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