515439429 发表于 2018-10-3 06:04:07

mysql+redis-12227658

  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.3redis
  所需要的依赖包:
  # 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.rpmredis-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
  # ll phpredis-master.zip
  -rwxr-xr-x 1 root root 83734 Oct 21 00:18 phpredis-master.zip
  # unzip phpredis-master.zip
  -bash: unzip: command not found
  安装unzip解压:
  # ls
  common.h   debian.controlmkdeb-apache2.shredis_session.c
  config.m4igbinary      php_redis.h       redis_session.h
  CREDITS    library.c       README.markdown   serialize.list
  debian   library.h       redis.c         tests
  发现其中并没有可执行文件,需要php的开发包php-devel
  # yum install -yphp-devel-5.3.3-38.el6.x86_64.rpm
  然后在当前目录下执行phpize
  phpize 的作用是侦测当前的php环境,并根据环境生成一个configure。
  # phpize
  Configuring for:
  PHP Api Version:         20090626
  Zend Module Api No:      20090626
  Zend Extension Api No:   220090626
  # ls
  acinclude.m4    config.sub      library.c         README.markdown
  aclocal.m4      configure       library.h         redis.c
  autom4te.cacheconfigure.in    ltmain.sh         redis_session.c
  build         CREDITS         Makefile.global   redis_session.h
  common.h      debian          missing         run-tests.php
  config.guess    debian.controlmkdeb-apache2.shserialize.list
  config.h.in   igbinary      mkinstalldirs   tests
  config.m4       install-sh      php_redis.h
  编译安装:
  编译完成后并不会生成redis.ini文件,需要自己手动生成,php.ini 在php-common的目录下边:# 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
  # cp mysql.ini redis.ini
  # vim redis.ini
  # pwd
  /etc/php.d
  # cat redis.ini
  ; Enable mysql extension module
  extension=redis.so
  或者直接将redis.ini写入php.ini中。
  重起php-fpm,发现redis插件已经插入
  # php -m |grep redis
  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的配配置文件:
  # !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_indexindex.php;
  34         fastcgi_paramSCRIPT_FILENAME   /usr/share/nginx/html/$fastcgi_script_name;
  35         include      fastcgi_params;
  36   }
  在/usr/share/nginx/html下编写php的测试页:
  # ls
  50x.htmlindex.htmlindex.php
  # cat index.php
  
  启动php-fpm服务。
  # service php-fpm start
  Starting php-fpm:                                          
  重起nginx服务
  # service nginx restart
  Stopping nginx:                                          
  Starting nginx:                                          
  然后即可通过网页访问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
  # ./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:
  Selecting default: 6379
  然后一路回车
  修改redis-server的配置文件:
  # vim /etc/redis/6379.conf
  ~~~~~~~~~~
  62bind 0.0.0.0
  重起
  # /etc/init.d/redis_6379 restart
  Stopping ...
  Redis stopped
  Starting Redis server...
  # netstat -antlp |grep redis
  tcp      0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      4534/redis-server 0
  redis监听在所有端口,
  测试:
  数据库和php的连接需要程序的支持:
  # cat test.php
  
  #
  将这个页面作为php的首页。
  # 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' ;
  在浏览器上测试:
  即可得到数据库响应的数据
http://blog.51cto.com/e/u261/themes/default/images/spacer.gifhttp://blog.51cto.com/e/u261/themes/default/images/spacer.gif
  此时有一个很大的缺陷:内容的一致性,redis在得到结果后,如果查找内容在其内存中存在,那么,他就不会返回数据库取数据,会造成数据的不一致性,所以需要添加一个触发器:
  配置gearman 实现数据同步
  gearman 是一个支持分布式的任务分发框架
  gearman job server 作为gearman的核心程序,需要编译安装并以守护进程形式运行在后台。
  gearman client 任务的请求者
  gearman worker 任务执行着
  在nginx所在的服务器安装gearman
  # yum install -ygearmand-1.1.8-2.el6.x86_64.rpm
  libgearman-1.1.8-2.el6.x86_64.rpm
  # yum install -ylibgearman-devel-1.1.8-2.el6.x86_64.rpmlibevent-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的扩展
  安装开发包。系统自带
  # yum install -y db*-devel
  编译安装gearman job server
  # tar -xf gearman-1.1.2.tgz
  # cd gearman-1.1.2
  # ls
  ChangeLogCREDITS   LICENSE      php_gearman.htest_client.phptest_worker.php
  config.m4examplesphp_gearman.cREADME         tests
  # phpize
  Configuring for:
  PHP Api Version:         20090626
  Zend Module Api No:      20090626
  Zend Extension Api No:   220090626
  # ./configure --with-php-config=/usr/bin/php-config
  make && make install
  # cd /etc/php.d/
  # ls
  curl.ini      json.ini    mysql.inipdo_mysql.ini   phar.ini   sqlite3.ini
  fileinfo.inimysqli.inipdo.ini    pdo_sqlite.iniredis.inizip.ini
  # cp mysql.ini gearman.ini
  # vim gearman.ini
  # vim /etc/php
  php.d/      php-fpm.confphp-fpm.d/    php.ini
  # vim /etc/php.ini
  # cat gearman.ini
  ; Enable mysql extension module
  extension=gearman.so
  或
  # grep ^extension /etc/php.ini
  extension = gearman.so
  重起Php-fpm
  在server1.example.com添加udf用户自定义函数
  由于要对数据库进行操作,所以要安装数据库开发包
  # unzip lib_mysqludf_json-master.zip
  # cd lib_mysqludf_json-master
  # yum install -y mysql-devel
  # 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)
  找到数据库插件所在的位置
  # ls
  lib_mysqludf_json.c   lib_mysqludf_json.so   README.md
  lib_mysqludf_json.htmllib_mysqludf_json.sql
  # cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
  将用户自定义函数考入插件库
  安装gearman-mysql用户自定义函数:
  # yum install -y libgearman-1.1.8-2.el6.x86_64.rpm libgearman-devel-1.1.8-2.el6.x86_64.rpmlibevent-devel-1.4.13-4.el6.x86_64.rpm libevent-doc-1.4.13-4.el6.noarch.rpmlibevent-headers-1.4.13-4.el6.noarch.rpm
  解压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)
  编写触发器:
  # 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端
  # cat worker.php
  
  直接后台运行worker
  # nohup php worker.php &>/dev/null &
  mysql> update test.test set name ='ginkgo';
  Query OK, 9 rows affected (0.12 sec)
  Rows matched: 9Changed: 9Warnings: 0
  "westos"
  127.0.0.1:6379> MONITOR
  OK
  1489902207.604830 "SET" "1" "ginkgo"
  1489902207.605362 "SET" "2" "ginkgo"
  1489902207.605802 "SET" "3" "ginkgo"
  1489902207.606244 "SET" "4" "ginkgo"
  1489902207.606688 "SET" "5" "ginkgo"
  1489902207.607052 "SET" "6" "ginkgo"
  1489902207.607333 "SET" "7" "ginkgo"
  1489902207.607773 "SET" "8" "ginkgo"
  1489902207.608201 "SET" "9" "ginkgo"
http://blog.51cto.com/e/u261/themes/default/images/spacer.gifhttp://blog.51cto.com/e/u261/themes/default/images/spacer.gif

页: [1]
查看完整版本: mysql+redis-12227658