committed by
GitHub
53 changed files with 1030 additions and 250 deletions
@ -0,0 +1,39 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2022 The Thingsboard Authors |
||||
|
* |
||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
* you may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at |
||||
|
* |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
*/ |
||||
|
package org.thingsboard.server.common.data.sync.vc; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
import java.util.Objects; |
||||
|
|
||||
|
@Data |
||||
|
public class BranchInfo { |
||||
|
private final String name; |
||||
|
private final boolean isDefault; |
||||
|
|
||||
|
@Override |
||||
|
public boolean equals(Object o) { |
||||
|
if (this == o) return true; |
||||
|
if (o == null || getClass() != o.getClass()) return false; |
||||
|
BranchInfo that = (BranchInfo) o; |
||||
|
return Objects.equals(name, that.name); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int hashCode() { |
||||
|
return Objects.hash(name); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,156 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2022 The Thingsboard Authors |
||||
|
* |
||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
* you may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at |
||||
|
* |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
*/ |
||||
|
package org.thingsboard.server.dao.sqlts; |
||||
|
|
||||
|
import com.google.common.util.concurrent.Futures; |
||||
|
import com.google.common.util.concurrent.ListenableFuture; |
||||
|
import org.junit.Before; |
||||
|
import org.junit.Test; |
||||
|
import org.thingsboard.server.common.data.kv.BaseReadTsKvQuery; |
||||
|
import org.thingsboard.server.common.data.kv.ReadTsKvQuery; |
||||
|
import org.thingsboard.server.common.data.kv.TsKvEntry; |
||||
|
|
||||
|
import java.util.Optional; |
||||
|
|
||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
import static org.mockito.ArgumentMatchers.any; |
||||
|
import static org.mockito.ArgumentMatchers.anyLong; |
||||
|
import static org.mockito.ArgumentMatchers.anyString; |
||||
|
import static org.mockito.BDDMockito.willCallRealMethod; |
||||
|
import static org.mockito.BDDMockito.willReturn; |
||||
|
import static org.mockito.Mockito.mock; |
||||
|
import static org.mockito.Mockito.spy; |
||||
|
import static org.mockito.Mockito.times; |
||||
|
import static org.mockito.Mockito.verify; |
||||
|
import static org.thingsboard.server.common.data.id.TenantId.SYS_TENANT_ID; |
||||
|
import static org.thingsboard.server.common.data.kv.Aggregation.COUNT; |
||||
|
|
||||
|
public class AbstractChunkedAggregationTimeseriesDaoTest { |
||||
|
|
||||
|
final int LIMIT = 1; |
||||
|
final String TEMP = "temp"; |
||||
|
final String DESC = "DESC"; |
||||
|
AbstractChunkedAggregationTimeseriesDao tsDao; |
||||
|
|
||||
|
@Before |
||||
|
public void setUp() throws Exception { |
||||
|
tsDao = spy(AbstractChunkedAggregationTimeseriesDao.class); |
||||
|
ListenableFuture<Optional<TsKvEntry>> optionalListenableFuture = Futures.immediateFuture(Optional.of(mock(TsKvEntry.class))); |
||||
|
willReturn(optionalListenableFuture).given(tsDao).findAndAggregateAsync(any(), anyString(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
willReturn(Futures.immediateFuture(mock(TsKvEntry.class))).given(tsDao).getTskvEntriesFuture(any()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenLastIntervalShorterThanOthersAndEqualsEndTs() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 1, 3000, 2000, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQueryFirst = new BaseReadTsKvQuery(TEMP, 1, 2001, 1001, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQuerySecond = new BaseReadTsKvQuery(TEMP, 2001, 3001, 2501, LIMIT, COUNT, DESC); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(2)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQueryFirst.getKey(), 1, 2001, getTsForReadTsKvQuery(1, 2001), COUNT); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQuerySecond.getKey(), 2001, 3000 + 1, getTsForReadTsKvQuery(2001, 3001), COUNT); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenIntervalEqualsPeriod() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 1, 3000, 3000, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQueryFirst = new BaseReadTsKvQuery(TEMP, 1, 3001, 1501, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
assertThat(tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query)).isNotNull(); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQueryFirst.getKey(), 1, 3000 + 1, getTsForReadTsKvQuery(1, 3001), COUNT); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenIntervalEqualsPeriodMinusOne() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 1, 3000, 2999, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQueryFirst = new BaseReadTsKvQuery(TEMP, 1, 3000, 1500, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQuerySecond = new BaseReadTsKvQuery(TEMP, 3000, 3001, 3000, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(2)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQueryFirst.getKey(), 1, 3000, getTsForReadTsKvQuery(1, 3000), COUNT); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQuerySecond.getKey(), 3000, 3001, getTsForReadTsKvQuery(3000, 3001), COUNT); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenIntervalEqualsPeriodPlusOne() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 1, 3000, 3001, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQueryFirst = new BaseReadTsKvQuery(TEMP, 1, 3001, 1501, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQueryFirst.getKey(), 1, 3001, getTsForReadTsKvQuery(1, 3001), COUNT); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenIntervalEqualsOneMillisecondAndStartTsIsZero() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 0, 0, 1, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQueryFirst = new BaseReadTsKvQuery(TEMP, 0, 1, 0, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQueryFirst.getKey(), 0, 1, getTsForReadTsKvQuery(0, 1), COUNT); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenIntervalEqualsOneMillisecondAndStartTsIsOne() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 1, 1, 1, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQuery = new BaseReadTsKvQuery(TEMP, 1, 2, 1, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQuery.getKey(), 1, 2, getTsForReadTsKvQuery(1, 2), COUNT); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenIntervalEqualsOneMillisecondAndStartTsIsIntegerMax() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, Integer.MAX_VALUE, Integer.MAX_VALUE, 1, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQueryFirst = new BaseReadTsKvQuery(TEMP, Integer.MAX_VALUE, Integer.MAX_VALUE + 1L, Integer.MAX_VALUE, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQueryFirst.getKey(), Integer.MAX_VALUE, 1L + Integer.MAX_VALUE, getTsForReadTsKvQuery(Integer.MAX_VALUE, 1L + Integer.MAX_VALUE), COUNT); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenIntervalEqualsBigNumber() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 1, 3000, Integer.MAX_VALUE, LIMIT, COUNT, DESC); |
||||
|
ReadTsKvQuery subQueryFirst = new BaseReadTsKvQuery(TEMP, 1, 3001, 1501, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, subQueryFirst.getKey(), 1, 3001, getTsForReadTsKvQuery(1, 3001), COUNT); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void givenIntervalNotMultiplePeriod_whenAggregateCount_thenCountIntervalEqualsPeriodSize() { |
||||
|
ReadTsKvQuery query = new BaseReadTsKvQuery(TEMP, 1, 3000, 3, LIMIT, COUNT, DESC); |
||||
|
willCallRealMethod().given(tsDao).findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
tsDao.findAllAsync(SYS_TENANT_ID, SYS_TENANT_ID, query); |
||||
|
verify(tsDao, times(1000)).findAndAggregateAsync(any(), any(), anyLong(), anyLong(), anyLong(), any()); |
||||
|
for (long i = 1; i <= 3000; i += 3) { |
||||
|
ReadTsKvQuery querySub = new BaseReadTsKvQuery(TEMP, i, i + 3, i + (i + 3 - i) / 2, LIMIT, COUNT, DESC); |
||||
|
verify(tsDao, times(1)).findAndAggregateAsync(SYS_TENANT_ID, querySub.getKey(), i, i + 3, getTsForReadTsKvQuery(i, i + 3), COUNT); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
long getTsForReadTsKvQuery(long startTs, long endTs) { |
||||
|
return startTs + (endTs - startTs) / 2L; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,5 @@ |
|||||
|
CACHE_TYPE=redis |
||||
|
REDIS_CONNECTION_TYPE=cluster |
||||
|
REDIS_NODES=redis-node-0:6379,redis-node-1:6379,redis-node-2:6379,redis-node-3:6379,redis-node-4:6379,redis-node-5:6379 |
||||
|
REDIS_USE_DEFAULT_POOL_CONFIG=false |
||||
|
REDIS_PASSWORD=thingsboard |
||||
@ -0,0 +1,2 @@ |
|||||
|
CACHE_TYPE=redis |
||||
|
REDIS_HOST=redis |
||||
@ -0,0 +1,58 @@ |
|||||
|
# |
||||
|
# Copyright © 2016-2022 The Thingsboard Authors |
||||
|
# |
||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
# you may not use this file except in compliance with the License. |
||||
|
# You may obtain a copy of the License at |
||||
|
# |
||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
# |
||||
|
# Unless required by applicable law or agreed to in writing, software |
||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
# See the License for the specific language governing permissions and |
||||
|
# limitations under the License. |
||||
|
# |
||||
|
|
||||
|
version: '2.2' |
||||
|
|
||||
|
services: |
||||
|
# Redis cluster |
||||
|
redis-node-0: |
||||
|
volumes: |
||||
|
- redis-cluster-data-0:/bitnami/redis/data |
||||
|
redis-node-1: |
||||
|
volumes: |
||||
|
- redis-cluster-data-1:/bitnami/redis/data |
||||
|
redis-node-2: |
||||
|
volumes: |
||||
|
- redis-cluster-data-2:/bitnami/redis/data |
||||
|
redis-node-3: |
||||
|
volumes: |
||||
|
- redis-cluster-data-3:/bitnami/redis/data |
||||
|
redis-node-4: |
||||
|
volumes: |
||||
|
- redis-cluster-data-4:/bitnami/redis/data |
||||
|
redis-node-5: |
||||
|
volumes: |
||||
|
- redis-cluster-data-5:/bitnami/redis/data |
||||
|
|
||||
|
volumes: |
||||
|
redis-cluster-data-0: |
||||
|
external: true |
||||
|
name: ${REDIS_CLUSTER_DATA_VOLUME_0} |
||||
|
redis-cluster-data-1: |
||||
|
external: true |
||||
|
name: ${REDIS_CLUSTER_DATA_VOLUME_1} |
||||
|
redis-cluster-data-2: |
||||
|
external: true |
||||
|
name: ${REDIS_CLUSTER_DATA_VOLUME_2} |
||||
|
redis-cluster-data-3: |
||||
|
external: true |
||||
|
name: ${REDIS_CLUSTER_DATA_VOLUME_3} |
||||
|
redis-cluster-data-4: |
||||
|
external: true |
||||
|
name: ${REDIS_CLUSTER_DATA_VOLUME_4} |
||||
|
redis-cluster-data-5: |
||||
|
external: true |
||||
|
name: ${REDIS_CLUSTER_DATA_VOLUME_5} |
||||
@ -0,0 +1,148 @@ |
|||||
|
# |
||||
|
# Copyright © 2016-2022 The Thingsboard Authors |
||||
|
# |
||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
# you may not use this file except in compliance with the License. |
||||
|
# You may obtain a copy of the License at |
||||
|
# |
||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
# |
||||
|
# Unless required by applicable law or agreed to in writing, software |
||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
# See the License for the specific language governing permissions and |
||||
|
# limitations under the License. |
||||
|
# |
||||
|
|
||||
|
version: '2.2' |
||||
|
|
||||
|
services: |
||||
|
# Redis cluster |
||||
|
redis-node-0: |
||||
|
image: bitnami/redis-cluster:7.0 |
||||
|
volumes: |
||||
|
- ./tb-node/redis-cluster-data-0:/bitnami/redis/data |
||||
|
environment: |
||||
|
- 'REDIS_PASSWORD=thingsboard' |
||||
|
- 'REDISCLI_AUTH=thingsboard' |
||||
|
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' |
||||
|
|
||||
|
redis-node-1: |
||||
|
image: bitnami/redis-cluster:7.0 |
||||
|
volumes: |
||||
|
- ./tb-node/redis-cluster-data-1:/bitnami/redis/data |
||||
|
environment: |
||||
|
- 'REDIS_PASSWORD=thingsboard' |
||||
|
- 'REDISCLI_AUTH=thingsboard' |
||||
|
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' |
||||
|
|
||||
|
redis-node-2: |
||||
|
image: bitnami/redis-cluster:7.0 |
||||
|
volumes: |
||||
|
- ./tb-node/redis-cluster-data-2:/bitnami/redis/data |
||||
|
environment: |
||||
|
- 'REDIS_PASSWORD=thingsboard' |
||||
|
- 'REDISCLI_AUTH=thingsboard' |
||||
|
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' |
||||
|
|
||||
|
redis-node-3: |
||||
|
image: bitnami/redis-cluster:7.0 |
||||
|
volumes: |
||||
|
- ./tb-node/redis-cluster-data-3:/bitnami/redis/data |
||||
|
environment: |
||||
|
- 'REDIS_PASSWORD=thingsboard' |
||||
|
- 'REDISCLI_AUTH=thingsboard' |
||||
|
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' |
||||
|
|
||||
|
redis-node-4: |
||||
|
image: bitnami/redis-cluster:7.0 |
||||
|
volumes: |
||||
|
- ./tb-node/redis-cluster-data-4:/bitnami/redis/data |
||||
|
environment: |
||||
|
- 'REDIS_PASSWORD=thingsboard' |
||||
|
- 'REDISCLI_AUTH=thingsboard' |
||||
|
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' |
||||
|
|
||||
|
redis-node-5: |
||||
|
image: bitnami/redis-cluster:7.0 |
||||
|
volumes: |
||||
|
- ./tb-node/redis-cluster-data-5:/bitnami/redis/data |
||||
|
depends_on: |
||||
|
- redis-node-0 |
||||
|
- redis-node-1 |
||||
|
- redis-node-2 |
||||
|
- redis-node-3 |
||||
|
- redis-node-4 |
||||
|
environment: |
||||
|
- 'REDIS_PASSWORD=thingsboard' |
||||
|
- 'REDISCLI_AUTH=thingsboard' |
||||
|
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5' |
||||
|
- 'REDIS_CLUSTER_REPLICAS=1' |
||||
|
- 'REDIS_CLUSTER_CREATOR=yes' |
||||
|
|
||||
|
# ThingsBoard setup to use redis-cluster |
||||
|
tb-core1: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-core2: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-rule-engine1: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-rule-engine2: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-mqtt-transport1: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-mqtt-transport2: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-http-transport1: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-http-transport2: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-coap-transport: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-lwm2m-transport: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-snmp-transport: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-vc-executor1: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
|
tb-vc-executor2: |
||||
|
env_file: |
||||
|
- cache-redis-cluster.env |
||||
|
depends_on: |
||||
|
- redis-node-5 |
||||
@ -0,0 +1,27 @@ |
|||||
|
# |
||||
|
# Copyright © 2016-2022 The Thingsboard Authors |
||||
|
# |
||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
# you may not use this file except in compliance with the License. |
||||
|
# You may obtain a copy of the License at |
||||
|
# |
||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
# |
||||
|
# Unless required by applicable law or agreed to in writing, software |
||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
# See the License for the specific language governing permissions and |
||||
|
# limitations under the License. |
||||
|
# |
||||
|
|
||||
|
version: '2.2' |
||||
|
|
||||
|
services: |
||||
|
redis: |
||||
|
volumes: |
||||
|
- redis-data:/bitnami/redis/data |
||||
|
|
||||
|
volumes: |
||||
|
redis-data: |
||||
|
external: true |
||||
|
name: ${REDIS_DATA_VOLUME} |
||||
@ -0,0 +1,97 @@ |
|||||
|
# |
||||
|
# Copyright © 2016-2022 The Thingsboard Authors |
||||
|
# |
||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
# you may not use this file except in compliance with the License. |
||||
|
# You may obtain a copy of the License at |
||||
|
# |
||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
# |
||||
|
# Unless required by applicable law or agreed to in writing, software |
||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
# See the License for the specific language governing permissions and |
||||
|
# limitations under the License. |
||||
|
# |
||||
|
|
||||
|
version: '2.2' |
||||
|
|
||||
|
services: |
||||
|
# Redis standalone |
||||
|
redis: |
||||
|
restart: always |
||||
|
image: bitnami/redis:7.0 |
||||
|
environment: |
||||
|
# ALLOW_EMPTY_PASSWORD is recommended only for development. |
||||
|
ALLOW_EMPTY_PASSWORD: "yes" |
||||
|
ports: |
||||
|
- '6379:6379' |
||||
|
volumes: |
||||
|
- ./tb-node/redis-data:/bitnami/redis/data |
||||
|
|
||||
|
# ThingsBoard setup to use redis-standalone |
||||
|
tb-core1: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-core2: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-rule-engine1: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-rule-engine2: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-mqtt-transport1: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-mqtt-transport2: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-http-transport1: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-http-transport2: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-coap-transport: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-lwm2m-transport: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-snmp-transport: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-vc-executor1: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
|
tb-vc-executor2: |
||||
|
env_file: |
||||
|
- cache-redis.env |
||||
|
depends_on: |
||||
|
- redis |
||||
@ -0,0 +1,81 @@ |
|||||
|
# |
||||
|
# Copyright © 2016-2022 The Thingsboard Authors |
||||
|
# |
||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
# you may not use this file except in compliance with the License. |
||||
|
# You may obtain a copy of the License at |
||||
|
# |
||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
# |
||||
|
# Unless required by applicable law or agreed to in writing, software |
||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
# See the License for the specific language governing permissions and |
||||
|
# limitations under the License. |
||||
|
# |
||||
|
|
||||
|
version: '2.2' |
||||
|
|
||||
|
services: |
||||
|
tb-core1: |
||||
|
volumes: |
||||
|
- tb-log-volume:/var/log/thingsboard |
||||
|
tb-core2: |
||||
|
volumes: |
||||
|
- tb-log-volume:/var/log/thingsboard |
||||
|
tb-rule-engine1: |
||||
|
volumes: |
||||
|
- tb-log-volume:/var/log/thingsboard |
||||
|
tb-rule-engine2: |
||||
|
volumes: |
||||
|
- tb-log-volume:/var/log/thingsboard |
||||
|
tb-coap-transport: |
||||
|
volumes: |
||||
|
- tb-coap-transport-log-volume:/var/log/tb-coap-transport |
||||
|
tb-lwm2m-transport: |
||||
|
volumes: |
||||
|
- tb-lwm2m-transport-log-volume:/var/log/tb-lwm2m-transport |
||||
|
tb-http-transport1: |
||||
|
volumes: |
||||
|
- tb-http-transport-log-volume:/var/log/tb-http-transport |
||||
|
tb-http-transport2: |
||||
|
volumes: |
||||
|
- tb-http-transport-log-volume:/var/log/tb-http-transport |
||||
|
tb-mqtt-transport1: |
||||
|
volumes: |
||||
|
- tb-mqtt-transport-log-volume:/var/log/tb-mqtt-transport |
||||
|
tb-mqtt-transport2: |
||||
|
volumes: |
||||
|
- tb-mqtt-transport-log-volume:/var/log/tb-mqtt-transport |
||||
|
tb-snmp-transport: |
||||
|
volumes: |
||||
|
- tb-snmp-transport-log-volume:/var/log/tb-snmp-transport |
||||
|
tb-vc-executor1: |
||||
|
volumes: |
||||
|
- tb-vc-executor-log-volume:/var/log/tb-vc-executor |
||||
|
tb-vc-executor2: |
||||
|
volumes: |
||||
|
- tb-vc-executor-log-volume:/var/log/tb-vc-executor |
||||
|
|
||||
|
volumes: |
||||
|
tb-log-volume: |
||||
|
external: true |
||||
|
name: ${TB_LOG_VOLUME} |
||||
|
tb-coap-transport-log-volume: |
||||
|
external: true |
||||
|
name: ${TB_COAP_TRANSPORT_LOG_VOLUME} |
||||
|
tb-lwm2m-transport-log-volume: |
||||
|
external: true |
||||
|
name: ${TB_LWM2M_TRANSPORT_LOG_VOLUME} |
||||
|
tb-http-transport-log-volume: |
||||
|
external: true |
||||
|
name: ${TB_HTTP_TRANSPORT_LOG_VOLUME} |
||||
|
tb-mqtt-transport-log-volume: |
||||
|
external: true |
||||
|
name: ${TB_MQTT_TRANSPORT_LOG_VOLUME} |
||||
|
tb-snmp-transport-log-volume: |
||||
|
external: true |
||||
|
name: ${TB_SNMP_TRANSPORT_LOG_VOLUME} |
||||
|
tb-vc-executor-log-volume: |
||||
|
external: true |
||||
|
name: ${TB_VC_EXECUTOR_LOG_VOLUME} |
||||
Loading…
Reference in new issue