Docker Deployement Configuration
ClickHouse can be easily deployed using Docker. The following configuration covers the essential setup including network ports, storage volumes, and security parameters.
Basic Container Launch
docker run -d \
--name=clickhouse-server \
-e CLICKHOUSE_ADMIN_PASSWORD=secure_password \
--ulimit nofile=262144:262144 \
-p 8123:8123 \
-p 9000:9000 \
-p 9009:9009 \
--privileged=true \
-v clickhouse-data:/var/lib/clickhouse \
bitnami/clickhouse:latest
Port Configuration Overview
| Port | Protocol | Purpose |
|---|---|---|
| 8123 | HTTP | Web interface and REST API |
| 9000 | TCP | Native client connections |
| 9009 | TCP | Inter-node replication |
Verification
Confirm the service is running correctly:
curl http://localhost:8123
Expected response: Ok.
Configuration File Management
Extracting Configuration Files
Copy the default configuration files from the container for customization:
# Extract user authentication configuration
docker cp clickhouse-server:/etc/clickhouse-server/users.xml /opt/clickhouse/config/users.xml
# Extract server configuration
docker cp clickhouse-server:/etc/clickhouse-server/config.xml /opt/clickhouse/config/config.xml
Persistent Storage Mount
Mount external directories for data persistence:
docker run -d \
--name=clickhouse-server \
-e CLICKHOUSE_ADMIN_PASSWORD=secure_password \
--ulimit nofile=262144:262144 \
-p 8123:8123 \
-v /opt/clickhouse/data:/var/lib/clickhouse \
-v /opt/clickhouse/config:/etc/clickhouse-server \
bitnami/clickhouse:latest
Database and Table Operations
Creating a Database
CREATE DATABASE IF NOT EXISTS analytics_db;
Creating a Table
CREATE TABLE analytics_db.user_activity
(
`session_id` String,
`user_id` String,
`event_type` String,
`event_timestamp` DateTime,
`metadata` Map(String, String)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_timestamp)
ORDER BY (user_id, event_timestamp)
SETTINGS index_granularity = 8192;
Spring Boot Integration
Maven Dependencies
Add the ClickHouse JDBC driver to your pom.xml:
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.6.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
Application Configuration
Configure the connection in application.yml:
spring:
datasource:
clickhouse:
jdbc-url: jdbc:clickhouse://localhost:8123/analytics_db
username: default
password: secure_password
driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
Repository Implementation
@Repository
public class UserActivityRepository {
private final JdbcTemplate jdbcTemplate;
public UserActivityRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void saveActivity(UserActivity activity) {
String sql = """
INSERT INTO analytics_db.user_activity
(session_id, user_id, event_type, event_timestamp, metadata)
VALUES (?, ?, ?, ?, ?)
""";
Map<String, String> metadataMap = activity.getMetadata();
jdbcTemplate.update(sql,
activity.getSessionId(),
activity.getUserId(),
activity.getEventType(),
activity.getTimestamp(),
metadataMap
);
}
public List<UserActivity> findByUserId(String userId) {
String sql = """
SELECT session_id, user_id, event_type, event_timestamp, metadata
FROM analytics_db.user_activity
WHERE user_id = ?
ORDER BY event_timestamp DESC
LIMIT 100
""";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
UserActivity activity = new UserActivity();
activity.setSessionId(rs.getString("session_id"));
activity.setUserId(rs.getString("user_id"));
activity.setEventType(rs.getString("event_type"));
activity.setTimestamp(rs.getTimestamp("event_timestamp"));
return activity;
}, userId);
}
}
Service Layer
@Service
public class AnalyticsService {
private final UserActivityRepository activityRepository;
public AnalyticsService(UserActivityRepository activityRepository) {
this.activityRepository = activityRepository;
}
public void recordEvent(String userId, String eventType, Map<String, String> metadata) {
UserActivity activity = new UserActivity();
activity.setSessionId(UUID.randomUUID().toString());
activity.setUserId(userId);
activity.setEventType(eventType);
activity.setTimestamp(new Timestamp(System.currentTimeMillis()));
activity.setMetadata(metadata);
activityRepository.saveActivity(activity);
}
public List<UserActivity> getUserHistory(String userId) {
return activityRepository.findByUserId(userId);
}
}
Web Interface Access
The ClickHouse web console provides a visual interface for query execution and database management:
http://<server-ip>:8123/play
This web interface supports SQL query execution, result visualization, and system monitoring.