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

[经验分享] mysql+redis-12227658

[复制链接]

尚未签到

发表于 2018-10-3 06:04:07 | 显示全部楼层 |阅读模式
  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
  所需要的依赖包:
  [root@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
  [root@server2 redis]# ll phpredis-master.zip
  -rwxr-xr-x 1 root root 83734 Oct 21 00:18 phpredis-master.zip
  [root@server2 redis]# unzip phpredis-master.zip
  -bash: unzip: command not found
  安装unzip解压:
  [root@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
  [root@server2 redis]# yum install -y  php-devel-5.3.3-38.el6.x86_64.rpm
  然后在当前目录下执行phpize
  phpize 的作用是侦测当前的php环境,并根据环境生成一个configure。
  [root@server2 phpredis-master]# phpize
  Configuring for:
  PHP Api Version:         20090626
  Zend Module Api No:      20090626
  Zend Extension Api No:   220090626
  [root@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的目录下边:[root@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
  [root@server2 php.d]# cp mysql.ini redis.ini
  [root@server2 php.d]# vim redis.ini
  [root@server2 php.d]# pwd
  /etc/php.d
  [root@server2 php.d]# cat redis.ini
  ; Enable mysql extension module
  extension=redis.so
  或者直接将redis.ini写入php.ini中。
  重起php-fpm,发现redis插件已经插入
  [root@server2 php.d]# php -m |grep redis
  redis
  [root@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的配配置文件:
  [root@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的测试页:
  [root@server2 html]# ls
  50x.html  index.html  index.php
  [root@server2 html]# cat index.php
  
  启动php-fpm服务。
  [root@server2 html]# service php-fpm start
  Starting php-fpm:                                          [  OK  ]
  重起nginx服务
  [root@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
  [root@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的配置文件:
  [root@server3 utils]# vim /etc/redis/6379.conf
  ~~~~~~~~~~
  62  bind 0.0.0.0
  重起
  [root@server3 utils]# /etc/init.d/redis_6379 restart
  Stopping ...
  Redis stopped
  Starting Redis server...
  [root@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的连接需要程序的支持:
  [root@server2 redis]# cat test.php
  
  [root@server2 redis]#
  将这个页面作为php的首页。
  [root@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' ;
  在浏览器上测试:
  即可得到数据库响应的数据

  此时有一个很大的缺陷:内容的一致性,redis在得到结果后,如果查找内容在其内存中存在,那么,他就不会返回数据库取数据,会造成数据的不一致性,所以需要添加一个触发器:
  配置gearman 实现数据同步
  gearman 是一个支持分布式的任务分发框架
  gearman job server 作为gearman的核心程序,需要编译安装并以守护进程形式运行在后台。
  gearman client 任务的请求者
  gearman worker 任务执行着
  在nginx所在的服务器安装gearman
  [root@server2 redis]# yum install -y  gearmand-1.1.8-2.el6.x86_64.rpm
  libgearman-1.1.8-2.el6.x86_64.rpm
  [root@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的扩展
  安装开发包。系统自带
  [root@server2 redis]# yum install -y db*-devel
  编译安装gearman job server
  [root@server2 redis]# tar -xf gearman-1.1.2.tgz
  [root@server2 redis]# cd gearman-1.1.2
  [root@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
  [root@server2 gearman-1.1.2]# phpize
  Configuring for:
  PHP Api Version:         20090626
  Zend Module Api No:      20090626
  Zend Extension Api No:   220090626
  [root@server2 gearman-1.1.2]# ./configure --with-php-config=/usr/bin/php-config
  make && make install
  [root@server2 gearman-1.1.2]# cd /etc/php.d/
  [root@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
  [root@server2 php.d]# cp mysql.ini gearman.ini
  [root@server2 php.d]# vim gearman.ini
  [root@server2 php.d]# vim /etc/php
  php.d/        php-fpm.conf  php-fpm.d/    php.ini
  [root@server2 php.d]# vim /etc/php.ini
  [root@server2 php.d]# cat gearman.ini
  ; Enable mysql extension module
  extension=gearman.so
  或
  [root@server2 php.d]# grep ^extension /etc/php.ini
  extension = gearman.so
  重起Php-fpm
  在server1.example.com添加udf用户自定义函数
  由于要对数据库进行操作,所以要安装数据库开发包
  [root@server1 lib_mysqludf_json-master]# unzip lib_mysqludf_json-master.zip
  [root@server1 lib_mysqludf_json-master]# cd lib_mysqludf_json-master
  [root@server1 lib_mysqludf_json-master]# yum install -y mysql-devel
  [root@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)
  找到数据库插件所在的位置
  [root@server1 lib_mysqludf_json-master]# ls
  lib_mysqludf_json.c     lib_mysqludf_json.so   README.md
  lib_mysqludf_json.html  lib_mysqludf_json.sql
  [root@server1 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
  将用户自定义函数考入插件库
  安装gearman-mysql用户自定义函数:
  [root@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
  编译安装
  [root@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)
  编写触发器:
  [root@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端
  [root@server2 redis]# cat worker.php
  
  直接后台运行worker
  [root@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-607681-1-1.html 上篇帖子: MYSQL数据的备份与恢复 下篇帖子: mysql管理用户
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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