Skip to content

云原生数据库解决方案指南

云原生数据库是专为容器化和Kubernetes环境设计的数据库系统,具备弹性伸缩、自动故障转移、声明式配置等特性。本指南深入探讨主流云原生数据库的架构、部署模式和最佳实践。

🗄️ 云原生数据库架构

数据库云原生化演进

yaml
cloud_native_evolution:
  traditional_databases:
    deployment: "虚拟机或物理机"
    scaling: "垂直扩展为主"
    availability: "主从复制、故障手动切换"
    operations: "人工运维"
    
    limitations:
      - "资源利用率低"
      - "扩展能力受限"
      - "恢复时间长"
      - "运维成本高"
  
  containerized_databases:
    deployment: "容器化部署"
    scaling: "支持水平扩展"
    availability: "自动故障检测"
    operations: "半自动化运维"
    
    improvements:
      - "资源隔离和利用率提升"
      - "快速部署和扩容"
      - "统一管理平台"
      - "配置标准化"
    
    challenges:
      - "存储持久化"
      - "网络性能"
      - "状态管理复杂"
      - "数据安全性"
  
  cloud_native_databases:
    deployment: "Kubernetes Operator管理"
    scaling: "自动弹性伸缩"
    availability: "自愈能力"
    operations: "完全自动化"
    
    characteristics:
      architecture:
        - "存储计算分离"
        - "多租户支持"
        - "分布式架构"
        - "API优先设计"
      
      operations:
        - "声明式配置"
        - "自动备份恢复"
        - "在线升级"
        - "智能调优"
      
      observability:
        - "指标实时采集"
        - "日志集中管理"
        - "分布式追踪"
        - "可视化监控"
yaml
database_selection:
  selection_criteria:
    workload_type:
      oltp:
        description: "在线事务处理"
        characteristics:
          - "高并发读写"
          - "低延迟要求"
          - "ACID事务支持"
        recommended:
          - "CockroachDB"
          - "TiDB"
          - "YugabyteDB"
      
      olap:
        description: "在线分析处理"
        characteristics:
          - "大数据量分析"
          - "复杂查询"
          - "列式存储"
        recommended:
          - "ClickHouse"
          - "Apache Druid"
          - "TimescaleDB"
      
      htap:
        description: "混合事务分析处理"
        characteristics:
          - "同时支持OLTP和OLAP"
          - "实时分析能力"
          - "灵活负载处理"
        recommended:
          - "TiDB"
          - "YugabyteDB"
          - "CockroachDB"
    
    consistency_model:
      strong_consistency:
        databases: ["CockroachDB", "YugabyteDB", "TiDB"]
        use_cases: ["金融交易", "库存管理", "订单系统"]
      
      eventual_consistency:
        databases: ["Cassandra", "MongoDB", "Couchbase"]
        use_cases: ["社交媒体", "内容分发", "日志收集"]
    
    scaling_requirements:
      horizontal_scaling:
        description: "添加更多节点扩展"
        databases:
          - "CockroachDB"
          - "TiDB"
          - "Cassandra"
          - "MongoDB Sharding"
      
      vertical_scaling:
        description: "增加单节点资源"
        databases:
          - "PostgreSQL"
          - "MySQL"
          - "MongoDB"

🐘 主流云原生数据库

CockroachDB

yaml
cockroachdb:
  architecture:
    description: "分布式SQL数据库,兼容PostgreSQL"
    key_features:
      - "强一致性(Serializable隔离级别)"
      - "自动分片和rebalancing"
      - "多活架构(Multi-Active)"
      - "地理分布式部署"
      - "无单点故障"
    
    architecture_layers:
      sql_layer:
        - "SQL解析和优化"
        - "分布式执行计划"
        - "PostgreSQL兼容协议"
      
      transaction_layer:
        - "分布式事务协调"
        - "MVCC并发控制"
        - "基于时间戳的冲突解决"
      
      distribution_layer:
        - "Range分片(默认64MB)"
        - "Raft副本协议"
        - "自动负载均衡"
      
      storage_layer:
        - "RocksDB存储引擎"
        - "LSM-Tree结构"
        - "压缩和垃圾回收"
  
  kubernetes_deployment:
    operator_based: |
      # 使用CockroachDB Operator部署
      apiVersion: crdb.cockroachlabs.com/v1alpha1
      kind: CrdbCluster
      metadata:
        name: cockroachdb
        namespace: database
      spec:
        dataStore:
          pvc:
            spec:
              accessModes:
              - ReadWriteOnce
              resources:
                requests:
                  storage: 100Gi
              storageClassName: fast-ssd
        
        resources:
          requests:
            cpu: "2"
            memory: "4Gi"
          limits:
            cpu: "4"
            memory: "8Gi"
        
        tlsEnabled: true
        
        image:
          name: cockroachdb/cockroach:v23.1.0
        
        nodes: 3
        
        additionalLabels:
          app: cockroachdb
          environment: production
    
    manual_deployment: |
      # 手动StatefulSet部署
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: cockroachdb
        namespace: database
      spec:
        serviceName: cockroachdb
        replicas: 3
        selector:
          matchLabels:
            app: cockroachdb
        template:
          metadata:
            labels:
              app: cockroachdb
          spec:
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                - weight: 100
                  podAffinityTerm:
                    labelSelector:
                      matchExpressions:
                      - key: app
                        operator: In
                        values:
                        - cockroachdb
                    topologyKey: kubernetes.io/hostname
            
            containers:
            - name: cockroachdb
              image: cockroachdb/cockroach:v23.1.0
              imagePullPolicy: IfNotPresent
              
              ports:
              - containerPort: 26257
                name: grpc
              - containerPort: 8080
                name: http
              
              livenessProbe:
                httpGet:
                  path: /health
                  port: http
                  scheme: HTTPS
                initialDelaySeconds: 30
                periodSeconds: 5
              
              readinessProbe:
                httpGet:
                  path: /health?ready=1
                  port: http
                  scheme: HTTPS
                initialDelaySeconds: 10
                periodSeconds: 5
              
              volumeMounts:
              - name: datadir
                mountPath: /cockroach/cockroach-data
              - name: certs
                mountPath: /cockroach/cockroach-certs
              
              env:
              - name: COCKROACH_CHANNEL
                value: kubernetes-insecure
              
              command:
              - /bin/bash
              - -ecx
              - |
                exec /cockroach/cockroach start \
                --logtostderr \
                --certs-dir=/cockroach/cockroach-certs \
                --advertise-host=$(hostname -f) \
                --http-addr=0.0.0.0 \
                --join=cockroachdb-0.cockroachdb,cockroachdb-1.cockroachdb,cockroachdb-2.cockroachdb \
                --cache=25% \
                --max-sql-memory=25%
            
            volumes:
            - name: certs
              secret:
                secretName: cockroachdb-node
                defaultMode: 0400
        
        volumeClaimTemplates:
        - metadata:
            name: datadir
          spec:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 100Gi
            storageClassName: fast-ssd
    
    initialization: |
      # 初始化集群
      kubectl exec -it cockroachdb-0 -n database -- \
        /cockroach/cockroach init \
        --certs-dir=/cockroach/cockroach-certs \
        --host=cockroachdb-0.cockroachdb
      
      # 创建用户和数据库
      kubectl exec -it cockroachdb-0 -n database -- \
        /cockroach/cockroach sql \
        --certs-dir=/cockroach/cockroach-certs \
        --host=cockroachdb-0.cockroachdb \
        --execute="CREATE USER myuser WITH PASSWORD 'mypassword'; CREATE DATABASE mydb; GRANT ALL ON DATABASE mydb TO myuser;"
  
  best_practices:
    schema_design:
      - "使用UUID作为主键避免热点"
      - "合理设计索引减少跨节点查询"
      - "利用分区表优化大表查询"
      - "避免大事务影响性能"
    
    performance_tuning:
      - "调整--cache和--max-sql-memory参数"
      - "使用连接池管理连接"
      - "启用查询缓存"
      - "监控慢查询并优化"
    
    high_availability:
      - "至少3个节点保证可用性"
      - "跨可用区部署"
      - "配置区域感知副本"
      - "定期测试故障转移"
yaml
tidb:
  architecture:
    description: "分布式NewSQL数据库,兼容MySQL"
    components:
      tidb_server:
        role: "SQL层,无状态"
        responsibilities:
          - "SQL解析和优化"
          - "查询执行"
          - "MySQL协议兼容"
        scaling: "水平扩展"
      
      pd_server:
        role: "调度和元数据管理"
        responsibilities:
          - "集群元数据存储"
          - "时间戳分配"
          - "数据调度决策"
        deployment: "3-5节点,奇数"
      
      tikv_server:
        role: "分布式KV存储"
        responsibilities:
          - "数据存储"
          - "Raft副本协议"
          - "事务支持"
        scaling: "水平扩展"
      
      tiflash:
        role: "列式存储引擎"
        responsibilities:
          - "OLAP查询加速"
          - "实时数据同步"
          - "列式存储"
        optional: true
  
  kubernetes_deployment:
    tidb_operator: |
      # 安装TiDB Operator
      helm repo add pingcap https://charts.pingcap.org/
      helm install tidb-operator pingcap/tidb-operator \
        --namespace tidb-admin \
        --create-namespace \
        --version v1.5.0
      
      # 部署TiDB集群
      apiVersion: pingcap.com/v1alpha1
      kind: TidbCluster
      metadata:
        name: basic
        namespace: tidb-cluster
      spec:
        version: v7.1.0
        timezone: UTC
        
        pvReclaimPolicy: Retain
        enableDynamicConfiguration: true
        configUpdateStrategy: RollingUpdate
        
        pd:
          baseImage: pingcap/pd
          maxFailoverCount: 0
          replicas: 3
          requests:
            cpu: "1"
            memory: "2Gi"
          limits:
            cpu: "2"
            memory: "4Gi"
          storageClassName: fast-ssd
          storageSize: "10Gi"
          config:
            log:
              level: info
            replication:
              max-replicas: 3
              location-labels: ["zone", "rack", "host"]
        
        tikv:
          baseImage: pingcap/tikv
          maxFailoverCount: 0
          replicas: 3
          requests:
            cpu: "2"
            memory: "4Gi"
          limits:
            cpu: "4"
            memory: "8Gi"
          storageClassName: fast-ssd
          storageSize: "100Gi"
          config:
            storage:
              reserve-space: "10GB"
            rocksdb:
              max-open-files: 10000
            raftdb:
              max-open-files: 10000
        
        tidb:
          baseImage: pingcap/tidb
          maxFailoverCount: 0
          replicas: 2
          service:
            type: LoadBalancer
            annotations:
              cloud.google.com/load-balancer-type: "Internal"
          requests:
            cpu: "2"
            memory: "4Gi"
          limits:
            cpu: "4"
            memory: "8Gi"
          config:
            log:
              level: info
            performance:
              max-procs: 0
              tcp-keep-alive: true
        
        tiflash:
          baseImage: pingcap/tiflash
          maxFailoverCount: 0
          replicas: 1
          storageClaims:
          - resources:
              requests:
                storage: 100Gi
            storageClassName: fast-ssd
          requests:
            cpu: "2"
            memory: "4Gi"
          limits:
            cpu: "4"
            memory: "8Gi"
    
    monitoring_setup: |
      # 配置监控
      apiVersion: pingcap.com/v1alpha1
      kind: TidbMonitor
      metadata:
        name: basic
        namespace: tidb-cluster
      spec:
        clusters:
        - name: basic
          namespace: tidb-cluster
        
        prometheus:
          baseImage: prom/prometheus
          version: v2.40.0
          
          requests:
            cpu: "1"
            memory: "2Gi"
          limits:
            cpu: "2"
            memory: "4Gi"
          
          storage: 50Gi
          storageClassName: standard
          
          config:
            commandOptions:
            - --log.level=info
            - --storage.tsdb.retention.time=30d
        
        grafana:
          baseImage: grafana/grafana
          version: 9.3.0
          
          service:
            type: LoadBalancer
          
          username: admin
          password: admin
        
        initializer:
          baseImage: pingcap/tidb-monitor-initializer
          version: v7.1.0
        
        reloader:
          baseImage: pingcap/tidb-monitor-reloader
          version: v1.0.1
  
  backup_restore:
    backup_configuration: |
      # 使用BR进行备份
      apiVersion: pingcap.com/v1alpha1
      kind: Backup
      metadata:
        name: demo1-backup
        namespace: tidb-cluster
      spec:
        backupType: full
        br:
          cluster: basic
          clusterNamespace: tidb-cluster
          sendCredToTikv: true
        
        from:
          host: ${tidb_host}
          port: ${tidb_port}
          user: ${tidb_user}
          secretName: backup-demo1-tidb-secret
        
        s3:
          provider: aws
          secretName: s3-secret
          region: us-west-2
          bucket: tidb-backup
          prefix: backup-folder
        
        storageClassName: standard
        storageSize: 100Gi
    
    restore_configuration: |
      # 从备份恢复
      apiVersion: pingcap.com/v1alpha1
      kind: Restore
      metadata:
        name: demo1-restore
        namespace: tidb-cluster
      spec:
        backupType: full
        br:
          cluster: basic
          clusterNamespace: tidb-cluster
          sendCredToTikv: true
        
        to:
          host: ${tidb_host}
          port: ${tidb_port}
          user: ${tidb_user}
          secretName: restore-demo1-tidb-secret
        
        s3:
          provider: aws
          secretName: s3-secret
          region: us-west-2
          bucket: tidb-backup
          prefix: backup-folder/backup-20231201
        
        storageClassName: standard
        storageSize: 100Gi

MongoDB和Cassandra

yaml
mongodb:
  kubernetes_operator:
    community_operator: |
      # 使用MongoDB Community Operator
      # 安装Operator
      kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes-operator/master/config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
      kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes-operator/master/config/manager/manager.yaml
      
      # 部署MongoDB副本集
      apiVersion: mongodbcommunity.mongodb.com/v1
      kind: MongoDBCommunity
      metadata:
        name: mongodb-replica-set
        namespace: mongodb
      spec:
        members: 3
        type: ReplicaSet
        version: "6.0.5"
        
        security:
          authentication:
            modes: ["SCRAM"]
        
        users:
        - name: admin
          db: admin
          passwordSecretRef:
            name: mongodb-admin-password
          roles:
          - name: clusterAdmin
            db: admin
          - name: userAdminAnyDatabase
            db: admin
          scramCredentialsSecretName: mongodb-admin-scram
        
        - name: appuser
          db: myapp
          passwordSecretRef:
            name: mongodb-app-password
          roles:
          - name: readWrite
            db: myapp
          scramCredentialsSecretName: mongodb-app-scram
        
        additionalMongodConfig:
          storage:
            wiredTiger:
              engineConfig:
                cacheSizeGB: 2
          operationProfiling:
            mode: slowOp
            slowOpThresholdMs: 100
        
        statefulSet:
          spec:
            template:
              spec:
                affinity:
                  podAntiAffinity:
                    requiredDuringSchedulingIgnoredDuringExecution:
                    - labelSelector:
                        matchExpressions:
                        - key: app
                          operator: In
                          values:
                          - mongodb-replica-set
                      topologyKey: kubernetes.io/hostname
                
                containers:
                - name: mongod
                  resources:
                    requests:
                      cpu: "1"
                      memory: "2Gi"
                    limits:
                      cpu: "2"
                      memory: "4Gi"
                
                - name: mongodb-agent
                  resources:
                    requests:
                      cpu: "100m"
                      memory: "256Mi"
                    limits:
                      cpu: "200m"
                      memory: "512Mi"
            
            volumeClaimTemplates:
            - metadata:
                name: data-volume
              spec:
                accessModes:
                - ReadWriteOnce
                resources:
                  requests:
                    storage: 100Gi
                storageClassName: fast-ssd
            
            - metadata:
                name: logs-volume
              spec:
                accessModes:
                - ReadWriteOnce
                resources:
                  requests:
                    storage: 10Gi
                storageClassName: standard
    
    sharded_cluster: |
      # MongoDB分片集群配置
      apiVersion: mongodbcommunity.mongodb.com/v1
      kind: MongoDBCommunity
      metadata:
        name: mongodb-sharded
        namespace: mongodb
      spec:
        type: ShardedCluster
        version: "6.0.5"
        
        shardCount: 3
        mongosCount: 2
        configServerCount: 3
        
        # Config Server配置
        configServer:
          members: 3
          podSpec:
            resources:
              requests:
                cpu: "500m"
                memory: "1Gi"
              limits:
                cpu: "1"
                memory: "2Gi"
          persistence:
            single:
              storage: 10Gi
              storageClass: fast-ssd
        
        # Mongos路由配置
        mongos:
          count: 2
          podSpec:
            resources:
              requests:
                cpu: "1"
                memory: "2Gi"
              limits:
                cpu: "2"
                memory: "4Gi"
        
        # Shard配置
        shardPodSpec:
          podTemplate:
            spec:
              containers:
              - name: mongod
                resources:
                  requests:
                    cpu: "2"
                    memory: "4Gi"
                  limits:
                    cpu: "4"
                    memory: "8Gi"
          
          persistence:
            multiple:
              data:
                storage: 200Gi
                storageClass: fast-ssd
              journal:
                storage: 10Gi
                storageClass: fast-ssd
              logs:
                storage: 10Gi
                storageClass: standard
yaml
cassandra:
  k8ssandra_operator:
    description: "K8ssandra - Cassandra on Kubernetes的完整解决方案"
    
    installation: |
      # 安装K8ssandra Operator
      helm repo add k8ssandra https://helm.k8ssandra.io/stable
      helm repo update
      
      helm install k8ssandra-operator k8ssandra/k8ssandra-operator \
        --namespace k8ssandra-operator \
        --create-namespace
    
    cluster_deployment: |
      # 部署Cassandra集群
      apiVersion: k8ssandra.io/v1alpha1
      kind: K8ssandraCluster
      metadata:
        name: demo
        namespace: cassandra
      spec:
        cassandra:
          serverVersion: "4.0.7"
          
          datacenters:
          - metadata:
              name: dc1
            size: 3
            
            storageConfig:
              cassandraDataVolumeClaimSpec:
                storageClassName: fast-ssd
                accessModes:
                - ReadWriteOnce
                resources:
                  requests:
                    storage: 100Gi
            
            config:
              jvmOptions:
                heapSize: 2Gi
                heapNewGenSize: 400Mi
                
              cassandraYaml:
                num_tokens: 16
                authenticator: PasswordAuthenticator
                authorizer: CassandraAuthorizer
                
                concurrent_reads: 32
                concurrent_writes: 32
                concurrent_counter_writes: 32
                
                commitlog_sync: periodic
                commitlog_sync_period_in_ms: 10000
            
            racks:
            - name: rack1
              affinityLabels:
                topology.kubernetes.io/zone: us-east-1a
            - name: rack2
              affinityLabels:
                topology.kubernetes.io/zone: us-east-1b
            - name: rack: rack3
              affinityLabels:
                topology.kubernetes.io/zone: us-east-1c
            
            resources:
              requests:
                cpu: "2"
                memory: "4Gi"
              limits:
                cpu: "4"
                memory: "8Gi"
          
          # Stargate API网关
          stargate:
            size: 2
            heapSize: 1Gi
            
            resources:
              requests:
                cpu: "1"
                memory: "2Gi"
              limits:
                cpu: "2"
                memory: "4Gi"
        
        # Reaper修复服务
        reaper:
          autoScheduling:
            enabled: true
          
          resources:
            requests:
              cpu: "100m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
        
        # Medusa备份
        medusa:
          storageProperties:
            storageProvider: s3
            bucketName: cassandra-backup
            region: us-east-1
            storageSecretRef:
              name: medusa-bucket-key
          
          resources:
            requests:
              cpu: "100m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
    
    backup_restore: |
      # 创建备份
      apiVersion: medusa.k8ssandra.io/v1alpha1
      kind: CassandraBackup
      metadata:
        name: backup-20231201
        namespace: cassandra
      spec:
        cassandraDatacenter: dc1
        name: backup-20231201
      
      # 从备份恢复
      apiVersion: medusa.k8ssandra.io/v1alpha1
      kind: CassandraRestore
      metadata:
        name: restore-20231201
        namespace: cassandra
      spec:
        cassandraDatacenter:
          name: dc1
        backup: backup-20231201
        inPlace: true
  
  performance_tuning:
    jvm_configuration:
      - "根据节点内存调整堆大小"
      - "使用G1GC垃圾收集器"
      - "配置合适的GC日志"
      - "启用JMX监控"
    
    cassandra_yaml:
      - "调整并发读写参数"
      - "优化compaction策略"
      - "配置缓存大小"
      - "设置合适的超时时间"
    
    schema_design:
      - "基于查询模式设计表"
      - "合理使用分区键"
      - "避免大分区问题"
      - "使用物化视图优化查询"

📊 云原生数据库运维

监控和性能优化

yaml
monitoring_solution:
  prometheus_stack:
    exporters:
      postgres_exporter: |
        # PostgreSQL监控
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: postgres-exporter
        spec:
          replicas: 1
          template:
            spec:
              containers:
              - name: postgres-exporter
                image: prometheuscommunity/postgres-exporter:latest
                env:
                - name: DATA_SOURCE_NAME
                  value: "postgresql://user:password@postgres:5432/postgres?sslmode=disable"
                ports:
                - containerPort: 9187
      
      mongodb_exporter: |
        # MongoDB监控
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: mongodb-exporter
        spec:
          template:
            spec:
              containers:
              - name: mongodb-exporter
                image: percona/mongodb_exporter:latest
                env:
                - name: MONGODB_URI
                  value: "mongodb://user:password@mongodb:27017"
                ports:
                - containerPort: 9216
      
      cassandra_exporter: |
        # Cassandra监控(JMX)
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: cassandra-exporter-config
        data:
          config.yml: |
            startDelaySeconds: 0
            ssl: false
            lowercaseOutputName: false
            lowercaseOutputLabelNames: false
            whitelistObjectNames:
            - org.apache.cassandra.metrics:type=ClientRequest,*
            - org.apache.cassandra.metrics:type=Compaction,*
            - org.apache.cassandra.metrics:type=Storage,*
    
    alerting_rules: |
      groups:
      - name: database-alerts
        rules:
        # 通用数据库告警
        - alert: DatabaseDown
          expr: up{job=~".*-exporter"} == 0
          for: 1m
          labels:
            severity: critical
          annotations:
            summary: "Database is down"
        
        - alert: HighDiskUsage
          expr: (node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100 > 85
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Database disk usage is high"
        
        # PostgreSQL特定告警
        - alert: PostgreSQLReplicationLag
          expr: pg_replication_lag > 100*1024*1024
          for: 2m
          labels:
            severity: critical
        
        # MongoDB特定告警
        - alert: MongoDBReplicationLag
          expr: mongodb_mongod_replset_member_replication_lag > 10
          for: 2m
          labels:
            severity: warning
        
        # Cassandra特定告警
        - alert: CassandraNodeDown
          expr: cassandra_node_up == 0
          for: 1m
          labels:
            severity: critical
yaml
performance_optimization:
  query_optimization:
    slow_query_analysis: |
      # PostgreSQL慢查询分析
      kubectl exec -it postgres-0 -- psql -U postgres -c "
        SELECT query, 
               calls, 
               total_time, 
               mean_time, 
               max_time
        FROM pg_stat_statements
        ORDER BY mean_time DESC
        LIMIT 10;
      "
      
      # MongoDB慢查询
      kubectl exec -it mongodb-0 -- mongo --eval "
        db.setProfilingLevel(1, { slowms: 100 });
        db.system.profile.find().limit(10).sort({ ts: -1 }).pretty();
      "
      
      # Cassandra慢查询(通过nodetool)
      kubectl exec -it cassandra-0 -- nodetool settraceprobability 0.01
      kubectl exec -it cassandra-0 -- nodetool gettraceprobability
    
    index_optimization:
      postgresql: |
        # 查找缺失索引
        SELECT schemaname, tablename, 
               seq_scan, seq_tup_read, 
               idx_scan, idx_tup_fetch
        FROM pg_stat_user_tables
        WHERE seq_scan > 0
        ORDER BY seq_tup_read DESC
        LIMIT 10;
        
        # 查找未使用的索引
        SELECT schemaname, tablename, indexname, idx_scan
        FROM pg_stat_user_indexes
        WHERE idx_scan = 0
        AND indexrelname NOT LIKE '%_pkey';
      
      mongodb: |
        # 分析查询计划
        db.collection.find({field: value}).explain("executionStats")
        
        # 创建复合索引
        db.collection.createIndex(
          { field1: 1, field2: 1 },
          { background: true }
        )
      
      cassandra: |
        # 创建二级索引
        CREATE INDEX ON keyspace.table (column);
        
        # 使用物化视图
        CREATE MATERIALIZED VIEW keyspace.view AS
          SELECT * FROM keyspace.table
          WHERE column IS NOT NULL
          PRIMARY KEY (column, id);
  
  connection_pooling:
    pgbouncer_config: |
      # PgBouncer连接池
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: pgbouncer
      spec:
        template:
          spec:
            containers:
            - name: pgbouncer
              image: pgbouncer/pgbouncer:latest
              env:
              - name: DATABASES_HOST
                value: postgres
              - name: DATABASES_PORT
                value: "5432"
              - name: DATABASES_DATABASE
                value: "*"
              - name: PGBOUNCER_POOL_MODE
                value: transaction
              - name: PGBOUNCER_MAX_CLIENT_CONN
                value: "1000"
              - name: PGBOUNCER_DEFAULT_POOL_SIZE
                value: "20"
    
    application_connection: |
      # 应用程序连接配置
      database_config:
        pool_size: 20
        max_overflow: 10
        pool_timeout: 30
        pool_recycle: 3600
        echo: false
        
        # 连接字符串
        connection_url: "postgresql://user:pass@pgbouncer:6432/dbname"
  
  caching_strategies:
    redis_cache_layer: |
      # Redis缓存层配置
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: redis-cache
      spec:
        serviceName: redis
        replicas: 3
        template:
          spec:
            containers:
            - name: redis
              image: redis:7-alpine
              command:
              - redis-server
              - --appendonly
              - "yes"
              - --maxmemory
              - "2gb"
              - --maxmemory-policy
              - "allkeys-lru"
              resources:
                requests:
                  memory: "2Gi"
                  cpu: "500m"
                limits:
                  memory: "3Gi"
                  cpu: "1"
    
    application_caching: |
      # 应用层缓存策略
      cache_patterns:
        read_through:
          description: "读穿透缓存"
          implementation: "先查缓存,未命中则查数据库并写入缓存"
        
        write_through:
          description: "写穿透缓存"
          implementation: "同时更新缓存和数据库"
        
        cache_aside:
          description: "旁路缓存"
          implementation: "应用程序管理缓存逻辑"

📋 云原生数据库面试重点

架构设计类

  1. 云原生数据库的核心特征?

    • 存储计算分离
    • 弹性伸缩能力
    • 自动故障恢复
    • 声明式API管理
  2. 如何选择合适的云原生数据库?

    • 工作负载类型分析
    • 一致性模型要求
    • 扩展性需求评估
    • 运维复杂度考虑
  3. 分布式数据库的CAP权衡?

    • 一致性(Consistency)
    • 可用性(Availability)
    • 分区容错性(Partition Tolerance)
    • 不同场景的选择策略

部署运维类

  1. Kubernetes上部署数据库的最佳实践?

    • StatefulSet vs Operator
    • 持久化存储配置
    • 网络策略设计
    • 资源限制设置
  2. 如何实现数据库的高可用?

    • 多副本配置
    • 自动故障转移
    • 跨可用区部署
    • 备份恢复策略
  3. 数据库备份和恢复方案?

    • 全量备份vs增量备份
    • 连续归档策略
    • 点时间恢复PITR
    • 跨区域备份

性能优化类

  1. 云原生数据库性能优化方法?

    • 查询优化技巧
    • 索引设计策略
    • 连接池配置
    • 缓存层设计
  2. 如何监控数据库性能?

    • 关键指标选择
    • 监控工具集成
    • 告警规则设计
    • 性能基线建立
  3. 分布式数据库的一致性保证?

    • Raft/Paxos协议
    • MVCC机制
    • 分布式事务
    • 最终一致性

技术对比类

  1. CockroachDB vs TiDB的选择?

    • 架构设计差异
    • 兼容性对比
    • 性能特点
    • 适用场景分析
  2. 关系型vs非关系型数据库?

    • 数据模型差异
    • 事务支持能力
    • 扩展性对比
    • 使用场景选择
  3. Operator vs Helm部署数据库?

    • 自动化程度对比
    • 运维复杂度
    • 功能丰富度
    • 适用场景分析

🔗 相关内容


云原生数据库代表了数据库技术的未来发展方向,将分布式架构、自动化运维和云原生理念深度融合。通过选择合适的云原生数据库解决方案并遵循最佳实践,可以构建高可用、高性能、易运维的现代数据平台。

正在精进