部署mongod
一次启动3台。
配置副本集
注意其中初始化有些区别
# 进入shell
mongosh
# 查副本集状态
rs.status()
# 创建副本集
rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "192.168.0.1:27017" },
{ _id: 1, host: "192.168.0.2:27017" },
{ _id: 2, host: "192.168.0.3:27017" }
]
})
# 连接整体集群,确保是使用primary节点创建用户的
mongosh "mongodb://192.168.0.1:27017,192.168.0.2:27017,192.168.0.3:27017/?replicaSet=rs0"
# 建用户
db.getSiblingDB('admin').createUser({
user: '数据库用户名',
pwd: '数据库密码',
roles: [{ role: 'root', db: 'admin' }]
});
use admin;
show users;
部署mongot
一次启动3台。
验证
登录每台,查看collection数据。
# 查副本集状态
rs.status()
关于mongot高可用
在 MongoDB 副本集中,mongot(搜索引擎进程)通常与 mongod 部署在同一节点。由于 mongod 只能配置连接一个 mongot 地址,当本地 mongot 故障而 mongod 正常时,该节点会成为搜索服务的“黑洞”,导致用户请求间歇性失败。
为了解决这一单点故障问题,我们整理了以下三种成熟的架构方案。
方案1
通过nginx进行转发,nginx的故障率比mongot的低的多
方案2
基于方案1,增加keepalived,使用vip,实现完全的高可用
方案3
通过脚本,如果发现本机的mongot挂掉,那么就把本机的mongod停掉
以下是方案1 的实现方式
一、配置nginx增加tcp代理,3台机器的27028端口
stream{
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
access_log /var/log/nginx/tcp-access.log proxy;
open_log_file_cache off;
include /etc/nginx/conf.d/*.stream;
}
# cat conf.d/90.stream
upstream tcp_backend {
# 后端服务地址+端口(可配置多个,默认轮询)
server 192.168.0.1:27028;
server 192.168.0.2:27028;
server 192.168.0.3:27028;
}
# 2. 监听前端端口,转发到后端
server {
listen 90; # Nginx 监听的 TCP 端口(外部访问的端口)
proxy_pass tcp_backend; # 转发到上面定义的后端池
# 可选优化配置
proxy_connect_timeout 10s; # 连接后端超时时间
proxy_timeout 300s; # 连接空闲超时时间
proxy_buffer_size 4k; # 代理缓冲区大小
}
二、修改 mongod.conf
例如当前在 192.168.0.1节点
#searchIndexManagementHostAndPort: mongot-service:27028
searchIndexManagementHostAndPort: 192.168.0.1:90
#mongotHost: mongot-service:27028
mongotHost: 192.168.0.1:90