范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Sentry云原生中间件事件ClickHousePaaS,为Snuba引擎提供动力

  目录(脑图)
  ClickHouse PaaS 云原生多租户平台(Altinity.Cloud)
  官网:https://altinity.cloud PaaS 架构概览
  设计一个拥有云原生编排能力、支持多云环境部署、自动化运维、弹性扩缩容、故障自愈等特性,同时提供租户隔离、权限管理、操作审计等企业级能力的高性能、低成本的分布式中间件服务是真挺难的。
  SaaS 模式交付给用户
  Sentry Snuba 事件大数据分析引擎架构概览
  Snuba 是一个在 Clickhouse 基础上提供丰富数据模型、快速摄取消费者和查询优化器的服务。以搜索和提供关于 Sentry 事件数据的聚合引擎。
  数据完全存储在 Clickhouse 表和物化视图中,它通过输入流(目前只有 Kafka 主题)摄入,可以通过时间点查询或流查询(订阅)进行查询。
  文档: https://getsentry.github.io/snuba/architecture/overview.html Kubernetes ClickHouse Operator什么是 Kubernetes Operator?
  Kubernetes Operator 是一种封装、部署和管理 Kubernetes 应用的方法。我们使用 Kubernetes API(应用编程接口)和 kubectl 工具在 Kubernetes 上部署并管理 Kubernetes 应用。 https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/operator/ Altinity Operator for ClickHouse
  Altinity:ClickHouse Operator 业界领先开源提供商。 Altinity:https://altinity.com/ GitHub:https://github.com/Altinity/clickhouse-operator Youtube:https://www.youtube.com/@Altinity
  当然这种多租户隔离的 ClickHouse 中间件 PaaS 云平台,公司或云厂商几乎是不开源的。 RadonDB ClickHousehttps://github.com/radondb/radondb-clickhouse-operator https://github.com/radondb/radondb-clickhouse-kubernetes
  云厂商(青云)基于 altinity-clickhouse-operator 定制的。对于快速部署生产集群做了些优化。 Helm + Operator 快速上云 ClickHouse 集群云原生实验环境VKE K8S Cluster, Vultr   托管集群(v1.23.14)Kubesphere v3.3.1 集群可视化管理,全栈的 Kubernetes 容器云 PaaS 解决方案。 Longhorn 1.14,Kubernetes 的云原生分布式块存储。 部署 clickhouse-operator
  这里我们使用 RadonDB 定制的 Operator。 values.operator.yaml   定制如下两个参数:# operator 监控集群所有 namespace 的 clickhouse 部署 watchAllNamespaces: true # 启用 operator 指标监控 enablePrometheusMonitor: true helm 部署 operator: cd vip-k8s-paas/10-cloud-native-clickhouse  # 部署在 kube-system helm install clickhouse-operator ./clickhouse-operator -f values.operator.yaml -n kube-system  kubectl -n kube-system get po | grep clickhouse-operator # clickhouse-operator-6457c6dcdd-szgpd       1/1     Running   0          3m33s  kubectl -n kube-system get svc | grep clickhouse-operator # clickhouse-operator-metrics   ClusterIP      10.110.129.244     8888/TCP    4m18s  kubectl api-resources | grep clickhouse # clickhouseinstallations            chi          clickhouse.radondb.com/v1              true         ClickHouseInstallation # clickhouseinstallationtemplates    chit         clickhouse.radondb.com/v1              true         ClickHouseInstallationTemplate # clickhouseoperatorconfigurations   chopconf     clickhouse.radondb.com/v1              true         ClickHouseOperatorConfiguration 部署 clickhouse-cluster
  这里我们使用 RadonDB 定制的 clickhouse-cluster helm charts。
  快速部署 2 shards + 2 replicas + 3 zk nodes 的集群。 values.cluster.yaml   定制:clickhouse:     clusterName: snuba-clickhouse-nodes     shardscount: 2     replicascount: 2 ... zookeeper:   install: true   replicas: 3 helm 部署 clickhouse-cluster: kubectl create ns cloud-clickhouse helm install clickhouse ./clickhouse-cluster -f values.cluster.yaml -n cloud-clickhouse  kubectl get po -n cloud-clickhouse # chi-clickhouse-snuba-ck-nodes-0-0-0   3/3     Running   5 (6m13s ago)   16m # chi-clickhouse-snuba-ck-nodes-0-1-0   3/3     Running   1 (5m33s ago)   6m23s # chi-clickhouse-snuba-ck-nodes-1-0-0   3/3     Running   1 (4m58s ago)   5m44s # chi-clickhouse-snuba-ck-nodes-1-1-0   3/3     Running   1 (4m28s ago)   5m10s # zk-clickhouse-0                       1/1     Running   0               17m # zk-clickhouse-1                       1/1     Running   0               17m # zk-clickhouse-2                       1/1     Running   0               17m 借助 Operator 快速扩展 clickhouse 分片集群使用如下命令,将  shardsCount   改为 3  :kubectl edit chi/clickhouse -n cloud-clickhouse
  查看 pods: kubectl get po -n cloud-clickhouse  # NAME                                  READY   STATUS    RESTARTS       AGE # chi-clickhouse-snuba-ck-nodes-0-0-0   3/3     Running   5 (24m ago)    34m # chi-clickhouse-snuba-ck-nodes-0-1-0   3/3     Running   1 (23m ago)    24m # chi-clickhouse-snuba-ck-nodes-1-0-0   3/3     Running   1 (22m ago)    23m # chi-clickhouse-snuba-ck-nodes-1-1-0   3/3     Running   1 (22m ago)    23m # chi-clickhouse-snuba-ck-nodes-2-0-0   3/3     Running   1 (108s ago)   2m33s # chi-clickhouse-snuba-ck-nodes-2-1-0   3/3     Running   1 (72s ago)    119s # zk-clickhouse-0                       1/1     Running   0              35m # zk-clickhouse-1                       1/1     Running   0              35m # zk-clickhouse-2                       1/1     Running   0              35m
  发现多出  chi-clickhouse-snuba-ck-nodes-2-0-0   与 chi-clickhouse-snuba-ck-nodes-2-1-0  。 分片与副本已自动由 Operator   新建。小试牛刀ReplicatedMergeTree+Distributed+Zookeeper 构建多分片多副本集群
  连接 clickhouse
  我们进入 Pod, 使用原生命令行客户端  clickhouse-client   连接。kubectl exec -it chi-clickhouse-snuba-ck-nodes-0-0-0 -n cloud-clickhouse -- bash kubectl exec -it chi-clickhouse-snuba-ck-nodes-0-1-0 -n cloud-clickhouse -- bash kubectl exec -it chi-clickhouse-snuba-ck-nodes-1-0-0 -n cloud-clickhouse -- bash kubectl exec -it chi-clickhouse-snuba-ck-nodes-1-1-0 -n cloud-clickhouse -- bash kubectl exec -it chi-clickhouse-snuba-ck-nodes-2-0-0 -n cloud-clickhouse -- bash kubectl exec -it chi-clickhouse-snuba-ck-nodes-2-1-0 -n cloud-clickhouse -- bash
  我们直接通过终端分别进入这 6 个 pod。然后进行测试: clickhouse-client --multiline -u username -h ip --password passowrd # clickhouse-client -m
  创建分布式数据库查看  system.clusters  select * from system.clusters;
  2.创建名为  test   的数据库create database test on cluster "snuba-ck-nodes"; # 删除:drop database test on cluster "snuba-ck-nodes";
  在各个节点查看,都已存在  test   数据库。show databases;
  创建本地表(ReplicatedMergeTree)建表语句如下:
  在集群中各个节点  test   数据库中创建 t_local   本地表,采用 ReplicatedMergeTree   表引擎,接受两个参数:zoo_path   — zookeeper 中表的路径,针对表同一个分片的不同副本,定义相同路径。"/clickhouse/tables/{shard}/test/t_local"replica_name   — zookeeper 中表的副本名称CREATE TABLE test.t_local on cluster "snuba-ck-nodes" (     EventDate DateTime,     CounterID UInt32,     UserID UInt32 ) ENGINE = ReplicatedMergeTree("/clickhouse/tables/{shard}/test/t_local", "{replica}") PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID);
  宏( macros  )占位符:
  建表语句参数包含的宏替换占位符(如: {replica}  )。会被替换为配置文件里 macros 部分的值。
  查看集群中 clickhouse 分片&副本节点  configmap  :kubectl get configmap -n cloud-clickhouse | grep clickhouse  NAME                                             DATA   AGE chi-clickhouse-common-configd                    6      20h chi-clickhouse-common-usersd                     6      20h chi-clickhouse-deploy-confd-snuba-ck-nodes-0-0   2      20h chi-clickhouse-deploy-confd-snuba-ck-nodes-0-1   2      20h chi-clickhouse-deploy-confd-snuba-ck-nodes-1-0   2      20h chi-clickhouse-deploy-confd-snuba-ck-nodes-1-1   2      20h chi-clickhouse-deploy-confd-snuba-ck-nodes-2-0   2      19h chi-clickhouse-deploy-confd-snuba-ck-nodes-2-1   2      19h
  查看节点配置值: kubectl describe configmap chi-clickhouse-deploy-confd-snuba-ck-nodes-0-0  -n cloud-clickhouse
  创建对应的分布式表(Distributed)CREATE TABLE test.t_dist on cluster "snuba-ck-nodes" (     EventDate DateTime,     CounterID UInt32,     UserID UInt32 ) ENGINE = Distributed("snuba-ck-nodes", test, t_local, rand());  # drop table test.t_dist on cluster "snuba-ck-nodes";
  这里,Distributed 引擎的所用的四个参数: cluster - 服务为配置中的集群名( snuba-ck-nodes  )database - 远程数据库名( test  )table - 远程数据表名( t_local  )sharding_key - (可选) 分片key( CounterID/rand()  )
  查看相关表,如: use test; show tables; # t_dist # t_local
  通过分布式表插入几条数据: # 插入 INSERT INTO test.t_dist VALUES ("2022-12-16 00:00:00", 1, 1),("2023-01-01 00:00:00",2, 2),("2023-02-01 00:00:00",3, 3);
  任一节点查询数据: select * from test.t_dist;
  实战,为 Snuba 引擎提供 ClickHouse PaaS拆解与分析 Sentry Helm Charts
  在我们迁移到 Kubernetes Operator 之前,我们先拆解与分析下 sentry-charts 中自带的 clickhouse & zookeeper charts。
  非官方 Sentry Helm Charts: https://github.com/sentry-kubernetes/charts
  他的  Chart.yaml   如下:apiVersion: v2 appVersion: 22.11.0 dependencies: - condition: sourcemaps.enabled   name: memcached   repository: https://charts.bitnami.com/bitnami   version: 6.1.5 - condition: redis.enabled   name: redis   repository: https://charts.bitnami.com/bitnami   version: 16.12.1 - condition: kafka.enabled   name: kafka   repository: https://charts.bitnami.com/bitnami   version: 16.3.2 - condition: clickhouse.enabled   name: clickhouse   repository: https://sentry-kubernetes.github.io/charts   version: 3.2.0 - condition: zookeeper.enabled   name: zookeeper   repository: https://charts.bitnami.com/bitnami   version: 9.0.0 - alias: rabbitmq   condition: rabbitmq.enabled   name: rabbitmq   repository: https://charts.bitnami.com/bitnami   version: 8.32.2 - condition: postgresql.enabled   name: postgresql   repository: https://charts.bitnami.com/bitnami   version: 10.16.2 - condition: nginx.enabled   name: nginx   repository: https://charts.bitnami.com/bitnami   version: 12.0.4 description: A Helm chart for Kubernetes maintainers: - name: sentry-kubernetes name: sentry type: application version: 17.9.0
  这个 sentry-charts 将所有中间件 helm charts 耦合依赖在一起部署,不适合 sentry 微服务 & 中间件集群扩展。更高级的做法是每个中间件拥有定制的 Kubernetes Operator( 如:clickhouse-operator   ) & 独立的 K8S 集群,形成中间件 PaaS 平台对外提供服务。
  这里我们拆分中间件 charts 到独立的 namespace 或单独的集群运维。设计为: ZooKeeper 命名空间: cloud-zookeeper-paas  ClickHouse 命名空间: cloud-clickhouse-paas  独立部署 ZooKeeper Helm Chart
  这里 zookeeper chart 采用的是 bitnami/zookeeper,他的仓库地址如下: https://github.com/bitnami/charts/tree/master/bitnami/zookeeper https://github.com/bitnami/containers/tree/main/bitnami/zookeeper ZooKeeper Operator 会在后续文章专项讨论。 创建命名空间: kubectl create ns cloud-zookeeper-paas 简单定制下  values.yaml  :# 暴露下 prometheus 监控所需的服务 metrics:   containerPort: 9141   enabled: true .... .... service:   annotations: {}   clusterIP: ""   disableBaseClientPort: false   externalTrafficPolicy: Cluster   extraPorts: []   headless:     annotations: {}     publishNotReadyAddresses: true   loadBalancerIP: ""   loadBalancerSourceRanges: []   nodePorts:     client: ""     tls: ""   ports:     client: 2181     election: 3888     follower: 2888     tls: 3181   sessionAffinity: None   type: ClusterIP
  注意 :在使用支持外部负载均衡器的云提供商的服务时,需设置 Sevice 的 type 的值为 "LoadBalancer", 将为 Service 提供负载均衡器。来自外部负载均衡器的流量将直接重定向到后端 Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。 helm 部署: helm install zookeeper ./zookeeper -f values.yaml -n cloud-zookeeper-paas
  集群内,可使用  zookeeper.cloud-zookeeper-paas.svc.cluster.local:2181   对外提供服务。zkCli 连接 ZooKeeper: export POD_NAME=$(kubectl get pods --namespace cloud-zookeeper-paas -l "app.kubernetes.io/name=zookeeper,app.kubernetes.io/instance=zookeeper,app.kubernetes.io/component=zookeeper" -o jsonpath="{.items[0].metadata.name}")  kubectl -n cloud-zookeeper-paas exec -it $POD_NAME -- zkCli.sh  # test [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 1] ls /zookeeper [config, quota] [zk: localhost:2181(CONNECTED) 2] quit  # 外部访问 # kubectl port-forward --namespace cloud-zookeeper-paas svc/zookeeper 2181: & zkCli.sh 127.0.0.1:2181 查看  zoo.cfg  kubectl -n cloud-zookeeper-paas exec -it $POD_NAME -- cat /opt/bitnami/zookeeper/conf/zoo.cfg # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/bitnami/zookeeper/data # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature autopurge.purgeInterval=0  ## Metrics Providers # # https://prometheus.io Metrics Exporter metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider #metricsProvider.httpHost=0.0.0.0 metricsProvider.httpPort=9141 metricsProvider.exportJvmInfo=true preAllocSize=65536 snapCount=100000 maxCnxns=0 reconfigEnabled=false quorumListenOnAllIPs=false 4lw.commands.whitelist=srvr, mntr, ruok maxSessionTimeout=40000 admin.serverPort=8080 admin.enableServer=true server.1=zookeeper-0.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local:2888:3888;2181 server.2=zookeeper-1.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local:2888:3888;2181 server.3=zookeeper-2.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local:2888:3888;2181 独立部署 ClickHouse Helm Chart
  这里 clickhouse chart 采用的是 sentry-kubernetes/charts 自己维护的一个版本: sentry snuba 目前对于 clickhouse 21.x 等以上版本支持的并不友好,这里的镜像版本是  yandex/clickhouse-server:20.8.19.4  。https://github.com/sentry-kubernetes/charts/tree/develop/clickhouse ClickHouse Operator + ClickHouse Keeper 会在后续文章专项讨论。
  这个自带的 clickhouse-charts 存在些问题,Service 部分需简单修改下允许配置 "type:LoadBalancer" or "type:NodePort"。
  注意 :在使用支持外部负载均衡器的云提供商的服务时,需设置 Sevice 的 type 的值为 "LoadBalancer", 将为 Service 提供负载均衡器。来自外部负载均衡器的流量将直接重定向到后端 Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。 创建命名空间: kubectl create ns cloud-clickhouse-paas 简单定制下  values.yaml  :
  注意上面  zoo.cfg   的 3 个 zookeeper 实例的地址:server.1=zookeeper-0.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local:2888:3888;2181 server.2=zookeeper-1.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local:2888:3888;2181 server.3=zookeeper-2.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local:2888:3888;2181 # 修改 zookeeper_servers clickhouse:   configmap:     zookeeper_servers:       config:       - hostTemplate: "zookeeper-0.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local"         index: clickhouse         port: "2181"       - hostTemplate: "zookeeper-1.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local"         index: clickhouse         port: "2181"       - hostTemplate: "zookeeper-2.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local"         index: clickhouse         port: "2181"       enabled: true       operation_timeout_ms: "10000"       session_timeout_ms: "30000"  # 暴露下 prometheus 监控所需的服务 metrics:   enabled: true
  当然这里也可以不用 Headless Service,因为是同一个集群的不同 namespace 的内部访问,所以也可简单填入 ClusterIP 类型 Sevice: # 修改 zookeeper_servers clickhouse:   configmap:     zookeeper_servers:       config:       - hostTemplate: "zookeeper.cloud-zookeeper-paas.svc.cluster.local"         index: clickhouse         port: "2181"       enabled: true       operation_timeout_ms: "10000"       session_timeout_ms: "30000"  # 暴露下 prometheus 监控所需的服务 metrics:   enabled: true helm 部署: helm install clickhouse ./clickhouse -f values.yaml -n cloud-clickhouse-paas 连接 clickhouse kubectl -n cloud-clickhouse-paas exec -it clickhouse-0 -- clickhouse-client --multiline --host="clickhouse-1.clickhouse-headless.cloud-clickhouse-paas" 验证集群 show databases; select * from system.clusters; select * from system.zookeeper where path = "/clickhouse";
  当前 ClickHouse 集群的 ConfigMap
  kubectl get configmap -n cloud-clickhouse-paas | grep clickhouse  clickhouse-config    1      28h clickhouse-metrica   1      28h clickhouse-users     1      28h clickhouse-config(config.xml)     /var/lib/clickhouse/     /var/lib/clickhouse/tmp/     /var/lib/clickhouse/user_files/     /var/lib/clickhouse/format_schemas/      /etc/clickhouse-server/metrica.d/metrica.xml      users.xml      clickhouse     0.0.0.0     8123     9000     9009     4096     3     100     8589934592     5368709120     UTC     022     false                    3600     3600     60     1               system         query_log
toYYYYMM(event_date) 7500
system query_thread_log
toYYYYMM(event_date) 7500
/clickhouse/task_queue/ddl trace /var/log/clickhouse-server/clickhouse-server.log /var/log/clickhouse-server/clickhouse-server.err.log 1000M 10
clickhouse-metrica(metrica.xml) zookeeper-0.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local 2181 zookeeper-1.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local 2181 zookeeper-2.zookeeper-headless.cloud-zookeeper-paas.svc.cluster.local 2181 30000 10000 true clickhouse-0.clickhouse-headless.cloud-clickhouse-paas.svc.cluster.local 9000 default true true clickhouse-1.clickhouse-headless.cloud-clickhouse-paas.svc.cluster.local 9000 default true true clickhouse-2.clickhouse-headless.cloud-clickhouse-paas.svc.cluster.local 9000 default true clickhouse-users(users.xml) Sentry Helm Charts 定制接入 ClickHouse PaaS, 单集群多节点   我们简单修改 values.yml 禁用 sentry-charts 中的 clickHouse & zookeeperclickhouse: enabled: false zookeeper: enabled: false 修改externalClickhouseexternalClickhouse: database: default host: "clickhouse.cloud-clickhouse-paas.svc.cluster.local" httpPort: 8123 password: "" singleNode: false clusterName: "clickhouse" tcpPort: 9000 username: default   注意 : 这里只是简单的集群内部接入 1 个多节点分片集群,而 Snuba 系统的设计是允许你接入 多 个 ClickHouse 多 节点 多 分片 多 副本集群,将多个 Schema 分散到不同的集群,从而实现超大规模吞吐。因为是同一个集群的不同 namespace 的内部访问,所以这里简单填入类型为 ClusterIP Sevice 即可。 注意这里 singleNode 要设置成 false 。因为我们是多节点,同时我们需要提供 clusterName :源码分析: 这将用于确定: 将运行哪些迁移(仅本地或本地和分布式表) 查询中的差异 - 例如是否选择了 _local 或 _dist 表 以及确定来使用不同的 ClickHouse Table Engines 等。 当然,ClickHouse 本身是一个单独的技术方向,这里就不展开讨论了。 部署helm install sentry ./sentry -f values.yaml -n sentry 验证 _local 与 _dist 表以及 system.zookeeperkubectl -n cloud-clickhouse-paas exec -it clickhouse-0 -- clickhouse-client --multiline --host="clickhouse-1.clickhouse-headless.cloud-clickhouse-paas" show databases; show tables; select * from system.zookeeper where path = "/clickhouse";   高级部分 & 超大规模吞吐接入 ClickHouse 多集群/多节点/多分片/多副本的中间件 PaaS   独立部署多套 VKE LoadBlancer+ VKE K8S Cluster + ZooKeeper-Operator + ClickHouse-Operator,分散 Schema 到不同的集群以及多节点分片 。 分析 Snuba 系统设计查看测试用例源码,了解系统设计与高阶配置   关于针对 ClickHouse 集群各个分片、副本之间的读写负载均衡、连接池等问题。Snuba 在系统设计、代码层面部分就已经做了充分的考虑以及优化。   关于 ClickHouse Operator 独立的多个云原生编排集群以及 Snuba 系统设计等高级部分会在 VIP 专栏直播课单独讲解。 更多公众号:黑客下午茶,直播分享通知 云原生中间件 PaaS 实践:https://k8s-paas.hacker-linner.com

孩子吃饱了大人还喂会有什么后果?娃一顿吃多少,家长心里要有数文丨福林妈咪吃饱饭,这三个字,对很多中国人来说,已经是刻在我们基因里的追求。很多家庭平时做饭都有这样一个想法如果今天的饭菜没有剩,那就说明有人没吃饱。喂孩子也是,只要孩子没有放下碗撒哈拉沙漠的深度有多少?若将沙漠的沙子挖空,会看到什么?综述经过百万年的进化演变,人类已经成为现今地球上当之无愧的世界霸主。在面对其他任何生物的时候,人类都能够通过自身的智慧以及科技结晶取得胜利。然而即便如此,我们在大自然面前依旧显得十走进世界世纪解码最神秘的十五处文明遗存点亮真知计划世纪解码最神秘的十五处文明遗存马丘比丘地理位置秘鲁神秘指数五颗星马丘比丘,位于现今的秘鲁(Per)境内库斯科(Cuzco)西北75公里,整个遗址高耸在海拔约2350米的奥地利福拉尔贝格州,风景优美,感受不一样的异域风情欢迎大家来到我的旅行小世界,走遍千山万水,踏遍黄沙海洋,只为与你们分享这个世界的美好,如果你也喜欢旅行,那就跟随我的脚步和镜头一起出发吧!现在很多游客在外出旅行的时候,除了会选择一中国社科院旅游研究中心创始人张广瑞我的学术探索和历史小结张广瑞口述周易水整理回顾从上学读书到退休后淡出江湖,往事如烟,虽说没有任何值得炫耀的作为,但也说得上是丰富多彩,其实每个人都是这样的。在这些年里,无论是学习还是工作,我最为推崇的是王子文护肤秘籍来了,如何做到越活越年轻?素颜美女王子文驻颜有术,大方公开保养秘诀,王子文出演过家N次方唐山大地震等影视作品,荧幕中的王子文小巧可人,皮肤更是保养得白皙细腻,在圈里也有素颜美女之称,在欢乐颂中扮演的曲妖精更10年化妆师前辈给想学化妆,做化妆师新人忠告对于想学化妆的0基础小白,选择一家优质的化妆学校非常重要,好学校意味着顺利进入化妆行业的开始,可以少走很多弯路,节省大量时间。作为一名10经验的化妆前辈,我接触了全国不少各种形形色五六十岁的女人别乱染发!这三种发色显白又高级,减龄又显气质年关将至,又到了烫发染发的高峰阶段了,尽管离春节还有一段时间,但爱美的女士们已经蠢蠢欲动,开始挑选自己心爱的发型发色了。聪明的女人已经开始烫发了,染发大都会集中在年前那几天,不过染推荐10款好玩的沙盒游戏,方块方舟玩家能穿机甲套装作战相信只要是游戏爱好者,或多或少都接触过那么几款沙盒游戏,目前游戏市场上沙盒游戏占据了半壁江山,数量之多让人眼花缭乱,接下来就来为大家推荐几款值得一玩的沙盒游戏吧。第一款为明日之后,明日冬至,分享3种饺子馅最好吃的做法,随便一种都饱满多汁香大家好,我是第一美食的阿飞,时间如白驹过隙,转眼又到冬至了。汉书有云冬至阳气起,君道长,故贺。停停停停停,说人话,其实就是老话说的吃了冬至饭一天长一线,冬至过后白天一天比一天长,晚盘点10款好玩的像素沙盒游戏,方块方舟玩家成为石油大亨像素沙盒游戏,顾名思义,就是将沙盒元素和像素画风结合在了一起,这类游戏节奏明快,带来的游戏体验感相对独特,赢得了不少玩家的喜爱,接下来就来盘点10款好玩的像素沙盒游戏吧。第一款为星
真机曝光!iPhone15系列更厚更重,标准版还没有高刷新?苹果现在的保密工作越来越差,距离iPhone15系列发布还有半年时间,不少核心参数陆续遭到泄露,甚至连真机中框都遭到曝光。综合目前各种信息判断,iPhone15系列将变得更厚更重更小米13系列,海外媒体这样评价,网友苹果应该感受到压力了这几年冲击高端成了手机圈的热门词汇,虽然冲击高端不容易,但智能手机的高速发展期已经过去了,想要进一步发展,国产品牌就必须往高端走,而这必然会和苹果产生碰撞,小米因此喊出了对标苹果的欢瑞世纪创始人再被冻结千万股权据天眼查App显示,日前,欢瑞世纪投资(北京)有限公司新增股权冻结信息,被执行人为欢瑞世纪创始人钟君艳,冻结股权数额为1000万人民币,冻结期限自2023年2月13日至2026年2女星现身时装周,陌生男子借合影趁机骚扰,容祖儿无奈应对惹人怜3月8日,有博主爆料容祖儿现身巴黎时装周,被陌生男子骚扰却强颜欢笑的照片引发争议。在时装周现场,容祖儿穿着白上衣和白色短裤,一身白色的搭配轻松驾驭,大大方方配合媒体拍了多张美照,状超模刘雯与井柏然不官宣却高调恋爱,一起甜蜜看时装秀超级名模刘雯和男演员井柏然参加2023年巴黎时装周。两位在媒体面前高调恋爱香奈儿时装秀上,刘雯和井柏然坐在前排。刘文还对男友做出了调整项链和甜蜜微笑的举动。这是他们自2022年6月男生裤子如何选?从小白到入门手把手教会你!不知道小伙伴们有没有这样的烦恼,你们有没有觉得在网上买裤子比买衣服难,买六条裤子最起码要退三条回去,或者是闲置了,然后唯一能穿的三条,还有两条质量不好,最后只剩一条能穿的了。这样的40岁女星张钧甯巴黎街头被偶遇,皮肤紧致气质佳,细长美腿太吸睛近日,有网友晒出在巴黎街头偶遇女星张钧甯的照片,她一袭黑色连衣裙,裙摆在膝盖以上,一双细长的美腿着实吸人眼球,动态一出后,引来了不少人的关注。晒出的照片中,40岁的张钧甯打扮得精致为什么你的衣柜里总是缺少那一件衣服每到换季,无论刮风下雨,商场都人满为患。可见购物星人之庞大!十分惭愧的是,我也是购物星庞大家族中的一员。为什么每到换季就要买买买?去年的衣服都穿不了了么?对于这个问题,我和我的家族周大福拿捏年轻人,不靠黄金,靠奇葩设计最近逛小红书,没想到黄金珠宝品牌周大福,居然在小红书火成了一大顶流。而周大福频频出圈的倚仗,竟然是各种千奇百怪脑洞大开的设计创意。比如最近超火的拿捏男同胞的奥特曼联名你相信光吗?哈刘亦菲巴黎时装周与谷爱凌同框合影,用后置摄像头自拍太可爱文酱子编辑酱子未经允许禁止转载违者必究!前段时间,刘亦菲以一部去有风的地方再次爆火,她的行程也备受关注。作为LV的品牌代言人,近日,刘亦菲也被邀请到巴黎时装周看秀。在刘亦菲一身黑皮MiuMiu女孩决定放弃长裤我们必须让如何穿衣成为一种思考。MiucciaPrada让丝袜成为绝对主角Miuccia认为,服装的工艺技术和面料改变了我们看待服装的方式。大秀第一个Look便直白地展示了这种变化