源码编译安装使用glusterfs+heketi安装使用
注:使用源码安装的原因主要是使用yum安装glusterfs服务端时出现一些依赖库问题
- 准备3台glusterfs服务器(官方也建议至少3台,防止发生脑裂),并在各个服务器的/etc/hosts下面添加如下内容(如使用DNS服务器,则在DNS中添加域名解析)
10.85.3.113 glusterfs-.example.com
10.85.3.114 glusterfs-.example.com
10.85.3.115 glusterfs-.example.com
- 参照官方文档Build and Install GlusterFS安装依赖库
# yum install autoconf automake bison cmockery2-devel dos2unix flex fuse-devel glib2-devel libacl-devel libaio-devel libattr-devel libcurl-devel libibverbs-devel librdmacm-devel libtirpc-devel libtool libxml2-devel lvm2-devel make openssl-devel pkgconfig pyliblzma python-devel python-eventlet python-netifaces python-paste-deploy python-simplejson python-sphinx python-webob pyxattr readline-devel rpm-build sqlite-devel systemtap-sdt-devel tar userspace-rcu-devel
- 下载userspace-rcu-master并解压到/home/userspace-rcu-master
- 下载glusterfs-xlators/master并解压到/home/glusterfs-xlators-master
- 编译userspace-rcu
# cd userspace-rcu-master
# ./bootstrap
# ./configure
# make && make install
# ldconfig
- 下载glusterfs源码并解压到/home/glusterfs-5.7,本次版本为5.7
- 将glusterfs的lib拷贝到系统目录(编译gluster的时候会用到)
# cd /home/glusterfs-5.7
# cp -r libglusterfs/src /usr/local/include/glusterfs
- 安装依赖库uuid,yum install -y libuuid-devel
- 拷贝glupy(编译gluster的时候会用到)
# cp -r /home/glusterfs-xlators-master/xlators/features/glupy/ /home/glusterfs-5.7/xlators/features/
- 按照官方文档编译安装glusterfs
# cd /home/glusterfs-5.7
# ./autogen.sh
# ./configure --without-libtirpc
# ./configure --enable-gnfs
# make
# make install
在make的时候可能会遇到如下错误
../../../../contrib/userspace-rcu/rculist-extra.h::: error: redefinition of 'cds_list_add_tail_rcu'
void cds_list_add_tail_rcu(struct cds_list_head *newp,
^
In file included from glusterd-rcu.h::,
from glusterd-sm.h:,
from glusterd.h:,
from glusterd.c::
/usr/local/include/urcu/rculist.h::: note: previous definition of 'cds_list_add_tail_rcu' was here
void cds_list_add_tail_rcu(struct cds_list_head *newp,
给下述文件的cds_list_add_tail_rcu函数加上条件编译即可
/usr/local/include/urcu/rculist.h
/home/glusterfs-5.7/contrib/userspace-rcu/rculist-extra.h
#ifndef CDS_LIST_ADD_TAIL_CRU
#define CDS_LIST_ADD_TAIL_CRU
static inline
void cds_list_add_tail_rcu(struct cds_list_head *newp,
struct cds_list_head *head)
{
newp->next = head;
newp->prev = head->prev;
rcu_assign_pointer(head->prev->next, newp);
head->prev = newp;
}
#endif
- 在3台服务器执行如下命令,使用devicemapper
mkdir -p /data/brick
chown -R root: /data
chmod -R /data
vgcreate vgglusterfs /dev/vdb
lvcreate -L 499G -n glusterfs vgglusterfs
mkfs.xfs /dev/mapper/vgglusterfs-glusterfs
#/etc/fstab中添加:/dev/mapper/vgglusterfs-glusterfs /data/brick xfs defaults
mount -a
- 在3台服务器执行如下命令,设置开机启动并启动glusterfs
systemctl enable glusterd.service
使用如下命令查看生成的gluster.service的路径,本系统为:/usr/local/lib/systemd/system/glusterd.service
systemctl cat glusterd.service
/usr/local/lib/systemd/system/glusterd.service的内容如下
[Unit]
Description=GlusterFS, a clustered file-system server
Requires=rpcbind.service
After=network.target rpcbind.service
Before=network-online.target [Service]
Type=forking
PIDFile=/var/run/glusterd.pid
LimitNOFILE=
Environment="LOG_LEVEL=INFO"
ExecStart=/usr/local/sbin/glusterd -p /var/run/glusterd.pid --log-level $LOG_LEVEL $GLUSTERD_OPTIONS
KillMode=process
SuccessExitStatus= [Install]
WantedBy=multi-user.target
执行如下命令启动
systemctl daemon-reload
systemctl start glusterd.service
如果遇到“Failed to restart glusterd.service: Unit not found”错误,可能是rpcbind.service没有安装,执行yum install -y rpcbind安装即可
遇到“Failed to start GlusterFS, a clustered file-system server”错误,可以尝试如下方式:
- 可能本机已经启动glusterfs服务,找到进程,kill掉
- glusterd配置错误,找到glusterd.vol文件,并修改“working-directory” 为glusterd.vol所在的路径。如本机的glusterd.vol路径为/usr/local/etc/glusterfs/glusterd.vol,则glusterd.vol中的working-directory一行设置为“working-directory /usr/local/etc/glusterfs"
- 在master1上执行如下命令,添加对端
# gluster peer probe glusterfs-1.example.com
# gluster peer probe glusterfs-2.example.com
# gluster peer probe glusterfs-3.example.com
# gluster peer status
- 在master1上创建并启动volume,大小为5G
gluster volume create volume-5G replica glusterfs-.example.com:/data/brick/glusterfs1 glusterfs-.example.com:/data/brick/glusterfs2 glusterfs-.example.com:/data/brick/glusterfs3
gluster volume start volume-5G
使用如下命令查看volume
gluster volume status
gluster volume info
容器环境下推荐Replicated 模式,更多信息参见官方文档,注意部分模式已经废弃
- 在客户端机器上安装glusterfs客户端
# yum install glusterfs-client -y
- 在客户端挂载服务端volume,第一种方式为采用nfs挂载,第二种采用glusterfs命令行挂载,效果一样
mount -t glusterfs glusterfs-.example.com:/volume-5G /data/mounttest/
glusterfs --volfile-id=volume-5G --volfile-server=glusterfs-.example.com /data/glusterfsclient
- 需要注意的是存在多个glusterfs服务器时,client挂载glusterfs服务器的目录时并不需要对其进行负载均衡,只要挂载其中一台glusterfs的服务器的目录即可。本例中的client为:10.85.3.111,服务端为:10.85.3.113~10.85.3.115,client仅挂载了10.85.3.113的目录,但在client的tcp链接上可以看到如下链接状态(已删除无关信息),即client其实与3个服务端都建立了链接,即使一个服务器宕机或删除任何一个服务器的brick都不会影响其他两台服务器的数据存储。客户端挂载仅用于初始化拓扑。更多参见StackOverflow
# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 10.85.3.111: 10.85.3.115: ESTABLISHED /glusterfs
tcp 10.85.3.111: 10.85.3.113: ESTABLISHED /glusterfs
tcp 10.85.3.111: 10.85.3.113: ESTABLISHED /glusterfs
tcp 10.85.3.111: 10.85.3.114: ESTABLISHED /glusterfs
TIPS:
- gluster命令行可以参见官方文档和man命令
- 在执行”gluster delete volume $volume_name“命令后再添加时可能会出现如"Error: /data/brick/glusterfs1 is already part of a volume"的错误,使用如下方式清理环境即可
# rm -rf /data/brick/glusterfs1/*
# setfattr -x trusted.glusterfs.volume-id /data/brick/glusterfs1/
# 开启 指定 volume 的配额
$ gluster volume quota k8s-volume enable # 限制 指定 volume 的配额
$ gluster volume quota k8s-volume limit-usage / 1TB # 设置 cache 大小, 默认32MB
$ gluster volume set k8s-volume performance.cache-size 4GB # 设置 io 线程, 太大会导致进程崩溃
$ gluster volume set k8s-volume performance.io-thread-count # 设置 网络检测时间, 默认42s
$ gluster volume set k8s-volume network.ping-timeout # 设置 写缓冲区的大小, 默认1M
$ gluster volume set k8s-volume performance.write-behind-window-size 1024MB
- gluster brick的删除和添加,使用remove-brick时需要指定副本数,remove-brick无法删除所有的副本。如需要可以使用gluster volume delete命令
volume remove-brick <VOLNAME> [replica <COUNT>] <BRICK> ... <start|stop|status|commit|force>
volume add-brick <VOLNAME> [<stripe|replica> <COUNT> [arbiter <COUNT>]] <NEW-BRICK> ... [force]
- 磁盘测试
下载fio,解压后执行“make & make install”即可。可能需要执行"yum install libaio-devel"
- glusterfs的监控
在一台服务器上下载并执行“make build”编译gluster_exporter,直接使用./gluster_exporter启动即可。(为保证node节点有效性,最好在每台服务器上安装node_exporter)。使用如下方式可以简单启动一个exporter,监听端口默认是9189
nohup gluster_exporter --web.telemetry-path="/usr/local/sbin/gluster" >& &
在Prometheus中添加新job,即可使用Prometheus监控glusterfs
- job_name: glusterfs1
static_configs:
- targets: ['10.85.3.113:9189']
labels:
alias: glusterfs1
- glusterfs默认日志路径为:/var/log/glusterfs/glusterfs.log
- glusterfs client挂载磁盘时必须指定域名
- client去挂载目录删除对应挂载的进程即可,使用ps -ef|grep glusterfs查看
- 使用glusterfs时建议设置目录权组为65534,权限设置为775,并在挂载的进程上加上Supplement group为65534
- 使用gluster volume status [all | <VOLNAME> [nfs|shd|<BRICK>|quotad|tierd]] [detail|clients|mem|inode|fd|callpool|tasks|client-list]可以查看相关的volume信息,如gluster volume status
VOLNAME
clients可以查看volume的client信息
目前kubernetes使用glusterfs storageclass时需要用到heketi,下面讲解heketi的部署
在官网下载heketi压缩包heketi-vx.x.x.linux.amd64.tar.gz,可以按照官网文档进行安装部署,虚机部署方式如下:
- 创建目录:
mkdir /etc/heketi/
mkdir /var/lib/heketi/
- 将压缩包中的heketi.json拷贝到/etc/heketi/路径下,修改heketi.json文件,使用ssh作为与glusterfs通信方式,主要修改内容如下(如有需要,请修改port)
"executor": "ssh", "_sshexec_comment": "SSH username and private key file information",
"sshexec": {
"keyfile": "/etc/heketi/heketi_key",
"user": "root",
"port": "22",
"fstab": "Optional: Specify fstab file on node. Default is /etc/fstab",
"pv_data_alignment": "Optional: Specify PV data alignment size. Default is 256K",
"vg_physicalextentsize": "Optional: Specify VG physical extent size. Default is 4MB",
"lv_chunksize": "Optional: Specify LV chunksize. Default is 256K",
"backup_lvm_metadata": false,
"_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",
"debug_umount_failures": true
},
- 添加授权,使用如下方式生成密钥,
ssh-keygen -t rsa -q -f /etc/heketi/heketi_key -N ''
chmod 775 /etc/heketi/heketi_key
在所有gluasterfs服务器上为heketi添加ssh互信
cat heketi_key.pub >> /root/.ssh/authorized_keys
- 创建systemd启动文件:/usr/lib/systemd/system/heketi.service,内容如下
[Unit]
Description=Heketi Server [Service]
Type=simple
WorkingDirectory=/var/lib/heketi
EnvironmentFile=-/etc/heketi/heketi.json
User=heketi
ExecStart=/usr/bin/heketi --config=/etc/heketi/heketi.json
Restart=on-failure
StandardOutput=syslog
StandardError=syslog [Install]
WantedBy=multi-user.target
并在/etc/systemd/system/multi-user.target.wants中创建软连接
ln -s /usr/lib/systemd/system/heketi.service heketi.service
加载并启动heketi
systemctl daemon-reload
systemctl enable heketi
systemctl start heketi
如果启动时出现如下错误,可在/etc/heketi/heketi.json中删除对应的行即可,如出现如下错误,删除"xfs_sw"对应的行,使用默认值即可。(建议配置或删除所有“Optional”的行)
ERROR: Unable to parse configuration: json: cannot unmarshal string into Go struct field KubeConfig.xfs_sw of type int
- 执行如下命令,加载拓扑文件
$ export HEKETI_CLI_SERVER=http://<heketi server and port>
$ heketi-cli topology load --json=<topology>
拓扑文件内容如下,需要注意的是,heketi只能使用裸磁盘,不能使用文件系统以及lvm
{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"10.85.3.113"
],
"storage": [
"10.85.3.113"
]
},
"zone":
},
"devices": [
{
"name": "/dev/vdb",
"destroydata": false
}
]
},
{
"node": {
"hostnames": {
"manage": [
"10.85.3.114"
],
"storage": [
"10.85.3.114"
]
},
"zone":
},
"devices": [
{
"name": "/dev/vdb",
"destroydata": false
}
]
},
{
"node": {
"hostnames": {
"manage": [
"10.85.3.115"
],
"storage": [
"10.85.3.115"
]
},
"zone":
},
"devices": [
{
"name": "/dev/vdb",
"destroydata": false
}
]
}
]
}
]
}
- 使用如下命令创建一个10Gb的volume
heketi-cli volume create --size=10 --name="test"
可以看到新创建的volume
# heketi-cli volume list
Id:0a0e0fd1f81973044bb0365e44c08648 Cluster:b988c638edcef9b5b44e0e42ccef30b7 Name:tes
在glusterfs上查看可以看到heketi其实也是使用了devicemapper
# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/vg_c17870f6f2870ff1c8001ad19b3b9d5b-brick_e3e02d5357b540ce340ec5328fe8b0ec 10G 33M 10G % /var/lib/heketi/mounts/vg_c17870f6f2870ff1c8001ad19b3b9d5b/brick_e3e02d5357b540ce340ec5328fe8b0ec
当然此时也可以使用gluster命令查看volume
# gluster volume list
test
heketi命令行一般如下
export HEKETI_CLI_SERVER=http://<heketi server and port>
heketi-cli cluster list
heketi-cli cluster info $ID
heketi-cli node list
heketi-cli node info $ID
heketi-cli topology info
heketi-cli volume create --size= //10G
heketi-cli volume delete $ID
heketi-cli device disable $ID
keheti-cli device remove $ID
heketi-cli device delete $ID
注意:使用heketi管理volume后,仅使用heketi,不能glusterfs和heketi混用
- openshift使用heketi做动态pvc的方式如下
首先创建storageclass
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: glusterfs
namespace: demo
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://10.86.3.113:18080"
restuser: "root"
restauthenabled: "false"
然后创建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: glusterfs-test
namespace: demo
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 30Gi
storageClassName: glusterfs
需要注意的是如果heketi topology文件中使用了域名,则该域名必须能够被kubernetes解析,否则会失败
TIPS:
- heketi删除node之前需要移除该node的device和volume
- openshift 3.6中在配置pvc的时候可能会出现如下问题,在出现错误时没有给出错误信息,内容为nil。该问题为3.6版本的bug,建议升级
Failed to provision volume with StorageClass "glusterfs": glusterfs: create volume err: failed to create endpoint/service <nil>
- 如果删除heketi出现问题,可以手动清理环境,执行如下操作
systemctl stop heketi //在所有glusterfs服务器上执行如下操作
umount /var/lib/heketi/mounts/vg_xxxxxxx/brick_xxxx
rm -rf /var/lib/heketi/*
删除heketi创建的lv和vg
参考:
https://www.cnblogs.com/jicki/p/5801712.html
https://www.ibm.com/developerworks/cn/opensource/os-cn-glusterfs-docker-volume/index.html
https://jimmysong.io/kubernetes-handbook/practice/using-glusterfs-for-persistent-storage.html
https://pdf.us/2019/03/15/3020.html
https://github.com/psyhomb/heketi
https://github.com/heketi/heketi/blob/master/docs/admin/volume.md
源码编译安装使用glusterfs+heketi安装使用的更多相关文章
- SSH/SSL 源码编译安装简易操作说明
环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...
- 源码编译安装 MySQL 5.5.x 实践
1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...
- Linux 安装node.js ---- 源码编译的方式
一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-release 2.检查 gcc.gcc-c++ 是否安装过 命令: rpm -q gcc rp ...
- 烂泥:mysql5.5数据库cmake源码编译安装
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前也写过一篇有关mysql5.0源码编译的文章,该文章为<烂泥:mysql5.0数据库源码编译安装>.但是MySQL自5.5版本以后,就开 ...
- Centos7.X 源码编译安装subversion svn1.8.x
说明:SVN(subversion)的运行方式有两种:一种是基于Apache的http.https网页访问形式:还有一种是基于svnserve的独立服务器模式.SVN的数据存储方式也有两种:一种是在B ...
- centos6.5环境源码编译安装mysql5.6.34
centos6.5环境源码编译安装mysql5.6.34 源码下载地址http://dev.mysql.com/downloads/mysql/5.6.html#downloads 选择Generic ...
- centos 6.5源码编译安装subversion 1.8.10
一.简介 CentOS 6.5的yum源可以安装的SVN客户端版本太低了,1.6.11,所以需要升级到1.8.10,而官网有没有找到1.8.10的安装包,只能选择源码编译安装. 二.安装步骤 参考官网 ...
- Linux环境PostgreSQL源码编译安装
Linux环境PostgreSQL源码编译安装 Linux版本: Red Hat 6.4 PostgreSQL版本: postgresql-9.3.2.tar.gz 数据存放目录: /var/post ...
- 源码编译安装LAMP环境及配置基于域名访问的多虚拟主机
实验环境及软件版本: CentOS版本: 6.6(2.6.32.-504.el6.x86_64) apache版本: apache2.2.27 mysql版本: Mysql-5.6.23 php版本 ...
随机推荐
- c#打开颜色对话框
用button时间 调出颜色对话框来: private void btnForeColor_Click(object sender, EventArgs e) { ...
- JavaWeb 发送邮件
我们可以使用第三方的邮箱服务器来发送邮件. 常用的邮件传输协议有2种:POP3/SMTP.IMAP/SMTP. POP和IMAP的区别:在邮箱客户端的操作,比如移动邮件.标记已读,如果使用POP,是不 ...
- FTP服务搭建配置笔记
1.什么是文件共享服务? 简单来说就是文件域存储块设备可以共享给他人使用. 1.1 实现文件共享服务的三种方式 FTP:属于应用层服务,可以跨平台使用 NFS:属于内核模式,不可以跨平台使用 Samb ...
- Centos7 samba配置
目录 免密码只读 加密码可读写 Samba配置了很多次,总是忘,现在写在博客里. 免密码只读 最主要的是免密配置,主要用到了两个配置,要写在[global]里: map to guest = Bad ...
- TF-IDF算法介绍及实现
目录 1.TF-IDF算法介绍 (1)TF是词频(Term Frequency) (2) IDF是逆向文件频率(Inverse Document Frequency) (3)TF-IDF实际上是:TF ...
- LOJ 2249: 洛谷 P2305: bzoj 3672: 「NOI2014」购票
题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...
- mysql常用操作(测试必备)
现在互联网的主流关系型数据库是mysql,掌握其基本的增.删.改.查是每一个测试人员必备的技能. sql语言分类 1.DDL语句(数据库定义语言): 数据库.表.视图.索引.存储过程,例如:CREAT ...
- ManiFest.MF
Manifest-Version: 1.0 //指定manifest文件的版本信息 Bundle-ManifestVersion: 2 //指定该包遵从 OSGi 规范 V3 或者 OSGi 规范 V ...
- Pandas | 19 合并/连接
Pandas具有功能全面的高性能内存中连接操作,与SQL等关系数据库非常相似.Pandas提供了一个单独的merge()函数,作为DataFrame对象之间所有标准数据库连接操作的入口 - pd.me ...
- pytest--运行指定的测试和参数化
mark pytest提供了标记机制,允许你使用marker对测试函数做标记,一个测试函数可以有多个marker,一个marker也可以用来标记多个测试函数 比如我们需要进行冒烟测试,不可能把所有的用 ...