新手求教mongodb 分片 副本副本集配置问题

bjiaonline 的BLOG
用户名:bjiaonline
文章数:30
访问量:2534
注册日期:
阅读量:5863
阅读量:12276
阅读量:359396
阅读量:1055456
51CTO推荐博文
一、Mongdb3.0安装官网下载最新稳定版本的mongodb软体 解压软体[root@test-weidangkou&service]#&tar&zxvf&mongodb-linux-x86_64-rhel62-3.0.3.tgz&
mongodb-linux-x86_64-rhel62-3.0.3/README
mongodb-linux-x86_64-rhel62-3.0.3/THIRD-PARTY-NOTICES
mongodb-linux-x86_64-rhel62-3.0.3/GNU-AGPL-3.0
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongodump
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongorestore
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongoexport
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongoimport
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongostat
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongotop
mongodb-linux-x86_64-rhel62-3.0.3/bin/bsondump
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongofiles
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongooplog
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongoperf
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongos
mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo创建mongdb数据存放路径及日志存放路径[root@test-weidangkou&service]#&mkdir&-p&/date/{mongodbdata,mongodb_logs}建立mongod账号,授权数据目录[root@test-weidangkou&date]#&useradd&mongod
[root@test-weidangkou&date]#&chown&-R&mongod.mongod&/date/mongodbdata/创建mongod.conf配置文件,只需要以下几个选项即可[root@test-weidangkou&date]#cat&/etc/mongod.conf&
dbpath&=&/data/mongodata&&&&&&&&&&&&&&&&&&&&&&&&&&&#mongodb数据存放路径
logpath&=&/data/mongodb_logs/mongodb.log&&&&&&&&&&&#mongodb日志存放路径
httpinterface&=&true&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#mongodb管理端口默认+
fork&=&true&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#后台启动二、启动Mongodb初始化数据(1)第一种直接在命令行中指定路径和日志/usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod&--dbpath=/date/mongodbdate/&--logpath=/date/mongodb_logs/mongodb.log&--fork
about&to&fork&child&process,&waiting&until&server&is&ready&for&connections.
forked&process:&5238
child&process&started&successfully,&parent&exiting
端口已经起来了:
[root@test-weidangkou&mongodb_logs]#&lsof&-i&:27017
COMMAND&&PID&USER&&&FD&&&TYPE&DEVICE&SIZE/OFF&NODE&NAME
mongod&&5238&root&&&&6u&&IPv4&&41939&&&&&&0t0&&TCP&*:27017&(LISTEN)
初始化由于要同步数据,建立本地的一些数据文件。会启动比较慢。(2)第二种方式启动:通过加载配置文件启动(推荐)[root@test-weidangkou&mongodbdate]#&/usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod&-f&/etc/mongod.conf&
about&to&fork&child&process,&waiting&until&server&is&ready&for&connections.
forked&process:&5382
child&process&started&successfully,&parent&exiting进入终端查看数据库[root@test-weidangkou&mongodb_logs]#&/usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo
MongoDB&shell&version:&3.0.3
connecting&to:&test
Welcome&to&the&MongoDB&shell.
For&interactive&help,&type&"help".
For&more&comprehensive&documentation,&see
http://docs.mongodb.org/
Questions?&Try&the&support&group
/group/mongodb-user
Server&has&startup&warnings:&
T17:37:53.882+0800&I&CONTROL&&[initandlisten]&**&WARNING:&You&are&running&this&process&as&the&root&user,&which&is&not&recommended.
T17:37:53.882+0800&I&CONTROL&&[initandlisten]&
T17:37:53.905+0800&I&CONTROL&&[initandlisten]&
T17:37:53.905+0800&I&CONTROL&&[initandlisten]&**&WARNING:&/sys/kernel/mm/transparent_hugepage/enabled&is&'always'.
T17:37:53.905+0800&I&CONTROL&&[initandlisten]&**&&&&&&&&We&suggest&setting&it&to&'never'
T17:37:53.905+0800&I&CONTROL&&[initandlisten]&
T17:37:53.905+0800&I&CONTROL&&[initandlisten]&**&WARNING:&/sys/kernel/mm/transparent_hugepage/defrag&is&'always'.
T17:37:53.906+0800&I&CONTROL&&[initandlisten]&**&&&&&&&&We&suggest&setting&it&to&'never'
T17:37:53.906+0800&I&CONTROL&&[initandlisten]&
local&&0.078GB启动报错会出现以下:[root@test-weidangkou&mongodbdate]#&/usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod&-f&/etc/mongod.conf&
about&to&fork&child&process,&waiting&until&server&is&ready&for&connections.
forked&process:&5298检查原因:第一:由于之前没有正常的退出Mongodb服务,需要删除mongod.lock文件,再次启动恢复正常。第二:配置文件有问题,需要检查配置文件是否有特殊字符,导致无法解析三、mongodb副本集配置配置mongodb的副本集务必要做好以下几点:1、各个节点能够正常访问mongodb的socket端口,iptables要放行2、SELINUX必须要关闭掉,以免禁止端口复制3、各个服务器节点要做好解析/etc/hosts4、由于副本集是通过Heartbeat心跳线连接到,务必同步好各个节点的时间小注:本人由于之前没有注意到这些,被坑了好久。哈哈!!!mongodb复制过程及概念(1)主节点将数据修改操作保存至oplog,oplog:大小固定的文件,存储在local数据库(2)初始同步(inital sync)& &节点没有任何数据& &节点丢失副本复制历史& &:克隆所有的数据库& &:应用数据集的所有改变:复制oplog并应用于本地& &:为所有collection的构建索引(3)回滚后追赶(post-rollback catch-up)&(4)切分块迁移(shareding chunk migrations)local:存放了副本集的所有元素和用于存储oplog的是一个名为oplog.rs的oplog.rs的大小依赖于OS及文件系统;但可以自定义其大小oplogsize1、环境配置192.168.254.7& & samba192.168.254.229 &git192.168.254.9 & &weidangkou3t台机器的配置文件修改vim /etc/mongodb.conf,增加两个选项replIndexPrefetch&=&_id_only&&&&&&&&&&&&&#索引的ID号复制
replSet&=&9tong1&&&&&&&&&&&&&&&&&&&&&&&&&#副本集设置成9tong1为了测试证明复制的数据,可以先在主节点上导入点数据,测试环境的数据如下:[root@samba&mongodata]#&ls
9tong.0&&9tong.1&&9tong.2&&9tongAPI.0&&9tongAPI.1&&9tongAPI.ns&&9tong.ns&&base.0&&base.1&&base.ns&&journal&&local.0&&local.ns&&mongod.lock&&storage.bson2、初始化&&show&
T11:38:18.324+0800&E&QUERY&&&&Error:&listDatabases&failed:{&"note"&:&"from&execCommand",&"ok"&:&0,&"errmsg"&:&"not&master"&}
&&&&at&Error&(&anonymous&)
&&&&at&Mongo.getDBs&(src/mongo/shell/mongo.js:47:15)
&&&&at&shellHelper.show&(src/mongo/shell/utils.js:630:33)
&&&&at&shellHelper&(src/mongo/shell/utils.js:524:36)
&&&&at&(shellhelp2):1:1&at&src/mongo/shell/mongo.js:47
配置好副本集选项启动后,不能直接查看dbs的情况,因为目前还没有初始化不是primary
&&rs.initiate()
"info2"&:&"no&configuration&explicitly&specified&--&making&one",
"me"&:&"samba:27017",
9tong1:OTHER&&
9tong1:PRIMARY&&
初始化后会直接变成9tong1:PRIMARY的标识,可以查看数据库的容量信息
9tong1:PRIMARY&&show&
9tong&&&&&0.453GB
9tongAPI&&0.203GB
base&&&&&&0.203GB
local&&&&&2.077GB&3、添加副本节点9tong1:PRIMARY&&rs.add
rs.add(&&&&&rs.addArb(
9tong1:PRIMARY&&rs.add("192.168.254.9")&&&&&&&&&&#默认端口不需要加端口号码
9tong1:PRIMARY&&rs.add("192.168.254.9")
{&"ok"&:&1&}
9tong1:PRIMARY&&rs.status()
"set"&:&"9tong1",
"date"&:&ISODate("T04:04:51.535Z"),
"myState"&:&1,
"members"&:&[
"_id"&:&0,
"name"&:&"samba:27017",
"health"&:&1,
"state"&:&1,
"stateStr"&:&"PRIMARY",
"uptime"&:&1645,
"optime"&:&Timestamp(,&1),
"optimeDate"&:&ISODate("T04:04:45Z"),
"electionTime"&:&Timestamp(,&2),
"electionDate"&:&ISODate("T03:40:18Z"),
"configVersion"&:&2,
"self"&:&true
"_id"&:&1,
"name"&:&"192.168.254.9:27017",
"health"&:&1,
"state"&:&5,
"stateStr"&:&"STARTUP2",
"uptime"&:&6,
"optime"&:&Timestamp(0,&0),
"optimeDate"&:&ISODate("T00:00:00Z"),
"lastHeartbeat"&:&ISODate("T04:04:51.261Z"),
"lastHeartbeatRecv"&:&ISODate("T04:04:51.300Z"),
"pingMs"&:&2,
"syncingTo"&:&"samba:27017",
"configVersion"&:&2
StateStr:STARTUPU2是复制数据追赶主节点的状态模式。
数据同步好后会变成SECONDARY
"_id"&:&1,
"name"&:&"192.168.254.9:27017",
"health"&:&1,
"state"&:&2,
"stateStr"&:&"SECONDARY",
"uptime"&:&63,
"optime"&:&Timestamp(,&1),
"optimeDate"&:&ISODate("T04:04:45Z"),
"lastHeartbeat"&:&ISODate("T04:05:47.313Z"),
"lastHeartbeatRecv"&:&ISODate("T04:05:47.344Z"),
"pingMs"&:&1,
"configVersion"&:&2
也可以通过rs.conf()查看各个节点状态
9tong1:PRIMARY&&rs.conf()
"_id"&:&"9tong1",
"version"&:&2,
"members"&:&[
"_id"&:&0,
"host"&:&"samba:27017",
"arbiterOnly"&:&false,
"buildIndexes"&:&true,
"hidden"&:&false,
"priority"&:&1,
"tags"&:&{
"slaveDelay"&:&0,
"votes"&:&1
"_id"&:&1,
"host"&:&"192.168.254.9:27017",
"arbiterOnly"&:&false,
"buildIndexes"&:&true,
"hidden"&:&false,
"priority"&:&1,
"tags"&:&{
"slaveDelay"&:&0,
"votes"&:&1
"settings"&:&{
"chainingAllowed"&:&true,
"heartbeatTimeoutSecs"&:&10,
"getLastErrorModes"&:&{
"getLastErrorDefaults"&:&{
"wtimeout"&:&0
9tong1:PRIMARY&&use&9
switched&to&db&9tong
9tong1:PRIMARY&&db.user_contacts.find().count();
从节点上查看
9tong1:SECONDARY&&show&
9tong&&&&&0.203GB
9tongAPI&&0.078GB
base&&&&&&0.078GB
local&&&&&6.075GB
test&&&&&&0.078GB
9tong1:SECONDARY&&use&9
switched&to&db&9tong
9tong1:SECONDARY&&db.user_contacts.find().count();
以上证明数据已经同步过来,状态变成SECONDARY
查看OPOLOG状态
9tong1:PRIMARY&&db.printReplicationInfo()
configured&oplog&size:&&&5MB
log&length&start&to&end:&3053secs&(0.85hrs)
oplog&first&event&time:&&Wed&Jul&01&:18&GMT+0800&(CST)&&&#第一次更新时间
oplog&last&event&time:&&&Wed&Jul&01&:11&GMT+0800&(CST)&&&#最后一次更新时间
now:&&&&&&&&&&&&&&&&&&&&&Wed&Jul&01&:25&GMT+0800&(CST)&&&#现在时间
9tong1:SECONDARY&&db.printReplicationInfo()
configured&oplog&size:&&&32422MB
log&length&start&to&end:&1586secs&(0.44hrs)
oplog&first&event&time:&&Wed&Jul&01&:45&GMT+0800&(CST)&&
oplog&last&event&time:&&&Wed&Jul&01&:11&GMT+0800&(CST)&&#与主节点最近一次时间一&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&样说明数据同步完成了。
now:&&&&&&&&&&&&&&&&&&&&&Wed&Jul&01&:01&GMT+0800&(CST)& 4、连接到从节点192.168.254.9查看状态&&&[root@weidangkou&data]#&/usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo
MongoDB&shell&version:&3.0.3
connecting&to:&test
Server&has&startup&warnings:&
T12:00:01.448+0800&I&CONTROL&&[initandlisten]&**&WARNING:&You&are&running&this&process&as&the&root&user,&which&is&not&recommended.
T12:00:01.448+0800&I&CONTROL&&[initandlisten]&
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&WARNING:&/sys/kernel/mm/transparent_hugepage/enabled&is&'always'.
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&&&&&&&&We&suggest&setting&it&to&'never'
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&WARNING:&/sys/kernel/mm/transparent_hugepage/defrag&is&'always'.
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&&&&&&&&We&suggest&setting&it&to&'never'
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&
9tong1:SECONDARY&&
已经变成副本集的SECONDARY状态。
查看数据库容量信息,会出现以下错误。
9tong1:SECONDARY&&show&
T12:14:14.768+0800&E&QUERY&&&&Error:&listDatabases&failed:{&"note"&:&"from&execCommand",&"ok"&:&0,&"errmsg"&:&"not&master"&}
&&&&at&Error&(&anonymous&)
&&&&at&Mongo.getDBs&(src/mongo/shell/mongo.js:47:15)
&&&&at&shellHelper.show&(src/mongo/shell/utils.js:630:33)
&&&&at&shellHelper&(src/mongo/shell/utils.js:524:36)
&&&&at&(shellhelp2):1:1&at&src/mongo/shell/mongo.js:47
因为此时该节点不属于主节点,也没有默认为从节点。需要运行如下这个命令:
9tong1:SECONDARY&&rs.slaveOk()
9tong1:SECONDARY&&show&
9tong&&&&&0.203GB
9tongAPI&&0.078GB
base&&&&&&0.078GB
local&&&&&6.075GB
也可以通过rs.isMaster()查看是否自己属于主节点
9tong1:SECONDARY&&rs.isMaster()
"setName"&:&"9tong1",
"setVersion"&:&2,
"ismaster"&:&false,
"secondary"&:&true,
"hosts"&:&[
"samba:27017",
"192.168.254.9:27017"
"primary"&:&"samba:27017",
"me"&:&"192.168.254.9:27017",
"maxBsonObjectSize"&:&,
"maxMessageSizeBytes"&:&,
"maxWriteBatchSize"&:&1000,
"localTime"&:&ISODate("T04:23:34.493Z"),
"maxWireVersion"&:&3,
"minWireVersion"&:&0,
}5、添加192.168.254.229成为仲裁节点。仲裁节点只有投票选举权,没有数据复制功能。9tong1:PRIMARY&&rs.addArb("192.168.254.229")
{&"ok"&:&1&}
9tong1:PRIMARY&&rs.status()
"set"&:&"9tong1",
"date"&:&ISODate("T04:27:36.132Z"),
"myState"&:&1,
"members"&:&[
"_id"&:&0,
"name"&:&"samba:27017",
"health"&:&1,
"state"&:&1,
"stateStr"&:&"PRIMARY",
"uptime"&:&3010,
"optime"&:&Timestamp(,&1),
"optimeDate"&:&ISODate("T04:26:53Z"),
"electionTime"&:&Timestamp(,&2),
"electionDate"&:&ISODate("T03:40:18Z"),
"configVersion"&:&3,
"self"&:&true
"_id"&:&1,
"name"&:&"192.168.254.9:27017",
"health"&:&1,
"state"&:&2,
"stateStr"&:&"SECONDARY",
"uptime"&:&1370,
"optime"&:&Timestamp(,&1),
"optimeDate"&:&ISODate("T04:26:53Z"),
"lastHeartbeat"&:&ISODate("T04:27:35.993Z"),
"lastHeartbeatRecv"&:&ISODate("T04:27:34.470Z"),
"pingMs"&:&0,
"syncingTo"&:&"samba:27017",
"configVersion"&:&3
"_id"&:&2,
"name"&:&"192.168.254.229:27017",
"health"&:&1,
"state"&:&7,
"stateStr"&:&"ARBITER",
"uptime"&:&42,
"lastHeartbeat"&:&ISODate("T04:27:35.987Z"),
"lastHeartbeatRecv"&:&ISODate("T04:27:35.986Z"),
"pingMs"&:&0,
"configVersion"&:&3
}6、测试主节点写数据,查看从节点是否有主节点:
9tong1:PRIMARY&&db.classes.insert({class:&"ONE",nostu&:40})
WriteResult({&"nInserted"&:&1&})
9tong1:PRIMARY&&show&
system.indexes
从节点查看:
9tong1:SECONDARY&&db.classes.findOne()
"_id"&:&ObjectId("c674b1e83360d6"),
"class"&:&"ONE",
"nostu"&:&40
注意,从节点没有写权限,插入数据后会报错
9tong1:SECONDARY&&db.classes.insert({class:&"TOW",nostu&:50})
WriteResult({&"writeError"&:&{&"code"&:&undefined,&"errmsg"&:&"not&master"&}&})7、主从切换测试要点:副本集的重新选举的影响条件:心跳信息,heartbeat会每隔几秒检查连接状态信息优先级,默认都是1,值越高优先级越高。值为0的节点是不能成为主节点的,也不能触发选举。optime:主节点必须optime更新的时间要快于从节点是最新的,如果这个值小于线上的其他机器, & & & & 是不肯能成为主节点的。网络连接票数超过法定票数一半网络分区:票数选举选举机制:& 触发选举的事件新副本集初始化时从节点联系不到主节点时主节点“下台”时收到setpDown()命令时某从节点有更高的优先级且已经满足其他所有条件主节点无法联系到副本集的“多数方”&(1)关闭192.168.254.7-SAMBA,主节点的MongoDB服务rs.status()
"set"&:&"9tong1",
"date"&:&ISODate("T05:36:43.453Z"),
"myState"&:&1,
"members"&:&[
"_id"&:&0,
"name"&:&"samba:27017",
"health"&:&0,
"state"&:&8,
"stateStr"&:&"(not&reachable/healthy)",
"uptime"&:&0,
"optime"&:&Timestamp(0,&0),
"optimeDate"&:&ISODate("T00:00:00Z"),
"lastHeartbeat"&:&ISODate("T05:36:42.029Z"),
"lastHeartbeatRecv"&:&ISODate("T05:36:14.991Z"),
"pingMs"&:&0,
"lastHeartbeatMessage"&:&"Failed&attempt&to&connect&to&samba:27017;&couldn't&connect&to&server&samba:28.254.7),&connection&attempt&failed",
"configVersion"&:&-1
"_id"&:&1,
"name"&:&"192.168.254.9:27017",
"health"&:&1,
"state"&:&1,
"stateStr"&:&"PRIMARY",
"uptime"&:&5916,
"optime"&:&Timestamp(,&2),
"optimeDate"&:&ISODate("T04:31:11Z"),
"electionTime"&:&Timestamp(,&1),
"electionDate"&:&ISODate("T05:36:17Z"),
"configVersion"&:&3,
"self"&:&true
"_id"&:&2,
"name"&:&"192.168.254.229:27017",
"health"&:&1,
"state"&:&7,
"stateStr"&:&"ARBITER",
"uptime"&:&4188,
"lastHeartbeat"&:&ISODate("T05:36:43.328Z"),
"lastHeartbeatRecv"&:&ISODate("T05:36:42.799Z"),
"pingMs"&:&0,
"configVersion"&:&3
}停止后,10秒左右的时间,明显的看到原来是主节点的SAMBA,监控状态变为0,1表示正常,原先192.168.254.9从SECONDARY变成了PRIMARY。(2)更改192.168.254.9的优先级。使它变为高优先级成为主节点9tong1:PRIMARY&&cfg=rs.conf()&&&&&&&&&#保存当前状态
"_id"&:&"9tong1",
"version"&:&3,
"members"&:&[
"_id"&:&0,
"host"&:&"samba:27017",
"arbiterOnly"&:&false,
"buildIndexes"&:&true,
"hidden"&:&false,
"priority"&:&1,
"tags"&:&{
"slaveDelay"&:&0,
"votes"&:&1
"_id"&:&1,
"host"&:&"192.168.254.9:27017",
"arbiterOnly"&:&false,
"buildIndexes"&:&true,
"hidden"&:&false,
"priority"&:&1,
"tags"&:&{
"slaveDelay"&:&0,
"votes"&:&1
"_id"&:&2,
"host"&:&"192.168.254.229:27017",
"arbiterOnly"&:&true,
"buildIndexes"&:&true,
"hidden"&:&false,
"priority"&:&1,
"tags"&:&{
"slaveDelay"&:&0,
"votes"&:&1
"settings"&:&{
"chainingAllowed"&:&true,
"heartbeatTimeoutSecs"&:&10,
"getLastErrorModes"&:&{
"getLastErrorDefaults"&:&{
"wtimeout"&:&0
9tong1:PRIMARY&&cfg.members[1].priority=2&&&&&#更改ID号为1的优先级。
9tong1:PRIMARY&&rs.reconfig(cfg)&&&&&&&&&&&&&&#使配置生效
{&"ok"&:&1&}
9tong1:PRIMARY&&
9tong1:PRIMARY&&
T14:01:15.000+0800&I&NETWORK&&DBClientCursor::init&call()&failed
T14:01:15.002+0800&I&NETWORK&&trying&reconnect&to&127.0.0.1:2.0.1)&failed
T14:01:15.002+0800&I&NETWORK&&reconnect&127.0.0.1:2.0.1)&ok
9tong1:SECONDARY&&
9tong1:SECONDARY&&
可以看到原来主节点SAMBA,自动降级为SECONDARY,从节点自动升级到PRIMARY
[root@weidangkou&data]#&/usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo
MongoDB&shell&version:&3.0.3
connecting&to:&test
Server&has&startup&warnings:&
T12:00:01.448+0800&I&CONTROL&&[initandlisten]&**&WARNING:&You&are&running&this&process&as&the&root&user,&which&is&not&recommended.
T12:00:01.448+0800&I&CONTROL&&[initandlisten]&
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&WARNING:&/sys/kernel/mm/transparent_hugepage/enabled&is&'always'.
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&&&&&&&&We&suggest&setting&it&to&'never'
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&WARNING:&/sys/kernel/mm/transparent_hugepage/defrag&is&'always'.
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&**&&&&&&&&We&suggest&setting&it&to&'never'
T12:00:01.449+0800&I&CONTROL&&[initandlisten]&
9tong1:PRIMARY&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)posts - 92,&
comments - 0,&
trackbacks - 0
在配置副本集之前,我们先来了解一些关于副本集的知识.
1,副本集的原理
  副本集的原理与主从很相似,唯一不同的是,在主节点出现故障的时候,主从配置的从服务器不会自动的变为主服务器,而是要通过手动修改配置.但是副表集就不用,它会自动选出一台服务器做为主节点,从而保障系统的稳定性.
2,副本集新的主节点是怎么选举出来的呢
  是通过bully算法来的,也就是一致性协议.具体如下
  1):当主节点挂了后,副本集会获得其他从节点的最后更新时间与主服务做对比
  2):如果所有从节点的最后更新时间都是很旧,那就选举停止
  3):如果副本集中的大部分服务器挂了,包含主节点,那么选举也停止
  4):如果以上情况都没有发生,那就更新时间最新的被选举为主节点
  5):如果更新时间都一样,那么谁最快成为主节点就谁做为主节点
  注意:参数选举的节点必须是副本集中的半数节点以上,如果已经小于一半了所有节点保持只读状态。日志将会出现:can't see a majority of the set, relinquishing primary
  当然还有其他方法可以干预自然选举主节点的:
  设置从节点的优先级:通过priority,优先级高的先成为主节点
  强制下架主节点:db.adminCommand({replSetStepDown:1,force:true});
3.什么情况下会触发选举这个行为呢:
  1):配置副本集环境,做副本集初始化的时候
  2):当主节点挂掉的时候
  3):当主节点与其他节点无法通信的时候,即网络出现问题的时候.
4.副本集中的节点的角色
  primary:主节点
  arbiteronly:仲裁节点,不存储数据,只参与选举
  Secondary-Only:不能成为主节点,只能做为从节点,并可以参与选举
  Hidden:隐藏不被链接的从节点,不被程序访问,但可以参与选举的节点
  Delayed:可以指定一个时间延迟从primary节点同步数据。主要用于备份数据,如果实时同步,误删除数据马上同步到从节点,恢复又恢复不了。
  Non_voting:没有得参与选举,只负责备分数据
  设置方法:在初始化的时候把相关的角色设置为true就行了.
5.副本集的节点总数为什么要为奇数
假设你有一个副本集,这个副本集有四台服务器,分别两两位于不同的机房,这时两个机房之间的通信网络出故障断了,主节点与另一个机房的节点不能通信,这时候就会触发重新选举主节点的行为.但两个机房的服务器都是两台,占用这个副本集的服务器数量都没有达到半数以上,这个时候选举停止,副本集失效.假如是5台分布在两个机房那就有一个机房是三台服务器,超过副本集的一半,产生选举.
6.配置副本集的流程:
创建副本集的目录与副本集日志目录& ----& 以副本集启动mongodb& ---& 初始化副本集
7.开始配置吧
先准备三台服务器,假设IP分别为:192.168.1.1,&& 192.168.1.2,&&& 192.168.1.3
假设mongodb安装在根目录下
1):分别在三台服务器创建副本集的数据目录:mkdir /mongodb/data/replset
2):分别在三台服务器创建副本集的日志目录:mkdir /mongodb/log
3):分别在三台服务器启动mongodb,需要启动某些参数,我们可以把参数配置在一个配置文件中,然后以--config来加载配置文件,配置内容如下
dbpath=/mongodb/data/replset
logpath=/mongodb/log/replset.log
port=27017
oplogSize=2048
开始启动,加上表示副本集的参数,参数后面带上副本集的名字,分别在三台服务器执行以下命令:
mongod --config /mongodb/bin/replset.conf --replset myreplset
4):副本集初始化
  登录其中任意一台服务器,运行以下命令
  进入mongodb操作命令界面:mongo
  配置集本集服务器信息:
  config={"_id":"myreplset","members":[{"_id":0,"host":"192.168.1.1:27017"},{"_id":1,"host":"192.168.1.1:27017"},{"_id":2,"host":"192.168.1.1:27017"}]};
  注意:这里的第一个_id是表示我们启动mongodb时--replset这个参数后面带的名称一致,即副本集的名称,member里的_id是服务器在副本集中的代号,host是主机ip和通信端口
  初始化:rs.initiate(config);
  初始化成功显示如下:
&&&&&&&&"info" : "Config now saved locally.& Should come online in about a minute.",
&&&&&&&&"ok" : 1
& 到这一步就是副本集配置完成了
 你可以通过rs.status();这个来查看副本集各节点的状态;
& 其中的statestr:的值就表示是主节点还是从节点.
5):自己通过一些手动修改数据或停止主节点来测试数据的复制和主节点的选举是否成功.还有默认是主节点进行读取的,从节点是不能进行读取的,所以要在从节点运行以下命令: db.getMongo().setSlaveOk();
6.读取行为的分类:
primary:默认参数,只从主节点上进行读取操作;
primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。
secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据&旧&。
secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;
nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。
7.怎么把一个从节点变为一个仲裁节点
1):先停掉从节点的mongod
2):在主节点把这个从节点多mongodb副本集中移除.rs.remove("ip:端口");
2).新建一个数据目录,仲裁节点不需要存放数据,但要配置数据目录,设置的数据目录也不可以有数据.
3):启动从节点的mongod,要以副本集的形式启动.
4):在主节点中用rs.addArb("ip:端口");用rs.conf();查看是否设置成功.
8.副本集架设经验:最好不要把一个副本集的所有服务器在架设在同一个机房,如果这个机房出故障,那就是整个副本集不能用了,所以最好配置在不同机房,这样起吗可以保证有一个机房的服务器在提供服务
9:解决的问题与产生的问题
对于上一篇文章:
我们在文章的后面提出了三个问题的解决方案:
1).可以做读写分离,写在主节点,读取在从节点
2).副本集就是解决主从中的当主节点挂掉后,系统的继续运行问题.
3).用副本集代替主从,在副本集中设置一个仲裁节点,减少主节点的复制压力
副本集产生的新问题:
1):主节点的写的压力是否会过大
2):数据压力大到机器支撑不了的时候能否做到自动扩展
阅读(...) 评论()

我要回帖

更多关于 mongodb 添加副本集 的文章

 

随机推荐