Elasticsearch 架构说明
Elasticsearch 是一个开源的分布式搜索和分析引擎,专为速度、扩展和 AI 应用而打造。作为一个检索平台,它可以实时存储结构化、非结构化和向量数据,提供快速的混合和向量搜索
为什么我的WordPress采用elasticsearch采用单机?
- 默认情况下单机ES单副本足够支撑WordPress稳定运行,除非WordPress 站点文章数量超过100万篇,或者索引体积超过 30GB,否则搞 ES集群做分片Sharding纯属“负优化”。
- 对于 99% 的 WordPress 站点(包括大型资源站 B2 主题),单节点Single Node或者是单节点 + 副本Replication才是性能最高的选择。
Elastic 官方建议单个分片的大小在 10GB - 50GB 之间
k8s 部署ES
- Kubernetes版本
v1.29.9 - Elasticsearch版本
v7.17.13 - 命名空间为
wordpress - 推荐使用
i4t.com/dockerproxy镜像加速
创建部署yaml
root@k8s-master-01:~/es/es-i4t# vim wordpress-es.yaml
部署单机ES以及Kibana
- dsm7-nfs-client 这里我已经创建了storageclass
root@k8s-master-01:~/es/es-i4t# cat wordpress-es.yaml
---
# ===========================
# 1. Elasticsearch StatefulSet
# ===========================
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: wordpress
spec:
serviceName: elasticsearch
replicas: 1
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
initContainers:
- name: install-plugins
image: dockerproxy.frps.fun/library/elasticsearch:7.17.13
command:
- sh
- -c
- |
# 检查是否已安装 ik,没安装则下载
if [ ! -d "plugins/analysis-ik" ]; then
echo "Installing IK Analyzer..."
# 必须加 --batch 自动确认权限
./bin/elasticsearch-plugin install --batch https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.17.13.zip
fi
# [关键修复] 同时修正 plugins 和 config 目录的权限
# 这一步至关重要,否则主容器读不到字典
chown -R elasticsearch:elasticsearch plugins
chown -R elasticsearch:elasticsearch config
volumeMounts:
- name: plugins
mountPath: /usr/share/elasticsearch/plugins
# [新增] 挂载配置目录,保存字典文件
- name: ik-config
mountPath: /usr/share/elasticsearch/config/analysis-ik
- name: fix-permissions
image: busybox
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
containers:
- name: elasticsearch
image: dockerproxy.frps.fun/library/elasticsearch:7.17.13
resources:
limits:
memory: 8Gi
requests:
memory: 4Gi
env:
- name: discovery.type
value: single-node
- name: ES_JAVA_OPTS
value: "-Xms2g -Xmx4g"
- name: xpack.security.enabled
value: "true"
- name: xpack.security.transport.ssl.enabled
value: "true"
ports:
- containerPort: 9200
name: http
- containerPort: 9300
name: transport
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
- name: plugins
mountPath: /usr/share/elasticsearch/plugins
- name: ik-config
mountPath: /usr/share/elasticsearch/config/analysis-ik
volumes:
- name: plugins
emptyDir: {}
- name: ik-config
emptyDir: {}
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "dsm7-nfs-client"
resources:
requests:
storage: 50Gi
---
# ===========================
# 2. Elasticsearch Service
# ===========================
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: wordpress
spec:
type: NodePort
selector:
app: elasticsearch
ports:
- name: http
port: 9200
targetPort: 9200
# nodePort: 30200 # 如果需要固定端口可以取消注释
---
# ===========================
# 3. Kibana Deployment
# ===========================
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: dockerproxy.frps.fun/library/kibana:7.17.13
resources:
limits:
memory: 4Gi
env:
- name: ELASTICSEARCH_HOSTS
value: "http://elasticsearch:9200"
- name: I18N_LOCALE
value: "zh-CN"
- name: ELASTICSEARCH_USERNAME
value: "kibana_system"
- name: ELASTICSEARCH_PASSWORD
value: "***填写密码"
---
# ===========================
# 4. Kibana Service (NodePort)
# ===========================
apiVersion: v1
kind: Service
metadata:
name: kibana-nodeport
namespace: wordpress
spec:
type: NodePort
selector:
app: kibana
ports:
- name: http
port: 5601
targetPort: 5601

生成ES密码
# 1. 进入 ES 容器
kubectl exec -it elasticsearch-0 -n wordpress -- /bin/bash
# 2. 运行自动生成密码命令
./bin/elasticsearch-setup-passwords auto
# 3.记录以下2个账户密码
elastic: 超级管理员账号(你登录网页用这个)。
kibana_system: Kibana 系统内部连接 ES 用的账号(我们需要用这个修复报错)。
添加Kibana用户认证信息
containers:
- name: kibana
#image: kibana:7.17.13 官方镜像
image: dockerproxy.frps.fun/library/kibana:7.17.13
resources:
limits:
memory: 4Gi
env:
#### 以下为新增配置#####
- name: ELASTICSEARCH_USERNAME
value: "kibana_system" # 固定用户名,不要改
- name: ELASTICSEARCH_PASSWORD
value: "这里填刚才生成的kibana_system的密码"
更新Kibana Pod
root@k8s-master-01:~/es/es-i4t# kubectl apply -f wordpress-es.yaml
statefulset.apps/elasticsearch configured
service/elasticsearch unchanged
deployment.apps/kibana configured
service/kibana-nodeport unchanged
使用kibana确认下服务状态
root@k8s-master-01:~/es/es-i4t# kubectl get svc -n wordpress|grep kibana
kibana-nodeport NodePort 10.96.1.129 <none> 5601:30557/TCP 8m28s
访问k8s_node_ip:30557
密码为刚刚生成的
- elastic: 超级管理员账号(你登录网页用这个)。

测试ik分词器
POST /_analyze?pretty
{
"analyzer": "ik_max_word",
"text": "WordPress性能优化"
}

配置WP索引优化
我们通过配置模板只要是名字以wp_ 开头的索引,都强制用1分片0副本
PUT _index_template/wordpress_optimization
{
"index_patterns": ["wp_*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"analysis": {
"analyzer": {
"default": {
"type": "ik_max_word"
},
"default_search": {
"type": "ik_smart"
}
}
}
}
},
"priority": 1
}

WordPress安装插件
配置插件参数,编辑配置文件wp-config.php
<?php
/** ElasticPress 连接配置 */
// [关键修改] 将账号:密码拼接到 URL 里,格式 http://user:pass@ip:port
// 这样可以绕过 HTTP Header 丢失的问题
define( 'EP_HOST', 'http://elastic:密码部分@192.168.1.1:port' );
define( 'EP_INDEX_PREFIX', 'wp_b2_prod_' );
define( 'EP_IS_NETWORK', false );
安装插件: 在 WP 后台 -> 插件 -> 安装插件 -> 搜索 "ElasticPress" -> 安装并启用。

- 如果连接异常可以重启PHP、清理Redis缓存
开启同步

