mongodb 简单部署方案及实例

转载:http://my.oschina.net/zhuzhu0129/blog/53290

第一节 准备工作
 一 安装mongodb
  我这里选用rehl 5.6作为其运行载体。
  1. 下载mongodb的linux版本(注意32位和64位的区别),下载地址:http://www.mongodb.org/downloads
   # wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz
  2. 将下载的mongodb安装文件 mongodb-linux-x86_64-2.0.4.tgz 放到/usr/local/下
  3. 解压 
   # tar -zxvf mongodb-linux-x86_64-2.0.4.tgz
   重命名 
   # mv mongodb-linux-x86_64-2.0.4 /usr/local/mongodb
  4. 创建数据库文件目录, # mkdir -p /data/mongodb,我把数据库文件目录放在当前文件夹下,# mkdir -p data/db,创建日志目录 #mkdir -p log
  
 二 启动
  首先用命令进入到bin目录下:cd /usr/local/mongodb/bin
  
  方式一:直接运行命令启动
  ./mongod –port 10000 –fork –logpath= logpath=/data/mongodb/log/mongodb.log -- logappend -- dbpath=/data/mongodb/data/db
  
  方式二:通过配置文件方式启动(推荐)。
  1.在服务器上新建mongodb.conf配置文件(建议用命令生成,放在mongodb同一个目录下)
  内容为:
  port=10000 #端口号
  fork=true #以守护进程的方式运行,创建服务器进程
  #master=true #单主从配置时设为主服务器
  #salve=true ##单主从配置时设为从服务器
  logpath=/data/mongodb/log/mongodb.log #日志输出文件路径
  logappend=true #日志输出方式
  dbpath=/data/mongodb/data/db #数据库路径
  replSet=blort #设置富本集的名字
  shardsvr=true #设置是否分片
  2.运行./mongod –config ~/.mongodb.conf 命令(--config可以直接写成-f)。
  输出:
  all output going to: /data/mongodb/log/mongodb.log
  forked process: 5315
  
  mongodb 启动参数
    --quiet                              # 安静输出 
    --port arg                        # 指定服务端口号,默认端口27017 
    --bind_ip arg                  # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP 
    --logpath arg                  # 指定MongoDB日志文件,注意是指定文件不是目录 
    --logappend                   # 使用追加的方式写日志 
    --pidfilepath arg             # PID File 的完整路径,如果没有设置,则没有PID文件 
    --keyFile arg                   # 集群的私钥的完整路径,只对于Replica Set 架构有效 
    --unixSocketPrefix arg  # UNIX域套接字替代目录,(默认为 /tmp) 
    --fork                                 # 以守护进程的方式运行MongoDB,创建服务器进程 
    --auth                                # 启用验证 
    --cpu                                 # 定期显示CPU的CPU利用率和iowait 
    --dbpath arg                     # 指定数据库路径 
    --diaglog arg                    # diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads 
    --directoryperdb              # 设置每个数据库将被保存在一个单独的目录 
    --journal                            # 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 
    --journalOptions arg       # 启用日志诊断选项 
    --ipv6                                 # 启用IPv6选项 
    --jsonp                              # 允许JSONP形式通过HTTP访问(有安全影响) 
    --maxConns arg             # 最大同时连接数 默认2000 
    --noauth                           # 不启用验证 
    --nohttpinterface             # 关闭http接口,默认关闭27018端口访问 
    --noprealloc                     # 禁用数据文件预分配(往往影响性能) 
    --noscripting                    # 禁用脚本引擎 
    --notablescan                  # 不允许表扫描 
    --nounixsocket                # 禁用Unix套接字监听 
    --nssize arg (=16)           # 设置信数据库.ns文件大小(MB) 
    --objcheck                        # 在收到客户数据,检查的有效性, 
    --profile arg                      # 档案参数 0=off 1=slow, 2=all 
    --quota                              # 限制每个数据库的文件数,设置默认为8 
    --quotaFiles arg               #  number of files allower per db, requires --quota 
    --rest                                  # 开启简单的rest API 
    --repair                              # 修复所有数据库run repair on all dbs 
    --repairpath arg               # 修复库生成的文件的目录,默认为目录名称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                 # 如果从库与主库同步数据差得多,自动重新同步, 
    --oplogSize arg            # 设置oplog的大小(MB) 
    
    * 主/从参数

--------------------------------------------------------------------------------

--master                        # 主库模式 
    --slave                           # 从库模式 
    --source arg                 # 从库 端口号 
    --only arg                      # 指定单一的数据库复制 
    --slavedelay arg          # 设置从库同步主库的延迟时间 
     
    * Replica set(副本集)选项:

--------------------------------------------------------------------------------

--replSet arg                   # 设置副本集名称 
    
    * Sharding(分片)选项

--------------------------------------------------------------------------------

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

三 查询进程和关闭数据库
  1. 运行 ps -ef|grep mongo 命令查询服务器进程
  2. 运行 kill -2 5315命令kill掉5315的进程
  
 四 进入数据库并简单操作数据库
  1.运行./mongo –port 1000进入刚刚启动的端口号为10000的数据库
  2.使用use test可以切换集合(相当于数据库表),这里切换到了test集合
  3.使用db.test.insert("a","b");向集合插入数据
  4.使用db.test.find();查询集合里的数据
  5.更多shell命令请查阅相关文档

五 注意事项
  1. 防火墙设置(测试时可直接关闭linux关闭防火墙:立即但不永久生效:service iptables stop重启永久生效:chkconfig iptables off)

第二节 副本集
 简单的说,副本集就是有自动故障恢复功能的主从集群,副本集没有固定的"主节点",集群会通过投票选举一个"主节点"。当主节点岩机时,会变更到其他节点。副本集布在不同机器上时,至少要启动三个(单数)数据库服务器进程,否则启动时投票不成功会一直初始化不了。
 
 一 以配置文件方式启动三台机器上的数据库服务器
  1. 三台服务器的配置文件:
   port=10000 #端口号
   fork=true #以守护进程的方式运行,创建服务器进程
   logpath=/data/mongodb/log/mongodb.log #日志输出文件路径
   logappend=true #日志输出方式
   dbpath=/data/mongodb/data/db #数据库路径
   replSet=blort #设置富本集的名字为blort,replSet是让服务器知道在这个"blort"副本集中还有别的机器
   # replSet=blort /10.10.112.181:10000, 10.10.112.191:10000#设置富本集的名字,这种方式也可以,意思就是"blort"副本集其他机器,位置在10.10.112.181:10000和10.10.112.191:10000,但不推荐
  
  2. 通命令启动三台数据库服务器
   /usr/local/mongodb/bin/mongod -f /data/mongodb/blort/config.conf
   /usr/local/mongodb/bin/mongod -f /data/mongodb/blort2/config.conf
   /usr/local/mongodb/bin/mongod -f /data/mongodb/blort3/config.conf
  
 二 初始化副本集(只能初始化一次)
  /usr/local/mongodb/bin/mongo --port 30001
  use admin
  方法一:
  db.runCommand({"replSetInitiate":{"_id":"blort","members":[{"_id":0,"host":"10.10.113.122:30001"},{"_id":1,"host":"10.10.113.122:30002"},{"_id":2,"host":"10.10.113.122:30003","arbiterOnly":true}]}})
  
  方法二:
  config={_id:'blort',members:[{"_id":0,host:'10.10.113.122:30001},{"_id":1,host:'10.10.113.122:30002'},{"_id":2,"host":"10.10.113.122:30003","arbiterOnly":true}]};
  rs.initiate(config);

三 增加和设置副本集
  有几种不同类型的节点可以存在于副本集:
  Standard :存在于副本,参与投票,有可能成为活跃节点(即主节点)
  Passive :存储了完整的数据副本,参与投票,不能成为活跃节点
  Arbiter:仲裁者,只参与投票,不能成为活跃节点
  Priority:优先级,(投票会投优先级高的,如果相同,则投数据最新的)
  以上类型可以通过以下命令对副本集合进行修改或者增加服务器
  db.runCommand({"replSetReconfig":{"_id":"test3","version":2,"members":[{"_id":0,"host":"10.10.113.122:30001"},{"_id":1,"host":"10.10.113.122:30002"},{"_id":2,"host":"10.10.113.122:30003","arbiterOnly":true}]}})
  
  增加副本服务器
  在增加一个从服务器节点
  a.以相同副本集名字启动一台服务器
  b.通过rs.add命令往system.replset添加新的从服务器成员
  rs.add("10.10.113.122:30005"); 或者rs.add({"_id":4,"host":"10.10.113.122:30005"}) 
  添加仲裁
  rs.addArb("10.10.113.122:30004");

四 读扩展
  待研究
  
 五 用户校验
  未成功
  use test;
  db.addUser("test","123456");
  db.auth("test","123456");
  db.system.users.find();
  db.system.users.remove("test","123456");
  
第二节 replica sets + shard (双机方案,单机模拟)
 
 一 准备
  mkdir -p /data/mongodb/shard1-1/db/
  mkdir -p /data/mongodb/shard1-1/log/
  
  /data/mongodb/shard1-1/config.conf
   port=30001   #端口号
   fork=true   #以守护进程的方式运行,创建服务器进程
   #nohttpinterface=true   # 关闭http接口,默认关闭27018端口访问 port + 1000
   rest = true  #http接口 启动rest 使能访问 。与nohttpinterface 对应 只开一个
   shardsvr=true  #启动分片
   #oplogSize=100  #复制日志大小 MB
   logpath=/data/mongodb/shard1-1/log/shard1-1.log   #日志输出文件路径
   logappend=true   #日志输出方式
   dbpath=/data/mongodb/shard1-1/db   #数据库路径
   directoryperdb=true  # 设置每个数据库将被保存在一个单独的目录 
   replSet=shard1   #设置富本集的名字为shard1,replSet是让服务器知道在这个"shard1"副本集中还有别的机器

#auth=true # 启用验证
  
  mkdir -p /data/mongodb/shard1-1a/db/
  mkdir -p /data/mongodb/shard1-1a/log/
  /data/mongodb/shard1-1a/config.conf
   port=30002   #端口号
   fork=true   #以守护进程的方式运行,创建服务器进程
   #nohttpinterface=true   # 关闭http接口,默认关闭27018端口访问 port + 1000
   rest = true  #http接口 启动rest 使能访问 。与nohttpinterface 对应 只开一个
   shardsvr=true  #启动分片
   #oplogSize=100  #复制日志大小 MB
   logpath=/data/mongodb/shard1-1a/log/shard1-1a.log   #日志输出文件路径
   logappend=true   #日志输出方式
   dbpath=/data/mongodb/shard1-1a/db   #数据库路径
   directoryperdb=true  # 设置每个数据库将被保存在一个单独的目录 
   replSet=shard1   #设置富本集的名字为shard1,replSet是让服务器知道在这个"shard1"副本集中还有别的机器

#auth=true # 启用验证
  
  
  mkdir -p /data/mongodb/shard1-2/db/
  mkdir -p /data/mongodb/shard1-2/log/
  /data/mongodb/shard1-2/config.conf
   port=30003   #端口号
   fork=true   #以守护进程的方式运行,创建服务器进程
   #nohttpinterface=true   # 关闭http接口,默认关闭27018端口访问 port + 1000
   rest = true  #http接口 启动rest 使能访问 。与nohttpinterface 对应 只开一个
   shardsvr=true  #启动分片
   #oplogSize=100  #复制日志大小 MB
   logpath=/data/mongodb/shard1-2/log/shard1-2.log   #日志输出文件路径
   logappend=true   #日志输出方式
   dbpath=/data/mongodb/shard1-2/db   #数据库路径
   directoryperdb=true  # 设置每个数据库将被保存在一个单独的目录 
   replSet=shard1   #设置富本集的名字为shard1,replSet是让服务器知道在这个"shard1"副本集中还有别的机器

#auth=true # 启用验证
  
  mkdir -p /data/mongodb/shard2-1/db/
  mkdir -p /data/mongodb/shard2-1/log/
  /data/mongodb/shard2-1/config.conf
   port=32001   #端口号
   fork=true   #以守护进程的方式运行,创建服务器进程
   #nohttpinterface=true   # 关闭http接口,默认关闭27018端口访问 port + 1000
   rest = true  #http接口 启动rest 使能访问 。与nohttpinterface 对应 只开一个
   shardsvr=true  #启动分片
   #oplogSize=100  #复制日志大小 MB
   logpath=/data/mongodb/shard2-1/log/shard2-1.log   #日志输出文件路径
   logappend=true   #日志输出方式
   dbpath=/data/mongodb/shard2-1/db   #数据库路径
   directoryperdb=true  # 设置每个数据库将被保存在一个单独的目录 
   replSet=shard2   #设置富本集的名字为shard2,replSet是让服务器知道在这个"shard2"副本集中还有别的机器

#auth=true # 启用验证
  
  mkdir -p /data/mongodb/shard2-1a/db/
  mkdir -p /data/mongodb/shard2-1a/log/
  /data/mongodb/shard2-1a/config.conf
   port=32002   #端口号
   fork=true   #以守护进程的方式运行,创建服务器进程
   #nohttpinterface=true   # 关闭http接口,默认关闭27018端口访问 port + 1000
   rest = true  #http接口 启动rest 使能访问 。与nohttpinterface 对应 只开一个
   shardsvr=true  #启动分片
   #oplogSize=100  #复制日志大小 MB
   logpath=/data/mongodb/shard2-1a/log/shard2-1a.log   #日志输出文件路径
   logappend=true   #日志输出方式
   dbpath=/data/mongodb/shard2-1a/db   #数据库路径
   directoryperdb=true  # 设置每个数据库将被保存在一个单独的目录 
   replSet=shard2   #设置富本集的名字为shard2,replSet是让服务器知道在这个"shard2"副本集中还有别的机器

#auth=true # 启用验证
  
  mkdir -p /data/mongodb/shard2-2/db/
  mkdir -p /data/mongodb/shard2-2/log/
  /data/mongodb/shard2-2/config.conf
   port=32003   #端口号
   fork=true   #以守护进程的方式运行,创建服务器进程
   #nohttpinterface=true   # 关闭http接口,默认关闭27018端口访问 port + 1000
   rest = true  #http接口 启动rest 使能访问 。与nohttpinterface 对应 只开一个
   shardsvr=true  #启动分片
   #oplogSize=100  #复制日志大小 MB
   logpath=/data/mongodb/shard2-2/log/shard2-2.log   #日志输出文件路径
   logappend=true   #日志输出方式
   dbpath=/data/mongodb/shard2-2/db   #数据库路径
   directoryperdb=true  # 设置每个数据库将被保存在一个单独的目录 
   replSet=shard2   #设置富本集的名字为shard2,replSet是让服务器知道在这个"shard2"副本集中还有别的机器

#auth=true # 启用验证
  
  mkdir -p /data/mongodb/config1/db/
  mkdir -p /data/mongodb/config1/log/
  /data/mongodb/config1/config.conf
   dbpath = /data/mongodb/config1/db
   configsvr = true
   port = 40001
   logpath =/data/mongodb/config1/log/config1.log
   logappend = true
   fork = true
   
   #auth=true # 启用验证
  
  mkdir -p /data/mongodb/config2/db/
  mkdir -p /data/mongodb/config2/log/
  /data/mongodb/config2/config.conf
   dbpath = /data/mongodb/config2/db
   configsvr = true
   port = 40002
   logpath =/data/mongodb/config2/log/config2.log
   logappend = true
   fork = true
   
   #auth=true # 启用验证
  
  mkdir -p /data/mongodb/config3/db/
  mkdir -p /data/mongodb/config3/log/
  /data/mongodb/config3/config.conf
   dbpath = /data/mongodb/config3/db
   configsvr = true
   port = 40003
   logpath =/data/mongodb/config3/log/config3.log
   logappend = true
   fork = true
   
   #auth=true # 启用验证
  
  mkdir -p /data/mongodb/mongos1/log/
  /data/mongodb/mongos1/config.conf
   configdb =10.10.113.122:40001,10.10.113.122:40002,10.10.113.122:40003
   port = 50001
   chunkSize = 1
   logpath =/data/mongodb/mongos1/log/mongos1.log
   logappend = true
   fork = true

#auth=true # 启用验证
  
  mkdir -p /data/mongodb/mongos2/log/
  /data/mongodb/mongos2/config.conf
   configdb =10.10.113.122:40001,10.10.113.122:40002,10.10.113.122:40003
   port = 50002
   chunkSize = 1
   logpath =/data/mongodb/mongos2/log/mongos2.log
   logappend = true
   fork = true

#auth=true # 启用验证

二 启动
 
  shard1 副本 启动
  /usr/local/mongodb/bin/mongod -f /data/mongodb/shard1-1/config.conf
  /usr/local/mongodb/bin/mongod -f /data/mongodb/shard1-1a/config.conf
  /usr/local/mongodb/bin/mongod -f /data/mongodb/shard1-2/config.conf
  
  /usr/local/mongodb/bin/mongo --port 30001
  
  use admin
  db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{"_id":0,"host":"10.10.113.122:30001"},{"_id":1,"host":"10.10.113.122:30002","arbiterOnly":true},{"_id":2,"host":"10.10.113.122:30003"}]}})
  
  shard2 副本 启动
  /usr/local/mongodb/bin/mongod -f /data/mongodb/shard2-1/config.conf
  /usr/local/mongodb/bin/mongod -f /data/mongodb/shard2-1a/config.conf
  /usr/local/mongodb/bin/mongod -f /data/mongodb/shard2-2/config.conf
  
  /usr/local/mongodb/bin/mongo --port 31001
  
  use admin
  db.runCommand({"replSetInitiate":{"_id":"shard2","members":[{"_id":0,"host":"10.10.113.122:32001"},{"_id":1,"host":"10.10.113.122:32002","arbiterOnly":true},{"_id":2,"host":"10.10.113.122:32003"}]}})
 
  config1 启动
  /usr/local/mongodb/bin/mongod -f /data/mongodb/config1/config.conf
  config2 启动
  /usr/local/mongodb/bin/mongod -f /data/mongodb/config2/config.conf
  config3 启动
  /usr/local/mongodb/bin/mongod -f /data/mongodb/config3/config.conf
  
  mongos1 启动
  /usr/local/mongodb/bin/mongos -f /data/mongodb/mongos1/config.conf
  mongos2 启动
  /usr/local/mongodb/bin/mongos -f /data/mongodb/mongos2/config.conf
  
  
  /usr/local/mongodb/bin/mongo --port 50001
  use admin
  db.runCommand({addshard:"shard1/10.10.113.122:30001,10.10.113.122:30003",name:"shard1", maxsize:100})
  db.runCommand({addshard:"shard2/10.10.113.122:32001,10.10.113.122:32003",name:"shard2", maxsize:100})
  
  db.runCommand({listshards:1})
  
  use test
  db.test.insert({"aaa":"bbb"});

第三节 replica sets + shard (3机高可用 , 一主双备份)
 一 方案
  每个分片3服务器,前期采用三台,日后服务器的增加考虑灾备,服务增加的基数最少为三台(或才有双机方案)。
  Server1 10.10.113.122 Server1 10.10.113.132 Server3 10.10.113.133

类型    服务器   用途       系统   说明
   
  存储/数据   Server1    Shard1/Shard2/Shard3  Linux 64位  Shard1:10001;Shard2:10002,Shard3:10003;
       Server2   Shard1/Shard2/Shard3  Linux 64位  Shard1:10001;Shard2:10002,Shard3:10003;
       Server3   Shard1/Shard2/Shard3  Linux 64位  Shard1:10001;Shard2:10002,Shard3:10003;
   
  配置    Server1   Config1      Linux 64位  Config1:20000;
       Server2   Config2      Linux 64位  Config2:20000; 
       Server3   Config3      Linux 64位  Config3:20000;
   
  路由    Server1   Mongos1      Linux 64位  Mongos:30000;
       Server2   Mongos2      Linux 64位  Mongos:30000;
       Server3   Mongos3      Linux 64位  Mongos:30000;
 
 二 准备
  安装mongodb 参照第一节
  
  
  linux 传文件
  # scp mongodb-linux-x86_64-2.0.4.tgz root@10.10.113.132:/root
  # ssh 10.10.113.132
  
  删除目录
  # rm -r -f /data/mongodb
 
 
  创建配置、日志、分片、key文件存储目录及验证文件
  
  mkdir /data/mongodb/configsvr/ -p
  
  mkdir /data/mongodb/log/ -p
  
  mkdir /data/mongodb/shard1/ -p
  
  mkdir /data/mongodb/shard2/ -p
  
  mkdir /data/mongodb/shard3/ -p
  
  mkdir /data/mongodb/key/ -p
  
  mkdir /data/mongodb/conf/security/ -p
  mkdir /data/mongodb/conf/nosecurity/ -p
  
  创建配置文件
   1、 创建验证文件security于/data/mongodb/key/目录,关赋予可读权限,命令如下:
   cd /data/mongodb/key/
   echo 'hycloudmongodbkey' > security
   chmod 600 security
   
   2、 创建shard1.conf、shard2.conf、shard3.conf、configsvr.conf、mongos.conf于/data/mongodb/conf/security/ 和 /data/mongodb/conf/nosecurity/的目录,内容分别如下:
   shard1.conf
   
dbpath = /data/mongodb/shard1

directoryperdb = true

shardsvr = true

replSet = shard1

#bind_ip = 10.10.113.122,localhost

port = 10001

oplogSize = 100

logpath =/data/mongodb/log/shard1.log

logappend = true

profile = 1

slowms = 5

rest = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   shard2.conf
dbpath = /data/mongodb/shard2

directoryperdb = true

shardsvr = true

replSet = shard2

#bind_ip = 10.10.113.122,localhost

port = 10002

oplogSize = 100

logpath = /data/mongodb/log/shard2.log

logappend = true

profile = 1

slowms = 5

rest = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   shard3.conf
dbpath = /data/mongodb/shard3

directoryperdb = true

shardsvr = true

replSet = shard3

#bind_ip = 10.10.113.122,localhost

port = 10003

oplogSize = 100

logpath = /data/mongodb/log/shard3.log

logappend = true

profile = 1

slowms = 5

rest = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   configsvr.conf
dbpath = /data/mongodb/configsvr

directoryperdb = true

configsvr = true

port = 20000

logpath =/data/mongodb/log/configsvr.log

logappend = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   mongos.conf
configdb =10.10.113.122:20000, 10.10.113.132:20000, 10.10.113.133:20000

port = 30000

chunkSize = 1  #单位 mb 生成环境请使用 200 或删除

logpath =/data/mongodb/log/mongos.log

logappend = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
   
  分片配置
   说明:分片要在无验证环境中配置,否则会出现无权限等异常。采用以下命令启动Server1\Server2\Server3上的shard1\shard2\shard3:

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard1.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard2.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard3.conf

以下命令查看是否正常启动:

# netstat -lnpt # 或 ps -ef | grep mongo

启动后连接到shard1\shard2\shard3分别进行配置,在任意一台服务器即可,以下是具体配置过程:

# /usr/local/mongodb/bin/mongo --port 10001
   
   >use admin
   
   >config = {_id:"shard1", members: [

{_id: 0, host:"10.10.113.122:10001"},

{_id: 1, host:"10.10.113.132:10001"},

{_id: 2, host:"10.10.113.133:10001"}]

};

>rs.initiate(config)

>exit

# /usr/local/mongodb/bin/mongo --port 10002

>use admin
   
   >config = {_id:"shard2", members: [

{_id: 0, host:"10.10.113.132:10002"},

{_id: 1, host:"10.10.113.133:10002"},

{_id: 2, host:"10.10.113.122:10002"}]

};

>rs.initiate(config)

>exit

# /usr/local/mongodb/bin/mongo --port 10003
   
   >use admin

>config = {_id:"shard3", members: [

{_id: 0, host:"10.10.113.133:10003"},

{_id: 1, host:"10.10.113.122:10003"},

{_id: 2, host:"10.10.113.132:10003"}]

};

>rs.initiate(config)

至此,已完成分片配置
   
  路由设置
   路由是能过config来连接分片服务器,在启动路由进程时,先启动配置进程,路由配置过程如下:

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/configsvr.conf

# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/nosecurity/mongos.conf

启动后,连接路由进行分片添加,只需配置一台路由。注:分片操作需在admin库下进行,另外必需在无验证要求下进行,即采用前面创建于nosecurity文件夹下的配置。

# /usr/local/mongodb/bin/mongo --port 30000

mongos> use admin

mongos> db.runCommand({addshard:"shard1/10.10.113.122:10001,10.10.113.132:10001,10.10.113.133:10001",name:"shard1", maxsize:20480} )

mongos> db.runCommand({addshard:"shard2/10.10.113.122:10002,10.10.113.132:10002,10.10.113.133:10002",name:"shard2", maxsize:20480} )

mongos> db.runCommand({addshard:"shard3/10.10.113.122:10003,10.10.113.132:10003,10.10.113.133:10003",name:"shard3", maxsize:20480} )

命令检查分片添加情况,如出现以下结果则表示配置成功:

mongos> db.runCommand( {listshards : 1 } )
  
  
  权限控制
   MongoDB默认为验证模式。如需对数据库进行权限控制,需先采用无验证模式登录,进入admin库创建管理员用户后,再采用验证模式登录。通过前面创建的管理员帐号进行数据库与用户的创建。MongoDB集群的权限与单台的权限控制的不同之处在于,单台是通过-auth属性,集群是通过keyFile来进行服务器间的验证。以下介绍配置全过程。

前面的所有步骤,都是在nosecurity模式下进行。如果没有采用非验证模式的需要将所有进程(分片、配置、mongos)停止,将切换到无验证模式。

步骤一:先进行登录,并切换进admin库创建管理员帐号

# /usr/local/mongodb/bin/mongo --port 30000

mongos>use admin

mongos>db.addUser('admin','123456')

{

"singleShard" :"192.168.2.88:20000,192.168.2.89:20000,192.168.2.90:20000",

"n" : 0,

"connectionId" : 211,

"err" : null,

"ok" : 1

}

{

"_id" :ObjectId("4f6c78ddad912a3ac6833ece"),

"user" : "admin",

"readOnly" : false,

"pwd" :"95ec4261124ba5951720b199908d892b"

}

验证用户名与密码

mongos> db.auth('admin','123456')

1

mongos>exit

步骤二:退出后,将Server1\Server2\Server3服务器上MongoDB的所有进程(分片、配置、mongos)停止,将切换到验证模式。具体命令如下:

#killall mongod mongos

#netstat -lnpt

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard1.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard2.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard3.conf

# netstat -lnpt

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/configsvr.conf

# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/security/mongos.conf

启动后,如对库进行查看,则会报以下异常:

# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin

MongoDB shell version: 2.0.4

connecting to:10.10.113.122:30000/admin

> show dbs

Fri Mar 23 22:28:28 uncaughtexception: listDatabases failed:{ "ok" : 0, "errmsg" :"unauthorized" }

以下是正常登录后显示的信息:

# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin

MongoDB shell version: 2.0.4

connecting to:10.10.113.122:30000/admin

>db.auth('admin','123456')

1

mongos>

步骤三:以下是数据库及数据库用户创建的过程:

mongos> use hello

switched to db hello

mongos>db.addUser('sa','sa')

{

"singleShard" :"shard2/10.10.113.122:10002,10.10.113.132:10002,10.10.113.133:10002",

"n" : 0,

"lastOp" :NumberLong("5723101431532093441"),

"connectionId" : 38,

"err" : null,

"ok" : 1

}

{

"user" : "sa",

"readOnly" : false,

"pwd" :"75692b1d11c072c6c79332e248c4f699",

"_id" :ObjectId("4f6c8a6e9f67b049a20a00de")

}

mongos> exit

bye

# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/hello -u sa -p

MongoDB shell version: 2.0.4

Enter password:

connecting to:10.10.113.122:30000/hello

> show collections

system.indexes

system.users

> db.system.users.find()

{ "_id" :ObjectId("4f6c8a6e9f67b049a20a00de"), "user" :"sa", "readOnly" : false, "pwd" :"75692b1d11c072c6c79332e248c4f699" }

分片
   # /usr/local/mongodb/bin/mongo -port 30000
   
   > use test
   
   导入数据
   > use admin
   > db.runCommand({"enablesharding":"test"})
   > db.runCommand({"shardcollection":"test.doc","key":{"_id":1}})
   
第四节 replica sets + shard (3机高可用 , 一主一备份一仲裁)
 一 方案
  每个分片3服务器,前期采用三台,日后服务器的增加考虑灾备,服务增加的基数最少为三台(或用有双机方案)。
  Server1 10.10.113.122 Server1 10.10.113.132 Server3 10.10.113.133

类型    服务器   用途       系统   说明
   
  存储/数据   Server1    Shard1/Shard2/Shard3  Linux 64位  Shard1:10001;Shard2:10002,Shard3:10003;
       Server2   Shard1/Shard2/Shard3  Linux 64位  Shard1:10001;Shard2:10002,Shard3:10003;
       Server3   Shard1/Shard2/Shard3  Linux 64位  Shard1:10001;Shard2:10002,Shard3:10003;
   
  配置    Server1   Config1      Linux 64位  Config1:20000;
       Server2   Config2      Linux 64位  Config2:20000; 
       Server3   Config3      Linux 64位  Config3:20000;
   
  路由    Server1   Mongos1      Linux 64位  Mongos:30000;
       Server2   Mongos2      Linux 64位  Mongos:30000;
       Server3   Mongos3      Linux 64位  Mongos:30000;
 
 二 准备
  安装mongodb 参照第一节
  
  
  linux 传文件
  # scp mongodb-linux-x86_64-2.0.4.tgz root@10.10.113.132:/root
  # ssh 10.10.113.132
 
 
  创建配置、日志、分片、key文件存储目录及验证文件
  
  mkdir /data/mongodb/configsvr/ -p
  
  mkdir /data/mongodb/log/ -p
  
  mkdir /data/mongodb/shard1/ -p
  
  mkdir /data/mongodb/shard2/ -p
  
  mkdir /data/mongodb/shard3/ -p
  
  mkdir /data/mongodb/key/ -p
  
  mkdir /data/mongodb/conf/security/ -p
  mkdir /data/mongodb/conf/nosecurity/ -p
  
  创建配置文件
   1、 创建验证文件security于/data/mongodb/key/目录,关赋予可读权限,命令如下:
   cd /data/mongodb/key/
   echo 'hycloudmongodbkey' > security
   chmod 600 /data/mongodb/key/security
   
   2、 创建shard1.conf、shard2.conf、shard3.conf、configsvr.conf、mongos.conf于/data/mongodb/conf/security/ 和 /data/mongodb/conf/nosecurity/的目录,内容分别如下:
   shard1.conf
   
dbpath = /data/mongodb/shard1

directoryperdb = true

shardsvr = true

replSet = shard1

#bind_ip = 10.10.113.122,localhost

port = 10001

oplogSize = 100

logpath =/data/mongodb/log/shard1.log

logappend = true

profile = 1

slowms = 5

rest = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   shard2.conf
dbpath = /data/mongodb/shard2

directoryperdb = true

shardsvr = true

replSet = shard2

#bind_ip = 10.10.113.122,localhost

port = 10002

oplogSize = 100

logpath = /data/mongodb/log/shard2.log

logappend = true

profile = 1

slowms = 5

rest = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   shard3.conf
dbpath = /data/mongodb/shard3

directoryperdb = true

shardsvr = true

replSet = shard3

#bind_ip = 10.10.113.122,localhost

port = 10003

oplogSize = 100

logpath = /data/mongodb/log/shard3.log

logappend = true

profile = 1

slowms = 5

rest = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   configsvr.conf
dbpath = /data/mongodb/configsvr

directoryperdb = true

configsvr = true

port = 20000

logpath =/data/mongodb/log/configsvr.log

logappend = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
    
   mongos.conf
configdb =10.10.113.122:20000, 10.10.113.132:20000, 10.10.113.133:20000

port = 30000

chunkSize = 1  #单位 mb 生成环境请使用 200 或删除

logpath =/data/mongodb/log/mongos.log

logappend = true

fork = true

keyFile = /data/mongodb/key/security  #nosecurity目录将该行删除
   
  分片配置
   说明:分片要在无验证环境中配置,否则会出现无权限等异常。采用以下命令启动Server1\Server2\Server3上的shard1\shard2\shard3:

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard1.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard2.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard3.conf

以下命令查看是否正常启动:

# netstat -lnpt # 或 ps -ef | grep mongo

启动后连接到shard1\shard2\shard3分别进行配置,在任意一台服务器即可,以下是具体配置过程:(注意不能在仲裁机器初始化)

# /usr/local/mongodb/bin/mongo --port 10001
   
   >use admin
   
   >config = {_id:"shard1", members: [

{_id: 0, host:"10.10.113.122:10001"},

{_id: 1, host:"10.10.113.132:10001"},

{_id: 2, host:"10.10.113.133:10001","arbiterOnly":true}]

};

>rs.initiate(config)

>exit

# /usr/local/mongodb/bin/mongo --port 10002

>use admin
   
   >config = {_id:"shard2", members: [

{_id: 0, host:"10.10.113.132:10002"},

{_id: 1, host:"10.10.113.133:10002"},

{_id: 2, host:"10.10.113.122:10002","arbiterOnly":true}]

};

>rs.initiate(config)

>exit
   
   # /usr/local/mongodb/bin/mongo --port 10003
   
   >use admin

>config = {_id:"shard3", members: [

{_id: 0, host:"10.10.113.133:10003"},

{_id: 1, host:"10.10.113.122:10003"},

{_id: 2, host:"10.10.113.132:10003","arbiterOnly":true}]

};

>rs.initiate(config)

至此,已完成分片配置
   
  路由设置
   路由是能过config来连接分片服务器,在启动路由进程时,先启动配置进程,路由配置过程如下:

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/configsvr.conf

# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/nosecurity/mongos.conf

启动后,连接路由进行分片添加,只需配置一台路由。注:分片操作需在admin库下进行,另外必需在无验证要求下进行,即采用前面创建于nosecurity文件夹下的配置。

# /usr/local/mongodb/bin/mongo --port 30000

mongos> use admin
   # maxsize:20480 #单位 mb 分片限制大小 根据实际服务器来定
   mongos> db.runCommand({addshard:"shard1/10.10.113.122:10001,10.10.113.132:10001,10.10.113.133:10001",name:"shard1", maxsize:20480} )

mongos> db.runCommand({addshard:"shard2/10.10.113.132:10002,10.10.113.133:10002,10.10.113.122:10002",name:"shard2", maxsize:20480} )

mongos> db.runCommand({addshard:"shard3/10.10.113.133:10003,10.10.113.122:10003,10.10.113.132:10003",name:"shard3", maxsize:20480} )

命令检查分片添加情况,如出现以下结果则表示配置成功:

mongos> db.runCommand( {listshards : 1 } )
  
  
  权限控制
   MongoDB默认为验证模式。如需对数据库进行权限控制,需先采用无验证模式登录,进入admin库创建管理员用户后,再采用验证模式登录。通过前面创建的管理员帐号进行数据库与用户的创建。MongoDB集群的权限与单台的权限控制的不同之处在于,单台是通过-auth属性,集群是通过keyFile来进行服务器间的验证。以下介绍配置全过程。

前面的所有步骤,都是在nosecurity模式下进行。如果没有采用非验证模式的需要将所有进程(分片、配置、mongos)停止,将切换到无验证模式。

步骤一:先进行登录,并切换进admin库创建管理员帐号

# /usr/local/mongodb/bin/mongo --port 30000

mongos>use admin

mongos>db.addUser('admin','123456')

{

"singleShard" :"192.168.2.88:20000,192.168.2.89:20000,192.168.2.90:20000",

"n" : 0,

"connectionId" : 211,

"err" : null,

"ok" : 1

}

{

"_id" :ObjectId("4f6c78ddad912a3ac6833ece"),

"user" : "admin",

"readOnly" : false,

"pwd" :"95ec4261124ba5951720b199908d892b"

}

验证用户名与密码

mongos> db.auth('admin','123456')

1

mongos>exit

步骤二:退出后,将Server1\Server2\Server3服务器上MongoDB的所有进程(分片、配置、mongos)停止,将切换到验证模式。具体命令如下:

# killall mongod mongos

# netstat -lnpt

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard1.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard2.conf

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard3.conf

# netstat -lnpt # ps -ef | grep mongo

# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/configsvr.conf

# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/security/mongos.conf

启动后,如对库进行查看,则会报以下异常:

# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin

MongoDB shell version: 2.0.4

connecting to:10.10.113.122:30000/admin

> show dbs

Fri Mar 23 22:28:28 uncaughtexception: listDatabases failed:{ "ok" : 0, "errmsg" :"unauthorized" }

以下是正常登录后显示的信息:

# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin

MongoDB shell version: 2.0.4

connecting to:10.10.113.122:30000/admin

>db.auth('admin','123456')

1

mongos>

步骤三:以下是数据库及数据库用户创建的过程:

mongos> use hello

switched to db hello

mongos>db.addUser('sa','sa')

{

"singleShard" :"shard2/10.10.113.122:10002,10.10.113.132:10002,10.10.113.133:10002",

"n" : 0,

"lastOp" :NumberLong("5723101431532093441"),

"connectionId" : 38,

"err" : null,

"ok" : 1

}

{

"user" : "sa",

"readOnly" : false,

"pwd" :"75692b1d11c072c6c79332e248c4f699",

"_id" :ObjectId("4f6c8a6e9f67b049a20a00de")

}

mongos> exit

bye

# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/hello -u sa -p

MongoDB shell version: 2.0.4

Enter password:

connecting to:10.10.113.122:30000/hello

> show collections

system.indexes

system.users

> db.system.users.find()

{ "_id" :ObjectId("4f6c8a6e9f67b049a20a00de"), "user" :"sa", "readOnly" : false, "pwd" :"75692b1d11c072c6c79332e248c4f699" }

分片
   # /usr/local/mongodb/bin/mongo -port 30000
   
   > use admin
   > db.runCommand({"enablesharding":"test"})
   > db.runCommand({"shardcollection":"test.doc","key":{"_id":1}})
   > db.runCommand({"shardcollection":"test.txt","key":{"_id":1}})
   索引
   > use test
   > db.fs.chunks.ensureIndex({files_id: 1});  
   > use admin
   > db.runCommand({ shardcollection : "test.fs.chunks", key : { files_id : 1 }})

索引
   > use test
   
   > db.doc.ensureIndex({"letter":1})
   
   导入数据
   
   查询数据
   
   分片管理
   > use config
   > show collections
   > db.shards.find()
   > db.databases.find()
   > db.chunks.find()
   
   > db.printShardingStatus()

mongodb 简单部署方案及实例的更多相关文章

  1. zookeeper+dubbo简单部署方案

    1.zookeeper服务 首先,我们需要下载:zookeeper-3.4.9 解压后,在conf文件夹中添加一个配置文件zoo.cfg,内容如下: tickTime=2000 dataDir=/Us ...

  2. mongodb在双活(主备)机房的部署方案和切换方案设计

    1. 概述 现在很多高可用系统为了应对极端情况,比如主机宕机.网络故障以及机房宕机等灾难的发生,通常会部署主备架构(双机房),或者双活架构(双机房),甚至多活架构(三个机房或者以上),mongodb天 ...

  3. Tomcat多实例单应用部署方案 (转)

    一.Tomcat部署的场景分析 通常,我们对tomcat部署需求可以分为几种:单实例单应用,单实例多应用,多实例单应用,多实例多应用. 对于第一种场景,如果不要求周期性地维护tomcat版本,一般的做 ...

  4. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

  5. redis从入门到放弃 -> 部署方案

    单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...

  6. 一文读懂 Redis 分布式部署方案

    为什么要分布式 Redis是一款开源的基于内存的K-V型数据库,因为内存访问速度快,一般被用来做系统的缓存. Redis作为单机部署能够支持业务简单,数据量不大的系统需求,但在实际应用中,一旦系统规模 ...

  7. Ice系列--基于IceGrid的部署方案

    前言 前一篇文章介绍了IceGrid的简单应用.这篇文章来介绍一下它的高端玩法-如何将模板,复制组,知名对象应用于部署方案及其作用. 基于模板的部署方案 之前介绍了xml格式的配置文件通过各种描述符如 ...

  8. Kubernetes常见的部署方案(十四)

    一.常见的部署方案 滚动更新 服务不会停止,但是整个pod会有新旧并存的情况. 重新创建 先停止旧的pod,然后再创建新的pod,这个过程服务是会间断的. 蓝绿 (无需停机,风险较小) 部署v1的应用 ...

  9. iOS应用动态部署方案

    iOS的动态部署能极大的节约成本.苹果的审核周期很长,有的时候,你可能不得不等待将近2个星期去上架你的新功能或者bug.所以动态部署是有价值的. 我这里讨论的情况不把纯web应用考虑在内,因为用户体验 ...

随机推荐

  1. 消息系统Flume与Kafka的区别

    首先Flume和Kafka都是消息系统,但是它俩也有着很多不同的地方,Flume更趋向于消息采集系统,而Kafka更趋向于消息缓存系统. [一]设计上的不同 Flume是消息采集系统,它主要解决问题是 ...

  2. Win7:“找不到该项目”错误解决大法

    1.将以下代码复制粘贴到一新建的txt记事本文档中,并另存为del.bat文件(或者你喜欢的名字),注意扩展名为批处理文件bat. DEL /F /A /Q \\?\%1RD /S /Q \\?\%1 ...

  3. [转].net 调用oracle存储过程返回多个记录集

    本文转自:http://www.netwinform.com/articleinfo.aspx?id=17 存储过程: CREATE OR REPLACE PROCEDURE p_query_cs ( ...

  4. 【转】android自动化测试之MonkeyRunner使用实例(三)

    一.使用CMD命令打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器或连上设备,不然monkeyrunner无法连接设备. 1.1  用Elipse打开Android模拟器或在CMD中 ...

  5. asp.net 编写验证码

    首先准备一个类来实现对验证码的绘制功能. createcode.cs using System; using System.Collections.Generic; using System.Linq ...

  6. 使用blktrace排查iowait cpu高的问题

    本文转自这里,blktrace在这种情况下的使用方法值得借鉴学习. ------------------------------------------------------------------ ...

  7. Hive over HBase和Hive over HDFS性能比较分析

    http://superlxw1234.iteye.com/blog/2008274 环境配置: hadoop-2.0.0-cdh4.3.0 (4 nodes, 24G mem/node) hbase ...

  8. scala的REPL shell的调用

    最近突然对spark的spark-shell发生了兴趣 它是如何启动scala的REPL的,并且在此前写入了常用的环境变量的呢? 通过查看spark的源码,找到了SparkILoop.scala im ...

  9. Classloaders and Classes

    Classloaders and Classes (CLASSES) An example of the classloader (CLASSES) section that includes Cla ...

  10. ASP.NET Web Service如何工作(2)

    ASP.NET Web Service如何工作(2) [日期:2003-06-26] 来源:CSDN  作者:sunnyzhao(翻译) [字体:大 中 小] HTTP管道一旦调用了.asmx句柄,便 ...