文章目录
作者 | 邮箱 | 时间 |
---|---|---|
潘顾昌 | guchang.pan@hand-china.com | 2020/05/05 |
一、分布式Minio快速入门
分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。
1、分布式Minio有什么好处?
在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。
数据保护
分布式Minio采用 erasure code(纠删码)来防范多个节点宕机和位衰减bit rot。
分布式Minio至少需要4个节点,使用分布式Minio自动引入了纠删码功能。
高可用
单机Minio服务存在单点故障,相反,如果是一个N节点的分布式Minio,只要有N/2节点在线,你的数据就是安全的。不过你需要至少有N/2+1个节点 Quorum 来创建新的对象。
例如,一个8节点的Minio集群,每个节点一块盘,就算4个节点宕机,这个集群仍然是可读的,不过你需要5个节点才能写数据。
限制
分布式Minio单租户存在最少4个盘最多16个盘的限制(受限于纠删码)。这种限制确保了Minio的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例。
注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块盘。比如,你可以使用2个节点,每个节点4块盘,也可以使用4个节点,每个节点两块盘,诸如此类。
一致性
Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。
二、Minio分布式集群搭建
生产环境建议最少4节点
节点 | IP | data |
---|---|---|
minio1 | 172.28.8.65 | /data/minio/data |
minio2 | 172.28.8.61 | /data/minio/data |
minio3 | 172.28.8.62 | /data/minio/data |
minio4 | 172.28.8.63 | /data/minio/data |
1、获取Minio
https://dl.min.io/server/minio/release/linux-amd64/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
2、目录创建
mkdir -p /data/minio/{run,data} && mkdir -p /etc/minio
3、集群启动文件
创建/data/minio/run/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=root
export MINIO_SECRET_KEY=12345678
/data/minio/run/minio server --config-dir /etc/minio \
http://172.28.8.65/data/minio/data \
http://172.28.8.61/data/minio/data \
http://172.28.8.62/data/minio/data \
http://172.28.8.63/data/minio/data \
- MINIO_ACCESS_KEY:用户名,长度最小是5个字符
- MINIO_SECRET_KEY:密码,密码不能设置过于简单,不然minio会启动失败,长度最小是8个字符
- –config-dir:指定集群配置文件目录
4、创建服务
创建/usr/lib/systemd/system/minio.service
- WorkingDirectory:二进制文件目录
- ExecStart:指定集群启动脚本
cat > /usr/lib/systemd/system/minio.service <<EOF
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/data/minio/run/
ExecStart=/data/minio/run/run.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
5、二进制文件
将minio二进制文件上传到/data/minio/run目录
6、权限修改
给所有涉及到的文件或目录添加权限
- service文件
- 二进制文件
- 集群启动脚本
chmod +x /usr/lib/systemd/system/minio.service && chmod +x /data/minio/run/minio && chmod +x /data/minio/run/run.sh
7、启动集群
systemctl daemon-reload
systemctl enable minio && systemctl start minio
三、通过nginx代理集群
因为所有的集群节点具有数据一致性,生产环境需要使用Nginx将集群地址进行代理,对外统一入口
1.下载nginx
-
准备环境
yum install gcc-c++ yum install -y pcre pcre-devel yum install -y openssl openssl-devel
-
准备nginx:
下载:# wget http://nginx.org/download/nginx-1.8.1.tar.gz
解压:# tar -zxvf nginx-1.8.1.tar.gz
进入目录:# cd nginx-1.8.1
-
配置nginx:
# ./configure --prefix=/usr/src/nginx --with-http_stub_status_module --with-http_ssl_module
-
编译安装:
# make && make install
-
查看nginx版本:
进入安装目录:# cd /usr/src/nginx/sbin
查看版本:# ./nginx -v
-
设置开机启动
编辑/etc/rc.local:# vim /etc/rc.local
添加一行:/usr/src/nginx/sbin/nginx
,之后,开机会自动启动nginx -
nginx 命令
进入nginx目录:# cd /usr/src/nginx/sbin
启动服务:# ./nginx
停止服务:# ./nginx -s stop
重启服务:# ./nginx -s reopen
重新载入配置文件:# ./nginx -s reload
2.配置负载均衡
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream minio{
server 172.28.8.65:9000;
server 172.28.8.61:9000;
server 172.28.8.62:9000;
server 172.28.8.63:9000;
}
server {
listen 9001;
server_name 172.28.8.111;
location / {
proxy_pass http://minio;
proxy_set_header Host $http_host;
client_max_body_size 1000m;
}
}
}
3.keepalived配置双主热备
! Configuration File for keepalived
global_defs {
notification_email {
guchang.pan@hand-china.com
2660292608@qq.com
}
notification_email_from guchang.pan@hand-china.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYCAT_HA
}
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 52 #路由器标识,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.28.8.111/24
}
}
virtual_server 172.28.8.111 80 {
delay_loop 6
protocol TCP
real_server 172.28.8.65 80 {
notify_down "kill -9 $(cat /var/run/keepalived.pid)"
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}