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]