SymmetricDS 徹底配置安裝手冊

概述

SymmetricDS 是一個基於 Java 的數據庫同步框架。本文並不打算帶你熟悉 SymmetricDS 的實現原理,只是從安裝與配置入手,讓你感覺一下 SymmetricDS 運行效果。若是你的系統中是乾淨(空白)的,那麼你須要作的事情就比較多了。本文但願儘量全面且細緻地講解配置過程,而不至於你按照本文的教程安裝,出現沒法使用的狀況。若是真的有這樣的狀況產生,你能夠在下面進行留言。如下是我在安裝環境時配置的一些記錄,但願於你有益。java


版權說明

著做權歸做者全部。
商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
本文做者:Q-WHai
發表日期: 2016年7月12日
本文連接:http://blog.csdn.net/lemon_tree12138/article/details/51891291
來源:CSDN
更多內容:分類 >> 數據庫
node


個人環境

  1. CentOS release 6.5 (Final)
  2. java version 「1.8.0_92」
  3. mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
  4. OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
  5. symmetric-server-3.7.34

相關配置

安裝配置 JDK

這裏須要你的 JDK 版本爲 jdk1.6 以上,關於 JDK 的安裝和配置這裏就很少說了,網上一大堆。mysql

防火牆

此處爲測試環境,故設置了關閉防火牆linux

$ sudo service iptables stop
$ sudo chkconfig iptables off  # 設置防火牆不隨系統啓動,這一條你能夠選擇性添加

SSH 免密碼登陸

關於 SSH 的免密碼登陸在這裏不是很重要,只是本人在下發文件的時候用到了。你能夠選擇性配置。
配置過程可參見本人另外一篇博客《Hadoop 2.2.0 集羣搭建spring

建立 MySQL 新用戶

這裏爲了不使用 root 賬戶,因此建立了新的數據庫操做用戶:symmetric
首先使用 root 賬戶登陸 MySQL,並執行以下 SQL 語句:sql

mysql> INSERT INTO mysql.user(HOST,USER,PASSWORD) values("localhost","symmetric",password("123456"));
mysql> FLUSH privileges;

上面的 SQL 語句可讓你有一個 symmetric 的MySQL 用戶,但是這個用戶在不少地方都沒有操做權限。這裏須要修改某些操做的權限:數據庫

mysql> UPDATE mysql.user SET Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',Create_priv='Y', Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',Process_priv='Y',File_priv='Y', Grant_priv='Y',References_priv='Y',Index_priv='Y',Alter_priv='Y',Show_db_priv='Y', Super_priv='Y',Create_tmp_table_priv='Y',Lock_tables_priv='Y',Execute_priv='Y',Repl_slave_priv='Y', Repl_client_priv='Y',Create_view_priv='Y',Show_view_priv='Y',Create_routine_priv='Y',Alter_routine_priv='Y', Create_user_priv='Y',Event_priv='Y',Trigger_priv='Y' WHERE USER="symmetric" AND HOST="localhost";
mysql> FLUSH privileges;

配置 MySQL 驅動

在 Java 中,若是須要鏈接 MySQL 數據庫,須要使用 JDBC 的數據庫鏈接技術。在使用 JDBC 的時候比較容易忽略的就是鏈接驅動的配置了。
這一點在 Windows 下還好,不過要在 Linux 下使用 JDBC 就須要配置 MySQL 的驅動程序了。
1. 首先上傳 MySQL 的驅動 jar 包 mysql-connector-java-5.1.6-bin.jar 到 Linux 的合適位置
2. 配置環境變量vim

$ sudo vim /etc/profile

在文件末尾處添加以下內容:ruby

export CLASSPATH=${CLASSPATH}:/home/hadoop/libs/mysql-connector-java-5.1.6-bin.jar

設置配置當即生效bash

$ source /etc/profile

SymmetricDS

首先上傳 symmetric-server-3.7.34 到 master 節點自定義的一個目錄下,再重命名移動到用戶根目錄。

$ mv symmetric-server-3.7.34/ ~/symmetric

而後再下發此文件夾:

$ scp -r ~/symmetric/ slave:~/symmetric/

配置 corp

這裏的 corp 也就是個人 master 節點。
複製 symmetric 目錄下的 samples/corp-000.properties 文件到 engines 目錄下:

$ cp samples/corp-000.properties engines/

並修改此文件內容

$ vim engines/corp-000.properties

修改後的內容以下:

engine.name=corp-000

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://master/sample

db.user=symmetric
db.password=123456

registration.url=
sync.url=http://master:8080/sync/corp-000

group.id=corp
external.id=000

job.purge.period.time.ms=7200000
job.routing.period.time.ms=5000
job.push.period.time.ms=10000
job.pull.period.time.ms=10000
initial.load.create.first=true

這裏我只保留了實際的內容,不包含註釋。

配置 store

這裏的 store 也就是個人 slave 節點。
複製 symmetric 目錄下的 samples/store-001.properties 文件到 engines 目錄下:

$ cp samples/store-001.properties engines/

並修改此文件內容

$ vim engines/store-001.properties

修改後的內容以下:

engine.name=store-001

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://slave/sample

db.user=symmetric
db.password=123456

registration.url=http://master:8080/sync/corp-000

group.id=store
external.id=001

job.routing.period.time.ms=5000
job.push.period.time.ms=10000
job.pull.period.time.ms=10000

配置文件可執行

在默認的狀況下,symmetric/bin 目錄下的文件沒有執行權限,因此這裏咱們要爲這些文件添加可執行權限:

$ chmod 755 bin/*

建立數據庫

$ mysql -usymmetric -p123456
mysql> create database sample;

建立數據表

自動化建立

在 symmetric 中默認已經給出了自動化的數據建立過程,不過這種自動化的建立有一些不足的地方,那就是數據不夠完整。這樣就會導致在後面自動化插入數據時出現找不到數據表的狀況,因此這裏我比較推薦你使用下面手動建立的方式。自動化的建立方式只做爲參考:
建立指令

$ ./bin/symadmin --engine corp-000 create-sym-tables

建立結果

mysql> show tables;
+-----------------------------+
| Tables_in_sample            |
+-----------------------------+
| sym_channel |
| sym_conflict |
| sym_data |
| sym_data_event |
| sym_data_gap |
| sym_extension |
| sym_extract_request |
| sym_file_incoming |
| sym_file_snapshot |
| sym_file_trigger |
| sym_file_trigger_router |
| sym_grouplet |
| sym_grouplet_link |
| sym_incoming_batch |
| sym_incoming_error |
| sym_load_filter |
| sym_lock |
| sym_node |
| sym_node_channel_ctl |
| sym_node_communication |
| sym_node_group |
| sym_node_group_channel_wnd |
| sym_node_group_link |
| sym_node_host |
| sym_node_host_channel_stats |
| sym_node_host_job_stats |
| sym_node_host_stats |
| sym_node_identity |
| sym_node_security |
| sym_outgoing_batch |
| sym_parameter |
| sym_registration_redirect |
| sym_registration_request |
| sym_router |
| sym_sequence |
| sym_table_reload_request |
| sym_transform_column |
| sym_transform_table |
| sym_trigger |
| sym_trigger_hist |
| sym_trigger_router |
| sym_trigger_router_grouplet |
+-----------------------------+
42 rows in set (0.00 sec)

手動建立

手動建立雖然比較繁瑣,可是數據比較完整,整個過程也很順利。

SQL

item

CREATE TABLE item( item_id INTEGER PRIMARY KEY, name VARCHAR(100) );

item_selling_price

CREATE TABLE item_selling_price( item_id INTEGER REFERENCES item(item_id), store_id VARCHAR(5), price DECIMAL(10,2), cost DECIMAL(10,2), PRIMARY KEY(item_id, store_id) );

sale_transaction

CREATE TABLE sale_transaction( tran_id INTEGER PRIMARY KEY, store_id VARCHAR(5) NOT NULL, workstation VARCHAR(3) NOT NULL, day VARCHAR(10) NOT NULL, seq INTEGER NOT NULL );

sale_return_line_item

CREATE TABLE sale_return_line_item( tran_id INTEGER PRIMARY KEY REFERENCES sale_transaction(tran_id), item_id INTEGER NOT NULL REFERENCES item(item_id), price DECIMAL(10,2) NOT NULL, quantity INTEGER NOT NULL, returned_quantity INTEGER );

因而建立了以下 4 張數據表:

mysql> show tables; +-----------------------+
| Tables_in_sample | +-----------------------+
| item                  |
| item_selling_price    |
| sale_return_line_item | | sale_transaction      |
+-----------------------+

修改 HOST

因爲以前的配置文件中設置了 HOST 爲 master,因此這裏須要修改用戶 symmetric 的 HOST。

mysql> UPDATE user SET HOST='%' WHERE user='symmetric';
mysql> FLUSH privileges;

生成分銷系統表

在 symmetric 中默認已經給出了自動化生成分銷系統表的方式,只要一句指令便可:
指令

$ ./bin/symadmin --engine corp-000 create-sym-tables

檢查結果
查看 MySQL 中的數據表

mysql> show tables;
+-----------------------------+
| Tables_in_sample            |
+-----------------------------+
| item |
| item_selling_price |
| sale_return_line_item |
| sale_transaction |
| sym_channel |
| sym_conflict |
| sym_data |
| sym_data_event |
| sym_data_gap |
| sym_extension |
| sym_extract_request |
| sym_file_incoming |
| sym_file_snapshot |
| sym_file_trigger |
| sym_file_trigger_router |
| sym_grouplet |
| sym_grouplet_link |
| sym_incoming_batch |
| sym_incoming_error |
| sym_load_filter |
| sym_lock |
| sym_node |
| sym_node_channel_ctl |
| sym_node_communication |
| sym_node_group |
| sym_node_group_channel_wnd |
| sym_node_group_link |
| sym_node_host |
| sym_node_host_channel_stats |
| sym_node_host_job_stats |
| sym_node_host_stats |
| sym_node_identity |
| sym_node_security |
| sym_outgoing_batch |
| sym_parameter |
| sym_registration_redirect |
| sym_registration_request |
| sym_router |
| sym_sequence |
| sym_table_reload_request |
| sym_transform_column |
| sym_transform_table |
| sym_trigger |
| sym_trigger_hist |
| sym_trigger_router |
| sym_trigger_router_grouplet |
+-----------------------------+
46 rows in set (0.00 sec)

填充數據

雖然上面說了一堆東西,可是還只是一堆空的數據表,以下咱們就把 symmetric 自帶的數據填充到數據表中。操做過程以下:
指令

$ ./bin/dbimport --engine corp-000 ./samples/insert_sample.sql

結果檢查

mysql> select * from item_selling_price; +----------+----------+-------+------+
| item_id | store_id | price | cost | +----------+----------+-------+------+
| 11000001 | 001      |  0.20 | 0.10 |
| 11000001 | 002 | 0.30 | 0.20 | +----------+----------+-------+------+
2 rows in set (0.00 sec)

啓動 SymmetricDS

由於這裏是兩個節點之間的數據同步,因此咱們須要啓動兩個節點:corp 和 store
start corp node
corp 設置開啓的端口爲 8080

$ ./bin/sym --engine corp-000 --port 8080

start store node
store 設置開啓的端口爲 9090

$ ./bin/sym --engine store-001 --port 9090

上面兩個窗口的啓動以後,會進入等待狀態,因此若是有其餘操做,就須要另外打開窗口了。

註冊節點

這裏還有一步須要處理就是註冊節點,註冊操做在 corp 和 store 啓動以後進行。

$ ./bin/symadmin --engine corp-000 open-registration store 001
Log output will be written to /home/hadoop/symmetric/logs/symmetric.log
[] - AbstractCommandLauncher - Option: name=engine, value={corp-000}
[corp-000] - JdbcDatabasePlatformFactory - Detected database 'MySQL', version '5', protocol 'mysql'
[corp-000] - JdbcDatabasePlatformFactory - The IDatabasePlatform being used is org.jumpmind.db.platform.mysql.MySqlDatabasePlatform
[corp-000] - MySqlSymmetricDialect - The DbDialect being used is org.jumpmind.symmetric.db.mysql.MySqlSymmetricDialect
[corp-000] - ExtensionService - Found 0 extension points from the database that will be registered
[corp-000] - StagingManager - The staging directory was initialized at the following location: /home/hadoop/symmetric/tmp/corp-000
[corp-000] - ClusterService - This node picked a server id of master
[corp-000] - ExtensionService - Found 0 extension points from the database that will be registered
[corp-000] - ClientExtensionService - Found 9 extension points from spring that will be registered
[corp-000] - RegistrationService - Registration was reopened for 001
Opened registration for node group of 'store' external ID of '001'

發送初始負載

發送初始負載的目的是將最開始的時候 corp 節點數據表中的數據同步到 store 節點中。若是你開始的數據表中沒有這些數據,那麼就能夠不用發送此負載了。
指令

$ ./bin/symadmin --engine corp-000 reload-node 001

結果

Log output will be written to /home/hadoop/symmetric/logs/symmetric.log
[] - AbstractCommandLauncher - Option: name=engine, value={corp-000}
[corp-000] - JdbcDatabasePlatformFactory - Detected database 'MySQL', version '5', protocol 'mysql'
[corp-000] - JdbcDatabasePlatformFactory - The IDatabasePlatform being used is org.jumpmind.db.platform.mysql.MySqlDatabasePlatform
[corp-000] - MySqlSymmetricDialect - The DbDialect being used is org.jumpmind.symmetric.db.mysql.MySqlSymmetricDialect
[corp-000] - ExtensionService - Found 0 extension points from the database that will be registered
[corp-000] - StagingManager - The staging directory was initialized at the following location: /home/hadoop/symmetric/tmp/corp-000
[corp-000] - ClusterService - This node picked a server id of master
[corp-000] - ExtensionService - Found 0 extension points from the database that will be registered
[corp-000] - ClientExtensionService - Found 9 extension points from spring that will be registered
Successfully enabled initial load for node 001

測試驗證

這裏的驗證爲在 corp(即 master) 節點上修改一條數據,觀察兩個節點中數據表的變化。
在 corp 節點的數據庫中執行相應 SQL 語句:

更新

mysql> UPDATE item_selling_price SET price='0.21' WHERE item_id='11000001' AND store_id='001';

corp

mysql> select * from item_selling_price; +----------+----------+-------+------+
| item_id | store_id | price | cost | +----------+----------+-------+------+
| 11000001 | 001      |  0.21 | 0.10 |
| 11000001 | 002 | 0.30 | 0.20 | +----------+----------+-------+------+
2 rows in set (0.00 sec)

store

mysql> select * from item_selling_price; +----------+----------+-------+------+
| item_id | store_id | price | cost | +----------+----------+-------+------+
| 11000001 | 001 | 0.21 | 0.10 | +----------+----------+-------+------+
1 row in set (0.00 sec)

插入

注意這裏不要只添加一條記錄,由於涉及到了數據庫的觸發器,咱們虛擬了一條交易記錄,以下:

mysql> INSERT INTO item (item_id, name) VALUES (110000055, 'Soft Drink');
mysql> INSERT INTO item_selling_price (item_id, store_id, price) VALUES (110000055, '001', 0.65);
mysql> INSERT INTO item_selling_price (item_id, store_id, price) VALUES (110000055, '002', 1.00);

當一條交易被完成以後,咱們再去檢查一下 store 節點中的數據信息:

mysql> select * from item_selling_price;
+-----------+----------+-------+------+
| item_id | store_id | price | cost | +-----------+----------+-------+------+
|  11000001 | 001      |  0.22 | 0.10 |
| 110000055 | 001 | 0.65 | NULL | +-----------+----------+-------+------+
2 rows in set (0.00 sec)
mysql> select * from item;
+-----------+------------+
| item_id | name | +-----------+------------+
|  11000001 | Yummy Gum  |
| 110000055 | Soft Drink | +-----------+------------+
2 rows in set (0.00 sec)

數據的確是有增長的,驗證完成。


Ref

相關文章
相關標籤/搜索