linux上的定时任务可以通过crontab命令配置,简单但是不方便管理。因此,采用分布式cronsun管理各节点的定时任务,并监控日志。
1. 在master上安装mongodb
- 配置yum源,创建mongodb的repo文件,版本信息根据实际进行改动
vim /etc/yum.repos.d/mongodb-org.repo
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
- 安装mongodb
此处可能报错:GPG key retrieval failed: [Errno 14] curl#6 - “Could not resolve host: www.mongodb.org; Unknown error”,处理办法:https://blog.csdn.net/clementad/article/details/46896075
yum install mongodb-org -y
- 修改配置文件
vim /etc/mongod.conf
net:
port: 27017
bindIp: 0.0.0.0
security:
authorization: enabled
- 启动并设置开机自启
sudo systemctl start mongod
sudo systemctl enable mongod
- 创建用户
mongo
use admin
db.createUser({user:"root",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},"readWriteAnyDatabase"]})
# 此处进入master节点下创建cronsun用户
mongo --host <masterIP>
use admin
db.auth("root", "123456")
use cronsun
db.createUser({user:'cronsun',pwd:'123456',roles:[{role:"userAdmin",db:"cronsun"}]})
2. 在msater上安装etcd
- 安装命令
yum install etcd -y
- 修改配置文件
vim /etc/etcd/etcd.conf
ETCD_NAME="master"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
- 启动服务并且验证状态
systemctl start etcd
etcdctl set testdir/testkey0 0
etcdctl get testdir/testkey0
etcdctl -C http://<masterIP>:4001 cluster-health
etcdctl -C http://<masterIP>:2379 cluster-health
3. 在master上安装cronsun
- 下载并解压安装包,有时候网速慢,github上一直连不上,可以手动去网站下
cd /opt
wget https://github.com/shunfei/cronsun/releases/download/v0.3.5/cronsun-v0.3.5-linux-amd64.zip
unzip cronsun-v0.3.5-linux-amd64.zip
- 修改cronsun配置文件
vim /opt/cronsun-v0.3.5/conf/db.json
{
"Hosts": [
"<masterIP>:27017"
],
"Database": "cronsun",
"#AuthSource": "AuthSource Specify the database name associated with the user’s credentials.",
"#AuthSource": "AuthSource defaults to the cronsun's Database.",
"#AuthSource": "If connect mongodb like './bin/mongo mytest -u test -p 123 --authenticationDatabase admin' ",
"#AuthSource": "the AuthSource is 'admin'. ",
"AuthSource": "admin",
"UserName": "root",
"Password": "123456",
"#Timeout": "connect timeout duration/second",
"Timeout": 15
}
vim /opt/cronsun-v0.3.5/conf/etcd.json
{
"Endpoints":[
"http://<masterIP>:2379"
],
"Username":"",
"Password":"",
"#DialTimeout":"单位秒",
"DialTimeout": 2
}
- 将cronsun拷贝到集群其他节点地址
scp -r /opt/cronsun-v0.3.5 <other_server>:/opt
- 在所有节点上启动cronnode,(采用supervisor维护)
/opt/cronsun-v0.3.5/cronnode -conf /opt/cronsun-v0.3.5/conf/base.json
[program:cronsun_node]
command=/opt/cronsun-v0.3.5/cronnode -conf /opt/cronsun-v0.3.5/conf/base.json
directory=/opt
;process_name=%(process_num)02d?
;numprocs=5
autorestart=true
autostart=true
startsecs=1
startretries=10
stderr_logfile=/opt/cronsun-v0.3.5/stderr.log
stdout_logfile=/opt/cronsun-v0.3.5/stdout.log
;environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT
- 在master上启动cronweb,(采用supervisor维护)
/opt/cronsun-v0.3.5/cronweb -conf /opt/cronsun-v0.3.5/conf/base.json
[program:cronsun_web]
command=/opt/cronsun-v0.3.5/cronweb -conf /opt/cronsun-v0.3.5/conf/base.json
directory=/opt
;process_name=%(process_num)02d?
;numprocs=5
autorestart=true
autostart=true
startsecs=1
startretries=10
stderr_logfile=/opt/cronsun-v0.3.5/stderr.log
stdout_logfile=/opt/cronsun-v0.3.5/stdout.log
;environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT
4.访问cronsun界面
masterIP :7079/ui/#/node
默认登录账号密码: admin@admin.com/admin
5. 问题处理
5.1 断电重启
某次虚拟机意外断电,重启cronsun服务时报错:mongod.service: control process exited, code=exited status=14
处理方法:执行如下命令
sudo chown mongod:mongod /tmp/mongodb-27017.sock
5.2 serverStatus was very slow
某天发现cronsun突然断掉,检查mongodb挂掉了,重启,并去日志中查看,报错:serverStatus was very slow,查阅资料后描述可能是某次mongodb访问的内存不足,检查访问日志后发现进行了一次cronsun工作日志的查询,并且查询中没有设置时间,导致mongodb从job_log表中一次拉取过多的返回,处理方法:
mongo -host <ip>
use admin
db.auth("root", "root")
use cronsun
show collections
# 删除job_log表,由于job_latest_log表保存了近期的工作日志,本项目无需保存所有日志,故直接删除
db.job_log.drop()
# 有日志保存需求的,可先将job_log重命名到bak中,cronsun会自动创建新的job_log
# db.job_log.renameCollection(job_log_20211220) renames the collection