This is an automated email from the ASF dual-hosted git repository.

shuber pushed a commit to branch opensearch-persistence
in repository https://gitbox.apache.org/repos/asf/unomi.git


The following commit(s) were added to refs/heads/opensearch-persistence by this 
push:
     new e2125d611 - Make the search port configurable so that we can avoid 
conflicts between the ElasticSearch and OpenSearch integration tests - Add 
documentation on how to migrate from ElasticSearch to OpenSearch (not tested 
yet)
e2125d611 is described below

commit e2125d61116259f590259ee56f8b2936d5175b55
Author: Serge Huber <[email protected]>
AuthorDate: Tue Jan 7 10:53:48 2025 +0100

    - Make the search port configurable so that we can avoid conflicts between 
the ElasticSearch and OpenSearch integration tests
    - Add documentation on how to migrate from ElasticSearch to OpenSearch (not 
tested yet)
---
 .github/workflows/unomi-ci-build-tests.yml         |  14 +-
 .gitignore                                         |   1 +
 itests/pom.xml                                     |  11 +-
 .../test/java/org/apache/unomi/itests/BaseIT.java  |  16 +-
 manual/src/main/asciidoc/index.adoc                |   4 +
 .../migrate-elasticsearch-to-opensearch.adoc       | 212 +++++++++++++++++++++
 6 files changed, 248 insertions(+), 10 deletions(-)

diff --git a/.github/workflows/unomi-ci-build-tests.yml 
b/.github/workflows/unomi-ci-build-tests.yml
index be06c53b3..948fa6660 100644
--- a/.github/workflows/unomi-ci-build-tests.yml
+++ b/.github/workflows/unomi-ci-build-tests.yml
@@ -20,7 +20,6 @@ jobs:
       uses: actions/setup-java@v1
       with:
         java-version: 11
-        cache: maven
     - name: Build and Unit tests
       run: mvn -U -ntp -e clean install
 
@@ -30,18 +29,23 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        search-engine: [elasticsearch, opensearch]
+        include:
+          - search-engine: elasticsearch
+            port: 9400
+          - search-engine: opensearch
+            port: 9401
       fail-fast: false
-      max-parallel: 1  # Run tests sequentially to avoid port conflicts
     steps:
       - uses: actions/checkout@v4
       - name: Set up JDK 11
         uses: actions/setup-java@v1
         with:
           java-version: 11
-          cache: maven
       - name: Integration tests
-        run: mvn -ntp clean install -Pintegration-tests,${{ 
matrix.search-engine }}
+        run: |
+          mvn -ntp clean install -Pintegration-tests,${{ matrix.search-engine 
}} \
+          -Dopensearch.port=${{ matrix.port }} \
+          -Delasticsearch.port=${{ matrix.port }}
       - name: Archive code coverage logs
         uses: actions/upload-artifact@v3
         if: false # UNOMI-746 Reactivate if necessary
diff --git a/.gitignore b/.gitignore
index 1d2e17afa..f8c30c07e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 /NOTICE-generated
 .settings
+.vscode
 target
 .classpath
 .project
diff --git a/itests/pom.xml b/itests/pom.xml
index b8414186c..5868eee0d 100644
--- a/itests/pom.xml
+++ b/itests/pom.xml
@@ -354,9 +354,12 @@
         </profile>
         <profile>
             <id>opensearch</id>
+            <properties>
+                <opensearch.port>9401</opensearch.port>
+            </properties>
             <activation>
                 <property>
-                    <name>use.opensearch</name> <!-- Activate if 
use.opensearch is set -->
+                    <name>use.opensearch</name>
                 </property>
             </activation>
             <build>
@@ -372,6 +375,7 @@
                             <systemPropertyVariables>
                                 <my.system.property>foo</my.system.property>
                                 
<unomi.search.engine>opensearch</unomi.search.engine>
+                                
<org.apache.unomi.opensearch.addresses>localhost:${opensearch.port}</org.apache.unomi.opensearch.addresses>
                             </systemPropertyVariables>
                         </configuration>
                         <executions>
@@ -401,7 +405,7 @@
                                     <alias>opensearch</alias>
                                     <run>
                                         <ports>
-                                            <port>9400:9200</port>
+                                            
<port>${opensearch.port}:9200</port>
                                         </ports>
                                         <env>
                                             
<discovery.type>single-node</discovery.type>
@@ -417,12 +421,13 @@
                                         </volumes>
                                         <wait>
                                             <http>
-                                                
<url>http://localhost:9400</url>
+                                                
<url>http://localhost:${opensearch.port}</url>
                                                 <method>GET</method>
                                                 <status>200</status>
                                             </http>
                                             <time>120000</time>
                                         </wait>
+                                        
<portPropertyFile>${project.build.directory}/opensearch-port.properties</portPropertyFile>
                                     </run>
                                 </image>
                             </images>
diff --git a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java 
b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
index 497841b31..76de1cd23 100644
--- a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
@@ -307,10 +307,10 @@ public abstract class BaseIT extends KarafTestSupport {
                 editConfigurationFilePut("etc/system.properties", 
SEARCH_ENGINE_PROPERTY, System.getProperty(SEARCH_ENGINE_PROPERTY, 
SEARCH_ENGINE_ELASTICSEARCH)),
                 editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.graphql.feature.activated", "true"),
                 editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.elasticsearch.cluster.name", "contextElasticSearchITests"),
-                editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.elasticsearch.addresses", "localhost:9400"),
+                editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.elasticsearch.addresses", "localhost:" + getSearchPort()),
                 editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.elasticsearch.taskWaitingPollingInterval", "50"),
                 editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.opensearch.cluster.name", "contextElasticSearchITests"),
-                editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.opensearch.addresses", "localhost:9400"),
+                editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.opensearch.addresses", "localhost:" + getSearchPort()),
                 editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.opensearch.username", "admin"),
                 editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.opensearch.password", "Unomi.1ntegrat10n.Tests"),
                 editConfigurationFilePut("etc/custom.system.properties", 
"org.apache.unomi.opensearch.sslEnable", "false"),
@@ -686,4 +686,16 @@ public abstract class BaseIT extends KarafTestSupport {
         credsProvider.setCredentials(AuthScope.ANY, new 
UsernamePasswordCredentials(BASIC_AUTH_USER_NAME, BASIC_AUTH_PASSWORD));
         return credsProvider;
     }
+
+    protected static String getSearchPort() {
+        String searchEngine = System.getProperty(SEARCH_ENGINE_PROPERTY, 
SEARCH_ENGINE_ELASTICSEARCH);
+        if (SEARCH_ENGINE_OPENSEARCH.equals(searchEngine)) {
+            // For OpenSearch, get the port from the system property set by 
maven-failsafe-plugin
+            return System.getProperty("org.apache.unomi.opensearch.addresses", 
"localhost:9401")
+                    .split(":")[1]; // Extract port number from 
"localhost:9401"
+        } else {
+            // For Elasticsearch, use the default port or system property if 
set
+            return System.getProperty("elasticsearch.port", "9400");
+        }
+    }
 }
diff --git a/manual/src/main/asciidoc/index.adoc 
b/manual/src/main/asciidoc/index.adoc
index 49ada8ad2..eaffa08b0 100644
--- a/manual/src/main/asciidoc/index.adoc
+++ b/manual/src/main/asciidoc/index.adoc
@@ -60,6 +60,10 @@ include::graphql-examples.adoc[]
 
 include::migrations/migrations.adoc[]
 
+include::migrations/migrate-1.4-to-1.5.adoc[leveloffset=+1]
+
+include::migrations/migrate-elasticsearch-to-opensearch.adoc[leveloffset=+1]
+
 == Queries and aggregations
 
 include::queries-and-aggregations.adoc[]
diff --git 
a/manual/src/main/asciidoc/migrations/migrate-elasticsearch-to-opensearch.adoc 
b/manual/src/main/asciidoc/migrations/migrate-elasticsearch-to-opensearch.adoc
new file mode 100644
index 000000000..a728fb24f
--- /dev/null
+++ 
b/manual/src/main/asciidoc/migrations/migrate-elasticsearch-to-opensearch.adoc
@@ -0,0 +1,212 @@
+//
+// 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.
+//
+
+= Migrating from Elasticsearch to OpenSearch
+:toc: macro
+:toclevels: 4
+:toc-title: Table of contents
+:numbered:
+
+toc::[]
+
+== Overview
+
+This guide describes how to migrate your Apache Unomi data from Elasticsearch 
to OpenSearch. The migration process involves using the OpenSearch Replication 
Tool, which is designed to handle large-scale migrations efficiently while 
maintaining data consistency.
+
+== Prerequisites
+
+Before starting the migration, ensure you have:
+
+* Running Elasticsearch cluster with your Unomi data
+* Target OpenSearch cluster set up and running
+* Sufficient disk space on the target cluster
+* Java 11 or later installed
+* Network connectivity between source and target clusters
+
+== Migration Options
+
+=== Option 1: OpenSearch Replication Tool (Recommended)
+
+The OpenSearch Replication Tool is the recommended approach for production 
environments, especially for large datasets.
+
+==== Installation
+
+[source,bash]
+----
+git clone https://github.com/opensearch-project/opensearch-migrations.git
+cd opensearch-migrations/replication-tool
+./gradlew build
+----
+
+==== Configuration
+
+Create a configuration file `config.yml`:
+
+[source,yaml]
+----
+source:
+  hosts: ["source-elasticsearch-host:9200"]
+  user: "elastic_user"     # if authentication is enabled
+  password: "elastic_pass" # if authentication is enabled
+
+destination:
+  hosts: ["target-opensearch-host:9200"]
+  user: "opensearch_user"     # if authentication is enabled
+  password: "opensearch_pass" # if authentication is enabled
+
+indices:
+  - name: "context-*"         # Unomi context indices
+  - name: "segment-*"         # Unomi segment indices
+  - name: "profile-*"         # Unomi profile indices
+  - name: "session-*"         # Unomi session indices
+----
+
+==== Running the Migration
+
+[source,bash]
+----
+./bin/replication-tool --config config.yml
+----
+
+The tool provides progress updates and ensures data consistency during the 
migration.
+
+=== Option 2: Logstash Pipeline
+
+For smaller deployments or when more control over the migration process is 
needed, you can use Logstash.
+
+==== Logstash Configuration
+
+Create a file named `logstash-migration.conf`:
+
+[source,ruby]
+----
+input {
+  elasticsearch {
+    hosts => ["source-elasticsearch-host:9200"]
+    index => "context-*"  # Repeat for other indices
+    size => 5000
+    scroll => "5m"
+    docinfo => true
+    user => "elastic_user"     # if authentication is enabled
+    password => "elastic_pass" # if authentication is enabled
+  }
+}
+
+output {
+  opensearch {
+    hosts => ["target-opensearch-host:9200"]
+    index => "%{[@metadata][_index]}"
+    document_id => "%{[@metadata][_id]}"
+    user => "opensearch_user"     # if authentication is enabled
+    password => "opensearch_pass" # if authentication is enabled
+  }
+}
+----
+
+==== Running Logstash Migration
+
+[source,bash]
+----
+logstash -f logstash-migration.conf
+----
+
+== Post-Migration Steps
+
+1. Verify Data Integrity
++
+[source,bash]
+----
+# Check document counts
+curl -X GET "source-elasticsearch-host:9200/_cat/indices/context-*?v"
+curl -X GET "target-opensearch-host:9200/_cat/indices/context-*?v"
+----
+
+2. Update Unomi Configuration
++
+Edit `etc/custom.system.properties`:
++
+[source,properties]
+----
+# Comment out or remove Elasticsearch properties
+#org.apache.unomi.elasticsearch.addresses=localhost:9200
+#org.apache.unomi.elasticsearch.cluster.name=contextElasticSearch
+
+# Add OpenSearch properties
+org.apache.unomi.opensearch.addresses=localhost:9200
+org.apache.unomi.opensearch.cluster.name=contextOpenSearch
+org.apache.unomi.opensearch.sslEnable=false
+org.apache.unomi.opensearch.username=admin
+org.apache.unomi.opensearch.password=admin
+----
+
+3. Restart Apache Unomi
++
+[source,bash]
+----
+./bin/stop
+./bin/start
+----
+
+== Troubleshooting
+
+=== Common Issues
+
+1. Connection Timeouts
+* Increase the timeout settings in your configuration
+* Check network connectivity between clusters
+
+2. Memory Issues
+* Adjust JVM heap size for the migration tool
+* Consider reducing batch sizes
+
+3. Missing Indices
+* Verify index patterns in configuration
+* Check source cluster health
+
+=== Monitoring Progress
+
+The OpenSearch Replication Tool provides progress information during migration:
+
+* Documents copied
+* Time elapsed
+* Current transfer rate
+* Estimated completion time
+
+== Best Practices
+
+1. *Testing*
+* Always test the migration process in a non-production environment first
+* Verify all Unomi features work with migrated data
+
+2. *Performance*
+* Run migration during off-peak hours
+* Monitor system resources during migration
+* Use appropriate batch sizes based on document size
+
+3. *Backup*
+* Create backups of your Elasticsearch indices before migration
+* Keep source cluster running until verification is complete
+
+4. *Validation*
+* Compare document counts between source and target
+* Verify index mappings and settings
+* Test Unomi functionality with migrated data
+
+== Support
+
+For additional support:
+
+* OpenSearch Replication Tool: 
https://github.com/opensearch-project/opensearch-migrations
+* Apache Unomi Community: https://unomi.apache.org/community.html
+* OpenSearch Forum: https://forum.opensearch.org/ 
\ No newline at end of file

Reply via email to