老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

JAVA通過Gearman實現MySQL到Redis的數據同步(異步復制)

MySQL到redis數據復制方案

十多年的善右網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網絡營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整善右建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯公司從事“善右網站設計”,“善右網站推廣”以來,每個客戶項目都認真落實執行。

無論MySQL還是Redis,自身都帶有數據同步的機制,像比較常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog來實現的,這樣的數據復制其實還是一個異步過程,只不過當服務器都在同一內網時,異步的延遲幾乎可以忽略。

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

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

Gearman的安裝與使用

Gearman 是一個支持分布式的任務分發框架。設計簡潔,獲得了非常廣泛的支持。一個典型的Gearman應用包括以下這些部分:

JAVA通過Gearman實現MySQL到Redis的數據同步(異步復制)

Gearman Job Server:Gearman核心程序,需要編譯安裝并以守護進程形式運行在后臺
Gearman Client:可以理解為任務的收件員,比如我要在后臺執行一個發送郵件的任務,可以在程序中調用一個Gearman Client并傳入郵件的信息,然后就可以將執行結果立即展示給用戶,而任務本身會慢慢在后臺運行。
Gearman Worker:任務的真正執行者,一般需要自己編寫具體邏輯并通過守護進程方式運行,Gearman Worker接收到Gearman Client傳遞的任務內容后,會按順序處理。
以前曾經介紹過類似的 后臺任務處理項目Resque 。兩者的設計其實非常接近,簡單可以類比為:

Gearman Job Server:對應Resque的Redis部分
Gearman Client:對應Resque的Queue操作
Gearman Worker:對應Resque的Worker和Job
這里之所以選擇Gearman而不是Resque是因為Gearman提供了比較好用的MySQL UDF,工作量更小。

1、安裝依賴
yum install -y boost-devel gperf libevent-devel libuuid-devel
yum install mysql-devel -y
2、下載gearman
wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
3、編譯安裝,指定mysqlclient的鏈接路徑
tar -zxvf gearmand-1.1.12.tar.gz
cd gearmand-1.1.12
./configure
make && make install

4、啟動gearmand服務端 (啟動之時,在/var/log/下創建gearmand.log日志文件。-l 指定日志文件 -d后臺運行 -L 0.0.0.0 綁定到IPV4
gearmand -L 0.0.0.0 -l /var/log/gearmand.log -d
5、查看是否啟動成功
ps -ef | grep gearman
6、查看是否安裝成功,查看gearman版本信息
gearmand -V

7、MySQL UDF + Trigger同步數據到Gearman (https://github.com/mysqludf)
安裝lib_mysqludf_json(lib_mysqludf_json可以把MySQL表的數據以json數據格式輸出)
wget https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip
unzip master.zip
cd lib_mysqludf_json-master/
rm -rf lib_mysqludf_json.so
8、編譯 mysql_config 這是mysql的配置文件,可以 find /usr -name mysql_config 搜索下在什么位置
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位置)
cp lib_mysqludf_json.so /usr/local/mysql/lib/plugin/

演示lib_mysqludf_json功能
登錄mysql
mysql -uroot -h227.0.0.1 -p
注冊UDF函數
CREATE FUNCTION json_object RETURNS STRING SONAME "lib_mysqludf_json.so";
CREATE FUNCTION json_array RETURNS STRING SONAME "lib_mysqludf_json.so";
CREATE FUNCTION json_members RETURNS STRING SONAME "lib_mysqludf_json.so";
CREATE FUNCTION json_values RETURNS STRING SONAME "lib_mysqludf_json.so";
//json_array|json_members|json_values函數注冊方式與json_object一樣.
select json_object(id,file_save_type,base_dir) as sys_file_save_config from sys_file_save_config;
ERROR 1123 (HY000): Can't initialize function 'json_object'; Invalid json member name - name cannot be empty
以上錯誤這樣解決,給每個成員名稱使用別名即可:
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-mysql-udf)
wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
tar zxvf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
11、安裝libgearman-devel
yum install libgearman-devel -y
如果沒有yum源,添加epel.repo yum源
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

        [epel-debuginfo]
        name=Extra Packages for Enterprise Linux 6 - $basearch - Debug
        #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug
        mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch
        failovermethod=priority
        enabled=0
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
        gpgcheck=1

        [epel-source]
        name=Extra Packages for Enterprise Linux 6 - $basearch - Source
        #baseurl=http://download.fedoraproject.org/pub/epel/6/SRPMS
        mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-6&arch=$basearch
        failovermethod=priority
        enabled=0
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
        gpgcheck=1

12、編譯安裝
(可以登陸MySQL,輸入命令"show variables like '%plugin%'"查看plugin位置, mysql_config的配置文件,以及插件庫所在路徑,編譯之后會在此路徑生成.so文件)
./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/plugin/
make && make install

演示gearman-mysql-udf功能
mysql -uroot -p
CREATE FUNCTION gman_do_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_low RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_low_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_sum RETURNS STRING SONAME "libgearman_mysql_udf.so";
//函數gman_do|gman_do_high|gman_do_low|gman_do_high_background|gman_do_low_background|gman_sum注冊方式類似,請參考gearman-mysql-udf-0.6/README
//指定gearman job server地址
SELECT gman_servers_set('127.0.0.1:4730');

如果出現異常信息:
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)
表示系統找不到 libgearman.so 文件,一般so都在/usr/local/lib目錄下,修改配置文件/etc/ld.so.conf,將/usr/local/lib目錄加入進去即可:
$ cat /etc/ld.so.conf
include ld.so.conf.d/.conf
/usr/local/lib
$ /sbin/ldconfig -v | grep gearman

13、MySQL Trigger調用Gearman UDF實現同步
創建觸發器
DELIMITER $$
CREATE TRIGGER test_data_to_redis AFTER UPDATE ON test FOR EACH ROW BEGIN
SET@ret=gman_do_background('syncToRedis', json_object(NEW.id AS id, NEW.phone ASphone));
END$$;

    DELIMITER $$
CREATE TRIGGER test_data_to_redis2 AFTER INSERT ON test
  FOR EACH ROW BEGIN
    SET @ret=gman_do_background('syncToRedis2', json_object(NEW.id AS `id`, NEW.phone AS`phone`)); 
  END$$
DELIMITER ;

DELIMITER $$
CREATE TRIGGER test_data_to_redis3 BEFORE DELETE ON test
  FOR EACH ROW BEGIN
    SET @ret=gman_do_background('syncToRedis3', json_object(OLD.id AS `id`, OLD.phone AS`phone`)); 
  END$$
DELIMITER ;

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

jar包需要添加到本地jar倉庫:
mvn install:install-file -Dfile=C:\software\java-gearman-service-0.6.6.jar -DgroupId=org.gearman.jgs -DartifactId=java-gearman-service -Dversion=0.6.6 -Dpackaging=jar

        import java.util.concurrent.TimeUnit;

    import org.gearman.Gearman;
    import org.gearman.GearmanFunction;
    import org.gearman.GearmanFunctionCallback;
    import org.gearman.GearmanServer;
    import org.gearman.GearmanWorker;

    /**
     * *ECHO_HOST = "192.168.125.131"為安裝了Gearman并開啟geramand服務的主機地址
     *int ECHO_PORT = 4730默認端口為4730
     *
     * @author Administrator
     *
     */
    public class EchoWorker implements GearmanFunction {

        // function name
        public static final String ECHO_FUNCTION_NAME = "syncToRedis";

        // job server地址
        public static final String ECHO_HOST = "192.168.1.245";

        // job server監聽的端口
        public static final int ECHO_PORT = 4730;

        public static void main(String[] args) {
            // 創建一個Gearman實例
    Gearman gearman = Gearman.createGearman();
    /*
     * 創建一個jobserver
     * 
     * Parameter 1: job server的IP地址 Parameter 2: job server監聽的端口
     * 
     * job server收到client的job,并將其分發給注冊worker
     * 
     */
    GearmanServer server = gearman.createGearmanServer(EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT);
    // 創建一個Gearman的worker
    GearmanWorker worker = gearman.createGearmanWorker(); // 正題來了,創建work節點。
    worker.setReconnectPeriod(2, TimeUnit.SECONDS); // 設置超時重連時間
    worker.setMaximumConcurrency(5); // 最大并發數
    // 告訴工人如何執行工作(主要實現了GearmanFunction接口)
    worker.addFunction(EchoWorker.ECHO_FUNCTION_NAME, new EchoWorker());
    // worker連接服務器
    worker.addServer(server);
}

@Override
public byte[] work(String function, byte[] data, GearmanFunctionCallback callback) throws Exception {
    // work方法實現了GearmanFunction接口中的work方法,本實例中進行了字符串的反寫
    if (data != null) {
        String str = new String(data);
        System.out.println(str);
        StringBuffer sb = new StringBuffer(str);
        return sb.reverse().toString().getBytes();
    } else {
        return "未接收到data".getBytes();
    }
    }
    }
    import org.gearman.Gearman;  
    import org.gearman.GearmanClient;  
    import org.gearman.GearmanJobEvent;  
    import org.gearman.GearmanJobReturn;  
    import org.gearman.GearmanServer;  

public class EchoClient {  
public static void main(String... args) throws InterruptedException {  
        //創建一個Gearman實例  
        Gearman gearman = Gearman.createGearman();  
        //創建一個Gearman client               
        GearmanClient client = gearman.createGearmanClient();  
        /*  
         * 創建一個jobserver  
         *   
         * Parameter 1: job server的IP地址  
         * Parameter 2: job server監聽的端口  
         *   
         *job server收到client的job,并將其分發給注冊worker  
         *  
         */  
        GearmanServer server = gearman.createGearmanServer(  
                        EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT);  
         // 告訴客戶端,提交工作時它可以連接到該服務器  
        client.addServer(server);  
        /*  
         * 向job server提交工作  
         *   
         * Parameter 1: gearman function名字  
         * Parameter 2: 傳送給job server和worker的數據  
         *   
         * GearmanJobReturn返回job發熱結果  
         */  
        GearmanJobReturn jobReturn = client.submitJob(  
                        EchoWorker.ECHO_FUNCTION_NAME, ("Hello World!").getBytes());  
        //遍歷作業事件,直到我們打到最后文件               
        while (!jobReturn.isEOF()) {  

                //下一個作業事件  
                GearmanJobEvent event = jobReturn.poll();  

                switch (event.getEventType()) {  

                case GEARMAN_JOB_SUCCESS:     //job執行成功  
                        System.out.println(new String(event.getData()));  
                        break;  
                case GEARMAN_SUBMIT_FAIL:     //job提交失敗  

                case GEARMAN_JOB_FAIL:        //job執行失敗  
                        System.err.println(event.getEventType() + ": "  
                                        + new String(event.getData()));  
                default:  
                }  
        }  
        //關閉  
        gearman.shutdown();  
}  

}

http://gearman.org/download/
php方案:https://www.tuicool.com/articles/B7Jjaa

JAVA通過Gearman實現MySQL到Redis的數據同步(異步復制)


新聞名稱:JAVA通過Gearman實現MySQL到Redis的數據同步(異步復制)
轉載源于:http://www.xueling.net.cn/article/jhcood.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 中国老太卖婬HD播放 | 亚洲AV成人片色在线观看蜜桃 | 免费看国产一级特黄aaaa大片 | 东北老女人高潮疯狂过瘾对白 | 九色国内自产破解 | 99久33精品字幕 | 妖精视频www网站入口 | 成人免费视频亚洲 | 亚洲午夜久久久影院 | 91一区二区三区 | 8xmv在线观看免费 | 国产免费拔擦拔擦8x高清在线人 | 久久99国产精品尤物 | 欧美日韩精品一区二区三区 | 人人爽人妻精品A片二区 | 国产综合欧美无毒不卡怡红院 | 久久婷婷影院 | 成在人线AV无码免费高潮喷水 | 中文字幕+乱码+中文字幕无忧 | 久草最新在线 | 日本三级日本三级日本三级极 | 国产精品久久久久久久久污网站 | 国产精品成人亚洲一区二区 | 亚洲精品77777 | 一个人看的片免费高清www | 妺妺窝人体色www在线图片 | www.久久久久久久久久 | 欧美人与动牲交a欧美精品 44444kk在线观看三免费 | 国内毛片毛片毛片毛片 | 国产成人不卡无码免费视频 | 中国护士一级毛片 | 欧美成人免费视频 | 久久网站视频 | 无码专区WWW无码专区网网站 | 亚洲精品久久久久国产 | 538国产精品视频一区二区 | а天堂中文在线官网 | 日本大片免费看 | 狠狠操综合 | 操女人逼小说 | 午夜国产在线 |