Newer
Older
cubecactus.com / docs.html
@Agalya Ramadoss Agalya Ramadoss on 13 Feb 18 KB Initial CubeCactus website
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documentation - CubeCactus</title>
    <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;800&family=Archivo:wght@300;500;900&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="index.html">
    <style>
        :root {
            --primary: #00ff88;
            --secondary: #0099ff;
            --dark: #0a0e15;
            --darker: #050810;
            --light: #f0f4f8;
            --accent: #ff0066;
            --gray: #6b7280;
            --border: rgba(0, 255, 136, 0.2);
            --font-display: 'Archivo', sans-serif;
            --font-mono: 'JetBrains Mono', monospace;
        }
        
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: var(--font-mono);
            background: var(--darker);
            color: var(--light);
            line-height: 1.6;
        }
        
        .docs-container {
            max-width: 1400px;
            margin: 0 auto;
            padding: 6rem 2rem 2rem;
            display: grid;
            grid-template-columns: 300px 1fr;
            gap: 4rem;
        }
        
        .sidebar {
            position: sticky;
            top: 100px;
            height: fit-content;
        }
        
        .sidebar-section {
            margin-bottom: 2rem;
        }
        
        .sidebar-title {
            font-family: var(--font-display);
            font-weight: 900;
            color: var(--primary);
            font-size: 0.85rem;
            text-transform: uppercase;
            letter-spacing: 0.1em;
            margin-bottom: 1rem;
        }
        
        .sidebar-links {
            list-style: none;
            display: flex;
            flex-direction: column;
            gap: 0.5rem;
        }
        
        .sidebar-links a {
            color: var(--gray);
            text-decoration: none;
            font-size: 0.9rem;
            padding: 0.5rem 1rem;
            border-left: 2px solid transparent;
            transition: all 0.3s ease;
        }
        
        .sidebar-links a:hover,
        .sidebar-links a.active {
            color: var(--primary);
            border-left-color: var(--primary);
            background: rgba(0, 255, 136, 0.05);
        }
        
        .content {
            max-width: 900px;
        }
        
        .doc-header {
            margin-bottom: 3rem;
            padding-bottom: 2rem;
            border-bottom: 1px solid var(--border);
        }
        
        .doc-title {
            font-family: var(--font-display);
            font-size: 3.5rem;
            font-weight: 900;
            color: var(--light);
            margin-bottom: 1rem;
        }
        
        .doc-subtitle {
            font-size: 1.2rem;
            color: var(--gray);
        }
        
        .content h2 {
            font-family: var(--font-display);
            font-size: 2rem;
            font-weight: 900;
            color: var(--light);
            margin: 3rem 0 1.5rem;
            padding-top: 2rem;
            border-top: 1px solid var(--border);
        }
        
        .content h3 {
            font-family: var(--font-display);
            font-size: 1.5rem;
            font-weight: 900;
            color: var(--light);
            margin: 2rem 0 1rem;
        }
        
        .content p {
            color: var(--gray);
            margin-bottom: 1.5rem;
            line-height: 1.8;
        }
        
        .content code {
            background: rgba(0, 255, 136, 0.1);
            padding: 0.2rem 0.5rem;
            border-radius: 4px;
            font-family: var(--font-mono);
            color: var(--primary);
            font-size: 0.9em;
        }
        
        .code-block {
            background: var(--dark);
            border: 1px solid var(--border);
            border-radius: 8px;
            padding: 1.5rem;
            margin: 1.5rem 0;
            overflow-x: auto;
        }
        
        .code-block pre {
            color: var(--primary);
            font-size: 0.9rem;
            line-height: 1.8;
        }
        
        .info-box {
            background: rgba(0, 153, 255, 0.1);
            border-left: 4px solid var(--secondary);
            padding: 1.5rem;
            margin: 2rem 0;
            border-radius: 4px;
        }
        
        .warning-box {
            background: rgba(255, 153, 0, 0.1);
            border-left: 4px solid #ff9900;
            padding: 1.5rem;
            margin: 2rem 0;
            border-radius: 4px;
        }
        
        .feature-list {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 1.5rem;
            margin: 2rem 0;
        }
        
        .feature-item {
            background: rgba(0, 255, 136, 0.05);
            border: 1px solid var(--border);
            padding: 1.5rem;
            border-radius: 8px;
        }
        
        .feature-item h4 {
            color: var(--primary);
            margin-bottom: 0.5rem;
            font-family: var(--font-display);
            font-weight: 900;
        }
        
        ul, ol {
            margin: 1rem 0 1rem 2rem;
            color: var(--gray);
        }
        
        li {
            margin-bottom: 0.5rem;
        }
        
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 2rem 0;
        }
        
        th, td {
            padding: 1rem;
            text-align: left;
            border-bottom: 1px solid var(--border);
        }
        
        th {
            background: rgba(0, 255, 136, 0.05);
            color: var(--primary);
            font-family: var(--font-display);
            font-weight: 900;
            text-transform: uppercase;
            font-size: 0.85rem;
        }
        
        td {
            color: var(--gray);
        }
    </style>
</head>
<body>
    <div class="docs-container">
        <aside class="sidebar">
            <div class="sidebar-section">
                <h3 class="sidebar-title">Getting Started</h3>
                <ul class="sidebar-links">
                    <li><a href="#quick-start" class="active">Quick Start</a></li>
                    <li><a href="#installation">Installation</a></li>
                    <li><a href="#first-cluster">First Cluster</a></li>
                    <li><a href="#basic-operations">Basic Operations</a></li>
                </ul>
            </div>
            
            <div class="sidebar-section">
                <h3 class="sidebar-title">Core Concepts</h3>
                <ul class="sidebar-links">
                    <li><a href="#architecture">Architecture</a></li>
                    <li><a href="#data-model">Data Model</a></li>
                    <li><a href="#consistency">Consistency Levels</a></li>
                    <li><a href="#replication">Replication</a></li>
                </ul>
            </div>
            
            <div class="sidebar-section">
                <h3 class="sidebar-title">Features</h3>
                <ul class="sidebar-links">
                    <li><a href="#sql">SQL Support</a></li>
                    <li><a href="#gossip">Gossip Protocol</a></li>
                    <li><a href="#storage">LSM Storage</a></li>
                    <li><a href="#api">REST API</a></li>
                </ul>
            </div>
            
            <div class="sidebar-section">
                <h3 class="sidebar-title">Deployment</h3>
                <ul class="sidebar-links">
                    <li><a href="#docker">Docker</a></li>
                    <li><a href="#kubernetes">Kubernetes</a></li>
                    <li><a href="#production">Production</a></li>
                </ul>
            </div>
        </aside>
        
        <main class="content">
            <div class="doc-header">
                <h1 class="doc-title">Documentation</h1>
                <p class="doc-subtitle">Everything you need to build with CubeDB</p>
            </div>
            
            <section id="quick-start">
                <h2>Quick Start</h2>
                <p>Get CubeDB up and running in under 5 minutes.</p>
                
                <h3>Prerequisites</h3>
                <ul>
                    <li>Java 21 or later</li>
                    <li>Maven 3.6+</li>
                    <li>4GB RAM minimum</li>
                </ul>
                
                <h3>Build from Source</h3>
                <div class="code-block">
<pre># Clone repository
git clone https://github.com/cubecactus/cubecactus.git
cd cubecactus

# Build
mvn clean package -DskipTests

# Run single node
java -jar target/cubecactus-1.0.0.jar \
  --node-id=node-1 \
  --port=8080</pre>
                </div>
                
                <div class="info-box">
                    <strong>✓ Success!</strong> CubeCactus is now running on http://localhost:8080
                </div>
                
                <h3>Execute Your First Query</h3>
                <div class="code-block">
<pre># Create a table
curl -X POST http://localhost:8080/api/v1/sql/execute \
  -H "Content-Type: application/json" \
  -d '{"sql": "CREATE TABLE users (id TEXT PRIMARY KEY, name TEXT, email TEXT)"}'

# Insert data
curl -X POST http://localhost:8080/api/v1/sql/execute \
  -H "Content-Type: application/json" \
  -d '{"sql": "INSERT INTO users VALUES ('\''1'\'', '\''Alice'\'', '\''alice@example.com'\'')"}'

# Query data
curl -X POST http://localhost:8080/api/v1/sql/execute \
  -H "Content-Type: application/json" \
  -d '{"sql": "SELECT * FROM users WHERE id = '\''1'\''"}'</pre>
                </div>
            </section>
            
            <section id="installation">
                <h2>Installation</h2>
                
                <h3>Docker</h3>
                <div class="code-block">
<pre># Pull image
docker pull cubecactus/cubecactus:latest

# Run
docker run -d \
  --name cubecactus \
  -p 8080:8080 \
  cubecactus/cubecactus:latest</pre>
                </div>
                
                <h3>Docker Compose (3-Node Cluster)</h3>
                <div class="code-block">
<pre># Start cluster
docker-compose up -d

# Check status
docker-compose ps</pre>
                </div>
                
                <h3>Kubernetes</h3>
                <div class="code-block">
<pre># Deploy StatefulSet
kubectl apply -f k8s/statefulset.yaml

# Check pods
kubectl get pods -n cubedb</pre>
                </div>
            </section>
            
            <section id="architecture">
                <h2>Architecture</h2>
                <p>CubeCactus is a distributed column-family database inspired by Apache Cassandra, built with modern cloud-native principles.</p>
                
                <h3>Core Components</h3>
                <div class="feature-list">
                    <div class="feature-item">
                        <h4>LSM Storage Engine</h4>
                        <p>Write-optimized storage with MemTable, SSTable, and WAL</p>
                    </div>
                    <div class="feature-item">
                        <h4>Gossip Protocol</h4>
                        <p>SWIM-based membership and failure detection</p>
                    </div>
                    <div class="feature-item">
                        <h4>Query Engine</h4>
                        <p>SQL and CQL parser with query execution</p>
                    </div>
                    <div class="feature-item">
                        <h4>Replication Manager</h4>
                        <p>Configurable RF with hinted handoff</p>
                    </div>
                </div>
            </section>
            
            <section id="consistency">
                <h2>Consistency Levels</h2>
                <p>CubeDB supports tunable consistency for read and write operations.</p>
                
                <table>
                    <thead>
                        <tr>
                            <th>Level</th>
                            <th>Description</th>
                            <th>Use Case</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td><code>ONE</code></td>
                            <td>Fastest, returns after 1 node responds</td>
                            <td>High throughput, eventual consistency</td>
                        </tr>
                        <tr>
                            <td><code>QUORUM</code></td>
                            <td>Majority of replicas (RF/2 + 1)</td>
                            <td>Balanced performance and consistency</td>
                        </tr>
                        <tr>
                            <td><code>ALL</code></td>
                            <td>All replicas must respond</td>
                            <td>Strong consistency, critical data</td>
                        </tr>
                    </tbody>
                </table>
            </section>
            
            <section id="sql">
                <h2>SQL Support</h2>
                <p>CubeDB supports standard SQL syntax for familiar database operations.</p>
                
                <h3>Supported Operations</h3>
                <div class="code-block">
<pre>-- CREATE TABLE
CREATE TABLE users (
    id TEXT PRIMARY KEY,
    name TEXT,
    email TEXT,
    age TEXT
);

-- INSERT
INSERT INTO users (id, name, email, age) 
VALUES ('1', 'Alice', 'alice@example.com', '30');

-- SELECT
SELECT * FROM users WHERE id = '1';
SELECT name, email FROM users WHERE id = '1';

-- UPDATE
UPDATE users SET age = '31' WHERE id = '1';

-- DELETE
DELETE FROM users WHERE id = '1';</pre>
                </div>
            </section>
            
            <section id="gossip">
                <h2>Gossip Protocol</h2>
                <p>CubeCactus uses SWIM (Scalable Weakly-consistent Infection-style Membership) protocol for cluster membership.</p>
                
                <h3>How It Works</h3>
                <ol>
                    <li><strong>Heartbeat</strong>: Nodes increment heartbeat counters every gossip interval</li>
                    <li><strong>State Exchange</strong>: Nodes randomly select 3 peers and exchange cluster state</li>
                    <li><strong>Failure Detection</strong>: Nodes missing heartbeats are marked SUSPECTED, then DEAD</li>
                    <li><strong>Convergence</strong>: All nodes eventually see consistent cluster state</li>
                </ol>
                
                <div class="warning-box">
                    <strong>⚠ Configuration</strong>: Tune gossip intervals and timeouts based on your network latency. Default values work for most deployments.
                </div>
            </section>
            
            <section id="docker">
                <h2>Docker Deployment</h2>
                
                <h3>Single Node</h3>
                <div class="code-block">
<pre>docker run -d \
  --name cubecactus-node1 \
  -p 8080:8080 \
  -e NODE_ID=node-1 \
  -v cubecactus-data:/var/lib/cube/data \
  cubecactus/cubecactus:latest</pre>
                </div>
                
                <h3>3-Node Cluster</h3>
                <div class="code-block">
<pre># Use docker-compose.yml
services:
  cubecactus-node-1:
    image: cubecactus/cubecactus:latest
    ports:
      - "8080:8080"
    environment:
      - NODE_ID=node-1
      - SEEDS=cubecactus-node-2:7946,cubecactus-node-3:7946
      
  cubecactus-node-2:
    image: cubecactus/cubecactus:latest
    ports:
      - "8081:8080"
    environment:
      - NODE_ID=node-2
      - SEEDS=cubecactus-node-1:7946,cubecactus-node-3:7946
      
  cubecactus-node-3:
    image: cubecactus/cubecactus:latest
    ports:
      - "8082:8080"
    environment:
      - NODE_ID=node-3
      - SEEDS=cubecactus-node-1:7946,cubecactus-node-2:7946</pre>
                </div>
            </section>
            
            <section id="production">
                <h2>Production Deployment</h2>
                
                <h3>Best Practices</h3>
                <ul>
                    <li><strong>Replication Factor</strong>: Use RF=3 for production</li>
                    <li><strong>Consistency</strong>: Use QUORUM for balanced performance</li>
                    <li><strong>Monitoring</strong>: Enable metrics and health checks</li>
                    <li><strong>Backups</strong>: Regular snapshots of data directories</li>
                    <li><strong>Resources</strong>: Minimum 4 cores, 8GB RAM per node</li>
                </ul>
                
                <h3>Scaling</h3>
                <div class="code-block">
<pre># Add new node to cluster
java -jar cubecactus.jar \
  --node-id=node-4 \
  --port=8083 \
  --seeds=node1:7946,node2:7946,node3:7946

# Verify cluster
curl http://localhost:8080/api/v1/cluster/status</pre>
                </div>
            </section>
        </main>
    </div>
    
    <script>
        // Smooth scrolling for anchor links
        document.querySelectorAll('a[href^="#"]').forEach(anchor => {
            anchor.addEventListener('click', function (e) {
                e.preventDefault();
                const target = document.querySelector(this.getAttribute('href'));
                if (target) {
                    target.scrollIntoView({ behavior: 'smooth', block: 'start' });
                    
                    // Update active link
                    document.querySelectorAll('.sidebar-links a').forEach(link => {
                        link.classList.remove('active');
                    });
                    this.classList.add('active');
                }
            });
        });
        
        // Highlight current section in sidebar
        const sections = document.querySelectorAll('section[id]');
        const sidebarLinks = document.querySelectorAll('.sidebar-links a');
        
        window.addEventListener('scroll', () => {
            let current = '';
            sections.forEach(section => {
                const sectionTop = section.offsetTop;
                if (pageYOffset >= sectionTop - 200) {
                    current = section.getAttribute('id');
                }
            });
            
            sidebarLinks.forEach(link => {
                link.classList.remove('active');
                if (link.getAttribute('href') === `#${current}`) {
                    link.classList.add('active');
                }
            });
        });
    </script>
</body>
</html>