MongoDB分片集群自动化部署

OS:CentOS Linux release 7.9.2009 (Core)
场景:
需要半自动化或者自动化部署MongoDB集群时,可用此脚本。提高交付效率。

脚本实现架构图:
在这里插入图片描述

脚本:
check_clear_host.sh #此脚本有2个功能及是检查 资源规格和清理资源上的MognoDB 实全,清理动作禁止在生产或者重要的环境执行。

#!/bin/bashwithout=$(python  cluster_mongodb_mutil.py 'argument') #获取IP地址和密码
ips=$(echo $without|cut -d'|' -f1|cut -d':' -f2)
sshpassword=$(echo $without|cut -d'|' -f2|cut -d':' -f2)
sshuser='root'/usr/bin/which sshpass ;if [[ "$?" != "0" ]];then  yum -y install sshpass ;fioperation=1 # 1检查机器资源配置 0删除mongodb集群(生产环境禁止使用)function mongo_clear(){IFS='|' read -ra elements <<< "$1"for ip in "${elements[@]}"; dopid=$(sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "ps -ef|grep mongo|grep -vE 'grep'|awk -F' ' '{print \$2}'")if [ -n "$pid" ]; thensshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "kill -9 $pid"fiecho $ipsshpass -p $2   ssh  $3@${ip} -o StrictHostKeyChecking=no "userdel mongodb"sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "rm -fr  /data/*"sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "cd /usr/local/ && unlink mongodb"sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "rm -fr /opt/mongodb-linux-x86_64-rhel70-4.4.18"done
}function mongo_check(){IFS='|' read -ra elements <<< "$1"for ip in "${elements[@]}"; do{cpu=$(sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "cat /proc/cpuinfo | grep 'process'|wc -l")sshpass -p $2   ssh  $3@${ip} -o StrictHostKeyChecking=no "df -h|grep data"fre=$(sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "free -m|sed -n 2p|awk -F' ' '{print \$2}'")dik=$(sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "df -h|awk -F' ' '{print \$2}' |grep G|cut -d'G' -f1|awk '{if(NR == 1) {max = \$1} else {if(\$1 > max) {max = \$1}}} END {print max}'")dik_free=$(sshpass -p $2  ssh  $3@${ip} -o StrictHostKeyChecking=no "df -h|grep ${dik}|awk -F' ' '{print \$4}'")echo ${ip}': '${cpu}'c,'${fre}m,${dik}g,'磁盘可用'$dik_free} &donewait
}ipss=`echo $ips|sed 's/ /|/g'`if [ "$operation" == 0 ];thenmongo_clear ${ipss} ${sshpassword} ${sshuser}
elif [ "$operation" == 1 ];thenmongo_check $ipss $sshpassword $sshuser
fi

dbenvset_mult.sh

#!/bin/bashsshuser='root'
without=$(python  cluster_mongodb_mutil.py 'argument') #获取IP地址和密码
ips=$(echo $without|cut -d'|' -f1|cut -d':' -f2)
sshpassword=$(echo $without|cut -d'|' -f2|cut -d':' -f2)for ip in $ips
do{ipp=$(ip a|grep  'inet 172'|awk -F' ' '{print $2}'|cut -d'/' -f1)if [ "$ipp" == "$ip" ];thensh dbenvset.sh /data 0 0elif [ "$ipp" != "$ip" ];then/usr/bin/sshpass -p ${sshpassword} scp dbenvset.sh  root@${ip}:${dataroot}sshpass -p $sshpassword  ssh  ${sshuser}@${ip} -o StrictHostKeyChecking=no "sh dbenvset.sh /data 0 0" # /data为你的数据挂载盘,请根据实际情况修改fi} &
done
wait

dbenvset.sh

#!/bin/sh
addcmd(){
addText=$1
file=$2
#判断 file.sh 文件中是否存在该字符串
if ! grep -q "$addText" $file
then
#不存在,添加字符串echo "$addText" >> $file
else
#存在,不做处理echo "$addText"" exist in "$file
fi
}if [ $# -ne 3 ];thenecho "Error: please use $0 datadir ishdd ispm"
fi
datadir=$1  #数据目录,当前规范/data
ishdd=$2    #机械硬盘为1,ssd为0
ispm=$3     #物理机1,虚机0,容器2
#source /etc/profileif [ $ispm -ne 2 ];thensystemctl stop tunedsystemctl disable tuned
fi
if [ $ispm -eq 1 ];thensystemctl enable cpupower.servicesystemctl restart cpupower.service
fi
yum install -y libaio wget telnet net-tools strace gdb lsof sysstat bc numactl grubby ntp traceroute s3cmd zstd jq
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
if [ $ispm -ne 2 ];thenif [ $ishdd -eq 1 ];then#机械盘#数据盘禁用atimeawk '$2=="'$datadir'"{$4="defaults,noatime"}1' /etc/fstab > tmp && mv tmp /etc/fstab -fmount -o remount,noatime $datadir#内核设置存储介质的 I/O 调度器grubby --update-kernel=ALL --args="elevator=deadline"else#ssd#数据盘禁用atime,discard for ssd del dataawk '$2=="'$datadir'"{$4="defaults,noatime,discard"}1' /etc/fstab > tmp && mv tmp /etc/fstab -fmount -o remount,noatime,discard $datadirgrubby --update-kernel=ALL --args="elevator=noop"fi
fi
#设置当前不限制输出corefile,打开文件数,用户打开线程数
ulimit -c unlimited
ulimit -n 1048576
ulimit -u 1024000
#设置不限制输出corefile,打开文件数,用户打开线程数永久生效
addcmd '*  soft  core  unlimited' /etc/security/limits.conf
addcmd '*  hard  core  unlimited' /etc/security/limits.conf
addcmd '*  soft  nofile   1048576' /etc/security/limits.conf
addcmd '*  hard  nofile   1048576' /etc/security/limits.conf
addcmd '*  soft  nproc   1024000' /etc/security/limits.conf
addcmd '*  hard  nproc   1024000' /etc/security/limits.conf
addcmd '*  soft  stack   32768' /etc/security/limits.conf
addcmd '*  hard  stack   32768' /etc/security/limits.conf
#修改当前的内核配置立即关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
#内核关闭透明大页
grubby --args="transparent_hugepage=never" --update-kernel `grubby --default-kernel`
#设置操作系统预读扇区readahead(主要为了优化mongodb),/为数据盘目录,预读64个扇区为32k(网上资料说mongodb针对32k预读有优化,暂未从官方文档查实),对应随机读多的应用较小预读可以提升性能。
blockdev --setra 64 `df | grep -w $datadir | awk '{print $1}'`cat > /etc/systemd/system.conf << EOF
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See systemd-system.conf(5) for details.[Manager]
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
DumpCore=yes
#CrashShell=no
#ShowStatus=yes
#CrashChVT=1
#CtrlAltDelBurstAction=reboot-force
#CPUAffinity=1 2
#JoinControllers=cpu,cpuacct net_cls,net_prio
#RuntimeWatchdogSec=0
#ShutdownWatchdogSec=10min
#CapabilityBoundingSet=
#SystemCallArchitectures=
#TimerSlackNSec=
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
#DefaultRestartSec=100ms
#DefaultStartLimitInterval=10s
#DefaultStartLimitBurst=5
#DefaultEnvironment=
#DefaultCPUAccounting=no
#DefaultBlockIOAccounting=no
#DefaultMemoryAccounting=no
#DefaultTasksAccounting=no
#DefaultTasksMax=
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=
#DefaultLimitSTACK=
#DefaultLimitCORE=
#DefaultLimitRSS=
DefaultLimitNOFILE=1048576
#DefaultLimitAS=
DefaultLimitNPROC=1024000
#DefaultLimitMEMLOCK=
#DefaultLimitLOCKS=
#DefaultLimitSIGPENDING=
#DefaultLimitMSGQUEUE=
#DefaultLimitNICE=
#DefaultLimitRTPRIO=
#DefaultLimitRTTIME=
EOF
systemctl daemon-reexec
cat > /etc/sysctl.conf << EOF
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
#表示内核允许分配所有的物理内存,而不管当前的内存状态如何
vm.overcommit_memory = 1
fs.file-max = 6553560
#关闭系统swap
vm.swappiness = 0
#服务端所能accept即处理数据的最大客户端数量,即完成连接上限,默认值是128
net.core.somaxconn=32768
#服务端所能接受SYN同步包的最大客户端数量,即半连接上限,默认值是128
net.core.netdev_max_backlog=16384
#处于SYN_RECV的TCP最大连接数,SYN_RECV状态的TCP连接数超过该值后丢弃后续的SYN报文
net.ipv4.tcp_max_syn_backlog=16384
#表示关闭SYN Cookies。避免不使用SYN半连接队列的情况下成功建立连接
net.ipv4.tcp_syncookies = 0
#为TCP socket预留用于接收缓冲的内存缺省值(以字节为单位)
net.core.rmem_default=262144
#为TCP socket预留用于发送缓冲的内存缺省值(以字节为单位)
net.core.wmem_default=262144
#为TCP socket预留用于接收缓冲的内存最大值
net.core.rmem_max=16777216
#为TCP socket预留用于发送缓冲的内存最大值
net.core.wmem_max=16777216
#表示每个套接字所允许的最大缓冲区的大小
net.core.optmem_max=16777216
#表示用于向外连接的端口范围.缺省情况下过窄:32768到61000,改为1024到65535
net.ipv4.ip_local_port_range=1024 65535
#自动调优所使用的接收缓冲区的值,最少字节数/默认值/最大字节数
net.ipv4.tcp_rmem=1024 4096 16777216
#自动调优所使用的发送缓冲区的值
net.ipv4.tcp_wmem=1024 4096 16777216
#不设0可能大量丢包
#net.ipv4.tcp_tw_recycle = 0
EOFsysctl -p
swapoff -a

cluster_mongodb_mutil.py

#!/usr/bin/python
#! _*_ coding:utf-8 _*_import os,re
import sys
import time
import random,string
import subprocess
passw='xxx'account_verify = 1 # Cluster validation start ,0 关闭验证(Turn off validation) / 1开启验证(Enable verification)#mongos IP, port:30000
iplist_so = '''
1x2.x1.2x8.1601x2.x1.2x8.5
1x2.x1.2x8.35
'''
#config IP,port:27017
iplist_co = '''1x2.x1.2x8.177
1x2.x1.2x8.1391x2.x1.2x8.95
'''
#shard IP shard are separated by '|',port 40001-4000n
iplisto = '''
1x2.x1.2x8.186
1x2.x1.2x8.127
1x2.x1.2x8.151
|1x2.x1.2x8.117
1x2.x1.2x8.181
1x2.x1.2x8.193
|
1x2.x1.2x8.197
1x2.x1.2x8.58
1x2.x1.2x8.178
'''def ip_handle_shard(ip_list):#shard副本集的ip串处理函数slist = []slistz = []for s in ip_list.split('|'):slist.append(s.strip().replace("\n", " "))slistz.append(slist)slist = []return slistz
def ip_handle_sc(ip_list):#mongos/config的ip串处理函数slist = []for s in ip_list.split('\n'):slist.append(s.strip())clean_iplist = [item for item in slist if item]clean_iplist_clsp = ' '.join(clean_iplist)iplist_ss = []iplist_ss.append(clean_iplist_clsp)return iplist_ssiplist_s = ip_handle_sc(iplist_so)
iplist_c = ip_handle_sc(iplist_co)
iplist = ip_handle_shard(iplisto)def main(argv): #外部程序调入逻辑,获取密码和ip地址串if len(argv) < 2:return argvargument = argv[1]ts = ' 'sip = ''for shad_ip in iplist:if shad_ip != iplist[-1]:sip = sip + shad_ip[0] + tselse:sip = sip + shad_ip[0]ipsc = iplist_s[0] + ' ' + iplist_c[0] + ' ' + sipprint('ips:'+ipsc+'|sshpassword:'+passw)sys.exit(1)
if __name__ == "__main__":main(sys.argv)os.system('/usr/bin/which sshpass;if [[ "$?" != "0" ]];then  yum -y install sshpass ;fi')
# update your ip search location
num = string.ascii_letters+string.digits
password =  "".join(random.sample(num,12))
if os.path.exists('create_user.js'):os.remove('create_user.js')
file = open('create_user.js', 'a')
file.write('db.createUser({user:"admin", pwd:"%s", roles:[{role:"userAdminAnyDatabase",db:"admin"}]});\n' %(password))
file.write('db.createUser({user: "root",pwd: "%s",roles:[{role: "root", db: "admin"}]});\n' %(password))
file.close()#检实例安装结果函数
def function_psef(ip,passw):# 执行命令command = "sshpass -p\'%s\'  ssh  root@%s -o StrictHostKeyChecking=no 'netstat -tnlp|grep mongo'"%(passw,ip)process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 等待命令执行完成stdout, stderr = process.communicate()# 检查命令是否执行成功if process.returncode == 0:return 'successful_install'else:return "failure_install"#检副本集是否已经选举出 PRIMARY-函数
def function_primary(ip,passw,port):command = 'sshpass -p\'%s\'  ssh  root@%s -o StrictHostKeyChecking=no "echo \'rs.status()\'|/usr/local/mongodb/bin/mongo %s:%s|grep PRIMARY"'%(passw,ip,ip,port)process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)stdout, stderr = process.communicate()if process.returncode == 0:return 'PRIMARY'else:return 'SECONDARY'os.system('openssl rand -base64 753 > keyFile;chmod 400 keyFile')
shardname='rsshd'shards = 0
# extype部署类型 1.mongod 2.config 3.mongos
extype = 1
port = 40000
add_user_ip = []
for ips in iplist:shards += 1shardnamez = shardname+str(shards)ip1=ips[0].split(' ')[0]add_user_ip.append(ip1)#1.1 副本集批量安装#传送副本集IP组给脚本安装副本集os.system("sh mongo_mutil.sh  \'%s\' %s %s %s" %(ips[0],extype,passw,shards))#判断副本集实例都安装成功while True:successfuls = []for ip in ips[0].split(' '):example_ps = function_psef(ip,passw)successfuls.append(example_ps)for n in range(60):time.sleep(n)if successfuls.count('successful_install') == len(ips[0].split()) and list(set(successfuls))[0] == 'successful_install':pd = 'successful_install'breakelse:pd = ''if n == 30:#判断sharding副本集节点部署没有全部成功,退出脚本print('安装副本集'+ips[0]+'失败!')exit()breakif pd == 'successful_install':print('副本集 '+ips[0]+' 实例安装成功!')break#1.2. 副本集初始化命令拼接rsinit_head = 'rs.initiate({\\"_id\\": \\"%s\\",\\"members\\" :[' %(shardnamez)rsinit_tail = ']})'port = port + 1#  副本集IP拼接st = ','ipstr = ''for i in range(len(ips[0].split(' '))):print(i)ip=ips[0].split(' ')[i]print ipif ip != ips[0].split(' ')[-1]:ipst = '{\\"_id\\": %s,\\"host\\" : \\"%s:%s\\"}'%(i,ip,port)ipstr = ipstr + ipst + stelif ip == ips[0].split(' ')[-1]:ipst = '{\\"_id\\": %s,\\"host\\" : \\"%s:%s\\"}'%(i,ip,port)ipstr = ipstr + ipstrsinit_coun =  rsinit_head + ipstr + rsinit_tailtime.sleep(3)# 1.3 副本集初始化操作print('副本集 '+ips[0]+' 初始化开始......')os.system('sshpass -p\'%s\'  ssh  root@%s -o StrictHostKeyChecking=no "echo \'%s\'|/usr/local/mongodb/bin/mongo %s:%s"' %(passw,ip1,rsinit_coun,ip1,port))#判断shard的副本集是否产生主节点while True:primary_node = function_primary(ip1,passw,port)for n in range(60):time.sleep(n)if primary_node == 'PRIMARY':pd = 'PRIMARY'# 获取副本集主节点IP地址ip_str = os.popen('sshpass -p\'%s\'  ssh  root@%s -o StrictHostKeyChecking=no "echo \'rs.status()\'|/usr/local/mongodb/bin/mongo localhost:%s|grep -E \'name|stateStr\'|sed \'N;s/\\n//\'|grep PRIMARY"'%(passw,ip1,port)).read().strip().split(':')[1].replace('"','')ipList = re.findall( r'[0-9]+(?:\.[0-9]+){3}',ip_str)[0]os.system('sshpass -p %s scp %s  root@%s:/root/' %(passw,'create_user.js',ipList))#副本集主节点创建管理账号os.system('sshpass -p\'%s\'  ssh  root@%s -o StrictHostKeyChecking=no  "/usr/local/mongodb/bin/mongo %s:%s/admin < create_user.js"' %(passw,ipList,ipList,port))breakelse:pd = ''if n == 30:#判断副本集在30秒内没有选举出primary,退出脚本print('安装sharding副本集'+ips[0]+'在30秒内没有选举出primary,退出脚本.')exit()breakif pd == 'PRIMARY':break#// 2、 config节点部署
extype = 2
# 2.1 config节点复制集部署
os.system("sh mongo_mutil.sh  \'%s\' %s %s" %(iplist_c[0],extype,passw))replSetName = "rscnf" #config复制集名
rsinit_head = 'rs.initiate({\\"_id\\": \\"%s\\",\\"members\\" :[' %(str(replSetName))
rsinit_tail = ']})'
ip1=iplist_c[0].split(' ')[0]#检查config副本集实例安装结果
while True:successfuls = []for ip in iplist_c[0].split(' '):example_ps = function_psef(ip,passw)successfuls.append(example_ps)for n in range(60):time.sleep(n)if successfuls.count('successful_install') == len(iplist_c[0].split()) and list(set(successfuls))[0] == 'successful_install':print('config副本集'+iplist_c[0]+'实例部署成功!')pd = 'successful_install'breakelse:pd = ''if n == 30:#判断副本集节点部署没有全部成功,退出脚本print('安装config副本集'+iplist_c[0]+'失败!,退出脚本.')exit()breakif pd == 'successful_install':print('副本集 '+iplist_c[0]+' 实例安装成功!')break# config副本集IP拼接
st = ','
ipstr = ''
ipstc = ''
portc = '27017'
for i in range(len(iplist_c[0].split(' '))):print iip=iplist_c[0].split(' ')[i]print ipif ip != iplist_c[0].split(' ')[-1]:ipst = '{\\"_id\\": %s,\\"host\\" : \\"%s:%s\\"}'%(i,ip,portc)ipsc = ip + ':' + portcipstc = ipstc + ipsc + stipstr = ipstr + ipst + stelif ip == iplist_c[0].split(' ')[-1]:ipst = '{\\"_id\\": %s,\\"host\\" : \\"%s:%s\\"}'%(i,ip,portc)ipsc = ip + ':' + portcipstc = ipstc + ipscipstr = ipstr + ipst
rsinit_coun =  rsinit_head + ipstr + rsinit_tail
# 2.2 config副本集初始化
os.system('sshpass -p \'%s\'  ssh  root@%s -o StrictHostKeyChecking=no "echo \'%s\'|/usr/local/mongodb/bin/mongo %s:%s"' %(passw,ip1,rsinit_coun,ip1,portc))#判断config的副本集是否已产生主节点
while True:primary_node = function_primary(ip,passw,portc)for n in range(60):time.sleep(n)if primary_node == 'PRIMARY':pd = 'PRIMARY'breakelse:pd = ''if n == 30:#判断config副本集在30秒内没有选举出primary,退出脚本print('初始化config副本集'+iplist_c[0]+'在30秒内没有选举出primary,退出脚本.')exit()breakif pd == 'PRIMARY':break# 获取副本集主节点IP地址
ip_str = os.popen('sshpass -p\'%s\'  ssh  root@%s -o StrictHostKeyChecking=no "echo \'rs.status()\'|/usr/local/mongodb/bin/mongo %s:%s|grep -E \'name|stateStr\'|sed \'N;s/\\n//\'|grep PRIMARY"' %(passw,ip1,ip1,portc)).read().strip().split(':')[1].replace('"','')
ipList = re.findall( r'[0-9]+(?:\.[0-9]+){3}',ip_str)[0]
#副本集主节点创建管理账号
os.system('sshpass -p %s scp %s  root@%s:/root/' %(passw,'create_user.js',ipList))
time.sleep(1)
os.system('sshpass -p\'%s\'  ssh  root@%s -o StrictHostKeyChecking=no  "/usr/local/mongodb/bin/mongo %s:%s/admin < create_user.js"' %(passw,ipList,ipList,portc))
time.sleep(1)#// 3、 mongos节点部署
extype = 3
cfdbs = '  configDB: '+replSetName+'/'+ipstc
print('开始部署mongos......')
os.system('sed -i "s|`grep configDB mongos_install.sh`|%s|g" mongos_install.sh'%(cfdbs))#// 3.1 安装mongos节点
os.system("sh mongo_mutil.sh  \'%s\' %s %s" %(iplist_s[0],extype,passw))while True:successfuls = []for ip in ips[0].split(' '):example_ps = function_psef(ip,passw)successfuls.append(example_ps)for n in range(60):print(n)time.sleep(n)if successfuls.count('successful_install') == 3 and list(set(successfuls))[0] == 'successful_install':print('mongos实例节点部署成功!')pd = 'successful_install'breakelse:pd = ''if n == 30:#判断安装mongos在30秒内没有选举出primary,退出脚本print('安装mongos'+iplist_s[0]+'失败!,退出脚本.')exit()breakif pd == 'successful_install':print('mongos '+iplist_s[0]+' 实例安装成功!')break
time.sleep(3)
shardn = 0
port = 40000
# 3.2 添加集群分片
for ips in iplist:shardn += 1port = port + 1addshard_head = 'sh.addShard(\\"'# 添加分片的副本集ip串拼接ipsts = ''st= ','for i in range(len(ips[0].split(' '))):print(i)ip=ips[0].split(' ')[i]print ipif ip != ips[0].split(' ')[-1]:ipss = ip+':'+str(port)ipsts = ipsts + ipss + stelif ip == ips[0].split(' ')[-1]:ipss = ip+':'+str(port)ipsts = ipsts + ipssaddshard = shardname+str(shardn)+'/'+ipstsaddshard_tail = '\\")'addshardc = addshard_head + addshard + addshard_tailshows = 'sh.status()'os.system('sshpass -p \'%s\'  ssh  root@%s -o StrictHostKeyChecking=no "echo \'%s\'|/usr/local/mongodb/bin/mongo localhost:30000"' %(passw,iplist_s[0].split(' ')[0],addshardc))time.sleep(3)
#将密码写入日志中,方便后续查看
file = open('/data/mongodb/logs/mongo_route.log','a')
file.write('%s mongodb_password: %s \n' %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()),password))
file.close()
#把mognodb集群信息记录到集群config库的mongodb_configs集合中
os.system("echo 'db.mongodb_configs.insert({\"mongos_30000\" : \"%s\",\"config_%s\" : \"%s\",\"shards_40001-%s\":\"%s\"})'|/usr/local/mongodb/bin/mongo localhost:30000/config" %(iplist_s,portc,iplist_c,port,iplist))# 获取IP
mongos = os.popen("echo 'db.mongodb_configs.find({},{\"mongos_30000\":1, \"_id\":0})'|/usr/local/mongodb/bin/mongo localhost:30000/config|grep mongos_30000|grep -Po '(?<=\[).*?(?=\])'|tail -n1").read().strip()
config = os.popen("echo 'db.mongodb_configs.find({},{\"config_27017\":1, \"_id\":0})'|/usr/local/mongodb/bin/mongo localhost:30000/config|grep config_27017|grep -Po '(?<=\[).*?(?=\])'|tail -n1").read().strip()
shards = os.popen("echo 'db.mongodb_configs.find({},{\"shards_40001-%s\":1, \"_id\":0})'|/usr/local/mongodb/bin/mongo localhost:30000/config|grep shards_40001|grep -Po '(?<=\"\[).*?(?=\]\")'|grep -Po '(?<=\[).*?(?=\])'" %(port)).read().strip().replace("\n", " ")
all_ip = mongos + ' ' + config + ' ' + shards
print all_ip
# Closing remarks
n = 1
for i in range(20,14,-1):print(' '*i+'*'*n)n = n + 2
n = 11
for i in range(15,19):print(' '*i+'*'*n)n = n - 2
for i in range(3):print(' '*19+'*'*1+' '+'*'*1)
print(' '*20+'*'*1)
s = "[ MongoDB ]"
x = '★★★'
print('\033[1;33;40m%s\033[0m''分片集群已经部署完成''\033[1;34;40m%s\033[0m''~ 集群重启中~' %(s,x))
print('MongoDB集群密码在日志里-_- mongodb_password')
if account_verify == 1:os.system("sh cluster_add_security_key.sh \'%s\' \'%s\' \'%s\' \'%s\' %s " %(mongos,config,shards,all_ip,passw))
elif account_verify == 0:exit()

mongo_mutil.sh

#!/bin/bash#shardid=1
vers='4.4.18'
dataroot='/data'
passw=$3function  install_shard(){IFS='|' read -ra elements <<< "$1"for ip in "${elements[@]}"; do{ipp=$(ping `hostname` -c 1|grep PING|grep -Po '(?<=\().*?(?=\))'|grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|head -n 1)if [ "$ipp" == "$ip" ];thensh  mongodb_install.sh $2 $3 $4elif [ "$ipp" != "$ip" ];thenshardnamen='rsshd'$4shardnamey=$(grep replSetName mongodb_install.sh|cut -d':' -f2|grep -Po '(?<=\").*?(?=\")'|tail -n1)sed -i "s|$shardnamey|$shardnamen|g" mongodb_install.shsshpass -p $5  ssh  root@${ip} -o StrictHostKeyChecking=no "if [ ! -d $2 ];then  mkdir $2;fi"sshpass -p $5 scp mongodb_install.sh mongodb-linux-x86_64-rhel70-$3.tgz  root@${ip}:$2echo '副本集节点传入shards '$4sshpass -p $5  ssh  root@${ip} -o StrictHostKeyChecking=no "cd $2;sh  mongodb_install.sh $2 $3 $4"fiecho 'install mongod ......'} &donewait
}function  install_config(){IFS='|' read -ra elements <<< "$1"for ip in "${elements[@]}"; do{ipp=$(ping `hostname` -c 1|grep PING|grep -Po '(?<=\().*?(?=\))'|grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|head -n 1)if [ "$ipp" == "$ip" ];thensh config_install.sh $2 $3elif [ "$ipp" != "$ip" ];thensshpass -p $4  ssh  root@${ip} -o StrictHostKeyChecking=no "if [ ! -d $2 ];then  mkdir $2;fi"sshpass -p $4  scp config_install.sh mongodb-linux-x86_64-rhel70-$3.tgz  root@${ip}:$2sshpass -p $4  ssh  root@${ip} -o StrictHostKeyChecking=no "cd $2;sh  config_install.sh $2 $3"fiecho 'install config ......'} &donewait
}function  install_mongos(){IFS='|' read -ra elements <<< "$1"for ip in "${elements[@]}"; do{ipp=$(ping `hostname` -c 1|grep PING|grep -Po '(?<=\().*?(?=\))'|grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|head -n 1)if [ "$ipp" == "$ip" ];thensh mongos_install.sh $2 $3elif [ "$ipp" != "$ip" ];thensshpass -p $4  ssh  root@${ip} -o StrictHostKeyChecking=no "if [ ! -d $2 ];then  mkdir $2;fi"sshpass -p $4 scp mongos_install.sh mongodb-linux-x86_64-rhel70-${vers}.tgz  root@${ip}:$2sshpass -p $4  ssh  root@${ip} -o StrictHostKeyChecking=no "cd $2;sh mongos_install.sh $2 $3"fiecho 'install mongos ......'} &donewait
}if [ "$2" == 1 ];then # mongodips=`echo $1|sed 's/ /|/g'`rss=$4install_shard $ips ${dataroot} ${vers} ${rss} ${passw}
elif [ "$2" == 2 ];then # configips=`echo $1|sed 's/ /|/g'`install_config $ips ${dataroot} ${vers} ${passw}elif [ "$2" == 3 ];then # mongosips=`echo $1|sed 's/ /|/g'`install_mongos $ips ${dataroot} ${vers} ${passw}
fi

mongodb_install.sh

#!/bin/bash# /data/mongodb /{data,logs,conf}dataroot=$1
ver=$2
shardid=$3
setip='0.0.0.0'
if [ $# -ne 3 ];thenecho "Error: please use $0 dataroot ver shardid"exit 1
fi
addcmd(){
addText=$1
file=$2
#判断 file.sh 文件中是否存在该字符串 # Check whether the character string exists in the file.sh file
if ! grep "$addText" $file  >/dev/null
then
#不存在,添加字符串 # Does not exist, add a stringecho $addText >> $file
else
#存在,不做处理echo $addText" exist in "$file
fi
}
#wget mongodb-linux-x86_64-rhel70-4.4.18.tgz
tar xzvf mongodb-linux-x86_64-rhel70-$ver.tgz -C /opt
ln -snf /opt/mongodb-linux-x86_64-rhel70-$ver /usr/local/mongodb
basedir='/usr/local/mongodb'
datadir=$dataroot'/mongodb/data'
logdir=$dataroot'/mongodb/logs'# rm $datadir/* -rf
mkdir -p $logdirmkdir ${dataroot}/mongodb/confaddcmd 'export PATH=$PATH:/usr/local/mongodb/bin' ~/.bash_profile
source ~/.bash_profile
groupadd mongodb
useradd -g mongodb mongodb
cat > /usr/lib/systemd/system/mongod_multiple_mongod@.service << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
User=mongodb
Group=mongodb
#EnvironmentFile=-$basedir/etc/default/mongod
ExecStart=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_shard%i.yml
ExecStop=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_shard%i.yml --shutdown
PIDFile=$datadir/%i/mongo_%i.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
i=$shardid
#for ((i=1; i<=j; i++))
#domkdir -p $datadir/shard$iif [ ! -f $basedir/conf/mongo_shard$i.yml ]; thentouch ${dataroot}/mongodb/conf/mongo_shard$i.ymlfiport=`expr $i + 40000`cat > ${dataroot}/mongodb/conf/mongo_shard$i.yml << EOF
systemLog:destination: filepath: "$logdir/mongo_shard$i.log"logAppend: truelogRotate: rename
storage:journal:enabled: truecommitIntervalMs: 162dbPath: "$datadir/shard$i"syncPeriodSecs: 67engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 6
processManagement:fork: false
net:bindIp: $setip#注意修改端口  # Notice Modifying the portport: $port
setParameter:enableLocalhostAuthBypass: true
replication:#复制集名称 # Replication set namereplSetName: "rsshd3"oplogSizeMB: 24576
sharding:#作为分片服务 # As a shard serviceclusterRole: shardsvr
#security:
#  keyFile: "/data/mongodb/conf/keyFile"
#  authorization: enabled
EOF
sed -i "s|`grep cacheSizeGB ${dataroot}/mongodb/conf/mongo_shard$i.yml|sed 's/^[ \t]*//g'`|cacheSizeGB: "$(echo `free -m|grep Mem|awk -F' ' '{print $4}'`*0.85/1000|bc|cut -d'.' -f1)"|g"  ${dataroot}/mongodb/conf/mongo_shard$i.ymlchown -R mongodb:mongodb $dataroot/mongodbchown -R mongodb:mongodb $basedircd $basedirrpath=`pwd -P`chown -R mongodb:mongodb $rpathsystemctl restart mongod_multiple_mongod@$i.servicesystemctl enable mongod_multiple_mongod@$i.service
#done

config_install.sh

#!/bin/bash
# config install
# /data/mongodb /{data,logs,conf}dataroot=$1
ver=$2
setip='0.0.0.0'
addcmd(){
addText=$1
file=$2
#判断 file.sh 文件中是否存在该字符串
#Check whether the character string exists in the file.sh file
if ! grep "$addText" $file  >/dev/null
then
#不存在,添加字符串
# Does not exist, add a stringecho $addText >> $file
else
#存在,不做处理
#Exist, do not processecho $addText" exist in "$file
fi
}
#wget mongodb-linux-x86_64-rhel70-4.4.18.tgz
tar xzvf mongodb-linux-x86_64-rhel70-$ver.tgz -C /opt
ln -snf /opt/mongodb-linux-x86_64-rhel70-$ver /usr/local/mongodb
basedir='/usr/local/mongodb'
datadir=$dataroot'/mongodb'
logdir=$dataroot'/mongodb/logs'# rm $datadir/* -rf
mkdir -p $logdir#mkdir -p ${dataroot}/mongodb/config
mkdir ${dataroot}/mongodb/{conf,config}addcmd 'export PATH=$PATH:/usr/local/mongodb/bin' ~/.bash_profile
source ~/.bash_profile
groupadd mongodb
useradd -g mongodb mongodb
cat > /usr/lib/systemd/system/mongod_multiple_config@.service << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
User=mongodb
Group=mongodb
#EnvironmentFile=-$basedir/etc/default/mongod
ExecStart=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_config.yml
ExecStop=$basedir/bin/mongod --config ${dataroot}/mongodb/conf/mongo_config.yml --shutdown
PIDFile=$datadir/%i/mongo_%i.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reloadif [ ! -f $basedir/conf/mongo_config.yml ]; thentouch ${dataroot}/mongodb/conf/mongo_config.ymlficat > ${dataroot}/mongodb/conf/mongo_config.yml << EOF
systemLog:destination: file
#注意修改路径
#Note the modification pathpath: "$logdir/mongo_config.log"logAppend: true
storage:journal:enabled: true
#注意修改路径
#Note the modification pathdbPath: "$datadir/config"engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 1
processManagement:fork: false
net:bindIp: 0.0.0.0
#注意修改端口
#Notice Modifying the portport: 27017
setParameter:enableLocalhostAuthBypass: true
replication:
#复制集名称
#Replication set namereplSetName: "rscnf"
sharding:
#作为配置服务
#As configuration serviceclusterRole: configsvr
#security:
#  keyFile: "/data/mongodb/conf/keyFile"
#  authorization: enabled
EOF
sed -i "s|`grep cacheSizeGB ${dataroot}/mongodb/conf/mongo_config.yml|sed 's/^[ \t]*//g'`|cacheSizeGB: "$(echo `free -m|grep Mem|awk -F' ' '{print $4}'`*0.85/1000|bc|cut -d'.' -f1)"|g"  ${dataroot}/mongodb/conf/mongo_config.ymlchown -R mongodb:mongodb $dataroot/mongodbchown -R mongodb:mongodb $basedircd $basedirrpath=`pwd -P`chown -R mongodb:mongodb $rpathsystemctl restart mongod_multiple_config@1.servicesystemctl enable mongod_multiple_config@1.service

mongos_install.sh

#!/bin/bash
# config install
# /data/mongodb /{data,logs,conf}dataroot=$1
ver=$2
setip='0.0.0.0'
addcmd(){
addText=$1
file=$2
#判断 file.sh 文件中是否存在该字符串  # Check whether the character string exists in the file.sh file
if ! grep "$addText" $file  >/dev/null
then
#不存在,添加字符串  # Does not exist, add a stringecho $addText >> $file
else
#存在,不做处理 # Exist, do not processecho $addText" exist in "$file
fi
}
#wget mongodb-linux-x86_64-rhel70-4.4.18.tgz
tar xzvf mongodb-linux-x86_64-rhel70-$ver.tgz -C /opt
ln -snf /opt/mongodb-linux-x86_64-rhel70-$ver /usr/local/mongodb
basedir='/usr/local/mongodb'
datadir=$dataroot'/mongodb'
logdir=$dataroot'/mongodb/logs'# rm $datadir/* -rf
mkdir -p $logdir#mkdir -p ${dataroot}/mongodb/config
mkdir ${dataroot}/mongodb/confaddcmd 'export PATH=$PATH:/usr/local/mongodb/bin' ~/.bash_profile
source ~/.bash_profile
groupadd mongodb
useradd -g mongodb mongodb
cat > /usr/lib/systemd/system/mongod_multiple_mongos@.service << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
User=mongodb
Group=mongodb
#EnvironmentFile=-$basedir/etc/default/mongod
ExecStart=$basedir/bin/mongos --config ${dataroot}/mongodb/conf/mongo_route.yml
ExecStop=$basedir/bin/mongos --config ${dataroot}/mongodb/conf/mongo_route.yml --shutdown
PIDFile=$datadir/%i/mongo_%i.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for mongod as specified in
# https://docs.mongodb.com/manual/reference/ulimit/#recommended-ulimit-settings[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reloadif [ ! -f $basedir/conf/mongo_route.yml ]; thentouch ${dataroot}/mongodb/conf/mongo_route.ymlficat > ${dataroot}/mongodb/conf/mongo_route.yml << EOF
systemLog:destination: file
#  注意修改路径  # Note the modification pathpath: "/data/mongodb/logs/mongo_route.log"logAppend: true
processManagement:fork: false
net:bindIp: 0.0.0.0
#  注意修改端口 # Notice Modifying the portport: 30000
setParameter:enableLocalhostAuthBypass: true
replication:localPingThresholdMs: 15
sharding:
#  关联配置服务  # Associated configuration serviceconfigDB: rscnf/1x2.x1.2x8.177:27017,1x2.x1.2x8.139:27017,1x2.x1.2x8.95:27017
#security:
#  keyFile: "/data/mongodb/conf/keyFile"
EOFcat >  /root/.mongorc.js << EOF
//host=db.serverStatus().host;
host=\``hostname`\`
cmdCount=1;
prompt=function(){
return db+"@"+host+" "+(cmdCount++) +">";
}function showDate(){var today = new Date();
var year = today.getFullYear() + "年";
var month = (today.getMonth() +1) + "月";
var date = today.getDate() + "日";
var week = '星期' + today.getDay();
var quarter = "一年中的第" + Math.floor((today.getMonth() +3) / 3) + "个季度";var text = "[ 欢迎回来,今天是" + year + month + date  + week +"," + quarter + "。]";
print(text);}showDate();
EOFchown -R mongodb:mongodb $dataroot/mongodbchown -R mongodb:mongodb $basedircd $basedirrpath=`pwd -P`chown -R mongodb:mongodb $rpathsystemctl restart mongod_multiple_mongos@1.servicesystemctl enable mongod_multiple_mongos@1.service

部署效果:
在这里插入图片描述

本文章为原创,github地址 https://github.com/gg2038/mongo-sharding-install

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920104.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go-redis库使用总结

文章目录1. 概述与特性2. 安装与初始化2.1 安装2.2 初始化3 基本使用模式3.1 单实例客户端3.2 连接池与自动重连4. 常用 Redis 数据结构操作4.1 字符串&#xff08;String&#xff09;4.2 哈希&#xff08;Hash&#xff09;4.3 列表&#xff08;List&#xff09;4.4 集合&#…

【软件设计模式】策略模式

1.概念策略&#xff08;Strategy&#xff09;模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。策略模式属于行为型设计模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责…

Mac电脑英特尔版本最新系统15.6.1安装php环境

Mac电脑安装php环境 版本环境&#xff1a; 2025-08-22 14:09:19 安装 最新系统15.6.1系统&#xff1a; 新版本的mac不带php环境&#xff0c;需要自己 安装 brew install php8.3 启动说明 查看 . 使用官方方法安装 NVM curl -o- https://raw.githubusercontent.com/nvm-sh/…

Android焦点窗口变化导致遥控键值监听失效问题分析

最近在做语音全局控制Android系统功能&#xff0c;通过集成第三方语音识别sdk得到相关控制指令&#xff0c;然后将指令通过进程间通信传递给当前应用并作出响应。有很多通用指令&#xff0c;比如播放/暂停&#xff0c;Android系统本身就有全局控制指令&#xff1a;KeyEvent.KEY…

降本增效:基于 JavaScript 的 AI 编程 IDE 上下文压缩优化方案

降本增效&#xff1a;基于 JavaScript 的 AI 编程 IDE 上下文压缩优化方案 在当前 AI 辅助编程&#xff08;AI Pair Programming&#xff09;日益普及的背景下&#xff0c;开发者越来越依赖如 GitHub Copilot、Tabnine、CodeLlama 等智能编码工具。然而&#xff0c;一个普遍存在…

DataX HdfsWriter 插件文档

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/…

Rancher 管理的 K8S 集群中部署常见应用(MySQL、Redis、RabbitMQ)并支持扩缩容的操作

文章目录一、前提条件二、准备镜像三、进入 Rancher UI 部署3.1. 进入 Workloads3.2. 部署 MySQL3.3. 部署 Redis3.4. 部署 RabbitMQ四、验证服务五、扩缩容&#xff08;UI 操作&#xff09;六、附录yml部署文件6.1. mysql.yaml6.2. redis.yaml6.3. rabbitmq.yaml一、前提条件 …

8.21-8.22网络编程——词典

文章目录一、思维导图二、词典1、服务器2、客户端3、现象三、牛客网刷题一、思维导图 二、词典 1、服务器 #include <myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.116.128" //服务器IP地址 //账户密码结构 typedef s…

ffmpeg测试rtsp地址

ffmpeg可以用 ffmpeg 通过 tcp协议/udp协议传输流到 null设备&#xff0c;ffmpeg \-rtsp_transport tcp \ # 使用TCP协议传输RTSP流-timeout 5000000 \ # 设置超时时间为5000000微秒&#xff08;5秒&#xff09;-i "rtsp://admin:admin123192.168.1.…

Apache Commons Math_Java科学计算的利器

1. 引言 1.1 科学计算在现代软件开发中的重要性 随着大数据、人工智能和科学计算需求的不断增长,科学计算能力已成为现代软件开发不可或缺的重要组成部分。从金融风险评估到工程仿真,从数据分析到机器学习,科学计算在各行各业中发挥着关键作用。 科学计算涉及复杂的数学运…

Python爬虫框架设计:类封装与工程化实践​

实战中的UA轮换技巧 import fake_useragent import random class DynamicHeader: def init(self): self.ua_generator fake_useragent.UserAgent() # 注意&#xff1a;实际使用需更新数据路径 self.fingerprints [“chrome125”, “edge115”, “safari17”] # 2025年主流指…

5G 三卡图传终端:公安执法的 “移动可视化指挥中枢”

前言 在公安执法中&#xff0c;“实时取证、高效指挥、安全协同” 是破解现场复杂局面的核心需求。传统执法设备常因传输卡顿、证据存证难、跨警种信息断层等问题影响执法效能&#xff0c;而 5G 便携式多卡高清视频融合终端凭借多网聚合、高清编码、安全存储等特性&#xff0c;…

R语言rbind()和cbind()使用

rbind&#xff1a;r row&#xff08;行&#xff09;cbind&#xff1a;c column&#xff08;列&#xff09; 核心区别方向 • rbind&#xff1a;纵向&#xff08;按行&#xff09;堆叠&#xff0c;行数相加。 • cbind&#xff1a;横向&#xff08;按列&#xff09;拼接&#…

【Linux】开发工具命令指南:深度解析Vim的使用操作

欢迎各位佬进行交流&#xff0c;我们一起无限进步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录Vim&#xff1a;多模式高效文本编辑器1. 初次体验 Vim2. Vim 核心工作模式&#xff08;…

【Day 12】73.矩阵置零

文章目录73.矩阵置零题目&#xff1a;思路&#xff1a;方法一&#xff1a;用两个标记数组&#xff08;易理解&#xff0c;额外空间 O(mn)&#xff09;思路&#xff08;直观&#xff09;举例&#xff08;[[1,1,1],[1,0,1],[1,1,1]]&#xff09;优缺点代码实现&#xff08;Go&…

Clustering Enabled Wireless Channel Modeling Using Big Data Algorithms

文章目录Clustering TechniquesPartitioning-Based AlgorithmsDensity-Based AlgorithmsHierarchical-based algorithmsClustering Enabled Channel ModelingCluster-Based Channel ModelsClustering AlgorithmsClustering Techniques 聚类是一种已被广泛用于数据分析的技术。…

基于「多模态大模型 + BGE向量检索增强RAG」的儿童绘画心理健康分析系统(vue+flask+AI算法)

一、项目演示视频 基于「多模态大模型 BGE向量检索增强RAG」的儿童绘画心理健康分析系统(vueflaskAI算法)二、技术栈 前端技术栈 (web-vue) 核心框架: Vue 3.5.13 (Composition API) UI组件库: Element Plus 2.9.4 状态管理: Pinia 2.3.1 路由管理: Vue Router 4.5.0 HTTP客户…

QML中的Component

目录 &#x1f9e0; 核心概念&#xff1a;什么是 Component&#xff1f; &#x1f4ca; Component 的两种主要形式 1. 内联 Component&#xff08;在 QML 文件内部定义&#xff09; 2. 外部 Component&#xff08;单独的 .qml 文件&#xff09; &#x1f3af; Component 的…

什么是模型训练中的 特征提取,如何对光伏发电预测中的特征进行提取

&#x1f50d; 什么是模型训练中的“特征提取” 定义&#xff1a;特征提取是从原始数据中提炼出对预测或分类最有用的信息的过程。它的目标是去掉冗余和噪声&#xff0c;保留能最好反映数据规律的特征。 作用&#xff1a; 降低数据维度&#xff0c;减少计算量 提高模型的泛化…

Linux应急响应一般思路(三)

日志分析Linux日志分析Linux日志类型大致可以分为三类&#xff0c;内核和系统日志、用户日志、应用日志内核和系统日志&#xff1a;这种日志主要由syslog管理、根据其配置文件/etc/syslog.conf中的设置决定内核消息和各种系统程序信息记录到哪个位置用户日志&#xff1a;用户日…