m3db M3 Coordinator 和 M3 Query 配置文件详解

M3 Coordinator 和 M3 Query 共享相同的配置选项。



#服务器监听地址

listenAddress: <url>

# 发布指标的选项

metrics:

  # 指标范围

  scope:

    # 为收集的指标添加前缀

    prefix: <string>

    # 收集指标的报告频率

    reportingInterval: <duration>

    # 由收集的指标共享的标签

    tags: <map of strings>

  # Prometheus 报告器的配置(如果使用)

  prometheus:

    # 应用程序的指标收集端点

    # Default = "/metrics"

    handlerPath: <string>

    # 监听指标地址

    # Default = "0.0.0.0:7203"

    listenAddress: <url>

    # 用于 Tally 计时器的默认 Prometheus 类型,有效选项:[histogram, summary]

    timerType: <string>

    # 如果指定,则设置报告者使用的默认直方图目标

    defaultHistogramBuckets:

      # Upper bound of the bucket

      upper: <float>

    # 如果指定,则设置报告者使用的默认摘要目标

    defaultSummaryObjectives:

      percentile: <float>

      allowedError: <float>

    # 监听指定监听地址或向 Prometheus 注册度量时出现错误怎么办,有效选项:[stderr, log, none]

    # 默认 = panic 并停止 goroutine 的执行

    onError: <string>

  # 指标清理类型,有效选项:[none, m3, prometheus]

  # Default = "none"

  sanitization: <string>

  # 指标采样率。最小值=0.0,最大值=1.0

  samplingRate: <float>

  # 启用 Go 运行时指标,有效选项:[无、简单、中等、详细]

  # 查看 https://github.com/m3db/m3/blob/master/src/x/instrument/extended.go#L39:L64 了解更多详情

  extended: <string>

#日志配置

logging:

  #日志文件位置

  file: <string>

  # 错误日志级别

  level: <string>

  # 键值对发送到日志

  fields: <map_of_strings>

# 启用跟踪,如果没有配置,则禁用跟踪

tracing:

  # 跟踪服务的名称

  serviceName: <string>

  # 跟踪后端使用,有效选项:[jaeger, lightstep]

  backend: <string>

  # 如果使用 Jaeger,发送到跟踪后端的选项

  jaeger:

  # 如果使用 Lightstep,发送到跟踪后端的选项

  lightstep:

clusters:

    client:

      config:

        service:

          # 配置etcd keyspace,有效选项:[default_env, user_defined]

          # default_env 是裸机单节点,用户自定义匹配 kubernetes-namespace/cluster-name 模式

          env: <string>

          # 可用区,有效选项:[用户定义,嵌入]

          # 用户定义的应与您的托管服务提供商的可用区域相匹配

          zone: <string>

          # Service name

          service: <string>

          # 存放缓存的 etcd 数据的目录

          cacheDir: <string>

          # 确定这个节点应该连接到的 etcd 主机

          etcdClusters:

            # 可用区,有效选项:[用户定义,嵌入]

            # 用户定义的应与您的托管服务提供商的可用区域相匹配

            - zone: <string>

              # etcd集群的成员节点,格式为url:port

              endpoints:

                - <url>

              # 保持活动头行为

              keepAlive:

                # 启用保持活动

                enabled: <bool>

                # 一段时间后,如果客户端没有看到任何活动,则客户端 ping 服务器以查看传输是否处于活动状态。

                period: <duration>

                # 加入抖动保活周期,避免大量客户端同时发送保活探测。

                jitter: <duration>

                # 客户端等待保活探测响应的时间。如果在这段时间内没有收到响应,则连接关闭。

                timeout: <duration>

              # TLS 配置

              tls:

                #证书路径

                crtPath: <string>

                # 证书权限路径

                caCrtPath: <string>

                # 密钥存储路径

                keyPath: <string>

              autoSyncInterval: <duration>   

        # 种子节点配置,主要用于单节点设置

        seedNodes:

          # 键值存储目录的路径

          rootDir: <string>

          initialAdvertisePeerUrls: <array_of_strings>

          advertiseClientUrls: <array_of_strings>

          listenPeerUrls: <array_of_strings>

          listenClientUrls: <array_of_strings>

          # 集群的种子节点

          initialCluster:

            # 节点标识符

            - hostID: <string>

              # URL of node

              endpoint: <url>

              # 指定这是一个现有集群,如果现在是,则留空,有效选项:[现有]

              clusterState: <string>

          # 种子节点客户端安全配置

          clientTransportSecurity:

            # 证书权限路径

            caFile: <string>

    #证书路径

            certFile: <string>

            # 密钥存储路径

            keyFile: <string>

            trustedCaFile: <string>

            clientCertAuth: <bool>

            autoTls: <bool>

          # 种子节点对等安全配置

          peerTransportSecurity:

            # 证书权限路径

            caFile: <string>

            #证书路径

            certFile: <string>

            # 密钥存储路径

            keyFile: <string>

            trustedCaFile: <string>

            clientCertAuth: <bool>

            autoTls: <bool>

      # 写入集群的一致性级别,有效选项:[none, one, most, all]

      writeConsistencyLevel: <string>

      # 从集群读取的一致性级别,有效选项:[none, one, unstrict_majority, most, unstrict_all, all]

      readConsistencyLevel: <string>

      # 写入数据的超时时间

      # Default = 10s

      writeTimeout: <duration>

      # 任何给定查询的获取超时

      # Range = 30s to 5m

      fetchTimeout: <duration>

      # 集群连接超时

      connectTimeout: <duration>

      # 重试写操作的配置

      writeRetry:

        initialBackoff: <duration>

        # 指数退避系数

        backoffFactor: <float>

        # 最大退避时间

        maxBackoff: <duration>

        # 最大重试次数

        maxRetries: <int>

        # 一直重试连接直到尝试成功,否则重试条件变为假

        forever: <bool>       

        # 为等待间隔添加随机性

        jitter: <bool>

      # 重试获取操作的配置

      fetchRetry:

        initialBackoff: <duration>

        # 指数退避系数

        backoffFactor: <float>

        # 最大退避时间

        maxBackoff: <duration>

        # 最大重试次数

        maxRetries: <int>

        # 一直重试连接直到尝试成功,否则重试条件变为假

        forever: <bool>       

        # 为等待间隔添加随机性

        jitter: <bool>

      # 在不考虑连接之前背景检查失败的次数

      backgroundHealthCheckFailLimit: <int>

      # 在健康检查失败和下一次检查之间休眠时主机连接时间的因素

      backgroundHealthCheckFailThrottleFactor: <float>

# 如果运行嵌入式协调器,则本地嵌入式配置

local:

  # 描述静态集群中的命名空间

  namespaces:

    #命名空间的名称

    namespace: <string>

    #命名空间存储的值的类型,当前,有效选项:[unaggregated,aggregated]

    type: <string>

    # 存储指标数据的时间

    retention: <duration>

    # 指标采样分辨率

    resolution: <duration>

    # 在聚合集群命名空间上配置下采样选项

    downsample:

      all: <bool>

# 配置、命名空间和数据库管理端点。

clusterManagement:

  # etcd客户端配置

  etcd:

    # 配置etcd keyspace,有效选项:[default_env, user_defined]

    # default_env 是裸机单节点,用户自定义匹配 kubernetes-namespace/cluster-name 模式

    env: <string>

    # 可用区,有效选项:[用户定义,嵌入]

    # 用户定义的应与您的托管服务提供商的可用区域相匹配

    zone: <string>

    # 服务名称

    service: <string>

    # 存放缓存的 etcd 数据的目录

    cacheDir: <string>

    # 确定这个节点应该连接到的 etcd 主机

    etcdClusters:

      # 可用区,有效选项:[用户定义,嵌入]

      # 用户定义的应与您的托管服务提供商的可用区域相匹配

      - zone: <string>

        # etcd集群的成员节点,格式为url:port

        endpoints:

          - <url>

        # 保持活动头行为

        keepAlive:

          # 启用保持活动

          enabled: <bool>

          # 一段时间后,如果客户端没有看到任何活动,则客户端 ping 服务器以查看传输是否处于活动状态。

          period: <duration>

          # 加入抖动保活周期,避免大量客户端同时发送保活探测。

          jitter: <duration>

          # 客户端等待保活探测响应的时间。如果在这段时间内没有收到响应,则连接关闭。

          timeout: <duration>

        # TLS 配置

        tls:

          #证书路径

          crtPath: <string>

          # 证书权限路径

          caCrtPath: <string>

          # 密钥存储路径

          keyPath: <string>

        autoSyncInterval: <duration>   

    # M3服务发现配置

    m3sd:

      # 初始化超时

      # Default = 5s

      initTimeout: <duration>

    # w 的修订版本匹配请求从

    watchWithRevision: <int>

    # 更改缓存目录的权限和模式

    newDirectoryMode: <string>

    # 重试连接操作的配置

    retry:

      initialBackoff: <duration>

      # 指数退避系数

      backoffFactor: <float>

      # 最大退避时间

      maxBackoff: <duration>

      # 最大重试次数

      maxRetries: <int>

      # 一直重试连接直到尝试成功,否则重试条件变为假

      forever: <bool>     

      # 为等待间隔添加随机性

      jitter: <bool>

    # etcd 请求的超时时间

    requestTimeout: <duration>

    # watchChan 初始化的超时时间

    # Default = 10s

    watchChanInitTimeout: <duration>

    # 检查 watch chan 是否不再订阅并且应该关闭的频率

    # Default = 10s   

    watchChanCheckInterval: <duration>

    # 重置 etcd watch chan 之前的延迟

    # Default = 10s 

    watchChanResetInterval: <duration>

# 写/读/完成标签存储过滤器的过滤器

# 都是一样的配置,所以只解释一次

filter:

  read:

    # 指定只使用本地存储

    local_only: <string>

    # 指定使用仅远程存储

    remote_only: <string>

    # 指定使用所有存储

    allow_all: <string>

    # 指定不使用存储

    allow_none: <string>

  write:

  completeTags:

# 用于远程协调器到协调器调用的 GRPC 服务器的协调器的 RPC 配置

rpc:

  enabled: <bool>

  # 为远程调用启用协调器RPC

  listenAddress: <url>

  # RPC 服务器监听地址

  remotes:

  # 远程协调器区域的配置设置

    # Remote listen addresses to call for remote coordinator calls in the zone

    # 远程监听地址调用区域内的远程协调器调用

    remoteListenAddresses: <array of urls>

    # 覆盖此主机的默认错误行为,有效选项:[fail, warning, container]

    # Default = warning

    errorBehavior: <string>

  # 覆盖所有 rpc 主机的默认错误行为,有效选项:[fail、warning、container]

  # Default = warning

  errorBehavior: <string>

  # 在 GRPC 服务器上启用反射,用于测试与 grpcurl 等的连接性。

  reflectionEnabled: <bool>

# 配置方法以联系远程协调器以跨数据中心分布 M3 集群

# 查询服务的后端存储,有效选项:[grpc, m3db, noop-etcd]。

# Default = m3db

backend: <string>

# 读取请求的工作池策略

readWorkerPoolPolicy:

  # Worker pool automatically grows to capacity

  grow: <bool>

  # 静态池大小,或动态增长池的初始大小

  size: <int>

# 写请求的工作池策略

writeWorkerPoolPolicy:

  # 工作池自动增长到容量

  grow: <bool>

  # 静态池大小,或动态增长池的初始大小

  size: <int>

# 写入转发到其他 Prometheus 后端以进行镜像、高可用性等

writeForwarding:

  # prometheus 写入处理程序的转发选项

  promRemoteWrite:

    maxConcurrency: <int>

    timeout: <duration>

    # 重试连接操作的配置

    retry:

      initialBackoff: <duration>

      # 指数退避系数

      backoffFactor: <float>

      # 最大退避时间

      maxBackoff: <duration>

      # 最大重试次数

      maxRetries: <int>

      # 一直重试连接直到尝试成功,否则重试条件变为假

      forever: <bool>     

      # 为等待间隔添加随机性

      jitter: <bool>

    # Prometheus 写入处理程序转发器目标

    targets:

      # 要发送到的目标的 URL

      url: <string>

      # 如果未设置,方法默认为 POST

      method: <string>

      # 与请求一起发送到目标的标头

      headers: <map of strings>

# 如何对指标进行下采样

downsample:

  # 下采样器匹配器的配置

  matcher:

  # 下采样规则覆盖 KV 存储中设置的任何规则

  rules:

    # 规则(多个)为指标设置保留和分辨率给定过滤器以匹配指标

    mappingRules:

      # 字符串分隔的标签名称到标签值 glob 模式来过滤映射规则

      filter: <string>

      # 应用于指标集的聚合

      # 阅读 https://m3db.io/docs/operational_guide/mapping_rollup/ 获取完整列表

      aggregations: <array_of_strings>

      # 保留/解析存储策略以保持匹配的指标

      storagePolicies:

        # 存储指标数据的时间

        retention: <duration>

        # 指标采样分辨率

        resolution: <duration>

      # 删除与过滤器匹配的所有指标,而不是将它们保留在存储策略中

      drop: <bool>

      # 在应用映射规则时添加到度量的标签

      tags: <array_of_strings>

      # 映射规则的名称

      name: <string>

    # 规则(多个)为给定过滤器以匹配指标的指标集设置聚合

    rollupRules:

      # 字符串分隔的标签名称到标签值 glob 模式来过滤映射规则

      filter: <string>

      # 一组汇总规则变换

      transforms:

        rollup:

          # 应用汇总后发出的新指标的名称及其聚合和分组依据

          metricName: <string>

          # 要分组的标签集,只有这些标签保留在汇总操作生成的新指标名称上

          groupBy: <array_of_strings>

          # 应用于指标集的聚合

          # 阅读 https://m3db.io/docs/operational_guide/mapping_rollup/ 获取完整列表

          aggregations: <array_of_strings>

        # 聚合操作类型

        aggregate:

          # 阅读 https://m3db.io/docs/operational_guide/mapping_rollup/ 获取完整列表

          type: <string>

        # 变换操作类型

        transform:

          # 阅读 https://m3db.io/docs/operational_guide/mapping_rollup/ 获取完整列表

          type: <string>

      # 保留/解析存储策略以保持匹配的指标

      storagePolicies:

        # 存储指标数据的时间

        retention: <duration>

        # 指标采样分辨率

        resolution: <duration>

      # 汇总规则的名称

      name: <string>

  # 计数器元素池

  counterElemPool:

    # 池的大小

    size: <int>

    watermark:

      # 开始重新填充池的低水印

      # min=0.0, max=1.0

      low: <float>

      # 开始重新填充池的高水印

      # min=0.0, max=1.0

      high: <float>

  # 定时器元素池

  timerElemPool:

    # 池的大小

    size: <int>

    watermark:

      # 开始重新填充池的低水印

      # min=0.0, max=1.0

      low: <float>

      # 开始重新填充池的高水印

      # min=0.0, max=1.0

      high: <float>

  # 量规元素池

  gaugeElemPool:

    # 池的大小

    size: <int>

    watermark:

      # 开始重新填充池的低水印

      # min=0.0, max=1.0

      low: <float>

      # 开始重新填充池的高水印

      # min=0.0, max=1.0

      high: <float>

  # 为聚合切片指定自定义缓冲区超过限制

  bufferPastLimits:

    resolution: <duration>

    bufferPast: <duration>

  # 条目在因不活动而过期之前保持活动状态的时间

  entryTTL: <duration>

  # 增加规则过滤器中使用的指标类型

  augmentM3Tags: <bool>

  # 在决定下采样器是否应根据给定规则的存储策略忽略自动映射规则时包括汇总规则

  includeRollupsOnDefaultRuleFiltering: <bool>

# 摄取服务器配置

ingest:

  ingester:

    workerPoolSize: <int>

    # 写操作池大小

    opPool:

      size: <int>

      watermark:

        # 开始重新填充池的低水印

        # min=0.0, max=1.0

        low: <float>

        # 开始重新填充池的高水印

        # min=0.0, max=1.0

        high: <float>

    retry:

      initialBackoff: <duration>

      # 指数退避系数

      backoffFactor: <float>

      # 最大退避时间

      maxBackoff: <duration>

      # 最大重试次数

      maxRetries: <int>

      # 一直重试连接直到尝试成功,否则重试条件变为假

      forever: <bool>     

      # 为等待间隔添加随机性

      jitter: <bool>

    logSampleRate: <float>

# 提供石墨指标支持的 carbon 服务器的配置

carbon:

  ingester:

    workerPoolSize: <int>

    # 写操作池大小

    opPool:

      size: <int>

      watermark:

        # 开始重新填充池的低水印

        # min=0.0, max=1.0

        low: <float>

        # 开始重新填充池的高水印

        # min=0.0, max=1.0

        high: <float>

    retry:

      initialBackoff: <duration>

      # 指数退避系数

      backoffFactor: <float>

      # 最大退避时间

      maxBackoff: <duration>

      # 最大重试次数

      maxRetries: <int>

      # 一直重试连接直到尝试成功,否则重试条件变为假

      forever: <bool>     

      # 为等待间隔添加随机性

      jitter: <bool>

    logSampleRate: <float>

  aggregateNamespacesAllData:

  # 一个恒定的时间开始转移

  shiftTimeStart: <duration>

  # 一个恒定的移位时间结束

  shiftTimeEnd: <duration>

  # 一组恒定的步骤开始移位

  shiftStepsStart: <int>

  # 一组不断移动的步长

  shiftStepsEnd: <int>

  # 当且仅当结束与查询的解析边界完全匹配,并且开始与解析边界完全匹配时,用于移动开始的恒定步骤集

  shiftStepsStartWhenAtResolutionBoundary: <int>

  # 当且仅当开始与查询的解析边界完全匹配,结束与解析边界完全匹配时,要移动结束的一组恒定步骤

  shiftStepsEndWhenAtResolutionBoundary: <int>

  # 一组恒定的移动步骤开始,当且仅当,开始与查询的解析边界完全匹配,并且结束与解析边界不完全匹配

  shiftStepsEndWhenStartAtResolutionBoundary: <int>

  # 当且仅当结束与查询的解析边界完全匹配,并且开始与解析边界不完全匹配时,要移动结束的一组恒定步骤

  shiftStepsStartWhenEndAtResolutionBoundary: <int>

  # 当开始时间在数据点的分辨率步长之间时渲染部分数据点

  renderPartialStart: <bool>

  # 当结束时间在数据点的分辨率步长之间时渲染部分数据点

  renderPartialEnd: <bool>

  # 渲染整个输出只有 NaN 的系列,而不是返回一个空的数据点数组

  renderSeriesAllNaNs: <bool>

  # 在带引号的字符串中使用反斜杠转义所有字符,而不仅仅是转义引号

  compileEscapeAllNotOnlyQuotes: <bool>

# M3 Query组件的配置

query:

  # 查询超时

  timeout: <duration>

  # 默认查询引擎,有效选项:[prometheus, m3query]

  defaultEngine: <string>

  # 用于合并获取的查询的配置

  consolidation:

    # 确定哪个系列应该匹配的选项,有效选项:[ids, tags]

    matchType: <string>

  # Prometheus 客户端配置

  prometheus:

    # 每个查询获取样本的限制

    maxSamplesPerQuery: <int>

  # 可选配置限制所有带有特定标签的查询

  restrictTags:

    match:

      # 匹配的标签

      name: <string>

      # 如何匹配,有效选项:[EQUAL, NOTEQUAL, REGEXP, NOTREGEXP, EXISTS, NOTEXISTS, ALL]

      type: <string>

      # 标签值

      value: <string>

    # 从响应中剥离的标签

    strip: <array_of_strings>

# 指定查询实例中资源使用的限制。限制分为每个查询和全局限制

limits:

  # 在单个查询中配置资源使用限制。零或负值意味着没有限制

  perQuery:

    # 在将结果返回给查询服务之前,限制每个查询为任何给定的单个存储节点返回的时间序列数

    maxFetchedSeries: <int>

    # 在将结果返回给查询服务之前,限制每个查询与任何给定单个存储节点匹配的索引文档数

    maxFetchedDocs: <int>

    # 如果查询超出任何限制,则生成错误

    requireExhaustive: <bool>

# 设置查询的回溯持续时间

# Default = 5m

lookbackDuration: <duration>

# 查询的结果选项

resultOptions:

  # 在返回查询结果之前保留 NaN。

  # Default = false

  keepNans: <bool>

# 控制是否存储指标类型

storeMetricsType: <bool>

# 多进程配置

multiProcess:

  # 启用多进程执行

  enabled: <bool>

  # 要运行的子进程数

  # 使用 0 根据 CPU 数量自动检测

  count: <int>

  # 每个 CPU 运行的进程因子,离开

  # 使用 0 表示每个 CPU 使用默认值 0.5,即每两个 CPU 一个进程

  # min=0.0, max=1.0

  perCPU: <float>

  # 显式设置子 GOMAXPROCs env var

  goMaxProcs: <int>

# 调试包配置

debug:

  # 设置运行时报告互斥量争用事件,阅读 https://tip.golang.org/pkg/runtime/#SetMutexProfileFraction 了解更多关于值的详细信息

  mutexProfileFraction: <int>

  # 设置运行时报告阻塞事件,阅读 https://golang.org/pkg/runtime/#SetBlockProfileRate 了解更多关于该值的详细信息

  blockProfileRate: <int>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容