elasticsearch在kubernetes中持久化集群部署

背景

Javashop电商系统的商品索引是使用的elasticsearch,对于高可用的要求有两个重要的考量:

1、集群化

2、可扩容

3、冗灾

冗灾就要实现es的持久化,要考虑到es宕机的情况,当es因不可抗因素挂掉了,当我们再恢复了es的运行后,商品索引也要随之 一起恢复。

本文着重讨论elasticsearch的持久化部署方案,当然提供在方案也支持了集群及扩容。

思路

1、数据的存储

在k8s中的持久化部署不可避免的要用到持久卷,我们采用nfs方式的持久卷来存储es数据。

持久卷的详细介绍请见这里:

https://kubernetes.io/docs/concepts/storage/persistent-volumes/

2、节点规划

默认启动5个节点,3主2数据。

根据es官方推荐每个节点的智能要分离,因此maseter节点不存储数据,只用来协调。

3、多节点的权限问题

es的数据目录默认只允许一个节点访问,但在k8s上采用了持久卷,所有节点的数据都存储在这个卷上,这会导致es的访问权限问题。

报错如下:

java.io.IOException: failed to obtain lock on /usr/share/elasticsearch/data/nodes/0",

当然可以通过更改es的配置max_local_storage_nodes来允许多个节点访问同一个数据目录,但es官方不推荐这样做。

所以我们的方案是更改每个节点的数据存储目录来解决

ps:指定es配置项path.data来实现

举例说明:

节点名 存储目录
es-data-1 /usr/share/elasticsearch/data/es-data-1
es-data-2 /usr/share/elasticsearch/data/es-data-2

部署过程

一、pv(持久卷的建立)

先要建立nfs服务器

对于持久卷的结构规划如下:

目录 内容
/nfs/data/esmaster es master节点的数据
/nfs/data/esdata es 数据节点的数据

关于索引的磁盘占用:

请根据业务的数据量情况来规划持久卷硬件的情况

根据我们实际测算1000个商品大约需要1MB/每节点

默认情况

在默认的规划中,我们使用使用k8s的master节点作为nfs服务器,为上述卷准备了10G的空间,请确保k8s master node 不少于10G的空闲磁盘。

请根据您的具体业务情况选择nfs服务器,如果条件允许最好是独立的nfs服务器。

根据如上规划建立nfs服务:

#master节点安装nfs
yum -y install nfs-utils
#创建nfs目录
mkdir -p /nfs/data/{mqdata,esmaster,esdata}
#修改权限
chmod -R 777 /nfs/data/

#编辑export文件
vim /etc/exports

粘贴如下内容:
/nfs/data/esmaster *(rw,no_root_squash,sync)
/nfs/data/esdata *(rw,no_root_squash,sync)

#配置生效
exportfs -r
#查看生效
exportfs

#启动rpcbind、nfs服务
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs

#查看 RPC 服务的注册状况
rpcinfo -p localhost

#showmount测试,这里的ip输入master节点的局域网ip
showmount -e <your ip>

如果成功可以看到可被挂载的目录:

# showmount -e 172.17.14.73
Export list for 172.17.14.73:
                                                                                                                                          /nfs/data/esmaster *
/nfs/data/mqdata   *

接下来,要在每一个节点上安装nfs服务以便使k8s可以挂载nfs目录

#所有node节点安装客户端
yum -y install nfs-utils
systemctl start nfs && systemctl enable nfs

这样就为k8s的持久卷做好了准备。

建立持久卷

有了nfs的准备,我就可以建立持久卷了:

我们分享了javashop内部使用的yaml仓库供大家参考:

https://gitee.com/enation/elasticsearch-on-k8s

在您的k8s maseter节点服务器上 clone我们准备好的yaml文件

git clone https://gitee.com/enation/elasticsearch-on-k8s.git

修改yaml目录中的pv.yaml

修改其中的server配置为nfs服务器的IP:

  nfs:
    server: 192.168.1.100 #这里请写nfs服务器的ip

通过下面的命令建立持久卷:

kubectl create -f pv.yaml

通过以下命令查看持久卷是否建立成功:

kubectl get pv

部署elasticsearch

在k8s  master节点上执行下面的命令创建namespace:

kubectl create namespace ns-elasticsearch

执行下面的命令创建es集群

kubectl create -f elasticsearch.yaml

通过以上部署我们建立了一个ns-elasticsearch的namespace,并在其中创建了相应的pvc、角色账号,有状态副本集以及服务。

有状态副本集:

服务:

镜像

使用的是javashop自己基于es:6做的,加入了ik分词插件,其他没有变化。

服务

我们默认开启了对外nodeport端口,对应关系:

32000->9200

32100->9300

k8s内部可以通过下面的服务名称访问:

elasticsearch-api-service.ns-elasticsearch:9300

elasticsearch-service.ns-elasticsearch:9200

等待容器都启动成功后验证。

验证

1、生成索引

2、删除副本集:

kubectl delete -f elasticsearch.yaml

3、建立副本集

kubectl create -f elasticsearch.yaml

4、查看之前的索引是否恢复

关键技术点

1、集群发现:

  - name: "discovery.zen.ping.unicast.hosts"
              value: "elasticsearch-discovery"

建立了elasticsearch-discovery服务

2、映射持久卷

映射到:/usr/share/elasticsearch/data/

3、自定义数据目录

            - name: "path.data"
              value: "/usr/share/elasticsearch/data/$(MY_POD_NAME)"

其中MY_POD_NAME是读取的容器名称,通过有状态副本集保证唯一性的绑定:

- name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name

欢迎关注Javashop技术分享公众号,观看更多的视频讲解:

易族智汇(javashop)原创文章

原文地址:https://www.cnblogs.com/javashop-docs/p/12340612.html

时间: 2024-10-11 06:49:35

elasticsearch在kubernetes中持久化集群部署的相关文章

rabbitmq在kubernetes中持久化集群部署

背景 Javashop电商系统的消息总线使用的事rabbitmq,在订单创建.静态页生成.索引生成等等业务中大量采用异步消息系统,这个对于mq高可用的要求有两个重要的考量: 1.集群化 2.可扩容 3.冗灾 冗灾就要实现rabbitmq的持久化,要考虑到rabbitmq宕机的情况,当rabbitmq因不可抗因素挂掉了,这时有一些消息还没来得及被消费,当我们再恢复了rabbitmq的运行后,这些消息应该同时被恢复,可以再次被消费. 本文着重讨论rabbitmq的k8s的持久化部署方案,当然提供在方

Kubernetes 1.6集群部署

IP Hostname Roles 172.50.0.120 kube-Harbor Harbor镜像仓库 172.50.0.110 kube-Master-01   172.50.0.111 kube-Master-02   172.50.0.112 kube-Master-03   172.50.0.116 kube-node01   172.50.0.117 kube-node02   172.50.0.118 kube-node03   172.50.0.119 kube-node04

t持久化与集群部署开发详解

Quartz.net持久化与集群部署开发详解 序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项目的锤炼,走到啦今天,支持集群高可用的开发方案那是一定的,今天我就给小结下我的quartz.net开发升级过程. Quartz.net的数据库表结构 如果支持集群与持久化,单靠本机的内存和xml来保存计算任务调度的各种状态值,可想而知,是困难的.所以支持

谈一谈Elasticsearch的集群部署

??Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓扑结构设计的前提.关于如何配置集群的配置文件不会在本文中提及. 节点类型 1. 候选主节点(Master-eligible node) ??一个节点启动后,就会使用Zen Discovery机制去寻找集群中的其他节点,并与之建立连接.集群中会从候选主节点中选举出一个主节点,主节点负责创建索引.删除索

Quartz.net持久化与集群部署开发详解

序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项目的锤炼,走到啦今天,支持集群高可用的开发方案那是一定的,今天我就给小结下我的quartz.net开发升级过程. Quartz.net的数据库表结构 如果支持集群与持久化,单靠本机的内存和xml来保存计算任务调度的各种状态值,可想而知,是困难的.所以支持数据库这样的解决方案,OpenSymphony

kubernetes集群部署

鉴于Docker如此火爆,Google推出kubernetes管理docker集群,不少人估计会进行尝试.kubernetes得到了很多大公司的支持,kubernetes集群部署工具也集成了gce,coreos,aws等iaas平台,部署起来也相当的方便.鉴于网上众多资料基于的是不少老版本,本篇文章针对最新的kubernetes及其依赖组件的部署简要阐述.通过本文可以比较粗暴的运行你的kubernetes集群,要优雅还需要更多的工作.部署主要分为三步: 1.准备机器并打通网络 如果要部署kube

【转】Quartz.net持久化与集群部署开发详解

转自:http://www.cnblogs.com/knowledgesea/p/5145239.html 序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项目的锤炼,走到啦今天,支持集群高可用的开发方案那是一定的,今天我就给小结下我的quartz.net开发升级过程. Quartz.net的数据库表结构 如果支持集群与持久化,单靠本机的内存和xm

Kubernetes集群部署DNS服务

Kubernetes集群部署DNS服务在kubernetes中每一个service都会被分配一个虚拟IP,每一个Service在正常情况下都会长时间不会改变,这个相对于pod的不定IP,对于集群中APP的使用相对是稳定的. 但是Service的信息注入到pod目前使用的是环境变量的方式,并且十分依赖于pod(rc)和service的创建顺序,这使得这个集群看起来又不那么完美,于是kubernetes以插件的方式引入了DNS系统,利用DNS对Service进行一个映射,这样我们在APP中直接使用域

Kubernetes集群部署篇( 一)

K8S集群部署有几种方式:kubeadm.minikube和二进制包.前两者属于自动部署,简化部署操作,我们这里强烈推荐初学者使用二进制包部署,因为自动部署屏蔽了很多细节,使得对各个模块感知很少,非常不利用学习.所以,这篇文章也是使用二进制包部署Kubernetes集群. 一.架构拓扑图 二.环境规划 角色 IP 主机名 组件 Master1 192.168.161.161 master1 etcd1,master1 master2 192.168.161.162 master2 etcd2,m