MongoDB主从 副本集 分片集群安装

############################### 主从开始 ##########################################
最简单主从  http://www.codefrom.com/paper/MongoDB学习札记第六篇之主从复制

mongod --master --dbpath /opt/mongo1/ --port 10000
mongod --slave  --dbpath /opt/mongo2/ --port 10001  --source 127.0.0.1:10000

--slavedelay 600   延迟600s,可防止误删除数据库

连接方式
mongo 127.0.0.1:10000
mongo --host 127.0.0.1 --port 10000

登陆到从执行show dbs报错  

解决办法 
1 临时生效
执行rs.slaveOk()     或  db.getMongo().setSlaveOk();

2 永久生效
vi ~/.mongorc.js
增加一行rs.slaveOk();

3 方法三:在程序连接mongodb的XML配置文件增加 slave-ok="true"也支持直接从secondary中读
http://www.cnblogs.com/htynkn/archive/2011/10/30/2229467.html

############################### 主从结束 #################################################


############################### 副本集 Replica-Set 开始 ##################################
http://webinglin.github.io/2015/06/09/MongoDB学习札记-第八篇-Replica-Set-实战/
MongoDB Replica Set使用经验分享理论篇
http://www.linuxidc.com/Linux/2015-02/113296.htm

========================================================================================
一个Replica Set中的成员角色有三种:Primary,Secondary和Arbiter。

Primary    接收来自客户端的所有的写操作,一个Replica Set中有且只有一个Primary。Primary如果宕掉,Replica Set会自动选举一个Secondary成为Primary。
Primary将它data sets的所有操作都记录到oplog中。

Secondary  Secondary从Primary复制oplog,然后将oplog中的操作应用到自己的data sets。Secondary和Primary之间是异步复制,也就是Secondary中的数据可能
不是最新的。默认情况下,Secondary不可读不可写,但是可以通过设置运行客户端从Secondary读。

Arbiter    Arbiter不需要维护自己的data sets,只是当Primary挂掉之后参与投票选择哪个Secondary可以升级为Primary。当Replica Set中的成员个数为偶数个时,
就需要添加一个Arbiter用于投票选举哪个可以升级为Primary。Arbiter对硬件的要求很低。不能在Primary或者Secondary主机上运行Arbiter。

Hidden:这类节点是不能够被客户端制定IP引用,也不能被设置为主节点,但是可以投票,一般用于备份数据。
Delayed:可以指定一个时间延迟从primary节点同步数据。主要用于备份数据,如果实时同步,误删除数据马上同步到从节点,恢复又恢复不了。
Non-Voting:没有选举权的secondary节点,纯粹的备份数据节点。

一个Replica Set可以最多拥有12个成员,但是只有7个成员可以同时参与投票选举成为Primary,如果成员数量超过12,就需要使用Master-Slave主从复制方式。

部署一个Replica Set至少需要三个成员,一个Arbiter,一个Secondary和一个Primary或者一个Primary,两个Secondary。
======================================================================================
mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据
请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置
服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的
状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,
只要还有存货, mongodb集群就不会挂掉。

shard,这就是传说中的分片了。

一共三台机器
owl8  10.45.13.133  主 mongos config  replica set
owl5  10.45.12.205  从 mongos config  replica set
owl6  10.45.12.196  从 mongos config  replica set

每一台服务器分别启动配置服务器
mongod --configsvr --dbpath /opt/config --port 21000 --logpath /bak/logs/mongo/config.log --fork

每一台服务器分别启动mongos服务器
mongos  --configdb 10.45.13.133:21000,10.45.12.205:21000,10.45.12.196:21000  --port 20000   --logpath  /bak/logs/mongo/mongos.log --fork

Replica Set

在三台机器执行    两种方法  --replSet 指定副本集名称
mongod --dbpath /opt/mongo --replSet rs0   #前台执行,显示日志
mongod --fork --dbpath  /opt/mongo --replSet rs0 --oplogSize 5000 --logpath /opt/mongo/mongod.log  #后台执行

按配置文件启动 mongod -f /etc/mongod.conf

#############################################################################################
# mongod.conf
#   http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /bak/logs/mongo/mongod.log

# Where and how to store data.
storage:
  dbPath: /opt/mongo
  journal:
    enabled: true
  directoryPerDB: true
#  syncPeriodSecs: 60
#  engine:
#  mmapv1:
#  wiredTiger:
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 6
# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /opt/mongo/mongod.pid  # location of pidfile
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,10.45.13.133  # Listen to local interface only, comment to listen on all interfaces.
#security:
#operationProfiling:
#replication:
replication:
  oplogSizeMB: 5000
  replSetName: rs0
#sharding:

## Enterprise-Only Options

#auditLog:
#snmp:
#########################################################################

安装失败,清理文件命令
ps -ef|grep -v "grep\|tail"|grep mongo|awk '{print $2}'|xargs kill -15
rm -f /tmp/mongodb-27017.sock
rm -rf /opt/mongo/*
rm -f /opt/mongo/WiredTiger.turtle
sync  
echo "1" >/proc/sys/vm/drop_caches
echo "0" >/proc/sys/vm/drop_caches


mongod -f /etc/mongod.conf
tail -f /bak/logs/mongo/mongod.log

owl8  10.45.13.133
owl5  10.45.12.205
owl6  10.45.12.196

登陆到其中一台
#使用admin数据库
use admin
config = {_id:"rs0",members:[
 {_id:0,host:"10.45.13.133:27017"},
 {_id:1,host:"10.45.12.205:27017"},
 {_id:2,host:"10.45.12.196:27017"}]}

#monogo 副本集一些命令 登陆到mongod执行
#初始化
rs.initiate(config);

rs.conf() #查看配置

查看节点状态  rs.status()
state: 1表示当前可以进行读写,2表示不能读写
health: 1表示是正常的,0异常

动态添加节点,删除节点  必须要在 Primary 节点中进行
rs.remove("10.172.229.12:27017")
rs.add("10.172.229.12:27017")

replSetStepDown命令下架主节点。这个命令可以登录主节点使用
db.adminCommand({replSetStepDown : 1})

Mongodb权威指南 215页
把主节点变为备份节点,并维持60秒.如果这段时间没有新的主节点被选举出来,这个节点可以要求重新选举
rs.stepDown()

rs.stepDown(600) 主节点变为备份节点,并维持600秒

如果杀不掉可以使用强制开关
db.adminCommand({replSetStepDown : 1, force : true})

阻止选举
rs.freeze       如果对主节点做一些维护,不希望这段时间将其他成员选举为主节点,可以在每个备份节点执行freeze,强制他们始终处理备份节点
rs.freeze(600)  也可以加时间限制
rs.freeze(0)    维护完成后,如果想释放其他成员, 执行rs.freeze(0) 即可

修改mongodb oplog size
默认,oplog大小会占用64位的实例5%的可用磁盘空间。

查询oplog的大小及保存的操作记录持续的时长
rs0:PRIMARY>db.printReplicationInfo()

查询从节点的数据源列表,其中有数据滞后的时间
rs0:SECONDARY> db.printSlaveReplicationInfo()

Mongos Config 配置  ##################################

#串联路由服务器 将副本集转换为分片
登陆到其中一台mongos
mongo --port 20000
方法一
use admin
db.runCommand( { addshard : "rs0/10.45.13.133:27017,10.45.12.205:27017,10.45.12.196:27017"});
方法二
sh.addShard("rs0/10.45.13.133:27017,10.45.12.205:27017,10.45.12.196:27017")
设置为Arbiter使用以下方法
{_id:2,host:"10.45.12.196:27017",arbiterOnly:true}]}

#查看分片服务器的配置
use admin
db.runCommand( { listshards : 1 } );
sh.status() 这个命令也可以查看
############################### 副本集 Replica-Set 结束 ##################################



############################### 分片集群开始 ##################################
http://webinglin.github.io/2015/06/10/MongoDB学习札记-第十篇-分片集群搭建/
https://docs.mongodb.org/manual/tutorial/choose-a-shard-key/

环境准备

config Server
10.172.229.12:27000

mongos
10.172.229.12:28000

shards
10.172.229.12:29001
10.172.229.12:29002
10.172.229.12:29003

第一步:
创建分片实验需要的目录

mkdir -p /opt/shard/s1
mkdir -p /opt/shard/s2
mkdir -p /opt/shard/s3
mkdir -p /opt/shard/log
mkdir -p /opt/shard/config

第二步: 启动configServer
mongod --configsvr --dbpath /opt/shard/config/ --fork --logpath /opt/shard/log/configsvr.log --logappend --port 27000

第三步: 启动mongos
mongos --configdb 10.172.229.12:27000 --port 28000 --fork --logpath /opt/shard/log/mongs.log

第四步: 启动所有的shard分片
mongod --dbpath /opt/shard/s1/ --port 29001 --fork --logpath /opt/shard/log/s1.log --shardsvr --logappend    
mongod --dbpath /opt/shard/s2/ --port 29002 --fork --logpath /opt/shard/log/s2.log --shardsvr --logappend
mongod --dbpath /opt/shard/s3/ --port 29003 --fork --logpath /opt/shard/log/s3.log --shardsvr --logappend

第五步: 将shard添加到mongos中 并配置

mongo --port 28000
#使用admin数据库
use admin
sh.addShard("10.172.229.12:29001")
sh.addShard("10.172.229.12:29002")
sh.addShard("10.172.229.12:29003")

使用下面两个命令来配置需要分片的数据库及集合以及对应的片键
sh.enableSharding("test")
sh.shardCollection("test.users",{"username":1,"_id":1})

验证分片集群部署情况

先往mongos插入100条数据,然后通过 db.users.stats() 查看集合的状态,发现集合被切分到三个分片中了,虽然第一个分片数据量比较多,其他两个分片
数据量相对较少 (这个和片键 sharding key 的设置有关,我没有详细看官网关于shard key设置的文章,所以这里的片键设置比较简单,随意。)
for(var i=0; i<100; i++) {
db.users.insert({"username":"" + i,age:i*2 , addr:"ardr"+i})
}

db.users.stats() 查看集合状态


这时候如果用mongo客户端去连接 29001 , 29002, 29003端口,会发现只有集合的部分数据是可见的


############################### 分片集群结束 ##################################



你可能感兴趣的:(MongoDB主从 副本集 分片集群安装)