0%

minio单机及集群部署

minio提供对象存储,支持单节点部署及集群部署;集群部署模式下最少4节点,集群需要至少N/2节点在线才可读,至少N/2+1节点在线才可写——准确的说,至少需要4块“盘”,两个节点每个节点两块“盘”也是可行的

以下记录centos 7下的minio单机及集群部署,最初只记录了minio单节点部署,现在进行了完善,替换为minio新版本,通过配置文件的方式自动识别按单机模式或者集群模式启动

部署准备

服务器配置

  • 部署minio的所有主机配置时间同步,保持时间一致,否则minio集群无法启动
  • 视情况进行磁盘挂载,文件系统参数、ulimit参数调整等

minio安装

准备minio rpm包,minio版本更新很快,选用minio-20210817205308.0.0.x86_64.rpm,在所有minio所在主机安装:

1
2
3
4
5
# 安装minio包
rpm -ivh --nodeps minio-20210817205308.0.0.x86_64.rpm
# 添加minio软链
ln -s /usr/local/bin/minio /usr/bin/minio
minio -v

创建minio用户及用户目录

1
2
3
4
5
6
7
8
9
10
11
useradd minio
su - minio
cd ~
mkdir minio-server
cd minio-server
# minio启停脚本路径
mkdir bin
# minio配置文件路径
mkdir conf
# minio日志文件路径
mkdir logs

创建minio数据路径,这里将数据存储到了数据盘挂载点/data下

1
2
3
4
cd /data
mkdir minio_data
chown minio:minio -R minio_data
chmod -R 750 minio_data

nginx部署

部署nginx代理minio,一部分是上传文件到minio的代理,一部分是minio文件外链的代理

nginx部署可参考此脚本

minio集群模式部署

minio单节点standlone模式部署过程与集群模式下单节点部署只最终的启动命令不同,这里不进行演示。本文将给出一个启动脚本,根据conf/路径下配置文件内容,自动判断单节点启动OR集群模式启动

服务器IP为:

  • 192.168.1.1
  • 192.168.1.2
  • 192.168.1.3
  • 192.168.1.4

conf/下添加minio.conf文件,完整的配置文件示例为:

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

# minio控制台root用户名,所有minio节点使用相同的用户名和密码
# 非必填,默认为minio
MINIO_ROOT_USER=minio
# minio控制台root用户密码,所有minio节点使用相同的用户名和密码
# 非必填,默认为Minio!2023
MINIO_ROOT_PASSWORD=Minio!2023

# 是否使用集群模式部署,1-集群模式 0-单机模式
MINIO_CLUSTER_MODE=1

# 单机模式相关配置,集群模式将忽略
# 单机模式下,minio存储服务端口
# 非必填,默认为9210
MINIO_SERVER_PORT=9210
# 单机模式下,minio控制台服务端口
# 非必填,默认为9211
MINIO_CONSOLE_PORT=9211
# 单机模式下,minios数据目录
# 非必填,默认为 {MINIO_HOME}/data
MINIO_DATA_PATH=/home/minio/minio-server/data

# 集群相关配置,单机模式下将忽略
# 集群节点列表
# 节点地址,格式为: MINIO_CLUSTER_NODE[节点ID]=节点ip:节点server端口:节点console端口:节点data路径
# 约定节点ID为不重复的、递增的、连续的正整数,1,2,3,4....
MINIO_CLUSTER_NODE[1]=192.168.1.1:9210:9211:/data/minio_data
MINIO_CLUSTER_NODE[2]=192.168.1.2:9210:9211:/data/minio_data
MINIO_CLUSTER_NODE[3]=192.168.1.3:9210:9211:/data/minio_data
MINIO_CLUSTER_NODE[4]=192.168.1.4:9210:9211:/data/minio_data
# 当前节点的ID
MINIO_CLUSTER_NODE_ID=1

添加启动脚本bin/start_up.sh,使用minio用户执行此脚本即将按照文件配置启动minio节点

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# minio部署路径,默认为minio用户目录下minio-server下
MINIO_HOME='/home/minio/minio-server'

if [ ! -d ${MINIO_HOME} ]
then
echo "ERROR! path ${MINIO_HOME} not found!"
exit 1
fi

echo "minio home path is: ${MINIO_HOME}"

MINIO_CONFIG_DIR=${MINIO_HOME}'/conf'
if [ ! -d ${MINIO_CONFIG_DIR} ]
then
mkdir -p ${MINIO_CONFIG_DIR}
fi


MINIO_LOG_PATH=${MINIO_HOME}'/logs'
if [ ! -d ${MINIO_LOG_PATH} ]
then
mkdir -p ${MINIO_LOG_PATH}
fi

# 读取minio配置文件
if [ -f ${MINIO_CONFIG_DIR}'/minio.conf' ]
then
. ${MINIO_CONFIG_DIR}'/minio.conf'
fi

# 读取minio控制台root用户账号
if [ 'X'${MINIO_ROOT_USER} == 'X' ]
then
MINIO_ROOT_USER=minio
fi
# 读取minio控制台root用户密码
if [ 'X'${MINIO_ROOT_PASSWORD} == 'X' ]
then
MINIO_ROOT_PASSWORD=Minio!2023
fi
export MINIO_ROOT_USER=${MINIO_ROOT_USER}
export MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}


if [ 'X'${MINIO_CLUSTER_MODE} == 'X' ]
then
echo "ERROR! MINIO_CLUSTER_MODE should be 0(standlone mode) or 1(cluster mode) !"
exit 1
fi


if [ ${MINIO_CLUSTER_MODE} -eq 0 ]
then
if [ 'X'${MINIO_SERVER_PORT} == 'X' ]
then
MINIO_SERVER_PORT=9210
fi

if [ 'X'${MINIO_CONSOLE_PORT} == 'X' ]
then
MINIO_CONSOLE_PORT=9211
fi

# 读取minio data路径
if [ 'X'${MINIO_DATA_PATH} == 'X' ]
then
MINIO_DATA_PATH=${MINIO_HOME}'/data'
fi
if [ ! -d ${MINIO_DATA_PATH} ]
then
mkdir -p ${MINIO_DATA_PATH}
fi
chown minio:minio -R ${MINIO_DATA_PATH}
chmod -R 750 ${MINIO_DATA_PATH}

# 启动minio-server
nohup minio server --address ":${MINIO_SERVER_PORT}" --console-address ":${MINIO_CONSOLE_PORT}" ${MINIO_DATA_PATH} > ${MINIO_LOG_PATH}'/log' 2>&1 &

echo "minio started on port: ${MINIO_SERVER_PORT}, console port: ${MINIO_CONSOLE_PORT}"
exit 0
fi

if [ ${MINIO_CLUSTER_MODE} -ne 0 ]
then
# 读取当前节点ID
if [ 'X'${MINIO_CLUSTER_NODE_ID} == 'X' ]
then
echo "ERROR! must set MINIO_CLUSTER_NODE_ID when use cluster mode"
exit 1
fi
# 读取、拼接所有节点的data路径
MINIO_DATA_PATH=''
config_file=${MINIO_CONFIG_DIR}'/minio.conf'
nodes_cnt=`cat $config_file | grep -v '#' | grep -F 'MINIO_CLUSTER_NODE[' | wc -l`
for i in `seq 1 $nodes_cnt`
do
node=${MINIO_CLUSTER_NODE[$i]}
MINIO_DATA_PATH=${MINIO_DATA_PATH}' '`echo $node | awk -F':' '{print "http://"$1$4}'`
node_id=`echo $node | awk -F':' '{print "http://"$1$4}'`
done

MINIO_SERVER_PORT=`echo ${MINIO_CLUSTER_NODE[$MINIO_CLUSTER_NODE_ID]} | awk -F':' '{print $2}'`
MINIO_CONSOLE_PORT=`echo ${MINIO_CLUSTER_NODE[$MINIO_CLUSTER_NODE_ID]} | awk -F':' '{print $3}'`

nohup minio server --address ":${MINIO_SERVER_PORT}" --console-address ":${MINIO_CONSOLE_PORT}" ${MINIO_DATA_PATH} > ${MINIO_LOG_PATH}'/log' 2>&1 &

echo "minio started on port: ${MINIO_SERVER_PORT}, console port: ${MINIO_CONSOLE_PORT}"
exit 0
fi

添加stop.sh用于停止节点:

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
# minio部署路径,默认为minio用户目录下minio-server下
MINIO_HOME='/home/minio/minio-server'

if [ ! -d ${MINIO_HOME} ]
then
echo "ERROR! path ${MINIO_HOME} not found!"
exit 1
fi

MINIO_CONFIG_DIR=${MINIO_HOME}'/conf'
if [ ! -d ${MINIO_CONFIG_DIR} ]
then
mkdir -p ${MINIO_CONFIG_DIR}
fi

# 读取minio配置文件
if [ -f ${MINIO_CONFIG_DIR}'/minio.conf' ]
then
. ${MINIO_CONFIG_DIR}'/minio.conf'
if [ ${MINIO_CLUSTER_MODE} -ne 0 ]
then
# 读取当前节点ID
if [ 'X'${MINIO_CLUSTER_NODE_ID} == 'X' ]
then
echo "ERROR! must set MINIO_CLUSTER_NODE_ID when use cluster mode"
exit 1
fi
MINIO_SERVER_PORT=`echo ${MINIO_CLUSTER_NODE[$MINIO_CLUSTER_NODE_ID]} | awk -F':' '{print $2}'`
fi
lsof -i :${MINIO_SERVER_PORT} | grep minio | awk '{print $2}' | xargs kill -9
echo "minio process with server port ${MINIO_SERVER_PORT} killed"
else
echo "ERROR! config file not found!"
exit 1
fi

部署完成后执行start_up.sh即可启动节点,访问http://:即可访问控制台

nginx转发配置

使用nginx代理minio:

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
47
48
49
50
51
52

# nginx用作反向代理,设置request body size,避免大文件上传失败(413)
client_body_buffer_size 1024K;
client_header_buffer_size 1024K;
client_max_body_size 512m;
large_client_header_buffers 4 256k;

# minio存储服务server地址
upstream minio_server {
server 192.168.1.1:9210;
server 192.168.1.2:9210;
server 192.168.1.3:9210;
server 192.168.1.4:9210;
}
# minio控制台服务server地址
upstream minio_console {
server 192.168.1.1:9211;
server 192.168.1.2:9211;
server 192.168.1.3:9211;
server 192.168.1.4:9211;
}

# minio文件静态链接代理
server {
listen 80;
server_name oss.example.connorma.cn;

# minio examplebucket桶 静态文件转发
location /examplebucket/ {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio_server;
# 视情况设置expires
expires 0;
}
}

# minio上传文件代理
server {
listen 80;
server_name oss-upload.example.connorma.cn;

# oss 文件操作服务代理
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio_server;
}
}

客户端即可使用oss-upload.example.connorma.cn操作minio文件,可使用oss.example.connorma.cn访问文件外链