System Configuration
Configure system resource limits before installing the search engine:
cat > /etc/security/limits.d/es-limits.conf <<'EOF'
* soft nofile 1048576
* hard nofile 1048576
* soft memlock unlimited
* hard memlock unlimited
root soft nofile 1048576
root hard nofile 1048576
root soft memlock unlimited
root hard memlock unlimited
EOF
Disable transparent hugepages to avoid potential performance issues:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
if [ ! -f /etc/rc.local ] || ! grep -q transparent_hugepage /etc/rc.local; then
cat >> /etc/rc.local <<'EOF'
if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if [ -f /sys/kernel/mm/transparent_hugepage/defrag ]; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
fi
chmod +x /etc/rc.local
Apply kernel-level tuning parameters:
cat > /etc/sysctl.d/99-essys.conf <<'EOF'
vm.max_map_count = 262145
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 900
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.ip_local_port_range = 1024 65535
EOF
sysctl -p /etc/sysctl.d/99-essys.conf
Operating User Setup
Create a deidcated OS user for running the search service:
groupadd -g 700 search
useradd -u 700 -g search -m -d /home/search -c 'Easysearch' -s /bin/bash search
JDK Installation
Download and set up the Azul Zulu JDK 17 for ARM64 architecture:
JDK_URL="https://release.infinilabs.com/easysearch/jdk/zulu17.40.19-ca-jdk17.0.6-linux_aarch64.tar.gz"
wget -N "$JDK_URL" -P /opt/src
mkdir -p /opt/jdk
tar -zxf /opt/src/zulu*.tar.gz -C /opt/jdk --strip-components 1
cat > /etc/profile.d/jdk.sh <<'EOF'
export JAVA_HOME=/opt/jdk
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
EOF
source /etc/profile.d/jdk.sh
java -version
Easysearch Installation
Install the core search engine using the automated installation script:
curl -sSL http://get.infini.sh | bash -s -- -p easysearch -d /opt/search
Initialize security certificates:
cd /opt/search
/opt/search/bin/initialize.sh
ls -la /opt/search/config/*.crt /opt/search/config/*.key /opt/search/config/*.pem
Generate and configure user credentials:
export ES_HOME=/opt/search
SEC_PASS=$(tr -cd 'a-zA-Z0-9!@#$%' </dev/urandom | head -c24)
echo "$SEC_PASS" > /root/.es_password
SEC_HASH=$(/opt/search/bin/hash_password.sh -p "$SEC_PASS")
cat > $ES_HOME/config/security/user.yml <<EOF
meta:
type: "user"
config_version: 2
admin:
hash: "$SEC_HASH"
reserved: true
external_roles:
- "admin"
description: "Admin user"
EOF
Main Configuration File
Configure the search engine parameters in the YAML configuration:
cat > /opt/search/config/easysearch.yml <<EOF
cluster.name: search-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
cluster.initial_master_nodes: ["node-1"]
path.home: /opt/search
path.data: /opt/search/data
path.logs: /opt/search/logs
http.compression: true
security.enabled: true
security.audit.type: noop
security.ssl.transport.cert_file: instance.crt
security.ssl.transport.key_file: instance.key
security.ssl.transport.ca_file: ca.crt
security.ssl.transport.skip_domain_verify: true
security.ssl.http.enabled: true
security.ssl.http.cert_file: instance.crt
security.ssl.http.key_file: instance.key
security.ssl.http.ca_file: ca.crt
security.allow_default_init_securityindex: true
security.nodes_dn:
- 'CN=infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'
security.restapi.roles_enabled: ["superuser", "security_rest_api_access"]
security.system_indices.enabled: true
security.ssl.http.clientauth_mode: OPTIONAL
security.system_indices.indices: [".infini-*"]
security.authcz.admin_dn:
- 'CN=admin.infini.cloud,OU=UNIT,O=ORG,L=NI,ST=FI,C=IN'
EOF
JVM Memory Configuration
Adjust heap size based on available system memory. The recommended setting is half of total RAM, capped at 31GB:
sed -i "s/-Xms1g/-Xms4g/g; s/-Xmx1g/-Xmx4g/g" $ES_HOME/config/jvm.options
Directory Permissions
Set up backup directory and assign ownership:
mkdir -p /opt/search/backup
chown -R search:search /opt/search
Service Startup
Configure environment variables and launch the service in daemon mode:
su - search <<'EOF'
if ! grep -q ES_HOME ~/.bashrc; then
echo 'export ES_HOME=/opt/search' >> ~/.bashrc
fi
export ES_HOME=/opt/search
source ~/.bashrc
$ES_HOME/bin/easysearch -d
EOF
Health Verification
Confirm the search engine is operational:
curl -ku "admin:$SEC_PASS" https://127.0.0.1:9200
curl -ku "admin:$SEC_PASS" https://127.0.0.1:9200/_cluster/health?pretty
curl -ku "admin:$SEC_PASS" https://127.0.0.1:9200/_cat/nodes?v
Console Deployment
Install the web-based management console:
curl -sSL http://get.infini.sh | bash -s -- -p console
cd /opt/console
./console-linux-arm64 -service install
./console-linux-arm64 -service start
systemctl status console
Agent Deployment
Install the data collection agent:
curl -sSL http://get.infini.sh | bash -s -- -p agent
cd /opt/agent
sed -i "/ES_ENDPOINT:/ s|value:.*|value: https://localhost:9200|" agent.yml
sed -i "/ES_USER:/ s|value:.*|value: admin|" agent.yml
sed -i "/ES_PASS:/ s|value:.*|value: $SEC_PASS|" agent.yml
sed -i "/API_BINDING:/ s|value:.*|value: \"0.0.0.0:8080\"|" agent.yml
./agent-linux-arm64 -service install
./agent-linux-arm64 -service start
systemctl status agent
Gateway Deployment
Install the API gateway component:
curl -sSL http://get.infini.sh | bash -s -- -p gateway
cd /opt/gateway
sed -i "/ES_PASS:/ s|value:.*|value: $SEC_PASS|" gateway.yml
head -n 10 gateway.yml
./gateway-linux-arm64 -service install
./gateway-linux-arm64 -service start
systemctl status gateway
curl -u "admin:$SEC_PASS" http://127.0.0.1:8000
Load Geenrator Deployment
Install the load testing tool for performance validation:
curl -sSL http://get.infini.sh | bash -s -- -p loadgen
cd /opt/loadgen
mkdir -p mock
cat > mock/access.log <<'LOGEOF'
192.168.1.100 - - [10/Oct/2023:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 2326 "-" "Mozilla/5.0"
192.168.1.101 - - [10/Oct/2023:13:55:37 +0000] "POST /api/data HTTP/1.1" 201 145 "-" "curl/7.68.0"
192.168.1.102 - - [10/Oct/2023:13:55:38 +0000] "GET /assets/style.css HTTP/1.1" 200 4532 "http://example.com/" "Chrome/119.0.0.0"
LOGEOF
cat > loadgen.yml <<EOF
env:
ES_USERNAME: admin
ES_PASSWORD: $SEC_PASS
ES_ENDPOINT: http://localhost:8000
runner:
no_warm: false
log_requests: false
log_status_codes:
- 0
- 500
assert_invalid: false
assert_error: false
variables:
- name: log_line
type: file
path: mock/access.log
replace:
'"': '"'
'\\': '\\'
- name: record_id
type: sequence
- name: unique_key
type: uuid
- name: timestamp_local
type: now_local
- name: timestamp_utc
type: now_utc
- name: suffix_range
type: range
from: 10
to: 13
requests:
- request:
method: POST
runtime_variables:
batch_id: unique_key
runtime_body_line_variables:
routing_key: unique_key
basic_auth:
username: \$[[env.ES_USERNAME]]
password: \$[[env.ES_PASSWORD]]
url: \$[[env.ES_ENDPOINT]]/_bulk
body_repeat_times: 5000
body: |
{ "index" : { "_index" : "benchmark-\$[[suffix_range]]", "_id" : "\$[[unique_key]]" } }
{ "id" : "\$[[unique_key]]", "routing_key" : "\$[[routing_key]]", "batch_id" : "\$[[batch_id]]", "log_data" : "\$[[log_line]]", "sequence" : "\$[[suffix_range]]", "timestamp" : "\$[[timestamp_local]]" }
EOF
./loadgen-linux-arm64 -c 6 -d 6 --compress
curl -u "admin:$SEC_PASS" http://127.0.0.1:8000/_cat/indices/benchmark*?v
Access the web console at http://:9000/ to manage the Easysearch deployment.