国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JAVA通過(guò)Gearman實(shí)現(xiàn)MySQL到Redis的數(shù)據(jù)同步(異步復(fù)制)

doodlewind / 1952人閱讀

摘要:但是這需要對(duì)文件以及有非常深入的理解,同時(shí)由于存在多種形式,分析實(shí)現(xiàn)同步的工作量是非常大的。因此這里選擇了一種開發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的,將數(shù)據(jù)首先放入中,然后通過(guò)一個(gè)自己編寫的,將數(shù)據(jù)同步到。此類連接遠(yuǎn)程的。

MySQL到Redis數(shù)據(jù)復(fù)制方案

無(wú)論MySQL還是Redis,自身都帶有數(shù)據(jù)同步的機(jī)制,像比較常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog來(lái)實(shí)現(xiàn)的,這樣的數(shù)據(jù)復(fù)制其實(shí)還是一個(gè)異步過(guò)程,只不過(guò)當(dāng)服務(wù)器都在同一內(nèi)網(wǎng)時(shí),異步的延遲幾乎可以忽略。

那么理論上我們也可以用同樣方式,分析MySQL的binlog文件并將數(shù)據(jù)插入Redis。但是這需要對(duì)binlog文件以及MySQL有非常深入的理解,同時(shí)由于 binlog存在Statement/Row/Mixedlevel多種形式 ,分析binlog實(shí)現(xiàn)同步的工作量是非常大的。

因此這里選擇了一種開發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的MySQL UDF,將MySQL數(shù)據(jù)首先放入Gearman中,然后通過(guò)一個(gè)自己編寫的PHP Gearman Worker,將數(shù)據(jù)同步到Redis。比分析binlog的方式增加了不少流程,但是實(shí)現(xiàn)成本更低,更容易操作。

Gearman的安裝與使用

Gearman 是一個(gè)支持分布式的任務(wù)分發(fā)框架。設(shè)計(jì)簡(jiǎn)潔,獲得了非常廣泛的支持。一個(gè)典型的Gearman應(yīng)用包括以下這些部分:

Gearman Job Server:Gearman核心程序,需要編譯安裝并以守護(hù)進(jìn)程形式運(yùn)行在后臺(tái)
Gearman Client:可以理解為任務(wù)的收件員,比如我要在后臺(tái)執(zhí)行一個(gè)發(fā)送郵件的任務(wù),可以在程序中調(diào)用一個(gè)Gearman Client并傳入郵件的信息,然后就可以將執(zhí)行結(jié)果立即展示給用戶,而任務(wù)本身會(huì)慢慢在后臺(tái)運(yùn)行。
Gearman Worker:任務(wù)的真正執(zhí)行者,一般需要自己編寫具體邏輯并通過(guò)守護(hù)進(jìn)程方式運(yùn)行,Gearman Worker接收到Gearman Client傳遞的任務(wù)內(nèi)容后,會(huì)按順序處理。
以前曾經(jīng)介紹過(guò)類似的 后臺(tái)任務(wù)處理項(xiàng)目Resque 。兩者的設(shè)計(jì)其實(shí)非常接近,簡(jiǎn)單可以類比為:

Gearman Job Server:對(duì)應(yīng)Resque的Redis部分
Gearman Client:對(duì)應(yīng)Resque的Queue操作
Gearman Worker:對(duì)應(yīng)Resque的Worker和Job
這里之所以選擇Gearman而不是Resque是因?yàn)镚earman提供了比較好用的MySQL UDF,工作量更小。

1、安裝依賴

</>復(fù)制代碼

  1. yum install -y boost-devel gperf libevent-devel libuuid-devel
  2. yum install mysql-devel -y

2、下載gearman

</>復(fù)制代碼

  1. wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz

3、編譯安裝,指定mysqlclient的鏈接路徑

</>復(fù)制代碼

  1. tar -zxvf gearmand-1.1.12.tar.gz
  2. cd gearmand-1.1.12
  3. ./configure
  4. make && make install

4、啟動(dòng)gearmand服務(wù)端 (啟動(dòng)之時(shí),在/var/log/下創(chuàng)建gearmand.log日志文件。-l 指定日志文件 -d后臺(tái)運(yùn)行 -L 0.0.0.0 綁定到IPV4

</>復(fù)制代碼

  1. gearmand -L 0.0.0.0 -l /var/log/gearmand.log -d

5、查看是否啟動(dòng)成功

</>復(fù)制代碼

  1. ps -ef | grep gearman

6、查看是否安裝成功,查看gearman版本信息

</>復(fù)制代碼

  1. gearmand -V

7、MySQL UDF + Trigger同步數(shù)據(jù)到Gearman (https://github.com/mysqludf)
安裝lib_mysqludf_json(lib_mysqludf_json可以把MySQL表的數(shù)據(jù)以json數(shù)據(jù)格式輸出)

</>復(fù)制代碼

  1. wget https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip
  2. unzip master.zip
  3. cd lib_mysqludf_json-master/
  4. rm -rf lib_mysqludf_json.so

8、編譯 mysql_config 這是mysql的配置文件,可以 find /usr -name mysql_config 搜索下在什么位置

</>復(fù)制代碼

  1. gcc $(/usr/local/mysql/bin/mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

9、拷貝lib_mysqludf_json.so到MySQL的plugin目錄
(可以登陸MySQL,輸入命令"show variables like "%plugin%""查看plugin位置)

</>復(fù)制代碼

  1. cp lib_mysqludf_json.so /usr/local/mysql/lib/plugin/

演示lib_mysqludf_json功能
登錄mysql

</>復(fù)制代碼

  1. mysql -uroot -h127.0.0.1 -p

注冊(cè)UDF函數(shù)

</>復(fù)制代碼

  1. CREATE FUNCTION json_object RETURNS STRING SONAME "lib_mysqludf_json.so";
  2. CREATE FUNCTION json_array RETURNS STRING SONAME "lib_mysqludf_json.so";
  3. CREATE FUNCTION json_members RETURNS STRING SONAME "lib_mysqludf_json.so";
  4. CREATE FUNCTION json_values RETURNS STRING SONAME "lib_mysqludf_json.so";
  5. //json_array|json_members|json_values函數(shù)注冊(cè)方式與json_object一樣.
  6. select json_object(id,file_save_type,base_dir) as sys_file_save_config from sys_file_save_config;
  7. ERROR 1123 (HY000): Can"t initialize function "json_object"; Invalid json member name - name cannot be empty
  8. 以上錯(cuò)誤這樣解決,給每個(gè)成員名稱使用別名即可:
  9. select json_object(id as id ,file_save_type as fileSaveType,app_id as appID) as sys_file_save_config from sys_file_save_config;

10、安裝gearman-mysql-udf (https://launchpad.net/gearman...

</>復(fù)制代碼

  1. wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
  2. tar zxvf gearman-mysql-udf-0.6.tar.gz
  3. cd gearman-mysql-udf-0.6

11、安裝libgearman-devel

</>復(fù)制代碼

  1. yum install libgearman-devel -y

如果沒有yum源,添加epel.repo yum源

</>復(fù)制代碼

  1. [epel]
  2. name=Extra Packages for Enterprise Linux 6 - $basearch
  3. #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
  4. mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
  5. failovermethod=priority
  6. enabled=1
  7. gpgcheck=1
  8. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  9. [epel-debuginfo]
  10. name=Extra Packages for Enterprise Linux 6 - $basearch - Debug
  11. #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug
  12. mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch
  13. failovermethod=priority
  14. enabled=0
  15. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  16. gpgcheck=1
  17. [epel-source]
  18. name=Extra Packages for Enterprise Linux 6 - $basearch - Source
  19. #baseurl=http://download.fedoraproject.org/pub/epel/6/SRPMS
  20. mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-6&arch=$basearch
  21. failovermethod=priority
  22. enabled=0
  23. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  24. gpgcheck=1

12、編譯安裝
(可以登陸MySQL,輸入命令"show variables like "%plugin%""查看plugin位置, mysql_config的配置文件,以及插件庫(kù)所在路徑,編譯之后會(huì)在此路徑生成.so文件)

</>復(fù)制代碼

  1. ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/plugin/
  2. make && make install

演示gearman-mysql-udf功能

</>復(fù)制代碼

  1. mysql -uroot -p
  2. CREATE FUNCTION gman_do_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
  3. CREATE FUNCTION gman_servers_set RETURNS STRING SONAME "libgearman_mysql_udf.so";
  4. CREATE FUNCTION gman_do RETURNS STRING SONAME "libgearman_mysql_udf.so";
  5. CREATE FUNCTION gman_do_high RETURNS STRING SONAME "libgearman_mysql_udf.so";
  6. CREATE FUNCTION gman_do_low RETURNS STRING SONAME "libgearman_mysql_udf.so";
  7. CREATE FUNCTION gman_do_high_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
  8. CREATE FUNCTION gman_do_low_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
  9. CREATE FUNCTION gman_sum RETURNS STRING SONAME "libgearman_mysql_udf.so";
  10. //函數(shù)gman_do|gman_do_high|gman_do_low|gman_do_high_background|gman_do_low_background|gman_sum注冊(cè)方式類似,請(qǐng)參考gearman-mysql-udf-0.6/README
  11. //指定gearman job server地址
  12. SELECT gman_servers_set("127.0.0.1:4730");

如果出現(xiàn)異常信息:
ERROR 1126 (HY000): Can"t open shared library "libgearman_mysql_udf.so" (errno: 11 libgearman.so.8: cannot open shared object file: No such file or directory)
表示系統(tǒng)找不到 libgearman.so 文件,一般so都在/usr/local/lib目錄下,修改配置文件/etc/ld.so.conf,將/usr/local/lib目錄加入進(jìn)去即可:

</>復(fù)制代碼

  1. $ cat /etc/ld.so.conf
  2. include ld.so.conf.d/*.conf
  3. /usr/local/lib
  4. $ /sbin/ldconfig -v | grep gearman*

13、MySQL Trigger調(diào)用Gearman UDF實(shí)現(xiàn)同步
創(chuàng)建觸發(fā)器

</>復(fù)制代碼

  1. DELIMITER $$
  2. CREATE TRIGGER test_data_to_redis AFTER UPDATE ON test FOR EACH ROW BEGIN
  3. SET@ret=gman_do_background("syncToRedis", json_object(NEW.id AS `id`, NEW.phone AS`phone`));
  4. END$$;
  5. DELIMITER $$
  6. CREATE TRIGGER test_data_to_redis2 AFTER INSERT ON test
  7. FOR EACH ROW BEGIN
  8. SET @ret=gman_do_background("syncToRedis2", json_object(NEW.id AS `id`, NEW.phone AS`phone`));
  9. END$$
  10. DELIMITER ;
  11. DELIMITER $$
  12. CREATE TRIGGER test_data_to_redis3 BEFORE DELETE ON test
  13. FOR EACH ROW BEGIN
  14. SET @ret=gman_do_background("syncToRedis3", json_object(OLD.id AS `id`, OLD.phone AS`phone`));
  15. END$$
  16. DELIMITER ;

說(shuō)明以及問(wèn)題:此類采用了gearman官網(wǎng)的java-gearman-service(地址:https://launchpad.net/gearman...),目前release版本是0.6.6。java-gearman-servic.jar包中,即包括gearman server,還包括client和work客戶端API。
問(wèn)題:config類為spring注入的配置文件類,在worker.addFunction中,如果通過(guò)config類的屬性,并且屬性是從配置文件來(lái)的就會(huì)有問(wèn)題。不知道為啥,寫死就是OK的。此類連接遠(yuǎn)程的gearman job server。

jar包需要添加到本地jar倉(cāng)庫(kù):

</>復(fù)制代碼

  1. mvn install:install-file -Dfile=C:softwarejava-gearman-service-0.6.6.jar -DgroupId=org.gearman.jgs -DartifactId=java-gearman-service -Dversion=0.6.6 -Dpackaging=jar
  2. import java.util.concurrent.TimeUnit;
  3. import org.gearman.Gearman;
  4. import org.gearman.GearmanFunction;
  5. import org.gearman.GearmanFunctionCallback;
  6. import org.gearman.GearmanServer;
  7. import org.gearman.GearmanWorker;
  8. /**
  9. * *ECHO_HOST = "192.168.125.131"為安裝了Gearman并開啟geramand服務(wù)的主機(jī)地址
  10. *int ECHO_PORT = 4730默認(rèn)端口為4730
  11. *
  12. * @author Administrator
  13. *
  14. */
  15. public class EchoWorker implements GearmanFunction {
  16. // function name
  17. public static final String ECHO_FUNCTION_NAME = "syncToRedis";
  18. // job server地址
  19. public static final String ECHO_HOST = "192.168.1.245";
  20. // job server監(jiān)聽的端口
  21. public static final int ECHO_PORT = 4730;
  22. public static void main(String[] args) {
  23. // 創(chuàng)建一個(gè)Gearman實(shí)例
  24. Gearman gearman = Gearman.createGearman();
  25. /*
  26. * 創(chuàng)建一個(gè)jobserver
  27. *
  28. * Parameter 1: job server的IP地址 Parameter 2: job server監(jiān)聽的端口
  29. *
  30. * job server收到client的job,并將其分發(fā)給注冊(cè)worker
  31. *
  32. */
  33. GearmanServer server = gearman.createGearmanServer(EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT);
  34. // 創(chuàng)建一個(gè)Gearman的worker
  35. GearmanWorker worker = gearman.createGearmanWorker(); // 正題來(lái)了,創(chuàng)建work節(jié)點(diǎn)。
  36. worker.setReconnectPeriod(2, TimeUnit.SECONDS); // 設(shè)置超時(shí)重連時(shí)間
  37. worker.setMaximumConcurrency(5); // 最大并發(fā)數(shù)
  38. // 告訴工人如何執(zhí)行工作(主要實(shí)現(xiàn)了GearmanFunction接口)
  39. worker.addFunction(EchoWorker.ECHO_FUNCTION_NAME, new EchoWorker());
  40. // worker連接服務(wù)器
  41. worker.addServer(server);
  42. }
  43. @Override
  44. public byte[] work(String function, byte[] data, GearmanFunctionCallback callback) throws Exception {
  45. // work方法實(shí)現(xiàn)了GearmanFunction接口中的work方法,本實(shí)例中進(jìn)行了字符串的反寫
  46. if (data != null) {
  47. String str = new String(data);
  48. System.out.println(str);
  49. StringBuffer sb = new StringBuffer(str);
  50. return sb.reverse().toString().getBytes();
  51. } else {
  52. return "未接收到data".getBytes();
  53. }
  54. }
  55. }
  56. import org.gearman.Gearman;
  57. import org.gearman.GearmanClient;
  58. import org.gearman.GearmanJobEvent;
  59. import org.gearman.GearmanJobReturn;
  60. import org.gearman.GearmanServer;
  61. public class EchoClient {
  62. public static void main(String... args) throws InterruptedException {
  63. //創(chuàng)建一個(gè)Gearman實(shí)例
  64. Gearman gearman = Gearman.createGearman();
  65. //創(chuàng)建一個(gè)Gearman client
  66. GearmanClient client = gearman.createGearmanClient();
  67. /*
  68. * 創(chuàng)建一個(gè)jobserver
  69. *
  70. * Parameter 1: job server的IP地址
  71. * Parameter 2: job server監(jiān)聽的端口
  72. *
  73. *job server收到client的job,并將其分發(fā)給注冊(cè)worker
  74. *
  75. */
  76. GearmanServer server = gearman.createGearmanServer(
  77. EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT);
  78. // 告訴客戶端,提交工作時(shí)它可以連接到該服務(wù)器
  79. client.addServer(server);
  80. /*
  81. * 向job server提交工作
  82. *
  83. * Parameter 1: gearman function名字
  84. * Parameter 2: 傳送給job server和worker的數(shù)據(jù)
  85. *
  86. * GearmanJobReturn返回job發(fā)熱結(jié)果
  87. */
  88. GearmanJobReturn jobReturn = client.submitJob(
  89. EchoWorker.ECHO_FUNCTION_NAME, ("Hello World!").getBytes());
  90. //遍歷作業(yè)事件,直到我們打到最后文件
  91. while (!jobReturn.isEOF()) {
  92. //下一個(gè)作業(yè)事件
  93. GearmanJobEvent event = jobReturn.poll();
  94. switch (event.getEventType()) {
  95. case GEARMAN_JOB_SUCCESS: //job執(zhí)行成功
  96. System.out.println(new String(event.getData()));
  97. break;
  98. case GEARMAN_SUBMIT_FAIL: //job提交失敗
  99. case GEARMAN_JOB_FAIL: //job執(zhí)行失敗
  100. System.err.println(event.getEventType() + ": "
  101. + new String(event.getData()));
  102. default:
  103. }
  104. }
  105. //關(guān)閉
  106. gearman.shutdown();
  107. }

}
官網(wǎng):http://gearman.org/download/
php方案:https://www.tuicool.com/artic...

跟多精彩文章

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70771.html

相關(guān)文章

  • Gearman安裝和使用

    摘要:?jiǎn)?dòng)和如下信息則表示成功查看版本安裝擴(kuò)展從下載最新擴(kuò)展需下載最新源碼包,并解壓縮安裝安裝成功后信息然后,配置文件增加內(nèi)容重啟后,出現(xiàn)如下信息則表示安裝擴(kuò)展成功。 首發(fā)于 樊浩柏科學(xué)院 Gearman 是一個(gè)分布式任務(wù)分發(fā)系統(tǒng),通過(guò)程序調(diào)用(API,跨語(yǔ)言)分布式地把工作委派給更適合做某項(xiàng)工作的機(jī)器,且這些機(jī)器可以以并發(fā)的、負(fù)載均衡的形式來(lái)共同完成某項(xiàng)工作。當(dāng)計(jì)算密集型場(chǎng)景時(shí),適合在后...

    U2FsdGVkX1x 評(píng)論0 收藏0
  • 服務(wù)器遷移踩坑經(jīng)驗(yàn)分享

    摘要:去年年底因?yàn)槭褂昧嗽拼鎯?chǔ)和其他方面的原因,計(jì)劃的將服務(wù)器縮減一個(gè)機(jī)柜出來(lái)。云服務(wù)的回源服務(wù)器的配置中間漏了一臺(tái),后期給補(bǔ)上了。監(jiān)控遷移完畢之后,除了常規(guī)的業(yè)務(wù)代碼,還需要注意圖片資源的回源是否正常服務(wù)器壓力是否正常檢查日志是否出現(xiàn)錯(cuò)誤。 去年年底因?yàn)槭褂昧嗽拼鎯?chǔ)和其他方面的原因,計(jì)劃的將服務(wù)器縮減一個(gè)機(jī)柜出來(lái)。這樣今年每月機(jī)房的費(fèi)用可以減少1萬(wàn)左右。前前后后抽空在弄這個(gè)任務(wù),現(xiàn)做個(gè)筆記...

    Developer 評(píng)論0 收藏0
  • 通用圖床服務(wù)架構(gòu)解析(百萬(wàn)級(jí)回源/天)

    摘要:轉(zhuǎn)發(fā)通過(guò),將請(qǐng)求通過(guò)負(fù)載均衡,均衡給后端處理的服務(wù)。圖床同時(shí)也支持同步上傳回調(diào)通知的方式,將圖片上傳結(jié)果反饋給業(yè)務(wù)方。 Hulk 圖床是支持 360 公司絕大部分業(yè)務(wù)的圖片服務(wù),支持多種圖片處理功能,如:裁剪、壓縮、濾鏡、pHash 計(jì)算、人臉識(shí)別、格式轉(zhuǎn)換、gif 首幀提取……等等,支持的業(yè)務(wù)線包括:搜索、圖搜、新聞、信息流、廣告……等等,每天 CDN 回源圖床后端 150+ 億 P...

    XFLY 評(píng)論0 收藏0
  • 通用圖床服務(wù)架構(gòu)解析(百萬(wàn)級(jí)回源/天)

    摘要:轉(zhuǎn)發(fā)通過(guò),將請(qǐng)求通過(guò)負(fù)載均衡,均衡給后端處理的服務(wù)。圖床同時(shí)也支持同步上傳回調(diào)通知的方式,將圖片上傳結(jié)果反饋給業(yè)務(wù)方。 Hulk 圖床是支持 360 公司絕大部分業(yè)務(wù)的圖片服務(wù),支持多種圖片處理功能,如:裁剪、壓縮、濾鏡、pHash 計(jì)算、人臉識(shí)別、格式轉(zhuǎn)換、gif 首幀提取……等等,支持的業(yè)務(wù)線包括:搜索、圖搜、新聞、信息流、廣告……等等,每天 CDN 回源圖床后端 150+ 億 P...

    Karrdy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<