MongoDB集群部署(副本集模式)

一、需求背景
1、现状描述
(1)、针对近期出现的mongodb未授权的安全问题,导致mongodb数据会被非法访问。应安全平台部的要求,需要对所有mongodb进行鉴权设置,目前活动侧总共有4台,用于某XX产品;

(2)、某XX产品用到4台mongodb,属于2015年机房裁撤的范围;

(3)、早期的4台mongodb采用是的M1机型,同时在架构上采取了路由分片的模式。从目前来看,无论是数据量上,还是访问量上,都比较小,在资源上有点浪费,在架构上属于过早设计。

而本次新建的mongodb集群,采用的是副本集模式,且机型选为B6,机器数量为3台。

2、服务器信息

3、架构图

4、系统环境
CentOS 6.3 x86_64

5、软件包地址
http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.6.7.tgz

二、MongoDB集群部署
1、mongodb基础安装
略过(直接从官方下载二进制包解压到“/usr/local”路径)

# mkdir -p /data/mongodb/data/repair
# mkdir -p /usr/local/mongodb/{etc,run}
# mkdir -p /data/mongodb/logs

2、前期准备工作
(1)、副本集名称设置
# vim /usr/local/mongodb/etc/mongod.conf

初期的配置:
dbpath = /data/mongodb/data
logpath = /data/mongodb/logs/mongod.log
repairpath = /data/mongodb/data/repair
pidfilepath = /usr/local/mongodb/run/mongod.pid

directoryperdb = true
logappend = true

noauth = true

bind_ip = 你的IP
port = 27017

quota = true
quotaFiles = 65535

maxConns = 20000
fork = true
nssize = 16

rest = true
httpinterface = true

journal = true
oplogSize = 2000

cpu = true

replSet = fenglingSet

(2)、启动参数
对于NUMA架构的CPU,需要增加以下启动参数:
# vim /usr/local/mongodb/etc/mongod
…..
numactl --interleave=all
…..

(3)、完整的启动脚本
# vim /usr/local/mongodb/etc/mongod

#!/bin/bash## this script start and stop the mongodb daemon
## chkconfig:   - 85 15
# description: mongodb is a document key-value database
# processname: mongod
# config:     /usr/local/mongodb/etc/mongod.conf
# pidfile:     /usr/local/mongodb/run/mongod.pid
#
# code by rocketzhang
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

mongod="/usr/local/mongodb/bin/mongod"
prog=mongod

OPTIONS="--fork --config /usr/local/mongodb/etc/mongod.conf"
RETVAL=0

start() {
    echo -n $"Starting $prog......"
    numactl --interleave=all $mongod $OPTIONS
    
    RETVAL=$?
    echo 
    [ $RETVAL -eq 0 ]
    
    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog......"
    /sbin/killproc -9 $prog
    
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ]
    
    return $RETVAL
}

case "$1" in
start)
    start 
    ;;
    
stop) 
    stop 
    ;;
    
restart) 
    stop 
    sleep 1 
    start 
    ;;

*) 
    echo $"Usage: $prog {start|stop|restart}" 
    exit 1
esac

# ln -s /usr/local/mongodb/etc/mongod /etc/init.d/mongod

# chmod +x /usr/local/mongodb/etc/mongod

(4)、服务启动
# service mongod start

注意:
3台节点服务器皆做同样设置。

3、副本集设置
# /usr/local/mongodb/bin/mongo --host 10.157.23.13 --port 27017
> use admin
> config={ _id:"fenglingSet", members:[{_id:0,host:"10.157.23.13:27017"},{_id:1,host:"10.193.23.11:27017"},{_id:2,host:"10.193.24.171:27017"}]}

> rs.initiate(config);

> rs.status();

4、其他说明
(1)、集群状态信息查看
# /usr/local/mongodb/bin/mongo --host 10.157.23.13 --quiet --eval "printjson(rs.status())"

(2)、设置副本节点可读
mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。
# /usr/local/mongodb/bin/mongo --host 10.193.24.171 --port 27017
> db.getMongo().setSlaveOk();

注意:
重启服务后,需要重新设置。

(3)、节点角色
PRIMARY节点可读可写,SECONDARY节点仅可读。

三、MongoDB授权设置
1、单机模式
(1)、账号添加
# /usr/local/mongodb/bin/mongo --host XXX.XXX.XXX.XXX --port 27017
> use admin
> db.addUser("huodong", "tenmongo$2356")
> db.system.users.find()

(2)、配置修改并重启服务
# vim /usr/local/mongodb/etc/mongod.conf
……
auth = ture
…..

# service mongod restart

(3)、连接测试
# /usr/local/mongodb/bin/mongo XXX.XXX.XXX.XXX:27017/admin -uhuodong -p‘tenmongo$2356‘

2、集群模式(本次采用)
(1)、keyfile文件创建
# cd /usr/local/mongodb/etc
# openssl rand -base64 513 > keyfile
# chmod 600 keyfile

注意:
需要将keyfile也同步到其他节点服务器上。

(2)、账号添加
# /usr/local/mongodb/bin/mongo --host 10.157.23.13 --port 27017
> use admin
> db.addUser("huodong", "tenmongo$2356")

> db.system.users.find()

(3)、配置修改并重启服务
# vim /usr/local/mongodb/etc/mongod.conf

# service mongod restart

最终的配置:
dbpath = /data/mongodb/data
logpath = /data/mongodb/logs/mongod.log
repairpath = /data/mongodb/data/repair
pidfilepath = /usr/local/mongodb/run/mongod.pid

directoryperdb = true
logappend = true

auth = true
clusterAuthMode = keyFile
keyFile = /usr/local/mongodb/etc/keyfile

bind_ip = 10.157.23.13
port = 27017

quota = true
quotaFiles = 16

maxConns = 20000
fork = true
nssize = 16

rest = true
httpinterface = true

journal = true
oplogSize = 2000

cpu = true

replSet = fenglingSet

注意:
需要在其他节点服务器上,也做同样设置。

(4)、简单测试
# /usr/local/mongodb/bin/mongo 10.157.23.13:27017/admin -uhuodong -p‘tenmongo$2356‘

# /usr/local/mongodb/bin/mongo --host 10.157.23.13 -uhuodong -p‘tenmongo$2356‘ admin --quiet --eval "printjson(rs.status())"

四、PRIMARY节点自动Failover(业务侧)
1、业务侧服务器分布

2、账号添加(mongodb集群上进行)
# /usr/local/mongodb/bin/mongo 10.157.23.13:27017/admin -uhuodong -p‘tenmongo$2356‘
> use admin
> db.addUser("check_health", "tenmongo$2356")

3、Failover监控设置
(1)、HAPROXY配置(对应的VIP:10.153.224.44)
# vim /usr/local/haproxy/etc/haproxy.conf
……
listen FENGLING_MONGO_SERVER
         bind 0.0.0.0:27017
         mode tcp
         balance roundrobin
         option tcpka
         server MONGO_SERVER1 10.157.23.13:27017 maxconn 1500 check inter 2000 rise 2 fall 3 weight 1
         server MONGO_SERVER2 10.193.23.11:27017 maxconn 1500 check inter 2000 rise 2 fall 3 weight 1
         server MONGO_SERVER3 10.193.24.171:27017 maxconn 1500 check inter 2000 rise 2 fall 3 weight 1
……

# service haproxy reload

(2)、监控脚本
# vim /data/scripts/check_mongo_primary.sh

#!/bin/sh
#======================================================================
## MongoDB副本集PRIMARY角色异常监控告警
##
## code by rocketzhang
#======================================================================
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

MONGO_BIN_PATH="/usr/local/mongodb/bin/mongo"

MONITOR="/usr/local/oms/agent/alarm/BusMonitorAgent"
TOKEN="fengling_mongodb"
TITLE="MongoDB副本集PRIMARY角色异常监控"

SRV_IPADDR="10.153.224.44"
SRV_PORT="27017"

## S代表TCP协议,U代表UDP协议
PROT_OPT="S"
SCAN_FLAG=0

HOSTS_FILE="/etc/hosts"

for ((i=0; i<3; i++)); do 
    RETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${SRV_IPADDR} | grep open` 
    [[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10
done

if [[ ${SCAN_FLAG} -eq 0 ]]; then 
    CONTENT="MongoDB集群存在异常,27017端口不可达!" 
    ${MONITOR} -c 2 -f ${TOKEN} -t "${TITLE}" -i "${CONTENT}"
fi

CURRENT_MONGO_MASTER=`awk ‘/fl.mongo.qq.com/{print $1}‘ /etc/hosts`
NEW_MONGO_MASTER=`${MONGO_BIN_PATH} --host ${SRV_IPADDR} -ucheck_health -p‘tenmongo$2356‘ admin --quiet --eval "printjson(rs.status())" | grep -B 3 PRIMARY | awk -F ‘:‘ ‘/name/{print $2}‘ | sed ‘s/ "//‘`

if [[ "${NEW_MONGO_MASTER}" != "${CURRENT_MONGO_MASTER}" ]]; then 
    sed -i ‘/fl.mongo.qq.com/d‘ ${HOSTS_FILE} 
    echo "${NEW_MONGO_MASTER}    fl.mongo.qq.com" >> ${HOSTS_FILE} 
    /sbin/service nscd restart >/dev/null 2>&1  
    
    CONTENT="MongoDB副本集PRIMARY角色已自动切换,请尽快确认!" 
    ${MONITOR} -c 2 -f ${TOKEN} -t "${TITLE}" -i "${CONTENT}"
fi

(3)、crontab信息添加
# touch /var/run/check_primary.lock
# echo ‘ touch /var/run/check_primary.lock‘ >> /etc/rc.d/rc.local

# crontab -uroot -e
* * * * * (flock --timeout=0 /var/run/check_primary.lock /data/scripts/check_mongo_primary.sh >/dev/null 2>&1)

注意:
业务侧通过fl.mongo.qq.com域名进行mongodb集群访问,当mongodb集群的primary节点发生故障时,会自动选举剩下的其中的一个节点为primary角色,然后业务侧的监控脚本会自动发现最新的primary节点,并刷新本地的hosts配置。整个切换过程对业务侧保持透明,当然当数据与访问量到了一定规模时,我们也不推荐采用此架构模式,此时可以考虑自动路由分片的架构模式。

附录

1、参考资料
http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 
http://www.lanceyan.com/tech/mongodb_repset2.html 
http://www.lanceyan.com/tech/arch/mongodb_shard1.html

2、数据迁移
(1)、工具一
http://duoyun.org/topic/5173d275cbce24580a033bd8 
http://pan.baidu.com/s/15YsBs  提取密码:levr

(2)、工具二
https://github.com/10gen-labs/mongo-connector

本次的迁移命令:
/usr/local/mongodb/bin/mongosync -h 10.217.121.216:27020 --to 10.157.23.13:27017 --tu huodong --tp ‘tenmongo$2356‘ –oplog

时间: 2025-01-04 04:57:48

MongoDB集群部署(副本集模式)的相关文章

搭建mongodb集群(副本集+分片)

完整的搭建mongodb集群(副本集+分片)的例子... 准备四台机器,分别是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0 副本集及分片策略确定如下: 将创建3个副本集,命名为shard1,shard2,shard3: 以上3个副本集作为3个分片: 每个副本集包含2个副本(主.辅): 副本分开存储,即shard1存在bluejoe1和bluejoe2上各一份...以此类推 将创建3个配置库实例,一台机器一个 bluejoe0上配置一个mongos(mongos一般可

Mongodb集群部署以及集群维护命令

Mongodb集群部署以及集群维护命令 http://lipeng200819861126-126-com.iteye.com/blog/1919271 mongodb分布式集群架构及监控配置 http://freeze.blog.51cto.com/1846439/884925/ 见文中: 七.监控配置:      早在去年已经出现MongoDB和Redis的Cacti模板,使用它,你可以对你的MongoDB和Redis服务进行流量监控.cacti的模板一直在更新,若企业已经用到nosql这种

MongoDB集群搭建-副本集

MongoDB集群搭建-副本集 概念性的知识,可以参考本人博客地址: http://www.cnblogs.com/zlp520/p/8088169.html 一.Replica Set方案(副本集或复制集): 1.搭建副本集有两种办法: 其一:在一台服务器上,通过文件的方式及端口号的方式来区分: 其二:找最少三台服务器,每台服务器都通过如下的配置: ip规划每台服务器担任的工作: 192.168.0.100:27017 主机 192.168.0.101:27017 副本集 192.168.0.

kubernetes容器集群部署Etcd集群

安装etcd 二进制包下载地址:https://github.com/etcd-io/etcd/releases/tag/v3.2.12 [[email protected] ~]# GOOGLE_URL=https://storage.googleapis.com/etcd [[email protected] ~]# GITHUB_URL=https://github.com/coreos/etcd/releases/download [[email protected] ~]# DOWNL

Mongodb集群之副本集

上篇咱们遗留了几个问题 1主节点是否能自己主动切换连接? 眼下须要手动切换 2主节点读写压力过大怎样解决 3从节点每一个上面的数据都是对数据库全量拷贝,从节点压力会不会过大 4数据压力达到机器支撑不了时候是否能自己主动扩展? Nosql的产生是为了解决大数据量.高扩展,高性能,灵活数据模型.高可用性.可是光通过主从模型的架构是远远达不到上面几点的.因此.mongodb设计了副本集和分片的功能.咱们以下就来说说副本集 mongodb官方已经不建议使用主从模式,而是副本集进行取代. IMPORTAN

MongoDB健壮集群——用副本集做分片

1.    MongoDB分片+副本集 健壮的集群方案 多个配置服务器 多个mongos服务器  每个片都是副本集 正确设置w 架构图 说明: 1.   此实验环境在一台机器上通过不同port和dbpath实现启动不同的mongod实例 2.   总的9个mongod实例,分别做成shard1.shard2.shard3三组副本集,每组1主2从 3.   Mongos进程的数量不限,建议把mongos配置在每个应用服务器本机上,这样每个应用服务器就与自身的mongos进行通信,如果服务器不工作了

MongoDB学习笔记~Mongo集群和副本集

一些概念 对于Mongo在数据容灾上,推荐的模式是使用副本集模式,它有一个对外的主服务器Primary,还有N个副本服务器Secondary(N>=1,当N=1时,需要有一台仲裁服务器Arbiter,当N>1时不需要Arbiter),它们之前是通过内部机制实现同步的,并且当Primary挂了后,它会通过内部的心跳机制,选举别一台Secondary成为一个Primary,与外界(Route)进行通讯. 工业标准 在标准上,我们的副本集推荐使用奇数个服务器(3,5,7,9),但经过我的测试,只要大

《二》Kubernetes集群部署-搭建集群

多master集群架构图 时间必须同步.关闭防火墙.Firewalld.selinux 1.拷贝master01 中的kubernetes目录到master02上[[email protected] ~]# scp -r /opt/kubernetes/ 192.168.1.16:/opt/ 2.启动脚本[[email protected] kubeconfig]# scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manag

Rabbit-3.6.5 集群部署

1.集群概述通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收.这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制.本方案中搭建 3 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务. 2.节点类型 RAM node:内存节点将所有的队列.交换机.

ActiveMQ的单节点和集群部署

平安寿险消息队列用的是ActiveMQ. 单节点部署: 下载解压后,直接cd到bin目录,用activemq start命令就可启动activemq服务端了. ActiveMQ默认采用61616端口提供JMS服务,使用8161端口提供管理控制台服务,执行以下命令以便检验是否已经成功启动ActiveMQ服务: ps -aux | grep activemq netstat -anp | grep 61616 此外,还可直接访问管理页面:http://ip:8161/admin/ ,用户名和密码可以