设为首页 收藏本站
查看: 779|回复: 0

[经验分享] mysql+redis

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-3-20 09:37:53 | 显示全部楼层 |阅读模式
mysql_with_redis_with_php_with_nginx大结合:


本版本mysql使用系统自带的版本
redis,php,nginx等软件及依赖性见官网及pkgs.org

server1.example.com  :172.25.33.1 mysql
server2.example.com : 172.25.33.2 nginx +php
server3.example.com :172.25.33.3  redis
所需要的依赖包:

[iyunv@server2 redis]# ls
gearman-1.1.2.tgz                         php-devel-5.3.3-38.el6.x86_64.rpm
gearmand-1.1.8-2.el6.x86_64.rpm           php-fpm-5.3.3-38.el6.x86_64.rpm
gearman-mysql-udf-0.6.tar.gz              php-gd-5.3.3-38.el6.x86_64.rpm
jemalloc-3.6.0-1.el6.x86_64.rpm           php-mbstring-5.3.3-38.el6.x86_64.rpm
jemalloc-devel-3.6.0-1.el6.x86_64.rpm     php-mysql-5.3.3-38.el6.x86_64.rpm
libevent-1.4.13-4.el6.x86_64.rpm          php-pdo-5.3.3-38.el6.x86_64.rpm
libevent-devel-1.4.13-4.el6.x86_64.rpm    phpredis-master.zip
libevent-doc-1.4.13-4.el6.noarch.rpm      redis-3.0.2.tar.gz
libevent-headers-1.4.13-4.el6.noarch.rpm  redis-3.2.5.tar.gz
libgearman-1.1.8-2.el6.x86_64.rpm         redis-3.3.1.gem
libgearman-devel-1.1.8-2.el6.x86_64.rpm   rhel6 Redis.pdf
lib_mysqludf_json-master.zip              test
nginx-1.8.0-1.el6.ngx.x86_64.rpm          test.php
php-5.3.3-38.el6.x86_64.rpm               test.sql
php-cli-5.3.3-38.el6.x86_64.rpm           tokyocabinet-1.4.33-6.el6.x86_64.rpm
php-common-5.3.3-38.el6.x86_64.rpm        worker.php

server1上安装mysql-server
server2上安装nginx和php及其扩展。
nginx所在的服务器需要和mysql,redis等沟通,相当于桥梁的作用,所以需要和他们相关的插件:
php-mysql
php-redis
[iyunv@server2 redis]# ll phpredis-master.zip
-rwxr-xr-x 1 root root 83734 Oct 21 00:18 phpredis-master.zip
[iyunv@server2 redis]# unzip phpredis-master.zip
-bash: unzip: command not found
安装unzip解压:
[iyunv@server2 phpredis-master]# ls
common.h   debian.control  mkdeb-apache2.sh  redis_session.c
config.m4  igbinary        php_redis.h       redis_session.h
CREDITS    library.c       README.markdown   serialize.list
debian     library.h       redis.c           tests

发现其中并没有可执行文件,需要php的开发包php-devel
[iyunv@server2 redis]# yum install -y  php-devel-5.3.3-38.el6.x86_64.rpm
然后在当前目录下执行phpize
phpize 的作用是侦测当前的php环境,并根据环境生成一个configure。
[iyunv@server2 phpredis-master]# phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
[iyunv@server2 phpredis-master]# ls
acinclude.m4    config.sub      library.c         README.markdown
aclocal.m4      configure       library.h         redis.c
autom4te.cache  configure.in    ltmain.sh         redis_session.c
build           CREDITS         Makefile.global   redis_session.h
common.h        debian          missing           run-tests.php
config.guess    debian.control  mkdeb-apache2.sh  serialize.list
config.h.in     igbinary        mkinstalldirs     tests
config.m4       install-sh      php_redis.h
编译安装:
编译完成后并不会生成redis.ini文件,需要自己手动生成,php.ini 在php-common的目录下边:[iyunv@server2 modules]# rpm -ql php-common
/etc/php.d
/etc/php.d/curl.ini
/etc/php.d/fileinfo.ini
/etc/php.d/json.ini
/etc/php.d/phar.ini
/etc/php.d/zip.ini
/etc/php.ini

[iyunv@server2 php.d]# cp mysql.ini redis.ini
[iyunv@server2 php.d]# vim redis.ini
[iyunv@server2 php.d]# pwd
/etc/php.d
[iyunv@server2 php.d]# cat redis.ini
; Enable mysql extension module
extension=redis.so


或者直接将redis.ini写入php.ini中。

重起php-fpm,发现redis插件已经插入
[iyunv@server2 php.d]# php -m |grep redis
redis


[iyunv@server2 redis]# rpm -qa |grep php
php-cli-5.3.3-38.el6.x86_64
php-fpm-5.3.3-38.el6.x86_64
php-mysql-5.3.3-38.el6.x86_64
php-common-5.3.3-38.el6.x86_64
php-5.3.3-38.el6.x86_64
php-pdo-5.3.3-38.el6.x86_64

修改nginx的配配置文件:
[iyunv@server2 redis]# !vi
vim /etc/nginx/conf.d/default.conf

  8     location / {
  9         root   /usr/share/nginx/html;
10         index index.php index.html index.htm;
11     }


28      #pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
29
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_script_name;
35         include        fastcgi_params;
36     }


在/usr/share/nginx/html下编写php的测试页:
[iyunv@server2 html]# ls
50x.html  index.html  index.php
[iyunv@server2 html]# cat index.php
<?php
phpinfo()
?>

启动php-fpm服务。
[iyunv@server2 html]# service php-fpm start
Starting php-fpm:                                          [  OK  ]
重起nginx服务
[iyunv@server2 html]# service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

然后即可通过网页访问php的测试页:
***注意:在nginx的配置文件中定义的首页是有顺序的。


在server3.example.com 上安装redis
解压,直接make&& make install
有写情况下可能需要安装环境:(根据提示走)
jemalloc-3.6.0-1.el6.x86_64.rpm
jemalloc-devel-3.6.0-1.el6.x86_64.rpm
然后进入当前目录的utils
安装redis
[iyunv@server3 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]
Selecting default: 6379
然后一路回车
修改redis-server的配置文件:
[iyunv@server3 utils]# vim /etc/redis/6379.conf
   ~~~~~~~~~~
  62 bind 0.0.0.0
重起
[iyunv@server3 utils]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

[iyunv@server3 utils]# netstat -antlp |grep redis
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      4534/redis-server 0
redis监听在所有端口,


测试:
数据库和php的连接需要程序的支持:
[iyunv@server2 redis]# cat test.php
<?php
        $redis = new Redis();
        $redis->connect('172.25.33.3',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.33.1','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>";
        }
?>
[iyunv@server2 redis]#
将这个页面作为php的首页。
[iyunv@server2 redis]# cp test.php  /usr/share/nginx/html/index.php
cp: overwrite `/usr/share/nginx/html/index.php'? y

在server1.example.com中插入数据
mysql> select * from test.test
    -> ;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
|  3 | test3 |
|  4 | test4 |
|  5 | test5 |
|  6 | test6 |
|  7 | test7 |
|  8 | test8 |
|  9 | test9 |
+----+-------+
为index.php中的用户授权
mysql> grant update on test.* to redis@'172.25.33.2' identified by 'westos' ;
在浏览器上测试:
即可得到数据库响应的数据


spacer.jpg spacer.jpg




此时有一个很大的缺陷:内容的一致性,redis在得到结果后,如果查找内容在其内存中存在,那么,他就不会返回数据库取数据,会造成数据的不一致性,所以需要添加一个触发器:
配置gearman 实现数据同步
gearman 是一个支持分布式的任务分发框架
gearman job server 作为gearman的核心程序,需要编译安装并以守护进程形式运行在后台。
gearman client 任务的请求者
gearman worker 任务执行着
在nginx所在的服务器安装gearman
[iyunv@server2 redis]# yum install -y  gearmand-1.1.8-2.el6.x86_64.rpm  
libgearman-1.1.8-2.el6.x86_64.rpm

[iyunv@server2 redis]# yum install -y  libgearman-devel-1.1.8-2.el6.x86_64.rpm  libevent-devel-1.4.13-4.el6.x86_64.rpm libevent-headers-1.4.13-4.el6.noarch.rpm libevent-doc-1.4.13-4.el6.noarch.rpm
安装php的gearman的扩展
安装开发包。系统自带
[iyunv@server2 redis]# yum install -y db*-devel
编译安装gearman job server
[iyunv@server2 redis]# tar -xf gearman-1.1.2.tgz
[iyunv@server2 redis]# cd gearman-1.1.2
[iyunv@server2 gearman-1.1.2]# ls
ChangeLog  CREDITS   LICENSE        php_gearman.h  test_client.php  test_worker.php
config.m4  examples  php_gearman.c  README         tests
[iyunv@server2 gearman-1.1.2]# phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

[iyunv@server2 gearman-1.1.2]# ./configure --with-php-config=/usr/bin/php-config

make && make install

[iyunv@server2 gearman-1.1.2]# cd /etc/php.d/
[iyunv@server2 php.d]# ls
curl.ini      json.ini    mysql.ini  pdo_mysql.ini   phar.ini   sqlite3.ini
fileinfo.ini  mysqli.ini  pdo.ini    pdo_sqlite.ini  redis.ini  zip.ini
[iyunv@server2 php.d]# cp mysql.ini gearman.ini
[iyunv@server2 php.d]# vim gearman.ini
[iyunv@server2 php.d]# vim /etc/php
php.d/        php-fpm.conf  php-fpm.d/    php.ini      
[iyunv@server2 php.d]# vim /etc/php.ini
[iyunv@server2 php.d]# cat gearman.ini
; Enable mysql extension module
extension=gearman.so

[iyunv@server2 php.d]# grep ^extension /etc/php.ini
extension = gearman.so
重起Php-fpm


在server1.example.com添加udf用户自定义函数
由于要对数据库进行操作,所以要安装数据库开发包
[iyunv@server1 lib_mysqludf_json-master]# unzip lib_mysqludf_json-master.zip
[iyunv@server1 lib_mysqludf_json-master]# cd lib_mysqludf_json-master
[iyunv@server1 lib_mysqludf_json-master]# yum install -y mysql-devel
[iyunv@server1 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

登陆数据库,使用mysql> show global variables like 'plugin_dir';
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin |
+---------------+-------------------------+
1 row in set (0.00 sec)
找到数据库插件所在的位置
[iyunv@server1 lib_mysqludf_json-master]# ls
lib_mysqludf_json.c     lib_mysqludf_json.so   README.md
lib_mysqludf_json.html  lib_mysqludf_json.sql
[iyunv@server1 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
将用户自定义函数考入插件库
安装gearman-mysql用户自定义函数:
[iyunv@server1 redis]# yum install -y libgearman-1.1.8-2.el6.x86_64.rpm 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
解压gearman-mysql-udf-0.6
编译安装
[iyunv@server1 gearman-mysql-udf-0.6]# ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/
make && make install



注册用户自定义函数:
CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
注册用户自定义函数:
CREATE FUNCTION gman_do_background RETURNS STRING SONAME
'libgearman_mysql_udf.so';
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME
'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME
    -> 'libgearman_mysql_udf.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME
    -> 'libgearman_mysql_udf.so';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.func;
+--------------------+-----+-------------------------+----------+
| name               | ret | dl                      | type     |
+--------------------+-----+-------------------------+----------+
| json_object        |   0 | lib_mysqludf_json.so    | function |
| gman_do_background |   0 | libgearman_mysql_udf.so | function |
| gman_servers_set   |   0 | libgearman_mysql_udf.so | function |
+--------------------+-----+-------------------------+----------+

指定gearman的服务信息
mysql> select gman_servers_set('172.25.33.2:4730');
+--------------------------------------+
| gman_servers_set('172.25.33.2:4730') |
+--------------------------------------+
| 172.25.33.2:4730                     |
+--------------------------------------+
1 row in set (0.00 sec)


编写触发器:
[iyunv@server1 redis]# 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 BEGIN
    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
  END$$
DELIMITER ;

查看触发器:
mysql> SHOW TRIGGERS FROM test;
+-------------+--------+-------+----------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
| Trigger     | Event  | Table | Statement                                                                                                      | Timing | Created | sql_mode | Definer        | character_set_client | collation_connection | Database Collation |
+-------------+--------+-------+----------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
| datatoredis | UPDATE | test  | BEGIN
    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
  END | AFTER  | NULL    |          | root@localhost | latin1               | latin1_swedish_ci    | latin1_swedish_ci  |
+-------------+--------+-------+----------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

mysql>


编写gearman 的worker端
[iyunv@server2 redis]# cat worker.php
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('172.25.33.3', 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);
}
?>


直接后台运行worker
[iyunv@server2 redis]# nohup php worker.php &>/dev/null &
mysql> update test.test set name ='ginkgo';
Query OK, 9 rows affected (0.12 sec)
Rows matched: 9  Changed: 9  Warnings: 0

"westos"
127.0.0.1:6379> MONITOR
OK
1489902207.604830 [0 172.25.33.2:57867] "SET" "1" "ginkgo"
1489902207.605362 [0 172.25.33.2:57867] "SET" "2" "ginkgo"
1489902207.605802 [0 172.25.33.2:57867] "SET" "3" "ginkgo"
1489902207.606244 [0 172.25.33.2:57867] "SET" "4" "ginkgo"
1489902207.606688 [0 172.25.33.2:57867] "SET" "5" "ginkgo"
1489902207.607052 [0 172.25.33.2:57867] "SET" "6" "ginkgo"
1489902207.607333 [0 172.25.33.2:57867] "SET" "7" "ginkgo"
1489902207.607773 [0 172.25.33.2:57867] "SET" "8" "ginkgo"
1489902207.608201 [0 172.25.33.2:57867] "SET" "9" "ginkgo"


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-352077-1-1.html 上篇帖子: linux下的mysql的安装 下篇帖子: mysql安装文档(Linux二进制包安装) mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表