副本集搭建

                 ---何旭东

目录

副本集搭建... 1

参数介绍:... 1

开战... 3

基本操作... 3

逻辑图... 4

配置文件... 4

节点说明... 4

状态说明... 5

插入配置数据... 5

复制集初始化... 6

查看状态... 6

查看当前主库... 7

优化... 8

调整从库可读... 8

 

 

2015716

 

到此就配置好了二个replica sets

 

发现问题思路:把基础环境一个一个总计一个一个梳理,确认每个节点的对应关系。即可!

 

在这里发扬个观念:鄙视团队技术隐藏,公司没有知识库,领导刻薄!!!

参数介绍:

 --quiet                                 #安静输出
  --port arg                            #指定服务端口号,默认端口27017
  --bind_iparg                      #绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
  --logpatharg                     #指定MongoDB日志文件,注意是指定文件不是目录
  --logappend                      #使用追加的方式写日志
  --pidfilepath arg                #PID File 的完整路径,如果没有设置,则没有PID文件
  --keyFilearg                      #集群的私钥的完整路径,只对于Replica Set 架构有效
  --unixSocketPrefix arg      # UNIX域套接字替代目录,(默认为 /tmp)
  --fork                                #以守护进程的方式运行MongoDB,创建服务器进程
  --auth                               #启用验证
  --cpu                                #定期显示CPUCPU利用率和iowait
  --dbpatharg                     #指定数据库路径
  --diaglogarg                     #diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
  --directoryperdb               #设置每个数据库将被保存在一个单独的目录
  --journal                           #启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
  --journalOptionsarg         # 启用日志诊断选项
  --ipv6                              #启用IPv6选项
  --jsonp                            #允许JSONP形式通过HTTP访问(有安全影响)
  --maxConnsarg              #最大同时连接数 默认2000
  --noauth                         #不启用验证
  --nohttpinterface            #关闭http接口,默认关闭27018端口访问
  --noprealloc                    #禁用数据文件预分配(往往影响性能)
  --noscripting                   #禁用脚本引擎
  --notablescan                 #不允许表扫描
  --nounixsocket               #禁用Unix套接字监听
  --nssize arg(=16)          # 设置信数据库.ns文件大小(MB)
  --objcheck                     #在收到客户数据,检查的有效性,
  --profilearg                    #档案参数 0=off 1=slow, 2=all
  --quota                          #限制每个数据库的文件数,设置默认为8
  --quotaFilesarg              #  numberof files allower per db, requires --quota
  --rest                             #开启简单的rest API
  --repair                           #修复所有数据库run repair on all dbs
  --repairpatharg               #修复库生成的文件的目录,默认为目录名称dbpath
  --slowms arg (=100)       #value of slow for profile and console log
  --smallfiles                       #使用较小的默认文件
  --syncdelay arg (=60)    # 数据写入磁盘的时间秒数(0=never,不推荐)
  --sysinfo                         #打印一些诊断系统信息
  --upgrade                      #如果需要升级数据库

  * Replicaton 参数
-----------------------------------------------------------------------------
  --fastsync                      #从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
  --autoresync                 #如果从库与主库同步数据差得多,自动重新同步,
  --oplogSizearg              #设置oplog的大小(MB)

  * /从参数
-----------------------------------------------------------------------------
  --master                        #主库模式
  --slave                           #从库模式
  --sourcearg                  #从库端口号
  --onlyarg                     #指定单一的数据库复制
  --slavedelayarg            # 设置从库同步主库的延迟时间
 
  * Replica set(副本集)选项:
-----------------------------------------------------------------------------  
  --replSetarg                 #设置副本集名称

  * Sharding(分片)选项
-----------------------------------------------------------------------------  
  --configsvr                    #声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
  --shardsvr                     #声明这是一个集群的分片,默认端口27018
  --noMoveParanoia      # 关闭偏执为moveChunk数据保存?

 

开战

基本操作

关闭防火墙

关闭selinux

配置hosts

时间同步

 

基本情况如下:

IP地址

主机名

角色

192.168.200.185

mongodb.1.hxd

priority

192.168.200.187

mongodb.2.hxd

standard

192.168.200.186

mongodb.3.hxd

arbiter

 

逻辑图

MongoDB -(2) replica sets

配置文件

[[email protected] ~]# cat /etc/mongod.conf

port=27017 

dbpath = /usr/local/mongodb/data/

logpath =/usr/local/mongodb/logs/mongodb.log

logappend=true

fork=true

httpinterface=true

nojournal=true

rest=true

replSet=testSet

replIndexPrefetch=_id_only

节点说明

standard:常规节点,它存储一份完整的数据副本,参与选举投票可以成为活跃节点。

passive:存储了完整的数据副本,参与投票,不能成为活跃节点。

arbiter:仲裁者只参与投票,不能接受复制数据,也不能成为活跃节点。

 

Bully选举算法
Bully
算法是一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。

 

 

默认情况:primary节点负责数据读写,secondary节点备份primary节点上的数据,但是arbiter节点

不会从primary节点同步数据

 

arbiter作用:

primary节点故障,能够从second节点中,选出一个primary节点,不会参与数据读写。

 

状态说明

STARTUP:刚加入到复制集中,配置还未加载
STARTUP2
:配置已加载完,初始化状态
RECOVERING
:正在恢复,不适用读
ARBITER:
仲裁者
DOWN
:节点不可到达
UNKNOWN
:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂
REMOVED
:移除复制集
ROLLBACK
:数据回滚,在回滚结束时,转移到RECOVERINGSECONDARY状态
FATAL
:出错。查看日志grep replSetFATAL”找出错原因,重新做同步
PRIMARY
:主节点
SECONDARY
:备份节点

 

 

状态中关键数据位:

在用 rs.status()查看replica sets状态时,

state1表示该host是当前可以进行读写,2:不能读写

health1表示该host目前是正常的,0:异常

 

插入配置数据

启动数据库

mongod -f /etc/mongod.conf

 

插入信息

rs.initiate({_id:"testSet",members:[{_id:1,host:"192.168.200.185:27017"},{_id:2,host:"192.168.200.187:27017"},{_id:3,host:"192.168.200.186:27017","arbiterOnly":true}]});

 

复制集初始化

rs.initiate(conf); 

查看状态

testSet:PRIMARY> rs.status()

{

       "set" : "testSet",

       "date" : ISODate("2015-07-15T13:09:22Z"),

       "myState" : 1,

       "members" : [

                {

                        "_id" : 1,

                        "name" :"192.168.1.109:27017",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" :"PRIMARY",

                        "uptime" :1454,

                        "optime" :Timestamp(1436965655, 1),

                        "optimeDate": ISODate("2015-07-15T13:07:35Z"),

                       "electionTime" : Timestamp(1436965663, 1),

                       "electionDate" : ISODate("2015-07-15T13:07:43Z"),

                        "self" : true

                },

                {

                        "_id" : 2,

                        "name" :"192.168.1.110:27017",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" :"SECONDARY",

                       "uptime": 107,

                        "optime" :Timestamp(1436965655, 1),

                        "optimeDate": ISODate("2015-07-15T13:07:35Z"),

                       "lastHeartbeat" : ISODate("2015-07-15T13:09:22Z"),

                        "lastHeartbeatRecv" :ISODate("2015-07-15T13:09:22Z"),

                        "pingMs" : 0,

                        "syncingTo" :"192.168.1.109:27017"

                },

                {

                        "_id" : 3,

                        "name" :"192.168.1.108:27017",

                        "health" : 1,

                        "state" : 7,

                        "stateStr" :"ARBITER",

                        "uptime" :107,

                       "lastHeartbeat" : ISODate("2015-07-15T13:09:22Z"),

                       "lastHeartbeatRecv" :ISODate("2015-07-15T13:09:20Z"),

                        "pingMs" : 0

                }

       ],

       "ok" : 1

}

testSet:PRIMARY>

查看当前主库

testSet:SECONDARY> rs.isMaster();

{

       "setName" :"testSet",

       "setVersion" : 1,

       "ismaster" : false,

       "secondary" : true,

       "hosts" : [

               "192.168.200.187:27017",

               "192.168.200.185:27017"

       ],

       "arbiters" : [

                "192.168.200.186:27017"

       ],

       "primary" : "192.168.200.185:27017",

       "me" : "192.168.200.187:27017",

       "maxBsonObjectSize" : 16777216,

       "maxMessageSizeBytes" : 48000000,

       "maxWriteBatchSize" : 1000,

       "localTime" : ISODate("2015-07-16T02:21:08.234Z"),

       "maxWireVersion" : 2,

       "minWireVersion" : 0,

       "ok" : 1

}

优化

我们可以看到三台机器的 health 为是1 说明机器目前是正常的。

再来观看每台机器的state 位,1 是可以读写,2 是不可读写

 

 

调整从库可读

passive     ----节点执行以下内容

testSet:PRIMARY> show dbs;

admin (empty)

local 2.077GB

testSet:PRIMARY> use testdb;

switched to db testdb

testSet:PRIMARY>db.document01.insert({"name":"hxd","sex":"N","age":"22"});

 

WriteResult({ "nInserted" : 1 })

testSet:PRIMARY> show tables;

document01

system.indexes

testSet:PRIMARY> db.document01.find();

{ "_id" :ObjectId("55a71118442e12ca0d28b50a"), "name" :"hxd", "sex" : "N", "age" :"22" }

testSet:PRIMARY>

 

standard    ----节点执行以下内容

testSet:SECONDARY> show dbs;

admin  (empty)

local  2.077GB

testdb 0.078GB

testSet:SECONDARY> use testdb

switched to db testdb

testSet:SECONDARY> show tables;

2015-07-16T10:05:22.978+0800 error: {"$err" : "not master and slaveOk=false", "code" :13435 } at src/mongo/shell/query.js:131

testSet:SECONDARY> rs.slaveOk();

testSet:SECONDARY> show tables;

document01

system.indexes

testSet:SECONDARY> db.document01.find();

{ "_id" :ObjectId("55a71118442e12ca0d28b50a"), "name" :"hxd", "sex" : "N", "age" :"22" }

testSet:SECONDARY>