环境: centos6.5 mysql5.6 gearman简介: Gearman是一个支持分布式的任务分发框架。设计简洁,获得了非常广泛的支持。一个典型的Gearman应用包括以下这些部分: Gearman Job Server:Gearman核心程序,以守护进程形式运行在后台 Gearman Client:可以理解为
环境:
centos6.5
mysql5.6
gearman简介:
Gearman是一个支持分布式的任务分发框架。设计简洁,获得了非常广泛的支持。一个典型的Gearman应用包括以下这些部分:
-
Gearman Job Server:Gearman核心程序,以守护进程形式运行在后台
Gearman Client:可以理解为任务的收件员,比如我要在后台执行一个发送邮件的任务,可以在程序中调用一个Gearman Client并传入邮件的信息,然后就可以将执行结果立即展示给用户,而任务本身会慢慢在后台运行。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。
设计思路:
首先利用mysql UDF(通过了lib_mysqludf_json和gearman-mysql-udf的组合实现)在mysql中的数据发生改变时触动触发器将数据传入Gearman中,这时的mysql相当于Gearman的clinet。然后运行自己编写的php程序作为worker,将Gearman中的数据传到Redis中去,这时的Redis相当于是Gearman的consumer。
1、安装gearman
实验中的系统yum源在centos6.5自带的网络yum源的基础上,增加了epel的源,EPEL (Extra Packages for Enterprise Linux,企业版Linux的额外软件包) 是Fedora小组维护的一个软件仓库项目,为RHEL/CentOS提供他们默认不提供的软件包。使用这个源可以免去很多麻烦,省去源码编译的麻烦,需要注意的是,不论是使用centos自带的网络yum源还是epel扩展源,都需要你的IP能够访问到公网。
安装gearman、php、php的gearman扩展、nc工具
yum install -y php-pecl-gearman libgearman libgearman-devel gearmand nc
启动gearman服务
/etc/init.d/gearmand start
验证gearman是否成功启动,如果返回的结果中有4730端口,那么表示服务已经正常启动了
[root@hadoop1 ~]# netstat -alnutp |grep gearman
2、模拟Gearman的工作原理:
使用下列命令查看Gearman的队列
watch -n 1 "(echo status; sleep 0.1) | nc 127.0.0.1 4730"
结果如下
writeLog 0 0 0
四列含义:1-任务名称;2-等待队列任务数;3-运行中的任务数;4-正在运行的worker进程数;
编译一段php代码模拟Gearman的Client:client.php
<?php $client = new GearmanClient(); $client->addServer(); $client->doBackground('writeLog', 'Log content'); echo '文件已经在后台操作'; echo "\n";
执行client.php
php client.php
这时,再次查看Gearman的队列,发现等待队列中有一个任务
writeLog 1 0 0
编写一段php代码模拟Gearman的Worker:worker.php
该worker的作用是将客户端传递给Gearman的字符串'Log content'写入到当前目录下的gearman.log文件中
<?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('writeLog', 'writeLog'); while($worker->work()); function writeLog($job) { $log = $job->workload(); file_put_contents(__DIR__ . '/gearman.log', $log . "\n", FILE_APPEND | LOCK_EX); }
以nohup的方式后台启动worker.php
nohup php worker.php &
再次查看Gearman的队列,发现等待的任务变成0,worker进程变成了1,gearman.log有了内容
writeLog 0 0 1
[root@hadoop1 ~]# cat gearman.log Log content
3、安装mysql-server、mysql、php-mysql(php连接mysql的驱动,非必须,这里是为了稍后用程序比较从Redis和Mysql中分别读取数据的效率)。实验中,由于我的机子上之前已将安装了mysql5.6,所以就直接使用mysql5.6做实验了。当然也可以使用yum开安装mysql,可能安装的mysql版本不是5.6,但是完全没有关系。
安装mysql相关软件
yum install -y mysql-server mysql php-mysql
启动mysql
/etc/init.d/mysql start
4、安装lib_mysqludf_json
wget https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip mv master master.zip unzip master.zip cd lib_mysqludf_json-master rm -rf lib_mysqludf_json.so gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
这时重新编译生成了lib_mysqludf_json.so,然后需要把lib_mysqludf_json.so拷贝到mysql的插件目录下,查看mysql的插件目录:
[root@hadoop1 ~]# mysql -u root -pupbjsxt --execute="show variables like '%plugin%';" +---------------+--------------------------+ | Variable_name | Value | +---------------+--------------------------+ | plugin_dir | /usr/lib64/mysql/plugin/ | +---------------+--------------------------+
[root@hadoop1 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
5、安装gearman-mysql-udf
wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz tar xf gearman-mysql-udf-0.6.tar.gz -C ./ cd gearman-mysql-udf-0.6 ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/ make && make install
该插件直接安装到了mysql的插件目录下。
6、连入mysql,创建对应的function、trigger及设置gearman server信息
[root@hadoop1 ~]# mysql -u root -p****** mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'; mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so' ## 为javashop中的test表建立触发器 mysql> use javashop; mysql> describe test; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | char(20) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> source trigger.sql ## 设置gearman server信息 mysql>SELECT gman_servers_set('127.0.0.1:4730');
trigger.sql脚本文件内容如下
DELIMITER $$ CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN SET @ret=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`)); END$$ DELIMITER ;
7、在mysql中更新一条数据,然后查看gearman的队列
mysql> update test set name='redis' where id=10; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0
writeLog 0 0 1 syncToRedis 1 0 0
可见mysql触发器已经成功的将数据传入到gearman中了。
8、安装redis、php-pecl-redis(php连接redis的驱动)
yum install php-pecl-redis redis -y
启动redis
/etc/init.d/redis start
登录redis客户端,查看当前内存中的数据
[root@hadoop1 ~]# redis-cli redis 127.0.0.1:6379> keys * (empty list or set)
这时,redis中并没有数据。
9、编写一个worker程序,负责将gearman中的数据传入到redis中去:redis_worker.php
<?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('syncToRedis', 'syncToRedis'); $redis = new Redis(); $redis->connect('127.0.0.1'); 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, $workString); }
10、以nohup的方式后台运行redis_worker.php
nohup php redis_worker.php &
这时,再查看gearman的队列
writeLog 0 0 1 syncToRedis 0 0 1
发现syncToRedis任务之前等待的任务数变为了0,正在运行的worker进程数变为了1。
检查redis中是否缓存了数据
[root@hadoop1 ~]# redis-cli redis 127.0.0.1:6379> keys * 1) "10" redis 127.0.0.1:6379> get 10 "{\"id\":10,\"name\":\"redis\"}"
发现redis中已经成功的缓存了mysql中更新的数据,至此功能实现。
11、从redis中读取数据和从mysql中读取数据性能比较
编写php代码,从redis中读取数据:php_redis.php
<?php $stime=microtime(true); //获取程序开始执行的时间 $redis = new Redis(); $redis->connect('127.0.0.1'); echo $redis->get('10'); echo "\n"; $redis->close(); $etime=microtime(true);//获取程序执行结束的时间 $total=$etime-$stime; //计算差值 echo "$total".'秒'; echo "\n"; ?>
编写php代码,从mysql中读取数据:php_mysql.php
<?php $stime=microtime(true); //获取程序开始执行的时间 $con = mysql_connect("127.0.0.1","root","******"); $r2 = mysql_select_db("javashop"); $result = mysql_query("SELECT * FROM test limit 1"); while ($row = mysql_fetch_array($result)) { echo $row['id'] . " --> " . $row['name']; echo "\n"; } mysql_close($con); $etime=microtime(true);//获取程序执行结束的时间 $total=$etime-$stime; //计算差值 echo "$total".'秒'; echo "\n" ?>
分别运行两个php程序
[root@hadoop1 ~]# php php_redis.php {"id":10,"name":"redis"} 0.00059199333190918秒 [root@hadoop1 ~]# php php_mysql.php 10 --> redis 0.0043718814849854秒 [root@hadoop1 ~]# bc <<< 0.0043718814849854/0.00059199333190918 7
通过对一条记录的查询,可以发现,从mysql中获取数据的时长是redis中获取数据时长的7倍,可见性能的提升几乎达一个数量级。
注意点:
亲测印证了mysql在重启后会丢失之前设置的gearman server的信息,解决办法如下:
在mysql的datadir目录下创建init_file.sql文件,内容为gearman server的信息的设置
echo "SELECT gman_servers_set('127.0.0.1:4730');" > /var/lib/mysql/init_file.sql
然后在mysql的配置文件的[mysqld]项中添加如下内容
init-file=/var/lib/mysql/init_file.sql
然后重启mysql,更新一条记录再试试看!
参考:http://avnpc.com/pages/mysql-replication-to-redis-by-gearman
PS:完成了第一篇博客,希望大家多多指教,祝生活愉快!

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。1.没有索引导致查询缓慢,添加索引后可显著提升性能。2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。3.重构表结构和优化JOIN条件可改善表设计问题。4.数据量大时,采用分区和分表策略。5.高并发环境下,优化事务和锁策略可减少锁竞争。

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器