doris安装入门+代码示例

二进制下载地址 https://doris.apache.org/download

我这里下载的是apache-doris-2.1.10-bin-x64.tar.gz

 tar -zxvf apache-doris-2.1.10-bin-x64.tar.gz
 mv apache-doris-2.1.10-bin-x64 apache-doris
 cd apache-doris

doris依赖java,所以记得先下载好java,并配置好JAVA_HOME

分别启动 fe 和 be,注意 启动be的时候会提升让你关闭swap分区,以及ulimit文件符限制,根据提升改一下

./fe/bin/start_fe.sh --daemon
./be/bin/start_be.sh --daemon

进入命令行,兼容mysql,初始默认没密码

mysql -P 9030 -u root

创建数据库+表,注意单机版本默认只有一个be,所以replication_num不能大于1

create database log_db;
use log_db;
CREATE TABLE service_logs (     `log_time` DATETIME NOT NULL COMMENT "日志时间",     `service_name` VARCHAR(50) NOT NULL COMMENT "服务名称",     `log_level` VARCHAR(10) COMMENT "日志级别(DEBUG/INFO/ERROR)",     `ip` VARCHAR(15) COMMENT "客户端IP",     `request_path` VARCHAR(100) COMMENT "请求路径",     `status_code` SMALLINT COMMENT "HTTP状态码",     `response_time_ms` INT COMMENT "响应时间(ms)",     `detail` TEXT COMMENT "详细日志内容" ) DUPLICATE KEY(log_time, service_name)   DISTRIBUTED BY HASH(service_name) BUCKETS 10   PROPERTIES (     "replication_num" = "1",       "storage_format" = "V2"    );

登录后台 ip:8030,账号root,密码为空

构建模拟数据

-- 模拟INFO级别日志(正常请求)
INSERT INTO service_logs VALUES
('2025-06-20 09:15:23', 'order-service', 'INFO', '192.168.1.101', '/api/orders', 200, 45, '用户ID:10086 创建订单成功,订单号:ORD20250620001');

-- 模拟ERROR级别日志(服务异常)
INSERT INTO service_logs VALUES
('2025-06-20 09:16:42', 'payment-service', 'ERROR', '192.168.1.102', '/api/pay', 500, 1200, '支付网关连接超时,订单号:ORD20250620001,错误:java.net.ConnectException');

-- 模拟DEBUG级别日志(开发调试)
INSERT INTO service_logs VALUES
('2025-06-20 09:17:05', 'inventory-service', 'DEBUG', '192.168.1.103', '/api/stock', 200, 12, 'SQL查询: SELECT stock FROM items WHERE sku="SKU1001"');

-- 模拟404请求
INSERT INTO service_logs VALUES
('2025-06-20 09:18:30', 'user-service', 'WARN', '192.168.1.104', '/api/profile', 404, 8, '用户ID:10087 访问不存在的个人资料页');

-- 模拟高延迟请求
INSERT INTO service_logs VALUES
('2025-06-20 09:20:11', 'search-service', 'INFO', '192.168.1.105', '/api/search', 200, 2100, '复杂商品搜索条件: category=electronics&price_min=1000&keywords=4K电视');

剩下的sql操作就跟mysql非常类似了,由于兼容mysql协议,所以几乎所有的语言都支持操作,下面是python的简单示例


import pymysql
from datetime import datetime

# 连接配置
config = {
    'host': '192.168.34.128',
    'port': 9030,  # FE的query_port
    'user': 'root',
    'password': '',
    'database': 'log_db',
    'charset': 'utf8mb4'
}

def get_connection():
    """创建带自动重连的连接池"""
    return pymysql.connect(**config)

# 插入数据
def insert_log():
    conn = get_connection()
    try:
        with conn.cursor() as cursor:
            sql = """INSERT INTO service_logs VALUES
                    (%s, %s, %s, %s, %s, %s, %s, %s)"""
            data = (
                datetime.now(), 
                'payment-service',
                'ERROR',
                '10.0.0.1',
                '/api/checkout',
                500,
                1200,
                'Payment gateway timeout'
            )
            cursor.execute(sql, data)
        conn.commit()
        print("插入成功")
    except Exception as e:
        conn.rollback()
        print(f"插入失败: {e}")
    finally:
        conn.close()

# 查询数据
def query_logs():
    conn = get_connection()
    try:
        with conn.cursor(pymysql.cursors.DictCursor) as cursor:
            cursor.execute("""
                SELECT * FROM service_logs 
                WHERE log_level='ERROR' 
                ORDER BY log_time DESC 
                LIMIT 10
            """)
            for row in cursor.fetchall():
                print(f"[{row['log_time']}] {row['service_name']}: {row['detail']}")
    finally:
        conn.close()

# 更新数据,DUPLICATE KEY表不支持UPDATE,UNIQUE KEY的表才能执行更新操作,或者用insert插入强制更新
def update_log_status():
    conn = get_connection()
    try:
        with conn.cursor() as cursor:
            cursor.execute("""
                UPDATE service_logs 
                SET status_code=200 
                WHERE request_path='/api/checkout' 
                AND status_code=500
            """)
        conn.commit()
        print(f"更新了 {cursor.rowcount} 条记录")
    except Exception as e:
        conn.rollback()
        print(f"更新失败: {e}")
    finally:
        conn.close()

# 删除数据
def delete_old_logs():
    conn = get_connection()
    try:
        with conn.cursor() as cursor:
            cursor.execute("""
                DELETE FROM service_logs 
                WHERE log_time < DATE_SUB(NOW(), INTERVAL 30 DAY)
            """)
        conn.commit()
        print(f"删除了 {cursor.rowcount} 条旧日志")
    except Exception as e:
        conn.rollback()
        print(f"删除失败: {e}")
    finally:
        conn.close()

if __name__ == "__main__":
    insert_log()      # 增
    query_logs()      # 查  
    #update_log_status()  # 改
    delete_old_logs()    # 删
posted @ 2025-06-20 11:20  朝阳1  阅读(168)  评论(0)    收藏  举报