mongodb数据源 replicaset模式需要同步时间么!在项目中是如何配置该数据源的呢?求指导

MongoDB Replica Set的部署配置以及遇到的问题 -
- ITeye技术网站
博客分类:
本文介绍了MongoDB Replica Set 服务节点的的部署和配置过程,提供了部署脚本和测试代码。并就特定版本说明了使用中遇到的问题。
1.Replica Set介绍Replica Set是mongoDB将在1.6版本中推出的一项新功能,用来替代已有的Replica Pair,支持多于两个节点的自动的故障恢复,目前这个功能处于发布前的阶段。在它的1.5.7(1.6-rc2)版本中提供了一个Replica Set的测试版本,这个版本在日刚刚发布,本文内容全部基于这个版本。
2.服务部署和配置为了测试,在一台服务器上启动3个mongodb节点,建立目录如下:
cd /opt/programs/mongodb
mkdir data
mkdir data/20
mkdir data/21
mkdir data/22
启动脚本如下:
##########start20.sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27020 --replSet rep/rscat:27021 --dbpath $MONGO_DATA/20/ --oplogSize 2048
##########start21.sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27021 --replSet rep/rscat:27020 --dbpath $MONGO_DATA/21/ --oplogSize 2048
##########start22.sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27022 --replSet rep/rscat:27020 --dbpath $MONGO_DATA/22/ --oplogSize 2048
在3个不同的控制台中执行上述脚本,启动3个服务节点,从log日志可以看到,三个节点相互协商出一个节点作为Primary,另外两个自动作为Secondary节点。
打开客户端,并按照以下执行:
bin/mongo --port 27020
MongoDB shell version: 1.5.6
connecting to: rscat:27020/test
& use admin
switched to db admin
... _id: 'rep',
... members: [
... { _id: 0, host: 'rscat:27020' },
... { _id: 1, host: 'rscat:27021' },
... { _id: 2, host: 'rscat:27022' }
& rs.initiate(cfg)
"info" : "Config now saved locally. Should come online in about a
至此,Replica Set配置完成,下面可以进行测试了。
3.用MongoDB自带客户端mongo进行测试在控制台中用Ctrl-C杀死Primary服务,从服务器的log日志,以及从客户端查询都可以看到,另外两个节点会协商出其中的一个节点作为Primary。执行启动脚本,启动刚刚杀死的服务。
查看replica set状态的命令: rs.status()
查看replica set配置的命令: rs.conf()
查看服务节点是否为Primary的命令: db.isMaster();
4.java代码测试写这篇文章的时间是日,mongoDB java驱动的正式版本是2.0,尚不支持Replica Set的访问,查看官网,发现即将发布的2.1版是支持Replica Set的。下载其java driver的源代码,自己编译生成驱动的jar(暂命名为mongo-driver.jar),用刚生成的jar替换测试工程中的mongodb驱动。
测试代码如下:
import static org.junit.Assert.assertNotN
import static org.junit.Assert.assertE
import java.net.UnknownHostE
import java.util.ArrayL
import java.util.L
import org.junit.B
import org.junit.T
import com.mongodb.BasicDBO
import com.mongodb.DB;
import com.mongodb.DBC
import com.mongodb.DBC
import com.mongodb.DBO
import com.mongodb.M
import com.mongodb.MongoE
import com.mongodb.ServerA
public class TestReplicaSet {
private int count = 10;
private Mongo mongo =
public void setUp(){
List&ServerAddress& setList = new ArrayList&ServerAddress&();
setList.add(new ServerAddress("192.168.0.48", 27020));
setList.add(new ServerAddress("192.168.0.48", 27021));
setList.add(new ServerAddress("192.168.0.48", 27022));
} catch (UnknownHostException e) {
e.printStackTrace();
mongo = new Mongo(setList);
public void testInsertAndGet(){
DB db = mongo.getDB("A");
DBCollection col = db.getCollection("B");
col.drop();
for(int i = 1; i &= i++){
col.insert(new BasicDBObject("seq", i+""));
}catch(MongoException e){
System.out.println("i=" + i);
DBCursor cursor = col.find();
int j = 0;
while(cursor.hasNext()){
DBObject o = cursor.next();
assertNotNull(o.keySet());
assertEquals(j, 10);
执行上述单元测试,成功。
把上述代码稍作改变:
public void testInsertAndGet(){
DB db = mongo.getDB("A");
DBCollection col = db.getCollection("B");
col.drop();
for(int i = 1; i &= i++){
col.insert(new BasicDBObject("seq", i+""));
}catch(MongoException e){
if(i == 500){
System.out.println("i=" + i);
Thread.sleep(12000);
} catch (InterruptedException e) {
DBCursor cursor = col.find();
int j = 0;
while(cursor.hasNext()){
DBObject o = cursor.next();
assertNotNull(o.keySet());
assertEquals(j, count);
在insert执行到一半(500个)的时候,让程序暂时睡眠。在睡眠的12秒中之内,杀死Primary的服务,此时剩余的两个服务会迅速的自动选出一个作为Primary。12秒的睡眠结束之后,程序继续运行,但驱动却不能找到新的Primary服务,剩余的insert无法继续执行,失败。发生问题服务器版本1.5.7 java驱动版本(2.0+2.1)/2!!!
截至目前,mongodb的replica set还在开发之中,虽然核心的功能已经基本完成,但很多外围的比如驱动等尚待完善。
6.参考文章
mousehouse
浏览: 18465 次
来自: 北京
请问如何模糊查询特殊符号 比如说 { 之类的
现在的驱动貌似可以了,我刚照你这个跑了一遍,成功了
我测试了一下,Java的驱动应该是在内部抓住类似的异常处理了。 ...
你确认你的这个配置用到线上方案??? 连认证都没有哦?
应该用不到索引了吧?效率如何?mongodb(10)
作者同类文章X
今天在新环境部署mongodb集群,忘记先配置hostname,引发了一个错误。配置rs的完整过程,见
未配置主机名之前,在primary上执行
rs.initiate()
错误信息是:
& rs.initiate()
&info2& : &no configuration explicitly specified -- making one&,
&me& : &the-host-name:2222&,
&errmsg& : &couldn't initiate : can't find self in the replset config&,
然后需要编辑/etc/hosts文件,将上面红字的主机名映射进去即可
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:403028次
积分:10288
积分:10288
排名:第759名
原创:636篇
转载:18篇
评论:109条
(3)(3)(8)(6)(4)(4)(6)(7)(9)(13)(3)(14)(19)(23)(16)(6)(7)(22)(30)(53)(22)(46)(331)mongodb replicaset模式需要同步时间么!在项目中是如何配置该数据源的呢?求指导_百度知道
mongodb replicaset模式需要同步时间么!在项目中是如何配置该数据源的呢?求指导
配置ntp即可(集群中一台服务器做主服务器,会同步失败,其他服务器向它同步时间)。否则,如果两台机器时间差比较大需要同步机器时间
请问一下,在项目中如何配置mongodb replicaset模式下的数据源呢?
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁[MongoDB]安装MongoDB配置ReplicaSet
MongoDB的环境主要包括StandAlone,Replication和Sharding。
StandAlone:单机环境,一般开发测试的时候用。Replication:主从结构,一个Primary,多个Secondary,可能会有Arbitry。
Primary挂掉之后,会选举出一个Secondary作为Primary,与zookeeper类似。Arbitry上面不存数据,只是为了凑数。选举算法要求节点数必须是奇数个,如果Primary+Secondary不是奇数个,就要用Arbitry凑数。写数据只能在Primary,读数据默认也在Primary,可以配置成从Secondary读,可以选最近的节点。数据在Primary上写成功之后,会将操作记录在oplog中,Secondary将oplog拷贝过去,然后照着操作一遍,就有数据了。Primary和Secondary上面的数据保证最终一致性,可以为写操作配置write concern,有几个级别:在Primary上写完就认为写成功;写到oplog后认为写成功;写到一个/多个/某个/某几个Secondary之后认为写成功,等等。
Sharding:share nothing的结构,每台机器只存一部分数据。mongod服务器存数据,mongos服务器负责路由读写请求,元数据存在config中。
因为数据量和机器量的原因,项目最终用了一个Primary,一个Secondary,一个Arbitry。我自己的开发环境是Ubuntu,测试环境是CentOS。安装的是64位的MongoDB。
Ubuntu上的安装
sudo apt-get install mongodb-10gen
CentOS上的安装
配置yum源,创建文件:/etc/yum.repos.d/mongodb.repo
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
安装命令:
yum install mongo-10gen mongo-10gen-server
每台机器上面的配置文件/etc/mongod.conf修改成下面的:
#数据库文件所在位置(默认)
dbpath=/var/lib/mongo
#日志所在位置(默认)
logpath=/var/log/mongo/mongod.log
#pid所在位置(默认)
pidfilepath = /var/run/mongodb/mongod.pid
#keyFile所在位置,生成方式在后面(添加)
keyFile=/var/lib/mongo/key
#端口(默认)
port=27017
#每次启动后日志追加在后面,不会新建日志文件(默认)
logappend=true
#用deamon方式启动(添加)
#打开操作日志,用于故障恢复和持久化(默认)
journal=true
#replica set的名字(添加)
replSet=test-set
在每台机器上运行:
sudo mongod -f /etc/mongod.conf
我的环境里面,Primary ip: 192.168.1.1,Secondary ip: 192.168.1.2,Arbitary ip: 192.168.1.3。在单机上可以将多个mongodb设置成不同端口,我测试了一下也是可以的。
在Primary上运行“mongo”,打开命令行,设置Replica Set:
rs.initiate(
{&_id& : &test-set&,
&members& : [
{&_id& : 1, &host& : &192.168.1.1&},
{&_id& : 2, &host& : &192.168.1.2&},
{&_id& : 3, &host& : &192.168.1.3&, &arbiterOnly& : true}
&info& : &Config now saved locally. Should come online in about a minute.&,
历史成功后需要等一段时间,他会选举Primary,然后查看Replica Set的状态:
test-set:PRIMARY& rs.status()
&set& : &test-set&,
&date& : ISODate(&T10:28:55Z&),
&myState& : 7,
&members& : [
&_id& : 1,
&name& : &192.168.1.1:27017&,
&health& : 1,
&state& : 1,
&stateStr& : &PRIMARY&,
&uptime& : 4086,
&optime& : Timestamp(, 1),
&optimeDate& : ISODate(&T08:48:00Z&),
&lastHeartbeat& : ISODate(&T10:28:54Z&),
&lastHeartbeatRecv& : ISODate(&T10:28:53Z&),
&pingMs& : 0
&_id& : 2,
&name& : &192.168.1.2:27017&,
&health& : 1,
&state& : 2,
&stateStr& : &SECONDARY&,
&uptime& : 3997,
&optime& : Timestamp(, 1),
&optimeDate& : ISODate(&T08:48:00Z&),
&lastHeartbeat& : ISODate(&T10:28:54Z&),
&lastHeartbeatRecv& : ISODate(&T10:28:55Z&),
&pingMs& : 0,
&syncingTo& : &192.168.131.15:27017&
&_id& : 3,
&name& : &192.168.1.3:27017&,
&health& : 1,
&state& : 7,
&stateStr& : &ARBITER&,
&uptime& : 5781,
&self& : true
这样整个replica set就配置成功了,还是比较简单的。
KeyFile的设置
KeyFile是机器间用来进行权限认证的,如果没有设置KeyFile,在rs.initiate()的时候,会提示有其他机器没有ready,大概这个意思记不清了,反正有个error...
网上搜了一下这个错误,很多解释都是说,服务器异常关闭或者mongodb异常退出的时候,会留下一个锁文件&/var/lib/mongo/mongo.lock&,需要把这个锁文件删除之后重启mongodb。我试了一下这个方法对我无效。
查看了一台机器上的log文件,发现里面说,有其他机器给他发送消息,但是需要在每台机器上配置key file。大概是这个意思,忘记截图了。
创建Key File用下面的语句:
openssl rand -base64 741
产生的字符串存到一个文本文件中,然后把这个文件的权限chmod成600(如果权限过高不行,log里面会告诉你权限过高),然后在配置里面加上“keyFile=keyfile的路径”,重启mongodb就行了。
NUMA的问题
测试机的CPU是NUMA的,于是在运行mongod的时候命令行和log里面会有下面的提示:
WARNING: You are running on a NUMA machine.
We suggest launching mongod like this to avoid performance problems:
numactl C-interleave=all mongod [other options]
于是要把启动命令改成:
sudo numactl --interleave=all mongod -f /etc/mongod.conf1987人阅读
NOSQL(34)
作者同类文章X
配置mongodb分片群集(sharding cluster)
Sharding cluster介绍
这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。
&要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
Sharding架构图:
host&& &ip&& &&& &端口信息
-------------------------------------------------
mds1&& &192.168.20.11&& &mongod shard11:28011
&& &&& &&& &&& &&& &&&&& &&& &&&&& &&& &&&& mongod shard12:28012
&& &&& &&&&& &&& &&&&& &&& &&&&& &&& &&& && mongod config1:28010
&& &&& &&& &&& &&& &&&&& &&& &&&&& &&& & && mongs1:28000
mds2&& &192.168.20.13&& &mongod shard12:28013
&& &&& &&& &&& &&& &&&&& &&& &&&&& &&& & & & mongod shard22:28014
&& &&& &&& &&& &&& &&&&& &&& &&&&& &&& & & & mongod config2:28010
&& &&& &&& &&& &&& &&&&& &&& &&&&& &&& & && mongs2:28000
mds3&& &192.168.20.15&& &mongod shard13:28015
&& &&& &&& &&& &&& &&& &&& &&& &&&&& &&& &&& mongod shard23:28016
&& &&& &&& && &&& &&& &&& &&& &&&&& &&& &&&& mongod config3:28010
&& &&& &&& &&& &&& &&& &&& &&& &&&&& &&& &&& mongs3:28000
一、LINUX 环境准备工作
1.1 先配置ULIMIT
修改文件:
/etc/security/limits.conf
比如添加以下内容:
mongo&&&&&&&&&&&&&&& soft&&& nproc&& 30000
mongo&&&&&&&&&&&&&&& hard&&& nproc&& 65536
mongo&&&&&&&&&&&&&&& soft&&& nofile& 30000
mongo&&&&&&&&&&&&&&& hard&&& nofile& 65536
(这个在配置MONGODB 最大连接数是有用,因为MONGODB 默认的最大连接数为819,还要减掉各节点间的config等服务器的连接,如果你是在生产环境下,
相信一会儿就不够,并且mongo 安装用户如果不是root,比如我的mongo,也会报错,linux 默认一个非root 用户只能打开1024个文件。
1. 创建用户
useradd mongo
2. 安装monodb软件
su – mongo
tar zxvf mongodb-linux-x86_64-2.6.4.tar
3. 创建数据目录
根据本例sharding架构图所示,在各台sever上创建shard数据文件目录
su – mono
mkdir -p /home/mongodb/mongodb2.6.4/logs
mkdir -p /home/mongodb/mongodb2.6.4/config
mkdir -p /opt/mongodb/data/shard11
mkdir -p /opt/mongodb/data/shard21
su – mono
mkdir -p /home/mongodb/mongodb2.6.4/logs
mkdir -p /home/mongodb/mongodb2.6.4/config
mkdir -p /opt/mongodb/data/shard12
mkdir -p /opt/mongodb/data/shard22
su – mono
mkdir -p /home/mongodb/mongodb2.6.4/logs
mkdir -p /home/mongodb/mongodb2.6.4/config
mkdir -p /opt/mongodb/data/shard13
mkdir -p /opt/mongodb/data/shard23
配置REPLICAT SETS
1.配置SHARD1 所在的REPLICA SETS
(在实际配置中,我都使用了建立一个sh 文件,并对应--config 文件运行的方式,这样方便以后每次执行而不会出错)。
vi mongod_shard11_start.sh
/home/mongo/mongodb2.6.4/bin/mongod --shardsvr --replSet shard1 --port 28011 --dbpath /opt/mongodb/data/shard11 --oplogSize 1000 --logpath /home/mongo/mongodb2.6.4/logs/shard11.log --logappend& --maxConn 30000 --fork
vi mongod_shard12_start.sh
/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard1 –port 28013 –dbpath /opt/mongodb/data/shard12 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard12.log –logappend --maxConn 30000 –fork
vi mongod_shard13_start.sh
/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard1 –port 28015 –dbpath /opt/mongodb/data/shard13 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard13.log& –logappend --maxConn 30000 –fork
并启动 对应的
mongod_shard11_start.sh
mongod_shard12_start.sh
mongod_shard13_start.sh
初始化replica set shard1
用mongo 连接其中一个节点: 比如:shard11 执行以下:
& config = {_id: 'shard1', members: [
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 0, host:'198.168.20.11:28011'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 1, host:'198.168.20.13:28013'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 2, host:'198.168.20.15:28015'}]
&&&&&&&&&&& }
& rs.initiate(config);
此步的具体操作如下:
&& &mongo -port 28011
&& &config = {_id: 'shard1', members: [
&& &&& &&& &&& &&& {_id: 0, host:'198.168.20.11:28011'},
&& &&& &&& &&& &&& {_id: 1, host:'198.168.20.13:28013'},
&& &&& &&& &&& &&& {_id: 2, host:'198.168.20.15:28015'}]
&& &&& &&&& }
&& && rs.initiate(config)
&& &&& &&ok& : 0,
&& &&& &&errmsg& : &couldn't initiate : can't find self in the replset config my port: 28011&
&& && cfg={_id:&shard1&,members:[{_id:0,host:&192.168.20.11:28011&},
&& &... {_id:1,host:&192.168.20.13:28013&}]}
&& &&& &&_id& : &shard1&,
&& &&& &&members& : [
&& &&& &&& &{
&& &&& &&& &&& &&_id& : 0,
&& &&& &&& &&& &&host& : &192.168.20.11:28011&
&& &&& &&& &},
&& &&& &&& &{
&& &&& &&& &&& &&_id& : 1,
&& &&& &&& &&& &&host& : &192.168.20.13:28013&
&& &&& &&& &}
&& && rs.initiate(cfg)
&& &&& &&info& : &Config now saved locally.& Should come online in about a minute.&,
&& &&& &&ok& : 1
&& &shard1:OTHER& rs.status()
&& &&& &&set& : &shard1&,
&& &&& &&date& : ISODate(&T08:57:38Z&),
&& &&& &&myState& : 1,
&& &&& &&members& : [
&& &&& &&& &{
&& &&& &&& &&& &&_id& : 0,
&& &&& &&& &&& &&name& : &192.168.20.11:28011&,
&& &&& &&& &&& &&health& : 1,
&& &&& &&& &&& &&state& : 1,
&& &&& &&& &&& &&stateStr& : &PRIMARY&,
&& &&& &&& &&& &&uptime& : 2710,
&& &&& &&& &&& &&optime& : Timestamp(, 1),
&& &&& &&& &&& &&optimeDate& : ISODate(&T08:54:24Z&),
&& &&& &&& &&& &&electionTime& : Timestamp(, 1),
&& &&& &&& &&& &&electionDate& : ISODate(&T08:54:32Z&),
&& &&& &&& &&& &&self& : true
&& &&& &&& &},
&& &&& &&& &{
&& &&& &&& &&& &&_id& : 1,
&& &&& &&& &&& &&name& : &192.168.20.13:28013&,
&& &&& &&& &&& &&health& : 1,
&& &&& &&& &&& &&state& : 2,
&& &&& &&& &&& &&stateStr& : &SECONDARY&,
&& &&& &&& &&& &&uptime& : 194,
&& &&& &&& &&& &&optime& : Timestamp(, 1),
&& &&& &&& &&& &&optimeDate& : ISODate(&T08:54:24Z&),
&& &&& &&& &&& &&lastHeartbeat& : ISODate(&T08:57:36Z&),
&& &&& &&& &&& &&lastHeartbeatRecv& : ISODate(&T08:57:36Z&),
&& &&& &&& &&& &&pingMs& : 0,
&& &&& &&& &&& &&syncingTo& : &192.168.20.11:28011&
&& &&& &&& &}
&& &&& &],
&& &&& &&ok& : 1
&& &shard1:PRIMARY& rs.add({_id:2,host:&192.168.20.15:28015&})
&& &{ &ok& : 1 }
&& &shard1:PRIMARY& rs.status()
&& &&& &&set& : &shard1&,
&& &&& &&date& : ISODate(&T08:58:44Z&),
&& &&& &&myState& : 1,
&& &&& &&members& : [
&& &&& &&& &{
&& &&& &&& &&& &&_id& : 0,
&& &&& &&& &&& &&name& : &192.168.20.11:28011&,
&& &&& &&& &&& &&health& : 1,
&& &&& &&& &&& &&state& : 1,
&& &&& &&& &&& &&stateStr& : &PRIMARY&,
&& &&& &&& &&& &&uptime& : 2776,
&& &&& &&& &&& &&optime& : Timestamp(, 1),
&& &&& &&& &&& &&optimeDate& : ISODate(&T08:58:41Z&),
&& &&& &&& &&& &&electionTime& : Timestamp(, 1),
&& &&& &&& &&& &&electionDate& : ISODate(&T08:54:32Z&),
&& &&& &&& &&& &&self& : true
&& &&& &&& &},
&& &&& &&& &{
&& &&& &&& &&& &&_id& : 1,
&& &&& &&& &&& &&name& : &192.168.20.13:28013&,
&& &&& &&& &&& &&health& : 1,
&& &&& &&& &&& &&state& : 2,
&& &&& &&& &&& &&stateStr& : &SECONDARY&,
&& &&& &&& &&& &&uptime& : 260,
&& &&& &&& &&& &&optime& : Timestamp(, 1),
&& &&& &&& &&& &&optimeDate& : ISODate(&T08:58:41Z&),
&& &&& &&& &&& &&lastHeartbeat& : ISODate(&T08:58:44Z&),
&& &&& &&& &&& &&lastHeartbeatRecv& : ISODate(&T08:58:44Z&),
&& &&& &&& &&& &&pingMs& : 0,
&& &&& &&& &&& &&syncingTo& : &192.168.20.11:28011&
&& &&& &&& &},
&& &&& &&& &{
&& &&& &&& &&& &&_id& : 2,
&& &&& &&& &&& &&name& : &192.168.20.15:28015&,
&& &&& &&& &&& &&health& : 1,
&& &&& &&& &&& &&state& : 5,
&& &&& &&& &&& &&stateStr& : &STARTUP2&,
&& &&& &&& &&& &&uptime& : 3,
&& &&& &&& &&& &&optime& : Timestamp(0, 0),
&& &&& &&& &&& &&optimeDate& : ISODate(&T00:00:00Z&),
&& &&& &&& &&& &&lastHeartbeat& : ISODate(&T08:58:43Z&),
&& &&& &&& &&& &&lastHeartbeatRecv& : ISODate(&T08:58:43Z&),
&& &&& &&& &&& &&pingMs& : 0
&& &&& &&& &}
&& &&& &],
&& &&& &&ok& : 1
&& &shard1:PRIMARY&
配置SHARD2
vi shard21_start.sh
/home/mongo/mongodb2.6.4/bin/mongod --shardsvr --replSet shard2 –port 28012 –dbpath /opt/mongodb/data/shard21 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard21.log –logappend –fork
vi mongod_shard22_start.sh
/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard2 –port 28014 –dbpath /opt/mongodb/data/shard22 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard22.log –logappend –fork
vi mongod_shard23_start.sh
/home/mongo/mongodb2.6.4/bin/mongod –shardsvr –replSet shard2 –port 28016 –dbpath /opt/mongodb/data/shard23 –oplogSize 1000 –logpath /home/mongo/mongodb2.6.4/logs/shard23.log –logappend –fork
运行以上sh
初始化replica set shard2
用mongo 连接其中一个节点: 比如:shard21 执行以下:
& config = {_id: ’shard2′, members: [
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 0, host: '198.168.20.11:28012'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 1, host: '198.168.20.13:28014'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 2, host: '198.168.20.15:28016'}]
&&&&&&&&&&& }
& rs.initiate(config);
& cfg={_id:&shard2&,members:[{_id:0,host:&192.168.20.11:28012&},
... {_id:1,host:&192.168.20.13:28014&},
... {_id:2,host:&192.168.20.15:28016&}]}
&& &&_id& : &shard2&,
&& &&members& : [
&& &&& &&& &&_id& : 0,
&& &&& &&& &&host& : &192.168.20.11:28012&
&& &&& &},
&& &&& &&& &&_id& : 1,
&& &&& &&& &&host& : &192.168.20.13:28014&
&& &&& &},
&& &&& &&& &&_id& : 2,
&& &&& &&& &&host& : &192.168.20.15:28016&
& rs.initiate(cfg)
&& &&info& : &Config now saved locally.& Should come online in about a minute.&,
&& &&ok& : 1
shard2:OTHER& rs.status()
&& &&set& : &shard2&,
&& &&date& : ISODate(&T09:05:12Z&),
&& &&myState& : 2,
&& &&members& : [
&& &&& &&& &&_id& : 0,
&& &&& &&& &&name& : &192.168.20.11:28012&,
&& &&& &&& &&health& : 1,
&& &&& &&& &&state& : 2,
&& &&& &&& &&stateStr& : &SECONDARY&,
&& &&& &&& &&uptime& : 1431,
&& &&& &&& &&optime& : Timestamp(, 1),
&& &&& &&& &&optimeDate& : ISODate(&T09:05:03Z&),
&& &&& &&& &&self& : true
&& &&& &},
&& &&& &&& &&_id& : 1,
&& &&& &&& &&name& : &192.168.20.13:28014&,
&& &&& &&& &&health& : 1,
&& &&& &&& &&state& : 5,
&& &&& &&& &&stateStr& : &STARTUP2&,
&& &&& &&& &&uptime& : 9,
&& &&& &&& &&optime& : Timestamp(0, 0),
&& &&& &&& &&optimeDate& : ISODate(&T00:00:00Z&),
&& &&& &&& &&lastHeartbeat& : ISODate(&T09:05:11Z&),
&& &&& &&& &&lastHeartbeatRecv& : ISODate(&T09:05:11Z&),
&& &&& &&& &&pingMs& : 0
&& &&& &},
&& &&& &&& &&_id& : 2,
&& &&& &&& &&name& : &192.168.20.15:28016&,
&& &&& &&& &&health& : 1,
&& &&& &&& &&state& : 5,
&& &&& &&& &&stateStr& : &STARTUP2&,
&& &&& &&& &&uptime& : 7,
&& &&& &&& &&optime& : Timestamp(0, 0),
&& &&& &&& &&optimeDate& : ISODate(&T00:00:00Z&),
&& &&& &&& &&lastHeartbeat& : ISODate(&T09:05:11Z&),
&& &&& &&& &&lastHeartbeatRecv& : ISODate(&T09:05:11Z&),
&& &&& &&& &&pingMs& : 0
&& &&ok& : 1
shard2:SECONDARY&
配置三台config server
&./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork& &
&#config server也需要dbpath
&./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork
&./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork
在server1,server2,server3上分别执行:
&./mongos –configdb 192.168.20.11:8.20.13:8.20.15:28010 –port 28000 –chunkSize 128 –logpath /home/mongo/mongodb2.6.4/logs/mongos.log –logappend –fork
&#mongs不需要dbpath
&& &开始运行出现以下问题:
&& &about to fork child process, waiting until server is ready for connections.
&& &forked process: 5969
&& &日志显示:
&& &waited 209s for distributed lock configUpgrade for upgrading config database to new format v5
&& &后各节点设置时间同步后,问题解决。
&& &连接到其中一个mongos进程,并切换到admin数据库做以下配置
&& & 1. 连接到mongs,并切换到admin
&& & ./mongo 192.168.20.11:28000/admin
&& & Admin
&& & 2. 加入shards
&& & 命令格式:
&& &&& &replicaSetName/[:port] [,serverhostname2[:port],…]
&& &执行如下:
&& & &db.runCommand({addshard:&shard1/192.168.20.11:8.20.13:8.20.15:28011&});
&& & &db.runCommand({addshard:&shard2/192.168.20.11:8.20.13:8.20.15:28012&});
&& & &db.runCommand({addshard:&shard3/192.168.20.11:8.20.13:8.20.15:28013&});
&& &3. 可选参数
&& & Name:用于指定每个shard的名字,不指定的话系统将自动分配
&& & maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes
&& &修改maxsize:
&& &use config
&& &db.shards.update({_id:&s1&},{$set:{maxSize:2000000}})
&& &4. Listing shards
&& & &db.runCommand( { listshards : 1 } )
&& & 如果列出了以上二个你加的shards,表示shards已经配置成功
&& &mongos& db.runCommand( { listshards : 1 } )
&& &&& &&shards& : [
&& &&& &&& &{
&& &&& &&& &&& &&_id& : &s1&,
&& &&& &&& &&& &&host& : &shard1/192.168.20.11:8.20.13:8.20.15:28015&
&& &&& &&& &},
&& &&& &&& &{
&& &&& &&& &&& &&_id& : &s2&,
&& &&& &&& &&& &&host& : &shard2/192.168.20.11:8.20.13:8.20.15:28016&
&& &&& &&& &}
&& &&& &],
&& &&& &&ok& : 1
&& &mongos& use config
&& &mongos& db.shards.find()
&& &{ &_id& : &s1&, &host& : &shard1/192.168.20.11:8.20.13:8.20.15:28015&, &maxSize& : 2000000 }
&& &{ &_id& : &s2&, &host& : &shard2/192.168.20.11:8.20.13:8.20.15:28016&, &maxSize& : 2000000 }
&& &5. 激活数据库分片
&& & 命令:
&& & & db.runCommand( { enablesharding :&database_name&} );
&& & 通 过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection 将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对 collection作些操作
&& &用客户端连接Mongos
&& &Mongo --port 50000
&& &&sh.enableSharding(&database name&)
&& &&db.runCommand( { enableSharding: &database& } )
&& &这样即可。
&& &如果你想对一个大的collection进行sharding可以执行如下命令
&& &sh.shardCollection(&people.addresses&, { &state&: 1, &_id&: 1 } )
&& &示例:
&& &mongos& use admin
&& &switched to db admin
&& &mongos& db.runCommand({enablesharding:&test&})
&& &{ &ok& : 1 }
&& &mongos& use admin
&& &switched to db admin
&& &mongos& db.runCommand({shardcollection:&test.test&,key:{_id:1}})
&& &{ &collectionsharded& : &test.test&, &ok& : 1 }
&& &mongos&
&& &mongos&for (var i =2; i &= 1200000; i++) db.user.save({_id:i,name:&teststaasdasdfasdfsa name&,address:&adresss adfasdfasdfasdfasdfasdf&,country:&china&,province:&shanghai&,city:&minhang&});
&& &mongos&db.test.stats()
数据迁移:
---------------------------------------------------------------------------------------------------------------------------------
&& &准备工作:在导入数据前,先配置好要分片的数据库及表。
&& &不然导入完成后,发现数据库,表没有同步到另外一个集群。
&& &我这里做了从原单机数据库数据导出后,再分片集群库中导入操作。
&& &当设置了要分片的库,及表后,系统会自动帮你添加库及表。
&& &设置完成后,就可以导入数据了。
&& &use admin
&& &db.runCommand({enablesharding:&ip&})
&& &db.runCommand({shardcollection:&ip.ipaddress&,key:{ip1:1}})
&& &./mongorestore -h 192.168.20.11 --port 28000 -d ip /opt/backup/ip/ip
&& &./mongorestore -h 192.168.20.11 --port 28000 -d dmp /opt/backup/dmp/dmp
参考:http://www./lib/view/open2.html
======================================================
测试后感觉这种架构不太适合我,只有两个分片,而却有3个节点的集群,磁盘空间的使用率不高。后决定修改架构:
3台服务器,做成3个分片,每个分片有一个集群,
集群中有2台数据存储服务器+1台仲裁服务器
把仲裁服务器分别放在3台服务器中
host&& &ip&& &&& &端口信息&& &&& &&& &arbiterOnly&& &
--------------------------------------------------------------------
mds1&& &192.168.20.11&& &mongod shard1:28011&& &
&& &&& &&& &mongod shard2:28012
&& &&& &&& &mongod shard3:28013 ------------ True
&& &&& &&& &mongod config1:28010
&& &&& &&& &mongs1:28000
mds2&& &192.168.20.13&& &mongod shard1:28011
&& &&& &&& &mongod shard2:28012 ------------ True
&& &&& &&& &mongod shard3:28013
&& &&& &&& &
&& &&& &&& &mongod config2:28010
&& &&& &&& &mongs2:28000
mds3&& &192.168.20.15&& &mongod shard1:28011 ------------ True
&& &&& &&& &mongod shard2:28012
&& &&& &&& &mongod shard2:28013
&& &&& &&& &mongod config3:28010
&& &&& &&& &mongs3:28000
对应的数据保存目录各为:
/opt/mongodb/data/shard1
/opt/mongodb/data/shard2
/opt/mongodb/data/shard3
集群配置:
& config = {_id: 'shard1', members: [
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 0, host:'192.168.20.11:28011'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 1, host:'192.168.20.13:28011'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 2, host:'192.168.20.15:28011',&arbiterOnly&:true}]
&&&&&&&&&&& }
& rs.initiate(config);
& config = {_id: 'shard2', members: [
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 0, host:'192.168.20.11:28012'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 1, host:'192.168.20.13:28012',&arbiterOnly&:true},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 2, host:'192.168.20.15:28012'}]
&&&&&&&&&&& }
& rs.initiate(config);
rs.addArb(&192.168.20.13:28012&);
rs.add({_id: 1, host:'192.168.20.13:28012',&arbiterOnly&:true})
rs.add({_id: 2, host:'192.168.20.15:28012'})
& cfg = {_id: 'shard3', members: [
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 0, host:'192.168.20.13:28013'},
&&&&&&&&&&&&&&&&&&&&&&&&&& {_id: 1, host:'192.168.20.15:28013'},
&& &&& &&& &&& {_id: 2, host:'192.168.20.11:28013',&arbiterOnly&:true}
&& &&& &&& &&& ]
&&&&&&&&&&& }
& rs.initiate(cfg);
修改优先权:
MongoDB replica sets中通过设置priority的值来决定优先权的大小,这个值的范围是0--100,值越大,优先权越高。
如果值是0,那么不能成为primay。
&&& cfg = rs.conf()
&&& cfg.members[0].priority = 1
&&& cfg.members[1].priority = 2
&&& cfg.members[2].priority = 3
&&& rs.reconfig(cfg)
说明:cfg.members[0].priority =
括号中的数字是执行rs.conf()得出的节点顺序,第一个节点在这里写0,第二个节点写1,依次类推。
config server 配置:
配置服务器的dbpath 放在软件安装目录(SSD硬盘)
&./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork& &
&#config server也需要dbpath
&./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork
&./mongod –configsvr –dbpath /home/mongo/mongodb2.6.4/config –port 28010 –logpath /home/mongo/mongodb2.6.4/logs/config.log –logappend –fork
在server1,server2,server3上分别执行:
&./mongos –configdb 192.168.20.11:8.20.13:8.20.15:28010 –port 28000 –chunkSize 96 –logpath /home/mongo/mongodb2.6.4/logs/mongos.log –logappend –fork
分片配置:
&& & &db.runCommand({addshard:&shard1/192.168.20.11:8.20.13:8.20.15:28011&});
&& & &db.runCommand({addshard:&shard2/192.168.20.11:8.20.13:8.20.15:28012&});
&& & &db.runCommand({addshard:&shard3/192.168.20.11:8.20.13:8.20.15:28013&});
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:407290次
积分:5684
积分:5684
排名:第2303名
原创:180篇
转载:77篇
评论:31条
(2)(3)(1)(2)(2)(4)(5)(3)(4)(6)(4)(2)(13)(4)(8)(5)(6)(12)(13)(5)(2)(5)(6)(6)(6)(1)(6)(4)(5)(20)(2)(4)(1)(1)(2)(1)(9)(1)(1)(3)(1)(1)(4)(1)(2)(4)(1)(1)(1)(1)(1)(1)(6)(1)(1)(6)(7)(6)(4)(3)(2)(5)(6)(7)(4)}

我要回帖

更多关于 mongodb 主从同步 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信