注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

曾国藩的博客

 
 
 

日志

 
 

MongoDB高可用架构—Replica Set 集群实战 1  

2014-03-09 12:14:05|  分类: SQL/Oracle/Mysql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.linuxidc.com/Linux/2012-07/64491.htm

Replica Set使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。
使用Replica Set来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。
对于Replica Set中的secondary 节点默认是不可读的。 
 
 架构: 
    192.168.8.30 192.168.8.31 192.168.8.32

replica set1 :    shard11    shard12         shard13

replica set2 :    shard21    shard22         shard23

config     :    config    config    config

mongos      :     mongos    mongos          mongos

架构图:
Mongodb高可用架构—Replica Set 集群实战
 
分别在各服务器上运行两个mongod实例: 

shard11 + shard12 + shard13 ----> 组成一个replica set --|
  |-----> sharding_cluster
shard21 + shard22 + shard23 ----> 组成一个replica set --|
 
Shard Server: 用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障!
Config Server: 存储了整个 Cluster Metadata,其中包括 chunk 信息!
Route Server: 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
 
一、安装配置mongodb环境
1.安装
  1. wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz 
  2. tar zxf mongodb-linux-x86_64-2.0.4.tgz 
  3. mv mongodb-linux-x86_64-2.0.4 /opt/mongodb 
  4. echo "export PATH=$PATH:/opt/mongodb/bin" >> /etc/profile 
  5. source /etc/profile 
2.建立用户和组
  1. useradd -u 600 -s /bin/false mongodb  
3.创建数据目录
在各服务器上建立如下目录:
  1. 30服务器: 
  2. mkdir -p /data0/mongodb/{db,logs} 
  3. mkdir -p /data0/mongodb/db/{shard11,shard21,config} 
  4. 31服务器: 
  5. mkdir -p /data0/mongodb/{db,logs} 
  6. mkdir -p /data0/mongodb/db/{shard12,shard22,config} 
  7. 32服务器: 
  8. mkdir -p /data0/mongodb/{db,logs} 
  9. mkdir -p /data0/mongodb/db/{shard13,shard23,config} 
4.设置各节点服务器hosts解析
 
  1. true > /etc/hosts  
  2. echo -ne " 
  3. 192.168.8.30     mong01  
  4. 192.168.8.31     mong02 
  5. 192.168.8.32     mong03 
  6. " >>/etc/hosts 
  7.   
  8. 或 
  9. cat >> /etc/hosts << EOF 
  10. 192.168.8.30     mong01  
  11. 192.168.8.31     mong02 
  12. 192.168.8.32     mong03 
  13. EOF 
 
5.同步时钟
ntpdate ntp.api.bz
写到crontab任务计划中!
这里务必要同步时钟,不然shrad不能同步!
 
以上配置各节点都进行操作!!
二、配置relica sets
1.配置两个shard
  1. 30 server: 
  2. /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard11 -oplogSize 1000 -logpath /data0/mongodb/logs/shard11.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 
  3. sleep 2 
  4. /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard21 -oplogSize 1000 -logpath /data0/mongodb/logs/shard21.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb
  5. sleep 2 
  6. echo "all mongo started." 
  7.   
  8. 31 server: 
  9. /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard12 -oplogSize 1000 -logpath /data0/mongodb/logs/shard12.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb
  10. sleep 2 
  11. numactl --interleave=all /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard22 -oplogSize 1000 -logpath /data0/mongodb/logs/shard22.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb
  12. sleep 2 
  13. echo "all mongo started." 
  14.   
  15. 32 server: 
  16. numactl --interleave=all /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard13 -oplogSize 1000 -logpath /data0/mongodb/logs/shard13.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 
  17. sleep 2 
  18. numactl --interleave=all /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard23 -oplogSize 1000 -logpath /data0/mongodb/logs/shard23.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb  
  19. sleep 2 
  20. echo "all mongo started." 
 
可以对应的把上面的命令放在一个脚本内,方便启动!
也可以写到配置文件中,通过-f参数来启动!
改成配置文件方式:
  1. shardsvr = true 
  2. replSet = shard1 
  3. port = 27021 
  4. dbpath = /data0/mongodb/db/shard11 
  5. oplogSize = 1000 
  6. logpath = /data0/mongodb/logs/shard11.log 
  7. logappend = true 
  8. maxConns = 10000 
  9. quit=true 
  10. profile = 1 
  11. slowms = 5 
  12. rest = true 
  13. fork = true 
  14. directoryperdb = true 
这样可以通过 mognod -f mongodb.conf来启动了!
 
我这里把这些命令都放入脚本中:
启动脚本(这里只启动mongod,后面有专门启动config和mongos脚本):
 
  1. [root@mon1 sh]# cat start.sh  
  2. /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard11 -oplogSize 1000 -logpath /data0/mongodb/logs/shard11.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 
  3. sleep 2 
  4.   
  5. /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard21 -oplogSize 1000 -logpath /data0/mongodb/logs/shard21.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb 
  6. sleep 2 
  7. ps aux |grep mongo 
  8. echo "all mongo started." 
  9.   
  10. [root@mon2 sh]# cat start.sh  
  11. /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard12 -oplogSize 1000 -logpath /data0/mongodb/logs/shard12.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb   
  12. sleep 2 
  13. /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard22 -oplogSize 1000 -logpath /data0/mongodb/logs/shard22.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb   
  14. sleep 2 
  15. ps aux |grep mongo 
  16. echo "all mongo started." 
  17.   
  18. [root@mongo03 sh]# cat start.sh  
  19. /opt/mongodb/bin/mongod -shardsvr -replSet shard1 -port 27021 -dbpath /data0/mongodb/db/shard11 -oplogSize 1000 -logpath /data0/mongodb/logs/shard11.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb  --keyFile=/opt/mongodb/sh/keyFile 
  20. sleep 2 
  21. /opt/mongodb/bin/mongod -shardsvr -replSet shard2 -port 27022 -dbpath /data0/mongodb/db/shard21 -oplogSize 1000 -logpath /data0/mongodb/logs/shard21.log -logappend  --maxConns 10000 --quiet -fork --directoryperdb  --keyFile=/opt/mongodb/sh/keyFile 
  22. sleep 2 
  23. echo "all mongo started." 

 
PS:要是想开启一个HTTP协议的端口提供rest服务,可以在mongod启动参数中加上 --rest 选项!
这样我们可以通过 http://IP:28021/_replSet 查看状态!
 
生产环境推荐用配置文件和脚本文件方式启动。
 
三、初始化replica set
 
1.配置shard1用到的replica sets
 
  1. [root@mongo01 ~]# mongo 192.168.8.30:27021 
  2. > config = {_id: 'shard1', members: [ 
  3.     {_id: 0, host: '192.168.8.30:27021'}, 
  4.     {_id: 1, host: '192.168.8.31:27021'}, 
  5.     {_id: 2, host: '192.168.8.32:27021'}] 
  6.   } 
  7.   
  8. > config = {_id: 'shard1', members: [ 
  9. ...                           {_id: 0, host: '192.168.8.30:27021'}, 
  10. ...                           {_id: 1, host: '192.168.8.31:27021'}, 
  11. ...                           {_id: 2, host: '192.168.8.32:27021'}] 
  12. ...            } 
  13.     "_id" : "shard1"
  14.     "members" : [ 
  15.         { 
  16.             "_id" : 0, 
  17.             "host" : "192.168.8.30:27021" 
  18.         }, 
  19.         { 
  20.             "_id" : 1, 
  21.             "host" : "192.168.8.31:27021" 
  22.         }, 
  23.         { 
  24.             "_id" : 2, 
  25.             "host" : "192.168.8.32:27021" 
  26.         } 
  27.     ] 
出现如下信息表示成功: 
  1. > rs.initiate(config) 
  2.     "info" : "Config now saved locally.  Should come online in about a minute."
  3.     "ok" : 1 
  4.   
  5.   
  6. > rs.status() 
  7.     "set" : "shard1"
  8.     "date" : ISODate("2012-06-07T11:35:22Z"), 
  9.     "myState" : 1, 
  10.     "members" : [ 
  11.         { 
  12.             "_id" : 0, 
  13.             "name" : "192.168.8.30:27021"
  14.             "health" : 1,  #1 表示正常 
  15.             "state" : 1,   #1 表示是primary 
  16.             "stateStr" : "PRIMARY",  #表示此服务器是主库 
  17.             "optime" : { 
  18.                 "t" : 1339068873000, 
  19.                 "i" : 1 
  20.             }, 
  21.             "optimeDate" : ISODate("2012-06-07T11:34:33Z"), 
  22.             "self" : true 
  23.         }, 
  24.         { 
  25.             "_id" : 1, 
  26.             "name" : "192.168.8.31:27021"
  27.             "health" : 1,    #1 表示正常 
  28.             "state" : 2,     #2 表示是secondary 
  29.             "stateStr" : "SECONDARY",  #表示此服务器是从库 
  30.             "uptime" : 41, 
  31.             "optime" : { 
  32.                 "t" : 1339068873000, 
  33.                 "i" : 1 
  34.             }, 
  35.             "optimeDate" : ISODate("2012-06-07T11:34:33Z"), 
  36.             "lastHeartbeat" : ISODate("2012-06-07T11:35:21Z"), 
  37.             "pingMs" : 7 
  38.         }, 
  39.         { 
  40.             "_id" : 2, 
  41.             "name" : "192.168.8.32:27021"
  42.             "health" : 1, 
  43.             "state" : 2, 
  44.             "stateStr" : "SECONDARY"
  45.             "uptime" : 36, 
  46.             "optime" : { 
  47.                 "t" : 1341373105000, 
  48.                 "i" : 1 
  49.             }, 
  50.             "optimeDate" : ISODate("2012-06-07T11:34:00Z"), 
  51.             "lastHeartbeat" : ISODate("2012-06-07T11:35:21Z"), 
  52.             "pingMs" : 3 
  53.         } 
  54.     ], 
  55.     "ok" : 1 
  56. PRIMARY> 
可以看马上变成 PRIMARY 即主节点!
再到其它节点看下: 
  1. [root@mongo02 sh]# mongo 192.168.8.31:27021 
  2. MongoDB shell version: 2.0.5 
  3. connecting to: 192.168.8.31:27021/test 
  4. SECONDARY>  
  5.   
  6. [root@mongo03 sh]# mongo 192.168.8.32:27021 
  7. MongoDB shell version: 2.0.5 
  8. connecting to: 192.168.8.32:27021/test 
  9. SECONDARY>  
  10.   
在所有节点上可以查看Replica Sets 的配置信息: 
  1. PRIMARY> rs.conf() 
  2.     "_id" : "shard1"
  3.     "version" : 1, 
  4.     "members" : [ 
  5.         { 
  6.             "_id" : 0, 
  7.             "host" : "192.168.8.30:27021" 
  8.         }, 
  9.         { 
  10.             "_id" : 1, 
  11.             "host" : "192.168.8.31:27021" 
  12.         }, 
  13.         { 
  14.             "_id" : 2, 
  15.             "host" : "192.168.8.32:27021"
  16.             "shardOnly" : true 
  17.         } 
  18.     ] 
2.配置shard2用到的replica sets
 
  1. [root@mongo02 sh]# mongo 192.168.8.30:27022 
  2. MongoDB shell version: 2.0.5 
  3. connecting to: 192.168.8.30:27022/test 
  4. > config = {_id: 'shard2', members: [ 
  5.     {_id: 0, host: '192.168.8.30:27022'}, 
  6.     {_id: 1, host: '192.168.8.31:27022'}, 
  7.     {_id: 2, host: '192.168.8.32:27022'}] 
  8.     } 
  9. > config = {_id: 'shard2', members: [ 
  10. ... {_id: 0, host: '192.168.8.30:27022'}, 
  11. ... {_id: 1, host: '192.168.8.31:27022'}, 
  12. ... {_id: 2, host: '192.168.8.32:27022'}] 
  13. ... } 
  14.     "_id" : "shard2"
  15.     "members" : [ 
  16.         { 
  17.             "_id" : 0, 
  18.             "host" : "192.168.8.30:27022" 
  19.         }, 
  20.         { 
  21.             "_id" : 1, 
  22.             "host" : "192.168.8.31:27022" 
  23.         }, 
  24.         { 
  25.             "_id" : 2, 
  26.             "host" : "192.168.8.32:27022" 
  27.         } 
  28.     ] 
  29.   
  30. > rs.initiate(config) 
  31.     "info" : "Config now saved locally.  Should come online in about a minute."
  32.     "ok" : 1 
验证节点:
 
  1. > rs.status() 
  2.     "set" : "shard2"
  3.     "date" : ISODate("2012-06-07T11:43:47Z"), 
  4.     "myState" : 2, 
  5.     "members" : [ 
  6.         { 
  7.             "_id" : 0, 
  8.             "name" : "192.168.8.30:27022"
  9.             "health" : 1, 
  10.             "state" : 1, 
  11.             "stateStr" : "PRIMARY"
  12.             "optime" : { 
  13.                 "t" : 1341367921000, 
  14.                 "i" : 1 
  15.             }, 
  16.             "optimeDate" : ISODate("2012-06-07T11:43:40Z"), 
  17.             "self" : true 
  18.         }, 
  19.         { 
  20.             "_id" : 1, 
  21.             "name" : "192.168.8.31:27022"
  22.             "health" : 1, 
  23.             "state" : 2, 
  24.             "stateStr" : "SECONDARY"
  25.             "uptime" : 50, 
  26.             "optime" : { 
  27.                 "t" : 1341367921000, 
  28.                 "i" : 1 
  29.             }, 
  30.             "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 
  31.             "lastHeartbeat" : ISODate("2012-06-07T11:43:46Z"), 
  32.             "pingMs" : 0, 
  33.         }, 
  34.         { 
  35.             "_id" : 2, 
  36.             "name" : "192.168.8.32:27022"
  37.             "health" : 1, 
  38.             "state" : 2, 
  39.             "stateStr" : "SECONDARY"
  40.             "uptime" : 81, 
  41.             "optime" : { 
  42.                 "t" : 1341373254000, 
  43.                 "i" : 1 
  44.             }, 
  45.             "optimeDate" : ISODate("2012-06-07T11:41:00Z"), 
  46.             "lastHeartbeat" : ISODate("2012-06-07T11:43:46Z"), 
  47.             "pingMs" : 0, 
  48.         } 
  49.     ], 
  50.     "ok" : 1 
  51. PRIMARY>  
到此就配置好了二个replica sets!
PS: 初始化时,不指定priority默认id 0 为primary
 
状态中关键数据位:
在用 rs.status()查看replica sets状态时,
state:1表示该host是当前可以进行读写,2:不能读写
health:1表示该host目前是正常的,0:异常
 
注意:初使化replica sets时也可以用这种方法:
db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{"_id":0,"host":"192.168.8.30:27021"},{"_id":1,"host":"192.168.8.31:27021"},{"_id":2,"host":"192.168.8.32:27021","shardOnly":true}]}})
可以省略用rs.initiate(config)。
 
  评论这张
 
阅读(409)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018