Commit d5658d5b32bbfeebad90fc0b7519865d258ad280

Authored by AndrewVolosytnykhThingsboard
Committed by Andrew Shvayka
1 parent 1240099c

Code cleaning, improvement of README.md

@@ -54,7 +54,8 @@ @@ -54,7 +54,8 @@
54 <cassandra.version>4.10.0</cassandra.version> 54 <cassandra.version>4.10.0</cassandra.version>
55 <metrics.version>4.0.5</metrics.version> 55 <metrics.version>4.0.5</metrics.version>
56 <cassandra-unit.version>4.3.1.0</cassandra-unit.version> 56 <cassandra-unit.version>4.3.1.0</cassandra-unit.version>
57 - <cassandra-all.version>3.11.9</cassandra-all.version> 57 + <cassandra-all.version>3.11.10</cassandra-all.version>
  58 + <cassandra-driver-core.version>3.11.0</cassandra-driver-core.version>
58 <takari-cpsuite.version>1.2.7</takari-cpsuite.version> 59 <takari-cpsuite.version>1.2.7</takari-cpsuite.version>
59 <guava.version>28.2-jre</guava.version> 60 <guava.version>28.2-jre</guava.version>
60 <caffeine.version>2.6.1</caffeine.version> 61 <caffeine.version>2.6.1</caffeine.version>
@@ -1096,6 +1097,11 @@ @@ -1096,6 +1097,11 @@
1096 <version>${cassandra.version}</version> 1097 <version>${cassandra.version}</version>
1097 </dependency> 1098 </dependency>
1098 <dependency> 1099 <dependency>
  1100 + <groupId>com.datastax.cassandra</groupId>
  1101 + <artifactId>cassandra-driver-core</artifactId>
  1102 + <version>${cassandra-driver-core.version}</version>
  1103 + </dependency>
  1104 + <dependency>
1099 <groupId>io.dropwizard.metrics</groupId> 1105 <groupId>io.dropwizard.metrics</groupId>
1100 <artifactId>metrics-jmx</artifactId> 1106 <artifactId>metrics-jmx</artifactId>
1101 <version>${metrics.version}</version> 1107 <version>${metrics.version}</version>
@@ -54,17 +54,14 @@ @@ -54,17 +54,14 @@
54 <dependency> 54 <dependency>
55 <groupId>org.apache.cassandra</groupId> 55 <groupId>org.apache.cassandra</groupId>
56 <artifactId>cassandra-all</artifactId> 56 <artifactId>cassandra-all</artifactId>
57 - <version>3.11.10</version>  
58 </dependency> 57 </dependency>
59 <dependency> 58 <dependency>
60 <groupId>com.datastax.cassandra</groupId> 59 <groupId>com.datastax.cassandra</groupId>
61 <artifactId>cassandra-driver-core</artifactId> 60 <artifactId>cassandra-driver-core</artifactId>
62 - <version>3.10.1</version>  
63 </dependency> 61 </dependency>
64 <dependency> 62 <dependency>
65 <groupId>commons-io</groupId> 63 <groupId>commons-io</groupId>
66 <artifactId>commons-io</artifactId> 64 <artifactId>commons-io</artifactId>
67 - <version>2.5</version>  
68 </dependency> 65 </dependency>
69 </dependencies> 66 </dependencies>
70 67
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.client.tools.migrator; 16 package org.thingsboard.client.tools.migrator;
2 17
3 import com.google.common.collect.Lists; 18 import com.google.common.collect.Lists;
@@ -122,29 +137,52 @@ public class PgCaMigrator { @@ -122,29 +137,52 @@ public class PgCaMigrator {
122 } 137 }
123 } 138 }
124 139
125 - private void logLinesProcessed() {  
126 - if (linesProcessed++ % LOG_BATCH == 0) {  
127 - System.out.println(new Date() + " linesProcessed = " + linesProcessed + " in, castOk " + castedOk + " castErr " + castErrors); 140 + private void logLinesProcessed(long lines) {
  141 + if (lines % LOG_BATCH == 0) {
  142 + System.out.println(new Date() + " lines processed = " + lines + " in, castOk " + castedOk + " castErr " + castErrors);
128 } 143 }
129 } 144 }
130 145
131 - private List<Object> toValuesTs(List<String> raw) {  
132 - linesTsMigrated++;  
133 - List<Object> result = new ArrayList<>(); 146 + private void logLinesMigrated(long lines) {
  147 + if(lines % LOG_BATCH == 0) {
  148 + System.out.println(new Date() + " lines migrated = " + lines + " in, castOk " + castedOk + " castErr " + castErrors);
  149 + }
  150 + }
  151 +
  152 + private void addTypeIdKey(List<Object> result, List<String> raw) {
134 result.add(entityIdsAndTypes.getEntityType(raw.get(0))); 153 result.add(entityIdsAndTypes.getEntityType(raw.get(0)));
135 result.add(UUID.fromString(raw.get(0))); 154 result.add(UUID.fromString(raw.get(0)));
136 result.add(keyParser.getKeyByKeyId(raw.get(1))); 155 result.add(keyParser.getKeyByKeyId(raw.get(1)));
  156 + }
137 157
  158 + private void addPartitions(List<Object> result, List<String> raw) {
138 long ts = Long.parseLong(raw.get(2)); 159 long ts = Long.parseLong(raw.get(2));
139 long partition = toPartitionTs(ts); 160 long partition = toPartitionTs(ts);
140 result.add(partition); 161 result.add(partition);
141 result.add(ts); 162 result.add(ts);
  163 + }
  164 +
  165 + private void addTimeseries(List<Object> result, List<String> raw) {
  166 + result.add(Long.parseLong(raw.get(2)));
  167 + }
142 168
  169 + private void addValues(List<Object> result, List<String> raw) {
143 result.add(raw.get(3).equals("\\N") ? null : raw.get(3).equals("t") ? Boolean.TRUE : Boolean.FALSE); 170 result.add(raw.get(3).equals("\\N") ? null : raw.get(3).equals("t") ? Boolean.TRUE : Boolean.FALSE);
144 result.add(raw.get(4).equals("\\N") ? null : raw.get(4)); 171 result.add(raw.get(4).equals("\\N") ? null : raw.get(4));
145 result.add(raw.get(5).equals("\\N") ? null : Long.parseLong(raw.get(5))); 172 result.add(raw.get(5).equals("\\N") ? null : Long.parseLong(raw.get(5)));
146 result.add(raw.get(6).equals("\\N") ? null : Double.parseDouble(raw.get(6))); 173 result.add(raw.get(6).equals("\\N") ? null : Double.parseDouble(raw.get(6)));
147 result.add(raw.get(7).equals("\\N") ? null : raw.get(7)); 174 result.add(raw.get(7).equals("\\N") ? null : raw.get(7));
  175 + }
  176 +
  177 + private List<Object> toValuesTs(List<String> raw) {
  178 +
  179 + logLinesMigrated(linesTsMigrated++);
  180 +
  181 + List<Object> result = new ArrayList<>();
  182 +
  183 + addTypeIdKey(result, raw);
  184 + addPartitions(result, raw);
  185 + addValues(result, raw);
148 186
149 processPartitions(result); 187 processPartitions(result);
150 188
@@ -152,20 +190,12 @@ public class PgCaMigrator { @@ -152,20 +190,12 @@ public class PgCaMigrator {
152 } 190 }
153 191
154 private List<Object> toValuesLatest(List<String> raw) { 192 private List<Object> toValuesLatest(List<String> raw) {
155 - linesLatestMigrated++; 193 + logLinesMigrated(linesLatestMigrated++);
156 List<Object> result = new ArrayList<>(); 194 List<Object> result = new ArrayList<>();
157 - result.add(this.entityIdsAndTypes.getEntityType(raw.get(0)));  
158 - result.add(UUID.fromString(raw.get(0)));  
159 - result.add(this.keyParser.getKeyByKeyId(raw.get(1)));  
160 -  
161 - long ts = Long.parseLong(raw.get(2));  
162 - result.add(3, ts);  
163 195
164 - result.add(raw.get(3).equals("\\N") ? null : raw.get(3).equals("t") ? Boolean.TRUE : Boolean.FALSE);  
165 - result.add(raw.get(4).equals("\\N") ? null : raw.get(4));  
166 - result.add(raw.get(5).equals("\\N") ? null : Long.parseLong(raw.get(5)));  
167 - result.add(raw.get(6).equals("\\N") ? null : Double.parseDouble(raw.get(6)));  
168 - result.add(raw.get(7).equals("\\N") ? null : raw.get(7)); 196 + addTypeIdKey(result, raw);
  197 + addTimeseries(result, raw);
  198 + addValues(result, raw);
169 199
170 return result; 200 return result;
171 } 201 }
@@ -184,7 +214,7 @@ public class PgCaMigrator { @@ -184,7 +214,7 @@ public class PgCaMigrator {
184 String currentLine; 214 String currentLine;
185 linesProcessed = 0; 215 linesProcessed = 0;
186 while(iterator.hasNext()) { 216 while(iterator.hasNext()) {
187 - logLinesProcessed(); 217 + logLinesProcessed(linesProcessed++);
188 currentLine = iterator.nextLine(); 218 currentLine = iterator.nextLine();
189 if(isBlockFinished(currentLine)) { 219 if(isBlockFinished(currentLine)) {
190 return; 220 return;
@@ -21,8 +21,6 @@ It will generate single jar file with all required dependencies inside `target d @@ -21,8 +21,6 @@ It will generate single jar file with all required dependencies inside `target d
21 #### Dump data from the source Postgres Database 21 #### Dump data from the source Postgres Database
22 *Do not use compression if possible because Tool can only work with uncompressed file 22 *Do not use compression if possible because Tool can only work with uncompressed file
23 23
24 -*If you want to migrate just `ts_kv` without `ts_kv_latest` just don't dump an unnecessary table and when starting the tool don't use arguments (paths) for input dump and output files*  
25 -  
26 1. Dump related tables that need to correct save telemetry 24 1. Dump related tables that need to correct save telemetry
27 25
28 `pg_dump -h localhost -U postgres -d thingsboard -t tenant -t customer -t user -t dashboard -t asset -t device -t alarm -t rule_chain -t rule_node -t entity_view -t widgets_bundle -t widget_type -t tenant_profile -t device_profile -t api_usage_state -t tb_user > related_entities.dmp` 26 `pg_dump -h localhost -U postgres -d thingsboard -t tenant -t customer -t user -t dashboard -t asset -t device -t alarm -t rule_chain -t rule_node -t entity_view -t widgets_bundle -t widget_type -t tenant_profile -t device_profile -t api_usage_state -t tb_user > related_entities.dmp`
@@ -38,21 +36,26 @@ Tool use 3 different directories for saving SSTables - `ts_kv_cf`, `ts_kv_latest @@ -38,21 +36,26 @@ Tool use 3 different directories for saving SSTables - `ts_kv_cf`, `ts_kv_latest
38 36
39 Create 3 empty directories. For example: 37 Create 3 empty directories. For example:
40 38
41 - /home/ubunut/migration/ts  
42 - /home/ubunut/migration/ts_latest  
43 - /home/ubunut/migration/ts_partition 39 + /home/user/migration/ts
  40 + /home/user/migration/ts_latest
  41 + /home/user/migration/ts_partition
44 42
45 #### Run tool 43 #### Run tool
46 -*Note: if you run this tool on remote instance - don't forget to execute this command in `screen` to avoid unexpected termination 44 +
  45 +**If you want to migrate just `ts_kv` without `ts_kv_latest` or vice versa don't use arguments (paths) for output files*
  46 +
  47 +**Note: if you run this tool on remote instance - don't forget to execute this command in `screen` to avoid unexpected termination*
47 48
48 ``` 49 ```
49 java -jar ./tools-2.4.1-SNAPSHOT-jar-with-dependencies.jar 50 java -jar ./tools-2.4.1-SNAPSHOT-jar-with-dependencies.jar
50 - -telemetryFrom ./source/ts_kv_all.dmp 51 + -telemetryFrom /home/user/dump/ts_kv_all.dmp
  52 + -relatedEntities /home/user/dump/relatedEntities.dmp
51 -latestOut /home/ubunut/migration/ts_latest 53 -latestOut /home/ubunut/migration/ts_latest
52 - -tsOut /home/ubunut/migration/ts  
53 - -partitionsOut /home/ubunut/migration/ts_partition  
54 - -castEnable false 54 + -tsOut /home/ubunut/migration/ts
  55 + -partitionsOut /home/ubunut/migration/ts_partition
  56 + -castEnable false
55 ``` 57 ```
  58 +*Use your paths for program arguments*
56 59
57 Tool execution time depends on DB size, CPU resources and Disk throughput 60 Tool execution time depends on DB size, CPU resources and Disk throughput
58 61
@@ -62,20 +65,21 @@ Tool execution time depends on DB size, CPU resources and Disk throughput @@ -62,20 +65,21 @@ Tool execution time depends on DB size, CPU resources and Disk throughput
62 1. [Optional] install Cassandra on the instance 65 1. [Optional] install Cassandra on the instance
63 2. [Optional] Using `cqlsh` create `thingsboard` keyspace and requred tables from this file `schema-ts.cql` 66 2. [Optional] Using `cqlsh` create `thingsboard` keyspace and requred tables from this file `schema-ts.cql`
64 3. Stop Cassandra 67 3. Stop Cassandra
65 -4. Copy generated SSTable files into cassandra data dir: 68 +4. Look at `/var/lib/cassandra/data/thingsboard` and check for names of data folders
  69 +5. Copy generated SSTable files into cassandra data dir using next command:
66 70
67 ``` 71 ```
68 - sudo find /home/ubunut/migration/ts -name '*.*' -exec mv {} /var/lib/cassandra/data/thingsboard/ts_kv_cf-0e9aaf00ee5511e9a5fa7d6f489ffd13/ \;  
69 - sudo find /home/ubunut/migration/ts_latest -name '*.*' -exec mv {} /var/lib/cassandra/data/thingsboard/ts_kv_latest_cf-161449d0ee5511e9a5fa7d6f489ffd13/ \;  
70 - sudo find /home/ubunut/migration/ts_partition -name '*.*' -exec mv {} /var/lib/cassandra/data/thingsboard/ts_kv_partitions_cf-12e8fa80ee5511e9a5fa7d6f489ffd13/ \; 72 + sudo find /home/user/migration/ts -name '*.*' -exec mv {} /var/lib/cassandra/data/thingsboard/ts_kv_cf-0e9aaf00ee5511e9a5fa7d6f489ffd13/ \;
  73 + sudo find /home/user/migration/ts_latest -name '*.*' -exec mv {} /var/lib/cassandra/data/thingsboard/ts_kv_latest_cf-161449d0ee5511e9a5fa7d6f489ffd13/ \;
  74 + sudo find /home/user/migration/ts_partition -name '*.*' -exec mv {} /var/lib/cassandra/data/thingsboard/ts_kv_partitions_cf-12e8fa80ee5511e9a5fa7d6f489ffd13/ \;
71 ``` 75 ```
72 -  
73 -5. Start Cassandra service and trigger compaction 76 + *Pay attention! Data folders have similar name `ts_kv_cf-0e9aaf00ee5511e9a5fa7d6f489ffd13`, but you have to use own*
  77 +6. Start Cassandra service and trigger compaction
  78 +
  79 + Trigger compactions: `nodetool compact thingsboard`
  80 +
  81 + Check compaction status: `nodetool compactionstats`
74 82
75 -```  
76 - trigger compactions: nodetool compact thingsboard  
77 - check compaction status: nodetool compactionstats  
78 -```  
79 83
80 ## Switch Thignsboard into Hybrid Mode 84 ## Switch Thignsboard into Hybrid Mode
81 85