纵横大数据主要观点(四)

经典DBMS的挑战

  1. 数据量与处理压力带来的扩展性的挑战,主要体现在:
    1. 企业的核心业务系统,应付用户并发量与数据量增长的压力越来越严重;
    2. 企业的业务分析系统应付数据处理强度与数据量增长的压力也越来越严重。
  2. 对多种数据类型管理以及弱模式管理需求满足。
  3. 主流关系型数据库应对现代数据管理需求的挑战的主要策略,主要分两种(基于分布式与并行技术解决方案架构):
    1. Share Disk:从名字上可以判断,主要是扩展了数据库计算能力,但是磁盘、网络IO依旧是瓶颈;典型产品Oracle RAC,实际项目中超过4个RAC节点OLTP的集群很少,当增加第一个RAC节点时数据库性能可以显著提升性能,增加更多节点数据库性能则不能线性增加,甚至可能出现多节点的数据库性能还不如单机性能(数据库主要性能瓶颈时磁盘IO瓶颈,在OLTP和OLAP都有可能发生,OLAP场景更多一些;节点数量增加并没有解决硬盘IO瓶颈,且增加节点导致的协调、控制等损耗更大)。
    2. Share Nothing :通过分片技术让每个节点上存储的数据都不相同,这样即可解决水平扩展中磁盘IO问题,典型产品TeraData,GreenPlum;这种架构下由于数据分散在不同节点,这种架构天然就不适合OLTP的场景(例如:表关联操作不得不进行节点间数据迁移工作)。Share Nothing架构基本上都用于OLAP场景。
阅读更多

纵横大数据主要观点(三)

什么是数据库联邦

作者引入了一个数据库“联邦”的概念,是为了避免和数据库“集群”概念混淆。 关系型数据库联邦是数据库设计的一种架构:将一组互相独立的关系型数据库用网络连接起来协同工作,综合采用各种技术(分库分表、读写分离)以达到更强的数据管理与服务能力,提供更加的性能、更大的容量与更多的并发用户数。

一个联邦架构的数据系统需要提供以下关键服务

  1. 分布服务:确定由那个子数据库来执行相关的服务
  2. 协调服务:数据库节点之间交互数据处理,统一调度控制等
  3. 监控与管理服务:对分布式节点进行监控以及统一管理(例如节点升级、重启等)
  4. 消息服务:跨节点数据处理时需要用消息机制传递数据
阅读更多

纵横大数据主要观点(二)

分布式关系型数据库典型的架构

Share-Nothing

MPPDB一般都是此架构,主要是将数据拆分存储到不同的节点上,在各自节点上独立读写数据,正因为如此,此架构只适合OLAP业务,如果进行表关联操作时仍会进行网络节点之间的数据迁移与交换工作,同样的网络会成为MPPDB 水平扩展的瓶颈。TeraData目前最大商用规模大约600节点。

Share-Disk

典型的应用是Oracle RAC,不同于传统的HA架构,ShareDisk架构中的每个节点都是工作节点,独立处理业务。由于是ShareDisk架构,读写磁盘就会出现冲突,会产生大量的存储网络流量,通常存储网络的流量会因为数据库节点规模增加变成瓶颈

OLTP和OLAP 通常部署在两套系统中主要原因是数据库系统追求的高TPS,OLTP追求的是高并发、随机读写,要保持交易十五的ACID 特性,维护强大的数据库日志,目前实现OLTP单点能力(主机平台+高端IO存储)。OLAP追求的是批量操作、高并发读操作,技术上主要解决很好的分配与管理各种资源(即资源的精细化管理)。 关于Join操作,跨表聚合操作,对于OLTP数据库需要大量的IO操作将表数据读取到内存进行操作;而MPP数据库本身就是根据某个键值对数据进行分布式存储,相当于提前为多表Join操作做了很多工作。OLTP通常是通过hash join进行优化,OLAP是通过分布式join。

阅读更多

纵横大数据主要观点

大数据时代企业数据特征

大数据时代企业大数据标为 “大、 广、联”特征,“大”指的是数据量大,“广”指的是数据涉及各类不同胸痛,不同类型大数据,例如:IoT数据、日志数据等,“联”指的是企业内外部数据关联、不同业务部门大数据关联。

数据处理大要求没有变化

大数据时代虽然数据量激增,但是企业对数据处理的要求没有变化,甚至要求更高。主要是要求高可靠、高负载、 低成本

阅读更多

Kubernetes使用ConfigMap配置应用程序(二)

上一篇学习了通过args方式还是env方式都是将配置应用,配置参数硬编码在POD配置文件中,实际应用部署的过程中,我们希望配置参数和POD配置能够解藕,今天我们就看一下如何用ConfigMap配置应用。

创建一个ConfigMap

  • 使用命令行创建
1
kubectl create configmap fortune-configmap --from-literal=sleep-interval=60

创建成功以后可以通过kubectl命令查询configmap的配置。

kubectl get configmap fortune-configmap -o yaml 查询结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
data:
sleep-interval: "60"
kind: ConfigMap
metadata:
creationTimestamp: "2020-09-29T12:29:40Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:sleep-interval: {}
manager: kubectl-create
operation: Update
time: "2020-09-29T12:29:40Z"
name: fortune-configmap
namespace: default
resourceVersion: "2434"
selfLink: /api/v1/namespaces/default/configmaps/fortune-configmap
uid: a6562e65-1431-47b1-b153-e4c270561a2c
  • 使用yaml文件创建

上述查询到信息将metadata中只保留名称就可以创建一个简单的ConfigMap配置文件,使用如下命令即可通过文件创建ConfigMap kubectl create -f fortune-congfigmap.yaml

在POD文件中使用CongfigMap配置应用

  • 使用环境变量配置应用 修改POD配置文件,使用ConfigMap配置env参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
apiVersion: v1
kind: Pod
metadata:
name: fortune-env
labels:
app: fortune-env
spec:
containers:
- name: html-gen
image: 172.17.0.1:5000/fortune:env
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: fortune-configmap
key: sleep-interval
volumeMounts:
- name: html
mountPath: /var/htdocs
- name: log
mountPath: /var/log/fortune
- name: web-server
image: 172.17.0.1:500/nginx:alpine
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
- name: log-server
image: 172.17.0.1:5000/nginx:log
volumeMounts:
- name: log
mountPath: /usr/share/nginx/log
readOnly: true
ports:
- containerPort: 8080
protocol: TCP
volumes:
- name: html
emptyDir: {}
- name: log
emptyDir: {}

重新创建PODkubectl create -f fortune-pod-env.yaml, 此时再查询fortune每个60秒更新一次。实际应用部署时,也可以修改ConfigMap的配置,当新新建POD时会使用新的ConfigMap值。

  • 使用参数配置应用

和使用环境变量配置POD类似,修改POD配置文件,使用ConfigMap配置args参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
apiVersion: v1
kind: Pod
metadata:
name: fortune-args
labels:
app: fortune-args
spec:
containers:
- name: html-gen
image: 172.17.0.1:5000/fortune:args
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: fortune-configmap
key: sleep-interval
args: [$(INTERVAL)]
volumeMounts:
- name: html
mountPath: /var/htdocs
- name: log
mountPath: /var/log/fortune
- name: web-server
image: 172.17.0.1:500/nginx:alpine
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
- name: log-server
image: 172.17.0.1:5000/nginx:log
volumeMounts:
- name: log
mountPath: /usr/share/nginx/log
readOnly: true
ports:
- containerPort: 8080
protocol: TCP
volumes:
- name: html
emptyDir: {}
- name: log
emptyDir: {}

创建PODkubectl create -f fortune-pod-args.yaml, 此时查询fortune每个60秒更新一次。

此时,如果删除旧的ConfigMap,重新配置一个新的ConfigMap,再同时删除frotune-env pod和fortune-args pod并重新新建POD时会使用新的ConfigMap值。

ConfigMap可以配置的资源

从文件、文件夹和字符创建的ConfigMap

Kubernetes使用ConfigMap配置应用程序(一)

传统的应用程序在部署时往往需要通过命令行参数、环境变量、配置文件等方式配置应用程序。Kubernetes应用程序可以通过ConfigMap和Secret来配置应用程序。ConfigMap和Secret的区别主要是Secret用于敏感数据配置,数据在Kubernetes中是加密存储的。

选择ConfigMap和Secret的原则比较简单:

  • 非敏感数据则使用ConfigMap配置;
  • 敏感数据使用Secret配置;
  • 如果既有敏感数据又有非敏感数据则使用Secret配置。

ConfigMap和Secret使用方式类似,这里主要描述ConfigMap的使用方式。

这次还是以fortune应用程序为例,通过ConfigMap向fortune传递参数调整程序刷新的时间间隔。首先我看一下不借助ConfigMap我们如何通过命令参数和环境变量配置应用。

1.使用命令参数配置应用

修改fortune镜像,增加间隔参数

  • 修改fortuneloop.sh,增加间隔参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#! /bin/bash
trap "exit" SIGINT
INTERVAL=$1

mkdir /var/htdocs
mkdir /var/fortune

echo Configured to generate new fortune every $INTERVAL seconds.

while :
do
echo $(date) writing fortune to /var/htdocs/index.html >> /var/log/fortune/$(date +%Y-%m-%d).log
/usr/games/fortune > /var/htdocs/index.html

sleep $INTERVAL
done
  • 修改Dockerfile增加默认参数
1
2
3
4
5
6
FROM ubuntu:latest
RUN apt update ; apt install -y fortune
ADD fortuneloop.sh /bin/fortuneloop.sh

ENTRYPOINT ["/bin/fortuneloop.sh"]
CMD ["10"]

重新制作镜像:docker build -t 172.17.0.1:5000/fortune:args .,并推送本地镜像仓库

  • 本地运行镜像测试
1
2
docker run --name fortune-args -it 172.17.0.1:5000/fortune:args 15
Configured to generate new fortune every 15 seconds.

在POD中使用args覆盖容器参数

  • 修改POD配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: v1
kind: Pod
metadata:
name: fortune
labels:
app: fortune
spec:
containers:
- name: html-gen
image: 172.17.0.1:5000/fortune:args
args: ["30"]
volumeMounts:
- name: html
mountPath: /var/htdocs
- name: log
mountPath: /var/log/fortune
- name: web-server
image: 172.17.0.1:500/nginx:alpine
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
- name: log-server
image: 172.17.0.1:5000/nginx:log
volumeMounts:
- name: log
mountPath: /usr/share/nginx/log
readOnly: true
ports:
- containerPort: 8080
protocol: TCP
volumes:
- name: html
emptyDir: {}
- name: log
emptyDir: {}

这样重新创建POD即可看到应用参数更新成"30"秒。

2.使用环境变量配置应用

修改fortune镜像,增加间隔环境变量

  • 修改fortuneloop.sh,使用INTERVAL代替默认值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/bash
trap "exit" SIGINT
mkdir /var/htdocs
mkdir /var/fortune

echo Configured to generate new fortune every $INTERVAL seconds.

while :
do
echo $(date) writing fortune to /var/htdocs/index.html >> /var/log/fortune/$(date +%Y-%m-%d).log
/usr/games/fortune > /var/htdocs/index.html

sleep $INTERVAL
done
  • 修改Dockerfile增加默认参数
1
2
3
4
5
FROM ubuntu:latest
RUN apt update ; apt install -y fortune
ADD fortuneloop.sh /bin/fortuneloop.sh

ENTRYPOINT ["/bin/fortuneloop.sh"]

重新制作镜像:docker build -t 172.17.0.1:5000/fortune:env .,并推送本地镜像仓库

在POD中使用env覆盖容器参数

  • 修改POD配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: v1
kind: Pod
metadata:
name: fortune
labels:
app: fortune
spec:
containers:
- name: html-gen
image: 172.17.0.1:5000/fortune:env
env:
- name: INTERVAL
value: "45"
volumeMounts:
- name: html
mountPath: /var/htdocs
- name: log
mountPath: /var/log/fortune
- name: web-server
image: 172.17.0.1:500/nginx:alpine
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
- name: log-server
image: 172.17.0.1:5000/nginx:log
volumeMounts:
- name: log
mountPath: /usr/share/nginx/log
readOnly: true
ports:
- containerPort: 8080
protocol: TCP
volumes:
- name: html
emptyDir: {}
- name: log
emptyDir: {}

这样重新创建POD即可看到应用参数更新成"45"秒。

上述两种方式,无论时通过args方式还是env方式都是将配置参数硬编码在POD配置文件中。实际应用部署的过程中,我们希望配置参数和POD配置能够解藕,这个就需要用到Kubernetes提供的ConfigMap来实现。

非暴力沟通读书笔记(二)

非暴力沟通过程中除了报答自己的感受、需要和请求外也许要关注对方,也许要想对自己一样观察、感受对方,了解对方的需求和请求

  • 体会他人对感受和需求
    • 在体会他人的感受和需要是不要基于发表自己对看法、判断和建议等。
  • 给他人反馈
    • 在倾听到他人对感受、需求和请求等需要给予他人反馈,主动表达我们的理解。如果我们理解正确可以帮助对方意识到他们他们要表达对意思;如果我们理解不到位,对方则可以继续补充。
    • 一般来说一个人讲话时如果带有明显对情绪时他一般会期待得到反馈。即使在不善于表达情感的人之间只要用心体会他人对感受都会促进两者之间关系,例如:中年儿子和年迈对父亲之间。
  • 保持关注
    • 我们需要在为他人表达创造条件,确保我们已经充分对观察、感受对方对需求和请求时再给予他人的建议,如果过早给对方建议,没有让对方体会到我们已经真正理解和体会到对方对感受了,对方往往会认为我们建议是敷衍的,或者是否能真正发挥作用。
  • 如果当我们痛苦的无法倾听,这说明我们也许要别人的关心,请大声说出你对感受、需要和请求。

非暴力沟通不是一个沟通对技巧,是发自内心的爱或者真诚的希望改善和周围人关系。

非暴力沟通读书笔记(一)

非暴力沟通中强调合理表达诉求,而不是指责、批评或者抱怨对方对行为。例如:

  • 案例一 > 我很生气,你惹我不高兴了!

    更好一些对表达是: > 你约会迟到了,我很生气。

    但是上述表达中表达了自己对感受,但是指责了对方的行为,需要将指责对方的行为修改为表达自己对诉求: > 我很生气,我希望你约会能按时到,这样我们就有时间一起吃饭,还可以看一场电影。

  • 案例二 > 如果你下次在这样做事情,你不如不做!

    需要将上述对沟通方式调整为表达自己对感受,并说出自己对需求/诉求:

    我很失望,我希望你在涮碗的同时也把餐桌擦干净,这样我就不需要做这些了。

我们的愤怒、不高兴、失望等负面情绪往往是因为我们的期望没有得到满足,在沟通过程中如果只是通过批评、吼叫等行为表达了自己的情绪,而不是通过非暴力对方式表达自己对诉求/需求。在听到不中听对话我们往往会产生以下行为: 1. 认为自己犯了错,而产生自责或这内疚的情绪 2. 指责对方,或者驳斥对方 3. 了解我们对感受和需要 4. 用心体会他人对感受和需要

因此在沟通过程中表达自身对感受和需要,倾听对方对感受和需要开始非暴力对沟通。