1. 对象存储
一般来说,我们将存储分为文件存储,块存储和对象存储。
-
文件存储:一般都是POSIX协议的,比如我们操作系统上的XFS,EXT4
-
块存储:一般都是由虚拟化层实现的,有可能是QEMU的driver或者Kernel自带的模块,比如AWS的EBS
-
对象存储:对象存储通常向外提供API接口,系统通过网络向对象存储的接口传输数据。公有云的代表就是AWS的S3,私有云的代表就是MinIO。
需要说明的是Ceph,Ceph既能提供RBD块存储,也能提供CephFS的文件存储,还能提供对象存储RADOS,如果大家购买了红帽的订阅,不妨多花点钱使用Ceph,毕竟花钱的总是比不花钱的好一点。
另外,我们后面要说的k8s的对象存储也会涉及到Ceph,因为我们的Rook就是使用的Ceph。
2. 选择合适的存储类型
官方文档中提供了一些选择,这些选择目前有Beta的,也有Stable的。如果在公有云环境,我建议大家使用公有云提供的对象存储,真的是又便宜又好用。我们这里用的MinIO是目前比较流行的私有云S3,他完全遵循S3协议,管理和使用方式和S3也基本相同。
2.1. 安装MinIO
下载MinIO服务器
wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio #中国区
wget https://dl.min.io/server/minio/release/linux-amd64/minio # 国际区
mv minio /usr/local/sbin && chmod +x /usr/local/sbin/minio
下载MinIO客户端
wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc #中国区
wget https://dl.min.io/client/mc/release/linux-amd64/mc #国际区
mv mc /usr/local/sbin && chmod +x /usr/local/sbin/mc
2.2. 配置
初始化需要的目录
mkdir -p /app/minio/data && mkdir /etc/minio && mkdir /app/minio/run
四台机器配置一样 /etc/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/app/minio/run/
EnvironmentFile=/etc/minio/minio.pw
ExecStart=/usr/local/sbin/minio server \
--config-dir /etc/minio \
--address :9000 \
--console-address :9001 \
http://10.0.1.11:9000/app/minio/data \
http://10.0.1.12:9000/app/minio/data \
http://10.0.1.13:9000/app/minio/data \
http://10.0.1.14:9000/app/minio/data
Restart=on-failure
RestartSec=5
LimitNOFILE=20480000
[Install]
WantedBy=multi-user.target
而minio.pw里面写上初始的密码
MINIO_ACCESS_KEY=Minio
MINIO_SECRET_KEY=Passw0rd
2.3. 创建账户
在下载页面还有一个下载链接,是下载mc的,这个就是minio的客户端,我们可以不用把客户端装在服务器上,可以装在笔记本上。下载完成后是一个文件,给一个执行权限
chmod +x mc
mc和aws-cli类似,权限控制也是由profile控制的,只不过在minio中,他叫config
mc config host list
我们先添加一个host
mc config host add monitor http://localhost:9001 Minio
mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/root/.mc/share`.
mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
Enter Secret Key:
Added `monitor` successfully.
这样就可以看到内容了
2.4. policy
和s3的权限控制类似,minio的用户也是通过policy来控制的,而写法也基本相同,都是json格式的,下面的例子是一个拥有所有权限的例子,all.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ // 可以做出的行动(权限)
"s3:ListAllMyBuckets", // 查看所有的“桶”列表
"s3:ListBucket", // 查看桶内的对象列表
"s3:GetBucketLocation",
"s3:GetObject", // 下载对象
"s3:PutObject", // 上传对象
"s3:DeleteObject" // 删除对象
],
"Resource": [
"arn:aws:s3:::*" // (应用到的资源,*表示所有,也可以用路径来控制范围。arn:aws:s3是命名空间)
]
}
]
}
把这个policy添加到刚才的集群monitor当中
mc admin policy add monitor all all.json
Added policy `all` successfully.
2.5. 用户
添加用户并且给密码
mc admin user add monitor thanos Passw0rd
Added user `thanos` successfully.
把我们刚才的policy赋给用户UserName
mc admin policy set monitor all user=thanos
Policy all is set on user `thanos`
2.4. nginx
增加minio的控制台配置
server {
listen 9000;
server_name 10.0.0.11;
location / {
proxy_pass http://minio;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
upstream minio {
server 10.0.1.11:9000;
server 10.0.1.12:9000;
server 10.0.1.13:9000;
server 10.0.1.14:9000;
}
server {
listen 9001;
server_name 10.0.0.11;
location / {
proxy_pass http://minio-console;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
upstream minio-console {
server 10.0.1.11:9001;
server 10.0.1.12:9001;
server 10.0.1.13:9001;
server 10.0.1.14:9001;
}
3. Thanos Store
-
准备目录
mkdir -p /app/thanos/store mkdir /etc/thanos
-
systemd文件/etc/systemd/system/thanos-store.service
[Unit] Description=thanos-store Documentation=https://thanos.io/ After=network.target [Service] Type=simple ExecStart=/usr/local/sbin/thanos store \ --data-dir=/app/thanos/store \ --objstore.config-file=/etc/thanos/thanos-minio.yml \ --http-address=0.0.0.0:10905 \ --grpc-address=0.0.0.0:10906 \ --block-sync-concurrency=200 \ --store.grpc.series-max-concurrency=200 \ --chunk-pool-size=8GB \ --max-time=30d ExecReload=/bin/kill -HUP TimeoutStopSec=20s Restart=always LimitNOFILE=20480000 [Install] WantedBy=multi-user.target
-
对象存储配置文件/etc/thanos/thanos-minio.yml
type: S3 config: bucket: "thanos" endpoint: "10.0.1.11:9000" access_key: "thanos" insecure: true secret_key: "Passw0rd" http_config: idle_conn_timeout: 5m response_header_timeout: 10m insecure_skip_verify: true
-
启动服务
systemctl start thanos-store
4. Thanos compact
compact的作用就是定期把历史数据存入对象存储,其实他就像是一个cronjob,如果发现满足了条件,就会对对象存储中的数据进行整理
- 初始化
mkdir /app/thanos/compact
- systemd配置:/etc/systemd/system/thanos-compact.service
[Unit]
Description=thanos-compact
Documentation=https://thanos.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/thanos compact \
--data-dir=/app/thanos/compact \
--objstore.config-file=/etc/thanos/thanos-minio.yml \
--http-address=0.0.0.0:10912 \
--wait \
--block-sync-concurrency=30 \
--compact.concurrency=6
ExecReload=/bin/kill -HUP
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
5. Thanos sidecar
配置好之后,我们会发现对象存储里面并没有任何数据,官方文档中说
Compactor, Sidecar, Receive and Ruler are the only Thanos components which should have a write access to object storage, with only Compactor being able to delete data.
所以我们修改一下sidecar配置,/etc/systemd/system/thanos-sidecar.service
[Unit]
Description=thanos-sidecar
Documentation=https://thanos.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/thanos sidecar \
--tsdb.path=/app/prometheus \
--prometheus.url=http://localhost:9090 \
--http-address=0.0.0.0:10901 \
--grpc-address=0.0.0.0:10902 \
--objstore.config-file=/etc/thanos/thanos-minio.yml
ExecReload=/bin/kill -HUP
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
6. thanos-query
修改query的配置文件,增加query对象存储的选项,/etc/systemd/system/thanos-query.service
[Unit]
Description=thanos-query
Documentation=https://thanos.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/thanos query \
--http-address=0.0.0.0:10903 \
--grpc-address=0.0.0.0:10904 \
--store=10.0.1.11:10902 \
--store=10.0.1.12:10902 \
--store=10.0.1.11:10906 \
--store=10.0.1.12:10906 \
--query.timeout=10m \
--query.max-concurrent=200 \
--query.max-concurrent-select=40 \
--query.replica-label=replica
ExecReload=/bin/kill -HUP
TimeoutStopSec=20s
Restart=always
LimitNOFILE=20480000
[Install]
WantedBy=multi-user.targe