设为首页 收藏本站
查看: 779|回复: 0

[经验分享] mongodb3.2 sharding deploy-WorkNote

[复制链接]

尚未签到

发表于 2018-10-25 12:48:55 | 显示全部楼层 |阅读模式
  一、部署软件
  pc1、pc2、pc3分别安装mongodb,操作如下:
  [root@pc1 ~]#tail /etc/security/limits.conf
mongod soft nproc 40000  
* hard nofile 1000000
  
* soft nofile 1000000
  
* soft core unlimited
  
* soft stack 10240
  
* - nofile 65535
  
push - nproc 65535
  
push - nofile 320000
  
work - nproc 10000
  [root@pc1 ~]# tail /etc/security/limits.d/90-nproc.conf
*          soft    nproc     1024  
root       soft    nproc     unlimited
  [root@pc1 ~]#  cat /etc/yum.repos.d/mongodb.repo
[mongodb-org-3.2]  
name=MongoDB Repository
  
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
  
gpgcheck=1
  
enabled=1
  
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
  [root@pc1 ~]#  yum -y install mongodb-org
  [root@pc1 ~]# chkconfig mongodb off
  [root@pc1 ~]# mkdir  -p  /data/mongodb/{config,data/{config,logs,shard{1,2,3}_1}}
  [root@pc1 ~]# chown -R mongod.mongod  /data/mongodb
  [root@pc1 ~]# cp /etc/mongod.conf  /data/mongodb/config/shard1.conf
  [root@pc1 ~]#tree /data/
  /data/
  └── mongodb
  ├── config
  │   └── shard1.conf
  └── data
  ├── config
  ├── logs
  ├── shard1_1
  ├── shard2_1
  └── shard3_1
  二、配置服务
  副本集1的配置文件与启动脚本如下:
  [root@pc1 ~]# egrep "^[^#$]" /data/mongodb/config/shard1.conf
systemLog:  
  destination: file
  
  logAppend: true
  
  path: /data/mongodb/data/logs/shard1.log
  
storage:
  
  dbPath: /data/mongodb/data/shard1_1
  
  directoryPerDB: true
  
  journal:
  
    enabled: true
  
processManagement:
  
  fork: true  # fork and run in background
  
  pidFilePath: /var/run/mongodb/shard1.pid  # location of pidfile
  
net:
  
  port: 27027
  
  #bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
  
replication:
  
  oplogSizeMB: 500
  
  replSetName: shard1
  
sharding:
  
  clusterRole: shardsvr
  [root@pc1 ~]#  cp /etc/init.d/mongod  /etc/init.d/shard1
  [root@pc1 ~]#vim /etc/init.d/shard1
  [root@pc1 ~]#  egrep "^[^#$]" /etc/init.d/shard1
. /etc/rc.d/init.d/functions  
CONFIGFILE="/data/mongodb/config/shard1.conf"
  
OPTIONS=" -f $CONFIGFILE"
  
mongod=${MONGOD-/usr/bin/mongod}
  
MONGO_USER=mongod
  
MONGO_GROUP=mongod
  
SYSCONFIG="/etc/sysconfig/mongod"
  
if [ -f "$SYSCONFIG" ]; then
  
    . "$SYSCONFIG"
  
fi
  
NUMACTL_ARGS="--interleave=all"
  
if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null
  
then
  
    NUMACTL="numactl $NUMACTL_ARGS"
  
else
  
    NUMACTL=""
  
fi
  
PIDFILEPATH=`awk -F'[:=]' -v IGNORECASE=1 '/^[[:blank:]]*(processManagement\.)?pidfilepath[[:blank:]]*[:=][[:blank:]]*/{print $2}' "$CONFIGFILE" | tr -d "[:blank:]\"'" | awk -F'#' '{print $1}'`
  
PIDDIR=`dirname $PIDFILEPATH`
  
start()
  
{
  
  # Make sure the default pidfile directory exists
  
  if [ ! -d $PIDDIR ]; then
  
    install -d -m 0755 -o $MONGO_USER -g $MONGO_GROUP $PIDDIR
  
  fi
  
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  
echo never > /sys/kernel/mm/transparent_hugepage/defrag
  
fi
  
  # Recommended ulimit values for mongod or mongos
  
  # See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
  
  #
  
  ulimit -f unlimited
  
  ulimit -t unlimited
  
  ulimit -v unlimited
  
  ulimit -n 64000
  
  ulimit -m unlimited
  
  ulimit -u 64000
  
  echo -n $"Starting mongod: "
  
  daemon --user "$MONGO_USER" --check $mongod "$NUMACTL $mongod $OPTIONS >/dev/null 2>&1"
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/shard1
  
}
  
stop()
  
{
  
  echo -n $"Stopping mongod: "
  
  mongo_killproc "$PIDFILEPATH" $mongod
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/shard1
  
}
  
restart () {
  
        stop
  
        start
  
}
  
mongo_killproc()
  
{
  
  local pid_file=$1
  
  local procname=$2
  
  local -i delay=300
  
  local -i duration=10
  
  local pid=`pidofproc -p "${pid_file}" ${procname}`
  
  kill -TERM $pid >/dev/null 2>&1
  
  usleep 100000
  
  local -i x=0
  
  while [ $x -le $delay ] && checkpid $pid; do
  
    sleep $duration
  
    x=$(( $x + $duration))
  
  done
  
  kill -KILL $pid >/dev/null 2>&1
  
  usleep 100000
  
  checkpid $pid # returns 0 only if the process exists
  
  local RC=$?
  
  [ "$RC" -eq 0 ] && failure "${procname} shutdown" || rm -f "${pid_file}"; success "${procname} shutdown"
  
  RC=$((! $RC)) # invert return code so we return 0 when process is dead.
  
  return $RC
  
}
  
RETVAL=0
  
case "$1" in
  
  start)
  
    start
  
    ;;
  
  stop)
  
    stop
  
    ;;
  
  restart|reload|force-reload)
  
    restart
  
    ;;
  
  condrestart)
  
    [ -f /var/lock/subsys/shard1 ] && restart || :
  
    ;;
  
  status)
  
    status $mongod
  
    RETVAL=$?
  
    ;;
  
  *)
  
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
  
    RETVAL=1
  
esac
  
exit $RETVAL
  副本集2的配置文件与启动脚本如下:
  [root@pc1 ~]#egrep "^[^#$]" /data/mongodb/config/shard2.conf
systemLog:  
  destination: file
  
  logAppend: true
  
  path: /data/mongodb/data/logs/shard2.log
  
storage:
  
  dbPath: /data/mongodb/data/shard2_1
  
  directoryPerDB: true
  
  journal:
  
    enabled: true
  
processManagement:
  
  fork: true  # fork and run in background
  
  pidFilePath: /var/run/mongodb/shard2.pid  # location of pidfile
  
net:
  
  port: 27028
  
  #bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
  
replication:
  
  oplogSizeMB: 500
  
  replSetName: shard2
  
sharding:
  
  clusterRole: shardsvr
  [root@pc1 ~]#  cp /etc/init.d/mongod  /etc/init.d/shard2
  [root@pc1 ~]#  vim  /etc/init.d/shard2
  [root@pc1 ~]#  egrep "^[^#$]" /etc/init.d/shard2
. /etc/rc.d/init.d/functions  
CONFIGFILE="/data/mongodb/config/shard2.conf"
  
OPTIONS=" -f $CONFIGFILE"
  
mongod=${MONGOD-/usr/bin/mongod}
  
MONGO_USER=mongod
  
MONGO_GROUP=mongod
  
SYSCONFIG="/etc/sysconfig/mongod"
  
if [ -f "$SYSCONFIG" ]; then
  
    . "$SYSCONFIG"
  
fi
  
NUMACTL_ARGS="--interleave=all"
  
if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null
  
then
  
    NUMACTL="numactl $NUMACTL_ARGS"
  
else
  
    NUMACTL=""
  
fi
  
PIDFILEPATH=`awk -F'[:=]' -v IGNORECASE=1 '/^[[:blank:]]*(processManagement\.)?pidfilepath[[:blank:]]*[:=][[:blank:]]*/{print $2}' "$CONFIGFILE" | tr -d "[:blank:]\"'" | awk -F'#' '{print $1}'`
  
PIDDIR=`dirname $PIDFILEPATH`
  
start()
  
{
  
  # Make sure the default pidfile directory exists
  
  if [ ! -d $PIDDIR ]; then
  
    install -d -m 0755 -o $MONGO_USER -g $MONGO_GROUP $PIDDIR
  
  fi
  
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  
echo never > /sys/kernel/mm/transparent_hugepage/defrag
  
fi
  
  # Recommended ulimit values for mongod or mongos
  
  # See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
  
  #
  
  ulimit -f unlimited
  
  ulimit -t unlimited
  
  ulimit -v unlimited
  
  ulimit -n 64000
  
  ulimit -m unlimited
  
  ulimit -u 64000
  
  echo -n $"Starting mongod: "
  
  daemon --user "$MONGO_USER" --check $mongod "$NUMACTL $mongod $OPTIONS >/dev/null 2>&1"
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/shard2
  
}
  
stop()
  
{
  
  echo -n $"Stopping mongod: "
  
  mongo_killproc "$PIDFILEPATH" $mongod
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/shard2
  
}
  
restart () {
  
        stop
  
        start
  
}
  
mongo_killproc()
  
{
  
  local pid_file=$1
  
  local procname=$2
  
  local -i delay=300
  
  local -i duration=10
  
  local pid=`pidofproc -p "${pid_file}" ${procname}`
  
  kill -TERM $pid >/dev/null 2>&1
  
  usleep 100000
  
  local -i x=0
  
  while [ $x -le $delay ] && checkpid $pid; do
  
    sleep $duration
  
    x=$(( $x + $duration))
  
  done
  
  kill -KILL $pid >/dev/null 2>&1
  
  usleep 100000
  
  checkpid $pid # returns 0 only if the process exists
  
  local RC=$?
  
  [ "$RC" -eq 0 ] && failure "${procname} shutdown" || rm -f "${pid_file}"; success "${procname} shutdown"
  
  RC=$((! $RC)) # invert return code so we return 0 when process is dead.
  
  return $RC
  
}
  
RETVAL=0
  
case "$1" in
  
  start)
  
    start
  
    ;;
  
  stop)
  
    stop
  
    ;;
  
  restart|reload|force-reload)
  
    restart
  
    ;;
  
  condrestart)
  
    [ -f /var/lock/subsys/shard2 ] && restart || :
  
    ;;
  
  status)
  
    status $mongod
  
    RETVAL=$?
  
    ;;
  
  *)
  
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
  
    RETVAL=1
  
esac
  
exit $RETVAL
  副本集3的配置文件与启动脚本如下:
  [root@pc1 ~]#egrep "^[^#$]" /data/mongodb/config/shard3.conf
systemLog:  
  destination: file
  
  logAppend: true
  
  path: /data/mongodb/data/logs/shard3.log
  
storage:
  
  dbPath: /data/mongodb/data/shard3_1
  
  directoryPerDB: true
  
  journal:
  
    enabled: true
  
processManagement:
  
  fork: true  # fork and run in background
  
  pidFilePath: /var/run/mongodb/shard3.pid  # location of pidfile
  
net:
  
  port: 27026
  
  #bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
  
replication:
  
  oplogSizeMB: 500
  
  replSetName: shard3
  
sharding:
  
  clusterRole: shardsvr
  [root@pc1 ~]#  cp /etc/init.d/mongod  /etc/init.d/shard3
  [root@pc1 ~]#  vim  /etc/init.d/shard3
  [root@pc1 ~]#  egrep "^[^#$]" /etc/init.d/shard3  (略,内容基本与shard2 、shard1相同)
  复制配置文件到pc2pc3,并启动服务
  [root@pc1 ~]#  scp /data/mongodb/config/*.conf  pc2:/data/mongodb/config/
  [root@pc1 ~]#  scp /etc/init.d/shard*  pc2:/etc/init.d/
  [root@pc1 ~]#  scp /data/mongodb/config/*.conf  pc3:/data/mongodb/config/
  [root@pc1 ~]# scp /etc/init.d/shard*  pc2:/etc/init.d/
  [root@pc1 ~]#
  [root@pc1 ~]# /etc/init.d/shard1 start
  [root@pc1 ~]#ssh pc2 '/etc/init.d/shard1 start'
  [root@pc1 ~]#  ssh pc3 '/etc/init.d/shard1 start'
  [root@pc1 ~]#  /etc/init.d/shard2 start
  [root@pc1 ~]#  ssh pc2 '/etc/init.d/shard2 start'
  [root@pc1 ~]#  ssh pc3 '/etc/init.d/shard2 start'
  
  [root@pc1 ~]#  /etc/init.d/shard3 start
  [root@pc1 ~]#  ssh pc2 '/etc/init.d/shard3 start'
  [root@pc1 ~]#  ssh pc3 '/etc/init.d/shard3 start'
  配置副本集1如下操作:
  [root@pc1 ~]# mongo localhost:27027
MongoDB shell version: 3.2.7  
connecting to: localhost:27027/test
  
> use admin
  
switched to db admin
  
> rs.initiate()
  
{
  
"info2" : "no configuration specified. Using a default configuration for the set",
  
"me" : "pc1:27027",
  
"ok" : 1
  
}
  
shard1:OTHER> rs.add("pc2:27027")
  
{ "ok" : 1 }
  
shard1:PRIMARY> rs.addArb("pc3:27027")
  
{ "ok" : 1 }
  
shard1:PRIMARY> rs.status()
  
{
  
"set" : "shard1",
  
"date" : ISODate("2016-06-28T03:59:41.403Z"),
  
"myState" : 1,
  
"term" : NumberLong(1),
  
"heartbeatIntervalMillis" : NumberLong(2000),
  
"members" : [
  
{
  
"_id" : 0,
  
"name" : "pc1:27027",
  
"health" : 1,
  
"state" : 1,
  
"stateStr" : "PRIMARY",
  
"uptime" : 1634,
  
"optime" : {
  
"ts" : Timestamp(1467086346, 1),
  
"t" : NumberLong(1)
  
},
  
"optimeDate" : ISODate("2016-06-28T03:59:06Z"),
  
"infoMessage" : "could not find member to sync from",
  
"electionTime" : Timestamp(1467086301, 2),
  
"electionDate" : ISODate("2016-06-28T03:58:21Z"),
  
"configVersion" : 3,
  
"self" : true
  
},
  
{
  
"_id" : 1,
  
"name" : "pc2:27027",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 54,
  
"optime" : {
  
"ts" : Timestamp(1467086346, 1),
  
"t" : NumberLong(1)
  
},
  
"optimeDate" : ISODate("2016-06-28T03:59:06Z"),
  
"lastHeartbeat" : ISODate("2016-06-28T03:59:40.050Z"),
  
"lastHeartbeatRecv" : ISODate("2016-06-28T03:59:41.041Z"),
  
"pingMs" : NumberLong(1),
  
"syncingTo" : "pc1:27027",
  
"configVersion" : 3
  
},
  
{
  
"_id" : 2,
  
"name" : "pc3:27027",
  
"health" : 1,
  
"state" : 7,
  
"stateStr" : "ARBITER",
  
"uptime" : 35,
  
"lastHeartbeat" : ISODate("2016-06-28T03:59:40.053Z"),
  
"lastHeartbeatRecv" : ISODate("2016-06-28T03:59:41.044Z"),
  
"pingMs" : NumberLong(2),
  
"configVersion" : 3
  
}
  
],
  
"ok" : 1
  
}
  配置副本集2、配置副本集3的操作与配置副本集基本相同,本文不再罗嗦。注意:配置副本集1时,pc1primarypc2secondary ,而pc3arbiter;配置副本集2时,pc2primarypc3secondary,而pc1arbiter;配置副本集3时,pc3primarypc1secondary,而pc2arbiter
  config server的配置文件与启动文件如下:
  [[root@pc1 ~]# egrep "^[^#$]" /data/mongodb/config/config.conf
systemLog:  
  destination: file
  
  logAppend: true
  
  path: /data/mongodb/data/logs/config.log
  
storage:
  
  dbPath: /data/mongodb/data/config
  
  directoryPerDB: true
  
  journal:
  
    enabled: true
  
processManagement:
  
  fork: true  # fork and run in background
  
  pidFilePath: /var/run/mongodb/config.pid  # location of pidfile
  
net:
  
  port: 27029
  
  #bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
  
replication:
  
  oplogSizeMB: 500
  
  replSetName: configrs
  
sharding:
  
  clusterRole: configsvr
  [root@pc1 ~]#  cp /etc/init.d/mongod  /etc/init.d/mconfig
  [root@pc1 ~]#  vim /etc/init.d/mconfig
  [root@pc1 ~]#  egrep "^[^#$]" /etc/init.d/mconfig
. /etc/rc.d/init.d/functions  
CONFIGFILE="/data/mongodb/config/config.conf"
  
OPTIONS=" -f $CONFIGFILE"
  
mongod=${MONGOD-/usr/bin/mongod}
  
MONGO_USER=mongod
  
MONGO_GROUP=mongod
  
SYSCONFIG="/etc/sysconfig/mongod"
  
if [ -f "$SYSCONFIG" ]; then
  
    . "$SYSCONFIG"
  
fi
  
NUMACTL_ARGS="--interleave=all"
  
if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null
  
then
  
    NUMACTL="numactl $NUMACTL_ARGS"
  
else
  
    NUMACTL=""
  
fi
  
PIDFILEPATH=`awk -F'[:=]' -v IGNORECASE=1 '/^[[:blank:]]*(processManagement\.)?pidfilepath[[:blank:]]*[:=][[:blank:]]*/{print $2}' "$CONFIGFILE" | tr -d "[:blank:]\"'" | awk -F'#' '{print $1}'`
  
PIDDIR=`dirname $PIDFILEPATH`
  
start()
  
{
  
  # Make sure the default pidfile directory exists
  
  if [ ! -d $PIDDIR ]; then
  
    install -d -m 0755 -o $MONGO_USER -g $MONGO_GROUP $PIDDIR
  
  fi
  
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  
echo never > /sys/kernel/mm/transparent_hugepage/defrag
  
fi
  
  # Recommended ulimit values for mongod or mongos
  
  # See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
  
  ulimit -f unlimited
  
  ulimit -t unlimited
  
  ulimit -v unlimited
  
  ulimit -n 64000
  
  ulimit -m unlimited
  
  ulimit -u 64000
  
  echo -n $"Starting mongod: "
  
  daemon --user "$MONGO_USER" --check $mongod "$NUMACTL $mongod $OPTIONS >/dev/null 2>&1"
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mconfig
  
}
  
stop()
  
{
  
  echo -n $"Stopping mongod: "
  
  mongo_killproc "$PIDFILEPATH" $mongod
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mconfig
  
}
  
restart () {
  
        stop
  
        start
  
}
  
mongo_killproc()
  
{
  
  local pid_file=$1
  
  local procname=$2
  
  local -i delay=300
  
  local -i duration=10
  
  local pid=`pidofproc -p "${pid_file}" ${procname}`
  
  kill -TERM $pid >/dev/null 2>&1
  
  usleep 100000
  
  local -i x=0
  
  while [ $x -le $delay ] && checkpid $pid; do
  
    sleep $duration
  
    x=$(( $x + $duration))
  
  done
  
  kill -KILL $pid >/dev/null 2>&1
  
  usleep 100000
  
  checkpid $pid # returns 0 only if the process exists
  
  local RC=$?
  
  [ "$RC" -eq 0 ] && failure "${procname} shutdown" || rm -f "${pid_file}"; success "${procname} shutdown"
  
  RC=$((! $RC)) # invert return code so we return 0 when process is dead.
  
  return $RC
  
}
  
RETVAL=0
  
case "$1" in
  
  start)
  
    start
  
    ;;
  
  stop)
  
    stop
  
    ;;
  
  restart|reload|force-reload)
  
    restart
  
    ;;
  
  condrestart)
  
    [ -f /var/lock/subsys/mconfig ] && restart || :
  
    ;;
  
  status)
  
    status $mongod
  
    RETVAL=$?
  
    ;;
  
  *)
  
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
  
    RETVAL=1
  
esac
  
exit $RETVAL
  [root@pc1 ~]# scp /data/mongodb/config/config.conf  pc2:/data/mongodb/config
  [root@pc1 ~]# scp /etc/init.d/mconfig  pc2:/etc/init.d/
  [root@pc1 ~]#
  [root@pc1 ~]#  scp /data/mongodb/config/config.conf  pc2:/data/mongodb/config
  [root@pc1 ~]#  scp /etc/init.d/mconfig  pc3:/etc/init.d/
  [root@pc1 ~]#
  [root@pc1 ~]#/etc/init.d/mconfig  start
  Starting mongod:                                           [确定]
  [root@pc1 ~]#lsof -i:27029

  COMMAND  PID   USER   FD   TYPE DEVICE>  mongod  2765 mongod    6u  IPv4  11520      0t0  TCP *:27029 (LISTEN)
  [root@pc1 ~]# ssh pc2 '/etc/init.d/mconfig  start'
  [root@pc1 ~]# ssh pc2 '/etc/init.d/mconfig  start'
  为了保持config server的一致性,实现各config server的副本集功能,完成效果如下所示(config server的副本集不支持使用arbiter)
  [root@pc1 ~]# mongo localhost:27029
MongoDB shell version: 3.2.7  
connecting to: localhost:27029/test
  
configrs:SECONDARY> use admin
  
switched to db admin
  
configrs:SECONDARY> rs.slaveOk()
  
configrs:SECONDARY> rs.status()
  
{
  
"set" : "configrs",
  
"date" : ISODate("2016-07-01T03:25:49.471Z"),
  
"myState" : 2,
  
"term" : NumberLong(2),
  
"syncingTo" : "pc3:27029",
  
"configsvr" : true,
  
"heartbeatIntervalMillis" : NumberLong(2000),
  
"members" : [
  
{
  
"_id" : 0,
  
"name" : "pc1:27029",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 3937,
  
"optime" : {
  
"ts" : Timestamp(1467339616, 1),
  
"t" : NumberLong(2)
  
},
  
"optimeDate" : ISODate("2016-07-01T02:20:16Z"),
  
"syncingTo" : "pc3:27029",
  
"configVersion" : 3,
  
"self" : true
  
},
  
{
  
"_id" : 1,
  
"name" : "pc2:27029",
  
"health" : 1,
  
"state" : 2,
  
"stateStr" : "SECONDARY",
  
"uptime" : 3936,
  
"optime" : {
  
"ts" : Timestamp(1467339616, 1),
  
"t" : NumberLong(2)
  
},
  
"optimeDate" : ISODate("2016-07-01T02:20:16Z"),
  
"lastHeartbeat" : ISODate("2016-07-01T03:25:48.578Z"),
  
"lastHeartbeatRecv" : ISODate("2016-07-01T03:25:47.481Z"),
  
"pingMs" : NumberLong(1),
  
"syncingTo" : "pc3:27029",
  
"configVersion" : 3
  
},
  
{
  
"_id" : 2,
  
"name" : "pc3:27029",
  
"health" : 1,
  
"state" : 1,
  
"stateStr" : "PRIMARY",
  
"uptime" : 3936,
  
"optime" : {
  
"ts" : Timestamp(1467339616, 1),
  
"t" : NumberLong(2)
  
},
  
"optimeDate" : ISODate("2016-07-01T02:20:16Z"),
  
"lastHeartbeat" : ISODate("2016-07-01T03:25:49.146Z"),
  
"lastHeartbeatRecv" : ISODate("2016-07-01T03:25:47.585Z"),
  
"pingMs" : NumberLong(1),
  
"electionTime" : Timestamp(1467339615, 1),
  
"electionDate" : ISODate("2016-07-01T02:20:15Z"),
  
"configVersion" : 3
  
}
  
],
  
"ok" : 1
  
}
  
configrs:SECONDARY> exit
  
bye
  
[root@pc1 ~]#
  mongos 路由配置文件与启动脚本内容如下:
  [root@pc1 ~]#egrep "^[^#$]" /data/mongodb/config/mongos.conf
systemLog:  
  destination: file
  
  logAppend: true
  
  path: /data/mongodb/data/logs/mongos.log
  
processManagement:
  
  fork: true  # fork and run in background
  
  pidFilePath: /var/run/mongodb/mongos.pid  # location of pidfile
  
net:
  
  port: 27017
  
  #bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
  
sharding:
  
  configDB: pc1:27029,pc2:27029,pc3:27029
  
#注: mongodb3.4时格式必须为 configDB: configrs_name/configServer_list
  [root@pc1 ~]#  cp /etc/init.d/mongod  /etc/init.d/mongos
  [root@pc1 ~]#  vim /etc/init.d/mongos
  [root@pc1 ~]#  egrep "^[^#$]" /etc/init.d/mongos
. /etc/rc.d/init.d/functions  
CONFIGFILE="/data/mongodb/config/mongos.conf"
  
OPTIONS=" -f $CONFIGFILE"
  
mongod=${MONGOD-/usr/bin/mongos}
  
MONGO_USER=mongod
  
MONGO_GROUP=mongod
  
SYSCONFIG="/etc/sysconfig/mongod"
  
if [ -f "$SYSCONFIG" ]; then
  
    . "$SYSCONFIG"
  
fi
  
NUMACTL_ARGS="--interleave=all"
  
if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null
  
then
  
    NUMACTL="numactl $NUMACTL_ARGS"
  
else
  
    NUMACTL=""
  
fi
  
PIDFILEPATH=`awk -F'[:=]' -v IGNORECASE=1 '/^[[:blank:]]*(processManagement\.)?pidfilepath[[:blank:]]*[:=][[:blank:]]*/{print $2}' "$CONFIGFILE" | tr -d "[:blank:]\"'" | awk -F'#' '{print $1}'`
  
PIDDIR=`dirname $PIDFILEPATH`
  
start()
  
{
  
  # Make sure the default pidfile directory exists
  
  if [ ! -d $PIDDIR ]; then
  
    install -d -m 0755 -o $MONGO_USER -g $MONGO_GROUP $PIDDIR
  
  fi
  
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  
echo never > /sys/kernel/mm/transparent_hugepage/defrag
  
fi
  
  # Recommended ulimit values for mongod or mongos
  
  # See http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
  
  #
  
  ulimit -f unlimited
  
  ulimit -t unlimited
  
  ulimit -v unlimited
  
  ulimit -n 64000
  
  ulimit -m unlimited
  
  ulimit -u 64000
  
  echo -n $"Starting mongod: "
  
  daemon --user "$MONGO_USER" --check $mongod "$NUMACTL $mongod $OPTIONS >/dev/null 2>&1"
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongos
  
}
  
stop()
  
{
  
  echo -n $"Stopping mongod: "
  
  mongo_killproc "$PIDFILEPATH" $mongod
  
  RETVAL=$?
  
  echo
  
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mongos
  
}
  
restart () {
  
        stop
  
        start
  
}
  
mongo_killproc()
  
{
  
  local pid_file=$1
  
  local procname=$2
  
  local -i delay=300
  
  local -i duration=10
  
  local pid=`pidofproc -p "${pid_file}" ${procname}`
  
  kill -TERM $pid >/dev/null 2>&1
  
  usleep 100000
  
  local -i x=0
  
  while [ $x -le $delay ] && checkpid $pid; do
  
    sleep $duration
  
    x=$(( $x + $duration))
  
  done
  
  kill -KILL $pid >/dev/null 2>&1
  
  usleep 100000
  
  checkpid $pid # returns 0 only if the process exists
  
  local RC=$?
  
  [ "$RC" -eq 0 ] && failure "${procname} shutdown" || rm -f "${pid_file}"; success "${procname} shutdown"
  
  RC=$((! $RC)) # invert return code so we return 0 when process is dead.
  
  return $RC
  
}
  
RETVAL=0
  
case "$1" in
  
  start)
  
    start
  
    ;;
  
  stop)
  
    stop
  
    ;;
  
  restart|reload|force-reload)
  
    restart
  
    ;;
  
  condrestart)
  
    [ -f /var/lock/subsys/mongos ] && restart || :
  
    ;;
  
  status)
  
    status $mongod
  
    RETVAL=$?
  
    ;;
  
  *)
  
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
  
    RETVAL=1
  
esac
  
exit $RETVAL
  [root@pc1 ~]#  scp /data/mongodb/config/mongos   pc2:/data/mongodb/config/
  [root@pc1 ~]#  scp /etc/init.d/mongos  pc2:/etc/init.d/
  [root@pc1 ~]#  scp /data/mongodb/config/mongos   pc3:/data/mongodb/config/
  [root@pc1 ~]#scp /etc/init.d/mongos  pc3:/etc/init.d/
  [root@pc1 ~]# /etc/init.d/mongos start
  Starting mongod:                                           [确定]
  [root@pc1 ~]#ssh pc2 '/etc/init.d/mongos start'
  Starting mongod: [确定]
  [root@pc1 ~]#  ssh pc3 '/etc/init.d/mongos start'
  Starting mongod: [确定]
  [root@pc1 ~]#
  有些网朋友说:需要实现mongos路由的副本集(即多台mongos路由之间的复制),但从原理分析,我个人没能理解这种方案的功能,当然本人也尝试过,发现设置副本集之后mongos服务无法启动(并无深入研究,请各位朋友提宝贝意见)
  三、实现分片
  连接到任何一台mongos路由上,操作如下:
  [root@pc1 ~]# mongo
  MongoDB shell version: 3.2.7
  connecting to: test
  mongos> use admin
  switched to db admin
  mongos>sh.status()
--- Sharding Status ---  
  sharding version: {
  
"_id" : 1,
  
"minCompatibleVersion" : 5,
  
"currentVersion" : 6,
  
"clusterId" : ObjectId("577226b7511b1f96da0ddba2")
  
}
  
  shards:
  
  active mongoses:
  
"3.2.7" : 3
  
  balancer:
  
Currently enabled:  yes
  
Currently running:  no
  
Failed balancer rounds in last 5 attempts:  0
  
Migration Results for the last 24 hours:
  
No recent migrations
  
  databases:
  mongos> sh.addShard("shard1/pc1:27027")
  { "shardAdded" : "shard1", "ok" : 1 }
  mongos> sh.addShard("shard3/pc2:27026")
  { "shardAdded" : "shard3", "ok" : 1 }
  mongos> sh.addShard("shard2/pc3:27028")
  { "shardAdded" : "shard2", "ok" : 1 }
  mongos> sh.status()
--- Sharding Status ---  
  sharding version: {
  
"_id" : 1,
  
"minCompatibleVersion" : 5,
  
"currentVersion" : 6,
  
"clusterId" : ObjectId("577226b7511b1f96da0ddba2")
  
}
  
  shards:
  
{  "_id" : "shard1",  "host" : "shard1/pc1:27027,pc2:27027" }
  
{  "_id" : "shard2",  "host" : "shard2/pc1:27028,pc3:27028" }
  
{  "_id" : "shard3",  "host" : "shard3/pc2:27026,pc3:27026" }
  
  active mongoses:
  
"3.2.7" : 3
  
  balancer:
  
Currently enabled:  yes
  
Currently running:  no
  
Failed balancer rounds in last 5 attempts:  5
  
Last reported error:  mongos specified a different config database string : stored : pc1:27029 vs given : pc1:27029,pc2:27029,pc3:27029
  
Time of Reported error:  Tue Jun 28 2016 07:34:07 GMT+0000 (UTC)
  
Migration Results for the last 24 hours:
  
No recent migrations
  
  databases:
  mongos> use config
  switched to db config
  mongos> db.chunks.find()
  mongos> db.settings.find()
  { "_id" : "chunksize", "value" : NumberLong(64) }
  mongos> db.settings.save({"_id":"chunksize","value":NumberLong(5)}) #不建议修改chunk的值,本例为了实例效果改为5M。最小的chunksize(1M),默认chunksize为64M
  WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  mongos> db.settings.find()
  { "_id" : "chunksize", "value" : NumberLong(5) }
  mongos> use admin
  switched to db admin
  mongos> sh.enableSharding("test")
  { "ok" : 1 }
  mongos> sh.shardCollection("test.user",{uid:1})
  { "collectionsharded" : "test.user", "ok" : 1 }
  mongos>use test
  switched to db test
  mongos> db.use.ensureIndex({uid:1})
{  
"raw" : {
  
"shard1/pc1:27027,pc2:27027" : {
  
"createdCollectionAutomatically" : true,
  
"numIndexesBefore" : 1,
  
"numIndexesAfter" : 2,
  
"ok" : 1,
  
"$gleStats" : {
  
"lastOpTime" : Timestamp(1467102931, 2),
  
"electionId" : ObjectId("7fffffff0000000000000001")
  
}
  
}
  
},
  
"ok" : 1
  
}
  mongos> for (i=1;ish.status()
--- Sharding Status ---  
  sharding version: {
  
"_id" : 1,
  
"minCompatibleVersion" : 5,
  
"currentVersion" : 6,
  
"clusterId" : ObjectId("577234b7c92b86a15a2901d4")
  
}
  
  shards:
  
{  "_id" : "shard1",  "host" : "shard1/pc1:27027,pc2:27027" }
  
{  "_id" : "shard2",  "host" : "shard2/pc2:27028,pc3:27028" }
  
{  "_id" : "shard3",  "host" : "shard3/pc1:27026,pc3:27026" }
  
  active mongoses:
  
"3.2.7" : 3
  
  balancer:
  
Currently enabled:  yes
  
Currently running:  no
  
Failed balancer rounds in last 5 attempts:  0
  
Migration Results for the last 24 hours:
  
2 : Success
  
1 : Failed with error 'aborted', from shard1 to shard2
  
  databases:
  
{  "_id" : "test",  "primary" : "shard1",  "partitioned" : true }
  
test.user
  
shard key: { "uid" : 1 }
  
unique: false
  
balancing: true
  
chunks:
  
shard11
  
shard21
  
shard31
  
{ "uid" : { "$minKey" : 1 } } -->> { "uid" : "user2" } on : shard2 Timestamp(2, 0)
  
{ "uid" : "user2" } -->> { "uid" : "user8" } on : shard3 Timestamp(3, 0)
  
{ "uid" : "user8" } -->> { "uid" : { "$maxKey" : 1 } } on : shard1 Timestamp(3, 1)
  mongos>use config
  switched to db config
  mongos> show collections
actionlog  
changelog
  
chunks
  
collections
  
databases
  
lockpings
  
locks
  
mongos
  
settings
  
shards
  
tags
  
version
  mongos> db.settings.find()
{ "_id" : "chunksize", "value" : NumberLong(64) }  mongos>db.shards.find()
{ "_id" : "shard1", "host" : "shard1/pc1:27027,pc2:27027" }  
{ "_id" : "shard3", "host" : "shard3/pc1:27026,pc3:27026" }
  
{ "_id" : "shard2", "host" : "shard2/pc2:27028,pc3:27028" }
  mongos> db.databases.find()
{ "_id" : "test", "primary" : "shard1", "partitioned" : true }  mongos> db.chunks.find()
{ "_id" : "test.user-uid_MinKey", "lastmod" : Timestamp(2, 0), "lastmodEpoch" : ObjectId("57723675c92b86a15a290209"), "ns" : "test.user", "min" : { "uid" : { "$minKey" : 1 } }, "max" : { "uid" : "user2" }, "shard" : "shard2" }  
{ "_id" : "test.user-uid_\"user2\"", "lastmod" : Timestamp(3, 0), "lastmodEpoch" : ObjectId("57723675c92b86a15a290209"), "ns" : "test.user", "min" : { "uid" : "user2" }, "max" : { "uid" : "user8" }, "shard" : "shard3" }
  
{ "_id" : "test.user-uid_\"user8\"", "lastmod" : Timestamp(3, 1), "lastmodEpoch" : ObjectId("57723675c92b86a15a290209"), "ns" : "test.user", "min" : { "uid" : "user8" }, "max" : { "uid" : { "$maxKey" : 1 } }, "shard" : "shard1" }
  mongos>exit
  四、补充命令
  db.runCommand({addshard:"shard1/pc1:27027,pc2:27027,pc3:27027”,name:"shard1"});
  db.runCommand({addshard:"shard2/pc1:27028,pc2:27028,pc3:27028”,name:"shard2"});
  db.runCommand({addshard:"shard3/pc1:27026,pc2:27026,pc3:27026”,name:"shard3"});
  use admin
  db.runCommand({enablesharding:"db_name"})
  db.runCommand({shardcollection:"db_name.collection_name",key:{fields_name:"hashed"}})
  db.runCommand({shardcollection:"db_name.collection_name",key:{fields_name:1}})
  sh.shardCollection("db_name.collection_name",{fields_name1:1,fields_name2:1})



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-626372-1-1.html 上篇帖子: Java操纵MongoDB_1(环境设置) 下篇帖子: 【Mongodb】如何创建mongodb的replica set
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表