1.系统基础配置

下面的命令默认都使用root用户进行操作,操作系统为Centos7,mongodb3.6.x以上版本

1.1 修改系统配置文件/etc/security/limits.conf和/etc/profile

修改/etc/security/limits.conf持久化设置允许用户/进程打开文件句柄数,这一步需要重启系统,不然不起作用

* soft nofile 1048576

* hard nofile 1048576

* soft nproc 524288

* hard nproc 524288

修改/etc/profile,在最后添加ulimit -s 1024,然后保存并source /etc/profile

1.2 关闭每台机器的防火墙

Centos7以下命令:

chkconfig iptables off && service iptables stop

使用命令查看chkconfig --list 是否设置自动启动为关闭

Centos7以上命令:

systemctl stop firewalld

systemctl is-enabled firewalld

1.3 每台机器修改/etc/hosts和hostname

在/etc/hosts添加集群所有的ip及对应的hostname

注意:配置的ip数与选择的模板相关联

1.4 机器之间配置ssh免密登录

每台机器分别执行下面命令,这里以5台机器为准:

ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa

ssh-copy-id node1

ssh-copy-id node2

ssh-copy-id node3

ssh-copy-id node4

ssh-copy-id node5

1.5 检测自动化部署所需的命令是否可用

ifconfig、ssh需要可用

需要安装numactl,使用rpm -qa | grep numactl查看numactl是否已安装

注意:完成上面5步操作后重启每台机器。重启完毕,使用命令ulimit -a 查看

要保证 open files 对应的值为

Stack size 对应的值为

Max user processes对应的值为

1.6 检查mongodb安装下bin目录和shell目录执行权限

进入到shell目录,执行chmod +x auto*加执行权限

进入mongodb的bin目录,执行chmod +x ./*加执行权限

2.MongoDB 一键化部署

2.1 一键化部署shell文件介绍

shell脚本文件目前放置在mongodb的安装目录下:

⑪config.properties,配置文件,包括mongodb安装目录、mongoCluster集群安装目录、所需主机、数据库等等。如图:

上图几个参数可能需要随环境不同而修改。

说明:

ips=192.168.187.201, 192.168.187.202, 192.168.187.203, 192.168.187.204, 192.168.187.205

这里默认192.168.187.201为mongdb集群的节点node1,192.168.187.202为mongdb集群的节点node2,192.168.187.203为mongdb集群的节点node3,192.168.187.204为mongdb集群的节点node4,,192.168.187.205为mongdb集群的节点node5。

template与ips的ip数量对应,ips的ip数为5,则意味着采用5台机器的模板,这里默认为5。

⑬template 目录包括3.conf、4.conf和5.conf,为mongodb3台机器、4台机器和5台机器安装模板,有需要者可以自行修改模板。

3.conf 3台机器分配的mongodb节点模板为

  1. #所有mongo节点
  2. nodes=config,shard1,shard2,shard3,mongos
  3. #机器分配到的mongo节点
  4. node1=mongos,config,shard1,shard2,shard3
  5. node2=mongos,config,shard1,shard2,shard3
  6. node3=mongos,config,shard1,shard2,shard3
  7. #mongo节点分配到的机器,注意shard部分排在第一的为master,第二为secondary,第三位arbitery
  8. config=node1,node2,node3
  9. mongos=node1,node2,node3
  10. shard1=node1,node2,node3
  11. shard2=node2,node3,node1
  12. shard3=node3,node2,node1
  13. #mongo节点端口
  14. config_port=29040
  15. mongos_port=29050
  16. shard1_port=29010
  17. shard2_port=29020
  18. shard3_port=29030

注意:这里的node1、node2、node3不是机器hostname(当然也可以以这种node1、node2方式去命名hostname),只是机器ip的代名称,因为不同开发环境中的ip总是不同的,所以使用node1、node2...去代替变化的ip。这里的node1、node2、node3默认与config.properties中的ips属性对应,即ips中的第一个ip默认为node1,第二个ip默认为node2,第三个ip默认为node3,4.conf和5.conf类同。查看下图,可以清晰看到mongodb分布的节点:

4.conf 4台机器分配mongodb节点的模版为

  1. #所有mongo节点
  2. nodes=config,shard1,shard2,shard3,shard4,mongos
  3. #机器分配到的mongo节点
  4. node1=mongos,shard1,shard3,shard4
  5. node2=mongos,config,shard1,shard2,shard4
  6. node3=mongos,config,shard1,shard2,shard3
  7. node4=config,shard2,shard3,shard4
  8. #mongo节点分配到的机器,注意shard部分排在第一的为master,第二为secondary,第三位arbitery
  9. config=node2,node3,node4
  10. mongos=node1,node2,node3
  11. shard1=node1,node2,node3
  12. shard2=node2,node3,node4
  13. shard3=node3,node4,node1
  14. shard4=node4,node1,node2
  15. #mongo节点端口
  16. config_port=29040
  17. mongos_port=29050
  18. shard1_port=29000
  19. shard2_port=29010
  20. shard3_port=29020
  21. shard4_port=29030

5.conf 5台机器分配mongodb节点的模版为

  1. #所有mongo节点
  2. nodes=config,shard1,shard2,shard3,shard4,shard5,mongos
  3. #机器分配到的mongo节点
  4. node1=mongos,shard1,shard4,shard5
  5. node2=mongos,shard1,shard2,shard5
  6. node3=config,shard1,shard2,shard3
  7. node4=config,shard2,shard3,shard4
  8. node5=config,shard3,shard4,shard5
  9. #mongo节点分配到的机器, 注意shard部分排在第一的为master,第二为secondary,第三位arbitery
  10. config=node3,node4,node5
  11. mongos=node1,node2
  12. shard1=node1,node2,node3
  13. shard2=node2,node3,node4
  14. shard3=node3,node4,node5
  15. shard4=node4,node5,node1
  16. shard5=node5,node1,node2
  17. #mongo节点端口
  18. config_port=29040
  19. mongos_port=29050
  20. shard1_port=29060
  21. shard2_port=29070
  22. shard3_port=29080
  23. shard4_port=29090
  24. shard5_port=29100

模板需要配置的几项内容:

  • mongodb所有节点
  • 每台机器分配的mongodb节点
  • 每个mongodb节点分配的机器
  • mongo节点的端口

如有需要,可自行配置6、7或者更多的机器分配mongo模板

①autoCheckLive.sh脚本为创建所在服务器对应的mongodb的进程存活监控,不存在则自动拉起。

  1. #! /bin/bash
  2.  
  3. #shell目录的绝对路径
  4. shellPath=$
  5. configPath=$shellPath/config.properties
  6. #从config.properties文件读取数据出来
  7. clusterPath=`awk -F= -v k=clusterPath '{ if ( $1 == k ) print $2; }' $configPath`
  8. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  9. templatePath=$shellPath/template/$template.conf
  10.  
  11. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  12. #ip数组
  13. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  14. #本地ip
  15. localIp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:"`
  16.  
  17. suffix=""
  18. #判断linux系统cpu是否为numa架构,如果是则传回_numa,禁用numactl
  19. numaCount=`grep -i numa /var/log/dmesg | wc -l`
  20. nodeCount=`grep -i numa /var/log/dmesg | grep -wi "node" | wc -l`
  21. offCount=`grep -i numa /var/log/dmesg | grep -wi "numa=off" | wc -l`
  22. if [[ ($numaCount -gt ) && ($nodeCount -gt ) && ($offCount -eq ) ]]
  23. then
  24. suffix="_numa"
  25. fi
  26.  
  27. #遍历ip数组
  28. for((i=; i<=${#ipArray[@]}; i++))
  29. do
  30. #获取本地ip在模板中的代称号,根据本地ip所在ip数组中的下标数字获取
  31. if [[ $localIp = ${ipArray[i]} ]]
  32. then
  33. #获取模板中本地ip对应的代称号所拥有的mongo节点
  34. mongodbNodes=`awk -F= -v k=node$i '{ if ( $1 == k ) print $2; }' $templatePath`
  35. eval $(echo $mongodbNodes | awk '{split($0, mongodbArr, ","); for(y in mongodbArr) print "mongodbArray["y"]="mongodbArr[y]}')
  36. for n in ${mongodbArray[*]}
  37. do
  38. pid=`cat $clusterPath/$n/pid/$n.pid`
  39. #判断是否存活
  40. count=`ps -ef | grep $pid | grep -v grep | wc -l`
  41. #程序挂掉啦,启动
  42. if [ $count -eq ];then
  43. cd $shellPath && $shellPath/autoStartUp.sh $n$suffix
  44. fi
  45. done
  46. fi
  47. done

②autoClusterClose.sh脚本为mongodb集群关闭脚本,用法:./autoClusterClose.sh shutdown或者./autoClusterClose.sh kill,这里建议使用shutdown方式关闭。

  1. #! /bin/bash
  2.  
  3. configPath=config.properties
  4. #mongodb的安装目录
  5. mongodb_home=`awk -F= -v k=mongodbHome '{ if ( $1 == k ) print $2; }' $configPath`
  6. #mongodb集群安装目录
  7. clusterPath=`awk -F= -v k=clusterPath '{ if ( $1 == k ) print $2; }' $configPath`
  8. #所采用的安装模板
  9. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  10. #模板所在的位置
  11. templatePath=template/$template.conf
  12. user=`awk -F= -v k=user '{ if ( $1 == k ) print $2; }' $configPath`
  13. localIp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:"`
  14.  
  15. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  16. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  17.  
  18. #获取所有的配置、路由、分片
  19. nodes=`awk -F= -v k=nodes '{ if ( $1 == k ) print $2; }' $templatePath`
  20. eval $(echo $nodes | awk '{split($0, nodeArr, ","); for(i in nodeArr) print "nodeArray["i"]="nodeArr[i]}')
  21.  
  22. #查看/etc/crontab是否开启定时任务,有则关闭
  23. for((i=; i<=${#ipArray[@]}; i++))
  24. do
  25. if [[ $localIp = ${ipArray[i]} ]]
  26. then
  27. #kill本地的mongod、mongos
  28. echo "*****close ${ipArray[i]} 定时任务:日志切割和mongo进程存活监控*****"
  29. $mongodb_home/shell/autoConfig.sh removeCronTask
  30. else
  31. echo "*****close ${ipArray[i]} 定时任务:日志切割和mongo进程存活监控*****"
  32. ssh $user@${ipArray[i]} "cd $mongodb_home/shell && $mongodb_home/shell/autoConfig.sh removeCronTask"
  33. fi
  34. done
  35.  
  36. if [[ $ = "kill" ]]
  37. then
  38. for((i=; i<=${#ipArray[@]}; i++))
  39. do
  40. if [[ $localIp = ${ipArray[i]} ]]
  41. then
  42. #kill本地的mongod、mongos
  43. echo "*****close ${ipArray[i]} mongodb*****"
  44. ps -ef | grep $clusterPath/conf | grep -v grep | cut -c - | xargs kill -
  45. else
  46. echo "*****close ${ipArray[i]} mongodb*****"
  47. ssh $user@${ipArray[i]} "ps -ef | grep $clusterPath/conf | grep -v grep | cut -c 9-15 | xargs kill -2"
  48. fi
  49. done
  50. fi
  51.  
  52. if [[ $ = "shutdown" ]]
  53. then
  54. #.先关闭mongos
  55. #找到mongos对应的机器节点
  56. mongoss=`awk -F= -v k=mongos '{ if ( $1 == k ) print $2; }' $templatePath`
  57. eval $(echo $mongoss | awk '{split($0, mongosArr, ","); for(i in mongosArr) print "mongosArray["i"]="mongosArr[i]}')
  58. for mongosNode in ${mongosArray[*]}
  59. do
  60. #删除node,保留右边字符。下面两句是根据机器节点的代名称数字找到其对应的ip
  61. mongosIpNum=${mongosNode#*node}
  62. mongosIp=${ipArray[$mongosIpNum]}
  63. if [[ $localIp = $mongosIp ]]
  64. then
  65. echo "****************close $mongosIp mongos****************"
  66. ps -ef | grep $clusterPath/conf/mongos.conf | grep -v grep | cut -c - | xargs kill -
  67. else
  68. echo "****************close $mongosIp mongos****************"
  69. ssh $user@$mongosIp "ps -ef | grep $clusterPath/conf/mongos.conf | grep -v grep | cut -c 9-15 | xargs kill -2"
  70. fi
  71. done
  72.  
  73. #.再关闭configs
  74. configs=`awk -F= -v k=config '{ if ( $1 == k ) print $2; }' $templatePath`
  75. eval $(echo $configs | awk '{split($0, configArr, ","); for(i in configArr) print "configArray["i"]="configArr[i]}')
  76. #副本集,先关闭仲裁节点、从节点,最后关闭主节点
  77. for((i=${#configArray[@]}; i>=; i--))
  78. do
  79. configNode=${configArray[i]}
  80. #删除node,保留右边字符
  81. configIpNum=${configNode#*node}
  82. configIp=${ipArray[$configIpNum]}
  83. if [[ $localIp = $configIp ]]
  84. then
  85. echo "****************close $configIp config****************"
  86. $mongodb_home/bin/mongod -f $clusterPath/conf/config.conf --shutdown
  87. else
  88. echo "****************close $configIp config****************"
  89. ssh $user@$configIp "$mongodb_home/bin/mongod -f $clusterPath/conf/config.conf --shutdown"
  90. fi
  91. done
  92.  
  93. #.最后关闭shards
  94. for node in ${nodeArray[*]}
  95. do
  96. if [[ $node =~ "shard" ]]
  97. then
  98. shards=`awk -F= -v k=$node '{ if ( $1 == k ) print $2; }' $templatePath`
  99. eval $(echo $shards | awk '{split($0, shardArr, ","); for(i in shardArr) print "shardArray["i"]="shardArr[i]}')
  100. #副本集,先关闭仲裁节点、从节点,最后关闭主节点
  101. for((i=${#shardArray[@]}; i>=; i--))
  102. do
  103. shardNode=${shardArray[i]}
  104. #删除node,保留右边字符
  105. shardIpNum=${shardNode#*node}
  106. shardIp=${ipArray[$shardIpNum]}
  107. if [[ $localIp = $shardIp ]]
  108. then
  109. echo "****************close $shardIp $node****************"
  110. $mongodb_home/bin/mongod -f $clusterPath/conf/$node.conf --shutdown
  111. else
  112. echo "****************close $shardIp $node****************"
  113. ssh $user@$shardIp "$mongodb_home/bin/mongod -f $clusterPath/conf/$node.conf --shutdown"
  114. fi
  115. done
  116. fi
  117. done
  118. fi

③autoClusterIndex.sh脚本为mongodb集群初始化配置文件和修改系统配置、config和shard副本集以及mongos路由启动并初始化、mongodb集群数据库表分片和基础数据初始化的脚本、添加定时任务。用法:./ autoClusterIndex.sh。使用该脚本,可以全自动化安装mongodb。

  1. #! /bin/bash
  2.  
  3. configPath=config.properties
  4. #从config.properties文件读取数据出来
  5. clusterPath=`awk -F= -v k=clusterPath '{ if ( $1 == k ) print $2; }' $configPath`
  6. mongodb_home=`awk -F= -v k=mongodbHome '{ if ( $1 == k ) print $2; }' $configPath`
  7. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  8. localIp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:"`
  9. user=`awk -F= -v k=user '{ if ( $1 == k ) print $2; }' $configPath`
  10. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  11. templatePath=template/$template.conf
  12. #获取所有的配置、路由、分片
  13. nodes=`awk -F= -v k=nodes '{ if ( $1 == k ) print $2; }' $templatePath`
  14. eval $(echo $nodes | awk '{split($0, nodeArr, ","); for(i in nodeArr) print "nodeArray["i"]="nodeArr[i]}')
  15. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  16.  
  17. #遍历ip数组
  18. for((i=; i<=${#ipArray[@]}; i++))
  19. do
  20. if [[ $localIp = ${ipArray[i]} ]]
  21. then
  22. #.创建mongodbCluster并修改系统配置
  23. echo "********************************start ${ipArray[i]} autoConfig && autoSystemProperties********************************"
  24. $mongodb_home/shell/autoConfig.sh && $mongodb_home/shell/autoSystemProperties.sh
  25. else
  26. #把远程服务器旧的mongodb安装包删除
  27. ssh $user@${ipArray[i]} "rm -rf $mongodb_home"
  28. #把mongodb安装包拷贝到远程服务器
  29. scp -r $mongodb_home $user@${ipArray[i]}:$mongodb_home
  30. echo "********************************start ${ipArray[i]} autoConfig && autoSystemProperties********************************"
  31. ssh $user@${ipArray[i]} "cd $mongodb_home/shell && $mongodb_home/shell/autoConfig.sh && $mongodb_home/shell/autoSystemProperties.sh"
  32. fi
  33. done
  34.  
  35. #.mongodb集群启动config、shard1、shard2、shard3
  36. echo "********************************start mongodb集群启动config、shard1、shard2、shard3********************************"
  37. #不启动mongos,只启动config,shards
  38. $mongodb_home/shell/autoClusterStartUp.sh notmongos
  39.  
  40. #.mongodb集群配置、分片的副本集初始化
  41. echo "********************************start mongodb集群分片和副本集初始化********************************"
  42. $mongodb_home/shell/autoClusterInitSvr.sh cs
  43.  
  44. #.mongodb集群启动mongos
  45. echo "********************************start mongodb集群mongos********************************"
  46. mongoss=`awk -F= -v k=mongos '{ if ( $1 == k ) print $2; }' $templatePath`
  47. eval $(echo $mongoss | awk '{split($0, mongosArr, ","); for(i in mongosArr) print "mongosArray["i"]="mongosArr[i]}')
  48. for mongosNode in ${mongosArray[*]}
  49. do
  50. #删除node,保留右边字符
  51. mongosIpNum=${mongosNode#*node}
  52. mongosIp=${ipArray[$mongosIpNum]}
  53. if [[ $localIp = $mongosIp ]]
  54. then
  55. echo "****************start $mongosIp mongos****************"
  56. $mongodb_home/shell/autoStartUp.sh mongos
  57. else
  58. echo "****************start $mongosIp mongos****************"
  59. ssh $user@$mongosIp "cd $mongodb_home/shell && ./autoStartUp.sh mongos"
  60. fi
  61. done
  62.  
  63. #.mongodb集群mongos初始化
  64. echo "********************************start mongodb集群mongos初始化********************************"
  65. $mongodb_home/shell/autoClusterInitSvr.sh mongos
  66.  
  67. #.mongodb集群数据库表分片和初始化
  68. echo "********************************start mongodb集群数据库表分片和初始化********************************"
  69. $mongodb_home/shell/autoClusterShardedAndInitDB.sh
  70.  
  71. #.mongodb集群配置定时任务:日志每天切割,保留7天日志/每隔10分钟监控mongo进程是否存活,不存活则自动拉起
  72. for((i=; i<=${#ipArray[@]}; i++))
  73. do
  74. if [[ $localIp = ${ipArray[i]} ]]
  75. then
  76. echo "******************************** ${ipArray[i]} 添加定时任务:日志切割和mongo存活监控 ********************************"
  77. $mongodb_home/shell/autoConfig.sh addCronTask
  78. else
  79. echo "******************************** ${ipArray[i]} 添加定时任务:日志切割和mongo存活监控 ********************************"
  80. ssh $user@${ipArray[i]} "cd $mongodb_home/shell && $mongodb_home/shell/autoConfig.sh addCronTask"
  81. fi
  82. done

④autoClusterInitSvr.sh脚本为mongodb集群config、shard和mongos初始化脚本。用法:./autoClusterInitSvr.sh cs,初始化config和shard副本集配置;./autoClusterInitSvr.sh mongos,初始化mongos路由配置。

  1. #! /bin/bash
  2.  
  3. configPath=config.properties
  4.  
  5. mongodb_home=`awk -F= -v k=mongodbHome '{ if ( $1 == k ) print $2; }' $configPath`
  6. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  7. templatePath=template/$template.conf
  8. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  9. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  10.  
  11. #获取所有的配置、路由、分片
  12. nodes=`awk -F= -v k=nodes '{ if ( $1 == k ) print $2; }' $templatePath`
  13. eval $(echo $nodes | awk '{split($0, nodeArr, ","); for(i in nodeArr) print "nodeArray["i"]="nodeArr[i]}')
  14. param=$
  15.  
  16. if [[ $param = "cs" ]]
  17. then
  18. #自动化设置配置副本集
  19. config_numbers=""
  20. ccount=
  21. config_port=`awk -F= -v k=config_port '{ if ( $1 == k ) print $2; }' $templatePath`
  22. configs=`awk -F= -v k=config '{ if ( $1 == k ) print $2; }' $templatePath`
  23. eval $(echo $configs | awk '{split($0, configArr, ","); for(i in configArr) print "configArray["i"]="configArr[i]}')
  24. configMasterNode=${configArray[]}
  25. echo "configMasterNode: $configMasterNode"
  26. #删除node,保留右边字符
  27. configMasterIpNum=${configMasterNode#*node}
  28. #echo "configMasterIpNum: $configMasterIpNum"
  29. configMasterIp=${ipArray[$configMasterIpNum]}
  30. #echo "configMasterIp: $configMasterIp"
  31. for((i=; i<=${#configArray[@]}; i++))
  32. do
  33. configNode=${configArray[i]}
  34. #删除node,保留右边字符
  35. configIpNum=${configNode#*node}
  36. config_numbers=$config_numbers"{_id : $ccount, host : '${ipArray[$configIpNum]}:$config_port'},"
  37. ccount=`expr $ccount + `
  38. done
  39. #删除最后一个,保留左边字符
  40. echo "********************************设置config副本集********************************"
  41. config_numbers=${config_numbers%,*}
  42. echo $config_numbers
  43. $mongodb_home/bin/mongo $configMasterIp:$config_port/admin << EOF
  44. config = {_id : "configs", members : [ $config_numbers ] };
  45. rs.initiate(config);
  46. EOF
  47.  
  48. #自动化设置分片shard副本集
  49. for node in ${nodeArray[*]}
  50. do
  51. if [[ $node =~ "shard" ]]
  52. then
  53. shard_numbers=""
  54. shardMasterIp=""
  55. scount=
  56. shard_port=`awk -F= -v k=$node"_port" '{ if ( $1 == k ) print $2; }' $templatePath`
  57. shards=`awk -F= -v k=$node '{ if ( $1 == k ) print $2; }' $templatePath`
  58. eval $(echo $shards | awk '{split($0, shardArr, ","); for(i in shardArr) print "shardArray["i"]="shardArr[i]}')
  59. for((i=; i<=${#shardArray[@]}; i++))
  60. do
  61. shardNode=${shardArray[i]}
  62. #echo "shardNode: $shardNode"
  63. #删除node,保留右边字符
  64. shardIpNum=${shardNode#*node}
  65. #echo "shardIpNum: $shardIpNum"
  66. if [[ $scount = ]]
  67. then
  68. shardMasterIp=${ipArray[$shardIpNum]}
  69. shard_numbers=$shard_numbers"{_id : $scount, host : '${ipArray[$shardIpNum]}:$shard_port', priority : 2},"
  70. fi
  71. if [[ $scount = ]]
  72. then
  73. shard_numbers=$shard_numbers"{_id : $scount, host : '${ipArray[$shardIpNum]}:$shard_port', priority : 1},"
  74. fi
  75. if [[ $scount = ]]
  76. then
  77. shard_numbers=$shard_numbers"{_id : $scount, host : '${ipArray[$shardIpNum]}:$shard_port', arbiterOnly : true}"
  78. fi
  79. scount=`expr $scount + `
  80. done
  81. #echo "shard_numbers: $shard_numbers"
  82. echo "********************************设置$node副本集********************************"
  83. $mongodb_home/bin/mongo $shardMasterIp:$shard_port/admin << EOF
  84. config = {_id : "$node", members : [ $shard_numbers ] };
  85. rs.initiate(config);
  86. EOF
  87. fi
  88. done
  89. fi
  90.  
  91. if [[ $param = "mongos" ]]
  92. then
  93. #自动化设置路由分片
  94. mongos_numbers=""
  95. mongos_port=`awk -F= -v k=mongos_port '{ if ( $1 == k ) print $2; }' $templatePath`
  96. mongoss=`awk -F= -v k=mongos '{ if ( $1 == k ) print $2; }' $templatePath`
  97. eval $(echo $mongoss | awk '{split($0, mongosArr, ","); for(i in mongosArr) print "mongosArray["i"]="mongosArr[i]}')
  98. mongosNode=${mongosArray[]}
  99. #删除node,保留右边字符
  100. mongosIpNum=${mongosNode#*node}
  101. mongosIp=${ipArray[$mongosIpNum]}
  102. for node in ${nodeArray[*]}
  103. do
  104. if [[ $node =~ "shard" ]]
  105. then
  106. shard_numbers=""
  107. shard_port=`awk -F= -v k=$node"_port" '{ if ( $1 == k ) print $2; }' $templatePath`
  108. shards=`awk -F= -v k=$node '{ if ( $1 == k ) print $2; }' $templatePath`
  109. eval $(echo $shards | awk '{split($0, shardArr, ","); for(i in shardArr) print "shardArray["i"]="shardArr[i]}')
  110. for((i=; i<=${#shardArray[@]}; i++))
  111. do
  112. shardNode=${shardArray[i]}
  113. #删除node,保留右边字符
  114. shardIpNum=${shardNode#*node}
  115. shardIp=${ipArray[$shardIpNum]}
  116. shard_numbers=$shard_numbers$shardIp:$shard_port","
  117. done
  118. shard_numbers=${shard_numbers%,*}
  119. echo "mongos add $node shard_numbers:"$shard_numbers
  120. echo "********************************添加mongos分片$node********************************"
  121. $mongodb_home/bin/mongo $mongosIp:$mongos_port/admin << EOF
  122. sh.addShard("$node/$shard_numbers");
  123. EOF
  124. fi
  125. done
  126. $mongodb_home/bin/mongo $mongosIp:$mongos_port/admin << EOF
  127. sh.status();
  128. EOF
  129. fi

上述代码实现的config、shards以及mongos配置内容如下:

config副本集配置,参考示例:

> config = {

...      _id : "configs",

...      members : [

...         {_id : 0, host : "192.168.187.203:29040"},

...         {_id : 1, host : "192.168.187.204:29040"},

...         {_id : 2, host : "192.168.187.205:29040"}

...      ]

... }

> rs.initiate(config)

shards副本集配置,参考示例:

> config = {

...      _id : "shard1",

...      members : [

...         {_id : 0, host : "192.168.187.201:29060",priority:2},

...         {_id : 1, host : "192.168.187.202:29060",priority:1},

...         {_id : 2, host : "192.168.187.203:29060", arbiterOnly : true}

...      ]

... }

> rs.initiate(config)

这里默认,第一个ip的优先级为2,第二个ip的优先级为1,第三个ip为仲裁节点,所以第一个ip为primary主节点,第二位secondary从节点,第三个只参与投票,shard1根据分片的数据变化为shard2、shard3、shard4、shard5等等。

mongos配置内容为添加shards,参考示例为:

sh.addShard("shard1/192.168.187.201:29060,192.168.187.202:29060,192.168.187.203:29060")

sh.addShard("shard2/192.168.187.202:29070,192.168.187.203:29070,192.168.187.204:29070")

sh.addShard("shard3/192.168.187.203:29080,192.168.187.204:29080,192.168.187.205:29080")

sh.addShard("shard4/192.168.187.204:29090,192.168.187.205:29090,192.168.187.201:29090")

sh.addShard("shard5/192.168.187.205:29100,192.168.187.201:29100,192.168.187.202:29100")

sh.status() #参考分片的情况是否添加上

⑤autoClusterShardedAndInitDB.sh 脚本为指定数据库testDB1、testDB2、testDB3及其数据库表分片。

  1. #! /bin/bash
  2.  
  3. configPath=config.properties
  4.  
  5. mongodb_home=`awk -F= -v k=mongodbHome '{ if ( $1 == k ) print $2; }' $configPath`
  6. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  7. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  8. templatePath=template/$template.conf
  9. mongoss=`awk -F= -v k=mongos '{ if ( $1 == k ) print $2; }' $templatePath`
  10. testDB1=`awk -F= -v k=testDB1 '{ if ( $1 == k ) print $2; }' $configPath`
  11. testDB2=`awk -F= -v k=testDB2 '{ if ( $1 == k ) print $2; }' $configPath`
  12. testDB3=`awk -F= -v k=testDB3 '{ if ( $1 == k ) print $2; }' $configPath`
  13.  
  14. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  15. eval $(echo $mongoss | awk '{split($0, mongosArr, ","); for(i in mongosArr) print "mongosArray["i"]="mongosArr[i]}')
  16.  
  17. for mongosNode in ${mongosArray[*]}
  18. do
  19. #删除node,保留右边字符
  20. mongosIpNum=${mongosNode#*node}
  21. mongosIp=${ipArray[$mongosIpNum]}
  22. #指定数据库分片生效
  23. $mongodb_home/bin/mongo $mongosIp:/admin << EOF
  24. db.runCommand({enablesharding : "$testDB1"});
  25. db.runCommand({shardcollection : "$testDB1.account", key : {_id : "hashed"}});
  26. db.runCommand({shardcollection : "$testDB1.alarm", key : {_id : "hashed"}});
  27. db.runCommand({shardcollection : "$testDB1.blackClass", key : {_id : "hashed"}});
  28. db.runCommand({enablesharding : "$testDB2"});
  29. db.runCommand({shardcollection : "$testDB2.device", key : {_id : "hashed"}});
  30. db.runCommand({shardcollection : "$testDB2.deviceParam", key : {_id : "hashed"}});
  31. db.runCommand({enablesharding : "$testDB3"});
  32. db.runCommand({shardcollection : "$testDB3.blackImsiFace", key : {_id : "hashed"}});
  33. db.runCommand({shardcollection : "$testDB3.face", key : {_id : "hashed"}});
  34. EOF
  35. done
  36.  
  37. mongosInitNode=${mongosArray[]}
  38. #删除node,保留右边字符
  39. mongosInitIpNum=${mongosInitNode#*node}
  40. mongosInitIp=${ipArray[$mongosInitIpNum]}
  41. port=`awk -F= -v k=mongos_port '{ if ( $1 == k ) print $2; }' $templatePath`
  42.  
  43. #初始化数据库
  44. initDBPath=$mongodb_home/shell
  45. #解压initConfig.zip包 -o:不提示的情况下覆盖文件,-d /opt:指明将文件解压缩到/opt目录
  46. unzip -o -d $initDBPath/initConfig $initDBPath/initConfig.zip
  47. $mongodb_home/bin/mongorestore --host $mongosInitIp:$port --authenticationDatabase admin -d $testDB1 $initDBPath/initConfig/testDB1
  48. $mongodb_home/bin/mongorestore --host $mongosInitIp:$port --authenticationDatabase admin -d $testDB2 $initDBPath/initConfig/testDB2
  49. $mongodb_home/bin/mongorestore --host $mongosInitIp:$port --authenticationDatabase admin -d $testDB3 $initDBPath/initConfig/testDB3

⑥autoClusterStartUp.sh 脚本为config和shard副本集、mongos路由启动脚本,用法:./ autoClusterStartUp.sh,全部启动,包括config和shard副本集、mongos路由;./ autoClusterStartUp.sh notmongos,只启动config和shard副本集。

  1. #! /bin/bash
  2.  
  3. configPath=config.properties
  4. #从config.properties文件读取数据出来
  5. clusterPath=`awk -F= -v k=clusterPath '{ if ( $1 == k ) print $2; }' $configPath`
  6. mongodb_home=`awk -F= -v k=mongodbHome '{ if ( $1 == k ) print $2; }' $configPath`
  7. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  8. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  9. user=`awk -F= -v k=user '{ if ( $1 == k ) print $2; }' $configPath`
  10. localIp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:"`
  11. templatePath=template/$template.conf
  12.  
  13. #获取所有的配置、路由、分片
  14. nodes=`awk -F= -v k=nodes '{ if ( $1 == k ) print $2; }' $templatePath`
  15. eval $(echo $nodes | awk '{split($0, nodeArr, ","); for(i in nodeArr) print "nodeArray["i"]="nodeArr[i]}')
  16.  
  17. #ips切割为数组array
  18. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  19.  
  20. suffix=""
  21. #判断linux系统cpu是否为numa架构
  22. numaCount=`grep -i numa /var/log/dmesg | wc -l`
  23. nodeCount=`grep -i numa /var/log/dmesg | grep -wi "node" | wc -l`
  24. offCount=`grep -i numa /var/log/dmesg | grep -wi "numa=off" | wc -l`
  25. if [[ ($numaCount -gt ) && ($nodeCount -gt ) && ($offCount -eq ) ]]
  26. then
  27. suffix="_numa"
  28. fi
  29.  
  30. #轮询启动mongodb的节点,先config,后shard,再mongos
  31. for n in ${nodeArray[*]}
  32. do
  33. if [[ $n = "mongos" ]]
  34. then
  35. #传参为空,则mongos也执行,不为空则不执行
  36. if [[ $ = "" ]]
  37. then
  38. mongoss=`awk -F= -v k=mongos '{ if ( $1 == k ) print $2; }' $templatePath`
  39. eval $(echo $mongoss | awk '{split($0, mongosArr, ","); for(i in mongosArr) print "mongosArray["i"]="mongosArr[i]}')
  40. for((i=; i<=${#mongosArray[@]}; i++))
  41. do
  42. mongosNode=${mongosArray[i]}
  43. #删除node,保留右边字符
  44. mongosIpNum=${mongosNode#*node}
  45. mongosIp=${ipArray[$mongosIpNum]}
  46. echo "********************************start $mongosIp $n********************************"
  47. #启动本地服务或ssh远程调用
  48. if [[ $localIp = $mongosIp ]]
  49. then
  50. $mongodb_home/shell/autoStartUp.sh $n
  51. else
  52. ssh $user@$mongosIp "cd $mongodb_home/shell && ./autoStartUp.sh $n"
  53. fi
  54. done
  55.  
  56. #mongos也启动,即mongodb集群全启动
  57. #查看/etc/crontab是否开启定时任务,没有则开启
  58. for((i=; i<=${#ipArray[@]}; i++))
  59. do
  60. if [[ $localIp = ${ipArray[i]} ]]
  61. then
  62. echo "*****start ${ipArray[i]} 定时任务:日志切割和mongo进程存活监控*****"
  63. $mongodb_home/shell/autoConfig.sh addCronTask
  64. else
  65. echo "*****start ${ipArray[i]} 定时任务:日志切割和mongo进程存活监控*****"
  66. ssh $user@${ipArray[i]} "cd $mongodb_home/shell && $mongodb_home/shell/autoConfig.sh addCronTask"
  67. fi
  68. done
  69. fi
  70. else
  71. shards=`awk -F= -v k=$n '{ if ( $1 == k ) print $2; }' $templatePath`
  72. eval $(echo $shards | awk '{split($0, shardArr, ","); for(i in shardArr) print "shardArray["i"]="shardArr[i]}')
  73. for((i=; i<=${#shardArray[@]}; i++))
  74. do
  75. shardNode=${shardArray[i]}
  76. #删除node,保留右边字符
  77. shardIpNum=${shardNode#*node}
  78. shardIp=${ipArray[$shardIpNum]}
  79. echo "********************************start $shardIp $n********************************"
  80. #启动本地服务或ssh远程调用
  81. if [[ $localIp = $shardIp ]]
  82. then
  83. $mongodb_home/shell/autoStartUp.sh $n$suffix
  84. else
  85. ssh $user@$shardIp "cd $mongodb_home/shell && ./autoStartUp.sh $n$suffix"
  86. fi
  87. done
  88. fi
  89. done

⑦autoConfig.sh脚本为创建所在服务器对应的mongodb的配置文件如config.conf、shard1.conf、mongos.conf,以及添加日志切割和mongo进程存活监控定时任务,用法:./autoConfig.sh addCronTask。

  1. #! /bin/bash
  2.  
  3. #适用于3台或5台机器搭建15个或20个节点的mongodb高可用集群,3个或5个分片,每个分片(1主+1副+1仲裁)、3个配置、3个或2个路由
  4. configPath=config.properties
  5. #从config.properties文件读取数据出来
  6. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  7. clusterDataPath=`awk -F= -v k=clusterDataPath '{ if ( $1 == k ) print $2; }' $configPath`
  8. clusterLogPath=`awk -F= -v k=clusterLogPath '{ if ( $1 == k ) print $2; }' $configPath`
  9. mongodb_home=`awk -F= -v k=mongodbHome '{ if ( $1 == k ) print $2; }' $configPath`
  10.  
  11. function createConfig()
  12. {
  13. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  14. hostname=`hostname`
  15. localIp=`cat /etc/hosts | grep $hostname | awk -F " " '{print $1}'`
  16. #localIp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:"`
  17.  
  18. #配置mongodb_home
  19. #echo "配置mongodb_home"
  20. #editMongodbHome
  21.  
  22. #创建conf文件夹
  23. echo "********************************创建conf文件夹********************************"
  24. createConfFolders
  25.  
  26. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  27. templatePath=template/$template.conf
  28. #遍历ip数组
  29. for((i=; i<=${#ipArray[@]}; i++))
  30. do
  31. if [[ $localIp = ${ipArray[i]} ]]
  32. then
  33. nodes=`awk -F= -v k=node$i '{ if ( $1 == k ) print $2; }' $templatePath`
  34. echo "********************************${ipArray[i]}:$nodes********************************"
  35. eval $(echo $nodes | awk '{split($0, nodeArr, ","); for(i in nodeArr) print "nodeArray["i"]="nodeArr[i]}')
  36. for node in ${nodeArray[*]}
  37. do
  38. port=`awk -F= -v k=$node"_port" '{ if ( $1 == k ) print $2; }' $templatePath`
  39. case "$node" in
  40. "config")
  41. #创建config配置文件
  42. echo "***************创建config配置文件***************"
  43. createConfigFoldersConf $port
  44. ;;
  45. "mongos")
  46. #创建mongos路由配置文件
  47. echo "***************创建mongos路由配置文件***************"
  48. configPort=`awk -F= -v k=config_port '{ if ( $1 == k ) print $2; }' $templatePath`
  49. getConfigsIpsPort $configPort
  50. createMongosFoldersConf $port $ipsAndPorts
  51. ;;
  52. esac
  53.  
  54. if [[ $node =~ "shard" ]]
  55. then
  56. #创建shard分片配置文件
  57. echo "***************创建$node分片配置文件***************"
  58. createShardFoldersConf $node $port
  59. fi
  60. done
  61. fi
  62. done
  63. }
  64.  
  65. function getConfigsIpsPort()
  66. {
  67. ipsAndPorts=""
  68. for((i=; i<=${#ipArray[@]}; i++))
  69. do
  70. nodes=`awk -F= -v k=node$i '{ if ( $1 == k ) print $2; }' $templatePath`
  71. if [[ $nodes =~ "config" ]]
  72. then
  73. ipsAndPorts=$ipsAndPorts"${ipArray[i]}:$1,"
  74. fi
  75. done
  76. ipsAndPorts=${ipsAndPorts%,*}
  77. }
  78.  
  79. #为每台机器创建6个目录,shard1、shard2、shard3、config、mongos、conf
  80. function createConfFolders()
  81. {
  82.  
  83. if [[ -d $clusterDataPath/conf ]]
  84. then
  85. rm -rf $clusterDataPath/conf
  86. fi
  87.  
  88. #创建配置文件夹
  89. mkdir -p $clusterDataPath/conf
  90. }
  91.  
  92. function createMongosFoldersConf()
  93. {
  94. #创建mongos路由服务器的日志文件夹log、进程文件夹pid
  95. mkdir -p $clusterLogPath/mongos/log
  96. mkdir -p $clusterDataPath/mongos/pid
  97.  
  98. #设置路由服务器
  99. cat >> $clusterDataPath/conf/mongos.conf << EOF
  100. systemLog:
  101. destination: file
  102. path: $clusterLogPath/mongos/log/mongos.log
  103. logAppend: true
  104. processManagement:
  105. fork: true
  106. pidFilePath: $clusterDataPath/mongos/pid/mongos.pid
  107. net:
  108. bindIp: $localIp
  109. port: $
  110. maxIncomingConnections:
  111. sharding:
  112. configDB: configs/$
  113. EOF
  114.  
  115. }
  116.  
  117. function createConfigFoldersConf()
  118. {
  119. #创建config配置服务器的数据文件夹data、日志文件夹log、进程文件夹pid
  120. mkdir -p $clusterDataPath/config/data
  121. mkdir -p $clusterLogPath/config/journal
  122. mkdir -p $clusterLogPath/config/log
  123. mkdir -p $clusterDataPath/config/pid
  124.  
  125. #把数据目录的journal日志映射到日志目录里面
  126. ln -s $clusterLogPath/config/journal $clusterDataPath/config/data/journal
  127.  
  128. #设置配置服务器副本集
  129. cat >> $clusterDataPath/conf/config.conf << EOF
  130. systemLog:
  131. destination: file
  132. path: $clusterLogPath/config/log/config.log
  133. logAppend: true
  134. processManagement:
  135. fork: true
  136. pidFilePath: $clusterDataPath/config/pid/config.pid
  137. net:
  138. bindIp: $localIp
  139. port: $
  140. maxIncomingConnections:
  141. storage:
  142. dbPath: $clusterDataPath/config/data
  143. journal:
  144. enabled: true
  145. commitIntervalMs:
  146. directoryPerDB: true
  147. syncPeriodSecs:
  148. engine: wiredTiger
  149. replication:
  150. oplogSizeMB:
  151. replSetName: configs
  152. sharding:
  153. clusterRole: configsvr
  154. EOF
  155. }
  156.  
  157. function createShardFoldersConf()
  158. {
  159. #创建shard1分片服务器的数据文件夹data、日志文件夹log、进程文件夹pid
  160. mkdir -p $clusterDataPath/$/data
  161. mkdir -p $clusterLogPath/$/journal
  162. mkdir -p $clusterLogPath/$/log
  163. mkdir -p $clusterDataPath/$/pid
  164.  
  165. #把数据目录的journal日志映射到日志目录里面
  166. ln -s $clusterLogPath/$/journal $clusterDataPath/$/data/journal
  167.  
  168. #设置第一个分片副本集
  169. cat >> $clusterDataPath/conf/$.conf << EOF
  170. systemLog:
  171. destination: file
  172. path: $clusterLogPath/$/log/$.log
  173. logAppend: true
  174. processManagement:
  175. fork: true
  176. pidFilePath: $clusterDataPath/$/pid/$.pid
  177. net:
  178. bindIp: $localIp
  179. port: $
  180. maxIncomingConnections:
  181. storage:
  182. dbPath: $clusterDataPath/$/data
  183. journal:
  184. enabled: true
  185. commitIntervalMs:
  186. directoryPerDB: true
  187. syncPeriodSecs:
  188. engine: wiredTiger
  189. wiredTiger:
  190. engineConfig:
  191. cacheSizeGB:
  192. statisticsLogDelaySecs:
  193. journalCompressor: snappy
  194. directoryForIndexes: false
  195. collectionConfig:
  196. blockCompressor: snappy
  197. indexConfig:
  198. prefixCompression: true
  199. replication:
  200. oplogSizeMB:
  201. replSetName: $
  202. sharding:
  203. clusterRole: shardsvr
  204. EOF
  205. }
  206.  
  207. #配置mongodb环境变量
  208. function editMongodbHome()
  209. {
  210. profile=/etc/profile
  211. #配置MONGODB_HOME
  212. sed -i "/^export MONGODB_HOME/d" $profile
  213. echo "export MONGODB_HOME=$mongodb_home" >> $profile
  214.  
  215. #配置PATH
  216. sed -i "/^export PATH=\$PATH:\$MONGODB_HOME\/bin/d" $profile
  217. echo "export PATH=\$PATH:\$MONGODB_HOME/bin" >> $profile
  218.  
  219. #使/etc/profile文件生效
  220. source /etc/profile
  221. }
  222.  
  223. if [[ $ = "" ]]
  224. then
  225. createConfig
  226. fi
  227.  
  228. if [[ $ = "addCronTask" ]]
  229. then
  230. cronfile=/etc/crontab
  231. shellPath=${mongodb_home//\//\\/}\\/shell
  232. logRotateCronTaskNum=`sed -n -e "/\0 \0 \* \* \* root $shellPath\/autoLogRotate.sh $shellPath/=" $cronfile`
  233. if [[ $logRotateCronTaskNum = "" ]]
  234. then
  235. #没有则追加
  236. echo "0 0 * * * root $mongodb_home/shell/autoLogRotate.sh $mongodb_home/shell > /dev/null 2>&1 &" >> $cronfile
  237. fi
  238.  
  239. checkLiveCronTaskNum=`sed -n -e "/\*\/10 \* \* \* \* root $shellPath\/autoCheckLive.sh $shellPath/=" $cronfile`
  240. if [[ $checkLiveCronTaskNum = "" ]]
  241. then
  242. #没有则追加
  243. echo "*/10 * * * * root $mongodb_home/shell/autoCheckLive.sh $mongodb_home/shell > /dev/null 2>&1 &" >> $cronfile
  244. fi
  245. fi
  246.  
  247. if [[ $ = "removeCronTask" ]]
  248. then
  249. cronfile=/etc/crontab
  250. shellPath=${mongodb_home//\//\\/}\\/shell
  251. sed -i "/^\*\/10 \* \* \* \* root $shellPath\/autoCheckLive.sh $shellPath/d" $cronfile
  252. sed -i "/^\0 \0 \* \* \* root $shellPath\/autoLogRotate.sh $shellPath/d" $cronfile
  253. fi

⑧autoLogRotate.sh脚本为创建所在服务器对应的mongodb的日志切割脚本,并添加定时任务,默认为每天凌晨0点0分,对mongodb数据库日志进行切割并删除7天前的日志。

  1. #! /bin/bash
  2. #Rotate the MongoDB logs to prevent a single logfile from consuming too much disk space.
  3.  
  4. shellPath=$
  5. configPath=$shellPath/config.properties
  6. #从config.properties文件读取数据出来
  7. clusterPath=`awk -F= -v k=clusterPath '{ if ( $1 == k ) print $2; }' $configPath`
  8. template=`awk -F= -v k=template '{ if ( $1 == k ) print $2; }' $configPath`
  9. templatePath=$shellPath/template/$template.conf
  10.  
  11. ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
  12. eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "ipArray["i"]="arr[i]}')
  13. localIp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:"`
  14.  
  15. #代表删除7天前的备份,即只保留最近7天的备份
  16. days=
  17.  
  18. #遍历ip数组
  19. for((i=; i<=${#ipArray[@]}; i++))
  20. do
  21. if [[ $localIp = ${ipArray[i]} ]]
  22. then
  23. mongodbNodes=`awk -F= -v k=node$i '{ if ( $1 == k ) print $2; }' $templatePath`
  24. eval $(echo $mongodbNodes | awk '{split($0, mongodbArr, ","); for(i in mongodbArr) print "mongodbArray["i"]="mongodbArr[i]}')
  25. for((n=; n<=${#mongodbArray[@]}; n++))
  26. do
  27. pid=`cat $clusterPath/${mongodbArray[n]}/pid/${mongodbArray[n]}.pid`
  28. logdir=$clusterPath/${mongodbArray[n]}/log
  29. #切割日志
  30. /bin/kill -SIGUSR1 $pid
  31. find $logdir/ -mtime +$days -delete
  32. done
  33. fi
  34. done

⑨autoStartUp.sh脚本为启动该脚本所在服务器的config、shard、mongos节点,启动分正常启动和禁止numactl启动两种。

  1. #! /bin/bash
  2.  
  3. configPath=config.properties
  4. mongodb_home=`awk -F= -v k=mongodbHome '{ if ( $1 == k ) print $2; }' $configPath`
  5. clusterPath=`awk -F= -v k=clusterPath '{ if ( $1 == k ) print $2; }' $configPath`
  6. param=$
  7.  
  8. #config
  9. if [[ $param = "config" ]]
  10. then
  11. $mongodb_home/bin/mongod -f $clusterPath/conf/config.conf
  12. fi
  13. if [[ $param = "config_numa" ]]
  14. then
  15. numactl --interleave=all $mongodb_home/bin/mongod -f $clusterPath/conf/config.conf
  16. fi
  17.  
  18. #shard1
  19. paramLegth=`echo "$param" |wc -L`
  20. if [[ ($param =~ "shard") && ($paramLegth -lt ) && ($paramLegth -gt )]]
  21. then
  22. $mongodb_home/bin/mongod -f $clusterPath/conf/$param.conf
  23. fi
  24. if [[ ($param =~ "shard") && $param =~ "numa" ]]
  25. then
  26. shardName=${param%_*}
  27. numactl --interleave=all $mongodb_home/bin/mongod -f $clusterPath/conf/$shardName.conf
  28. fi
  29.  
  30. #mongos
  31. if [[ $param = "mongos" ]]
  32. then
  33. $mongodb_home/bin/mongos -f $clusterPath/conf/mongos.conf
  34. fi

⑩autoSystemProperties.sh 脚本为修改服务器的系统配置,TCP配置等。

  1. #! /bin/bash
  2.  
  3. #系统全局允许分配的最大文件句柄数
  4. sysctl -w fs.file-max=
  5. sysctl -w fs.nr_open=
  6. echo > /proc/sys/fs/nr_open
  7.  
  8. #允许当前会话/进程打开文件句柄数
  9. ulimit -n
  10.  
  11. #修改fs.file-max设置到 /etc/sysctl.conf 文件:
  12. #fs.file-max =
  13.  
  14. #修改/etc/security/limits.conf 持久化设置允许用户/进程打开文件句柄数,手动添加
  15. #* soft nofile
  16. #* hard nofile
  17. #* soft nproc
  18. #* hard nproc
  19.  
  20. #并发连接backlog设置
  21. sysctl -w net.core.somaxconn=
  22. sysctl -w net.ipv4.tcp_max_syn_backlog=
  23. sysctl -w net.core.netdev_max_backlog=
  24. #可用知名端口范围:
  25. sysctl -w net.ipv4.ip_local_port_range='80 65535'
  26. #sysctl -w net.core.rmem_default=
  27. sysctl -w net.core.wmem_default=
  28. sysctl -w net.core.rmem_max=
  29. sysctl -w net.core.wmem_max=
  30. sysctl -w net.core.optmem_max=
  31. #TCP Socket 读写 Buffer 设置:
  32. sysctl -w net.core.rmem_default=
  33. sysctl -w net.core.wmem_default=
  34. sysctl -w net.core.rmem_max=
  35. sysctl -w net.core.wmem_max=
  36. sysctl -w net.core.optmem_max=
  37. sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
  38. sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'
  39.  
  40. #修改系统内核参数:
  41. echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
  42. echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
  43.  
  44. #TCP 连接追踪设置:
  45. sysctl -w net.nf_conntrack_max=
  46. sysctl -w net.netfilter.nf_conntrack_max=
  47. sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=
  48.  
  49. #修改stack size为1024,不启作用,只能手动source
  50. #if [ `grep -c "ulimit -s 1024" /etc/profile` -eq '0' ];then
  51. # echo "ulimit -s 1024" >> /etc/profile
  52. # source /etc/profile
  53. #fi

⑫initConfig.zip 为数据库test及其数据库表的初始化文件,有需要的可以自行配置。

2.2 全自动化部署

1. 把mongodb安装目录放置在5台机器中的任意一台上面即可,选定好安装的路径。

2.进入mongodb/shell目录。

根据实际环境需要修改config.properties文件的clusterPath、mongodbHome、ips、template、数据库5个属性

3.autoClusterIndex.sh脚本所在的目录执行如下命令,否则脚本会不起作用,执行命令:

./autoClusterIndex.sh

执行上面命令,会一键自动化部署。

至此,完成部署。

2.3 部署验证

5台机器的验证:

服务器node1(192.168.187.201):

服务器node2(192.168.187.202):

服务器node3(192.168.187.203):

服务器node4(192.168.187.204):

服务器node5(192.168.187.205):

4台机器的验证:

服务器node1(192.168.187.201):

服务器node2(192.168.187.202):

服务器node3(192.168.187.203):

服务器node4(192.168.187.204):

3台机器的验证:

服务器node1(192.168.187.201)、服务器node2(192.168.187.202)、服务器node3(192.168.187.203)都会启动如下服务:

一键化部署的shell命令github地址为:

https://github.com/SwordfallYeung/MongodbCluster_autoDeploy

MongoDB3.6 一键化自动部署方案的更多相关文章

  1. spring boot 自动部署方案

    现在主流的自动部署方案大都是基于Docker的了,但传统的自动部署方案比较适合中小型公司,下面的方案就是比较传统的自动部署方案. 1.为什么需要自动部署 基于微服务的架构,自动部署显得非常重要.因为每 ...

  2. Jenkins spring boot 自动部署方案

    原文地址:http://www.cnblogs.com/skyblog/p/5632869.html 现在主流的自动部署方案大都是基于Docker的了,但传统的自动部署方案比较适合中小型公司,下面的方 ...

  3. 基于webhook方案的Git自动部署方案

    之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...

  4. Java代码自动部署

    注:本文来源于<it小熊> [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java ...

  5. 自己开发shell脚本实现一键化安装。

    一.说明在现实环境中可能需要批量部署服务器,那么在我们已经部署好一台服务以后如果实现剩下的服务批量安装呢: 使用shell能否实现功能: 假设我们要部署lamp或者是lnmp如何实现脚本部署? 使用以 ...

  6. Asp.net Core Jenkins Docker 实现一键化部署

    写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker ...

  7. 5分钟快速掌握Jenkins,项目一键自动部署

    5分钟快速掌握Jenkins,项目一键自动部署 目录 前言 Jenkins是什么? Jenkins环境安装搭建 Jenkins基本使用介绍 Jenkins快速构建项目,项目自动化部署 学习总结 前言 ...

  8. 一种让运行在CentOS下的.NET CORE的Web项目简单方便易部署的自动更新方案

    一.项目运行环境 项目采用的是.NET5开发的Web系统,独立部署在省内异地多台CentOS服务器上,它们运行在甲方专网环境中(不接触互联网),甲方进行业务运作时(一段时间内)会要求异地服务器开机上线 ...

  9. 简进祥-SVN版本控制方案:多分支并行开发,多环境自动部署

    两地同时开发一个产品,目前线上有3个环境:测试环境.预发布环境.生产环境.目前系统部署采用jenkins自动化部署工具 用jenkins部署的方案 jenkins 测试环境:配置了各个分支的svn 地 ...

随机推荐

  1. LeetCode算法题-Convert BST to Greater Tree(Java实现)

    这是悦乐书的第255次更新,第268篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第122题(顺位题号是538).给定二进制搜索树(BST),将其转换为更大树,使原始BS ...

  2. 我的第一个python web开发框架(31)——定制ORM(七)

    几个复杂的ORM方式都已介绍完了,剩下一些常用的删除.获取记录数量.统计合计数.获取最大值.获取最小值等方法我就不一一详细介绍了,直接给出代码大家自行查看. #!/usr/bin/env python ...

  3. 【导航】Python相关

    [博客导航] Python相关导航 [索引]Python常用资源(从新手到大牛) [任务]Python语言程序设计.MOOC学习 [笔记]Python集成开发环境——PyCharm 2018.3下载. ...

  4. C#基础知识之泛型

    泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用. 其实官方文档说明的很详细,我这边算是做个记录吧 一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) ...

  5. vue2.0阻止事件冒泡

    <!--picker弹窗--><transition name="fade"> <div class="picker_wrap" ...

  6. Elastic Stack-Elasticsearch使用介绍(一)

    一.前言     Elasticsearch对外提供RESTful API,下面的演示我们主要使用Postman,进行一系列的Demo演示,这款工具方便各位前端大大或者对接口调试的神器: 安装过于简单 ...

  7. Write your own operating system Day(1)

    工具准备: VirtualBox.exe是一个免费的轻巧的虚拟机 Bz.exe是二进制编辑器 NASM则是用来编译汇编语言的,具体使用方法自行百度 HZK16.fnt 中文GB2312的二进制点阵文件 ...

  8. Uint 7.文本和字体属性,background,精灵图和3种定位

    一. 文本属性 CSS 文本属性可定义文本的外观. 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. <!DOCTYPE html> <htm ...

  9. linux rzsz(lrzsz)安装

    lrzsz 官网入口:https://ohse.de/uwe/software/lrzsz.html lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与 ...

  10. Maven基础:Maven环境搭建及基本使用(1)

    1. Maven环境搭建 1.1 Maven简介 1.2 Maven下载及环境设置 Maven下载地址:http://maven.apache.org/download.cgi 当前下载版本:apac ...