mongodb 3.2 集群 (CentOS 7.2 环境)

 mongodb 集群会涉及3种类型

 1. mongos  入口

根据实际,可以配置多个入口,防止入口服务器宕机后,无法提供服务

 2. Config Server(1-3个) 配置服务器,用来寻找分片的

 3. Shard分片,因为是集群,所以分片至少有1个(本次测试有3个分片)

每个分片由主、配、仲裁3个服务组成。


Config Service 和 Shard 都需要配置成 replica set 形式(后面有讲怎么配)

为什么? 因为这么配置之后,主备会数据同步


注: 只有分片才是真正存储数据的


 


因为配置集群有多种方式,这里部署的方式是:

1. 用3台服务器

a. 使用之前安装好的mongodb 的 CentOS 克隆3台机器

b. 改ip ,看自己修改,我的是: 192.168.222.36, 192.168.222.37, 192.168.222.38  3台机器

2. 每台服务器配置1个 service config 端口号: 21000

3. 每台服务器配置3个 shard 分片 端口号分别是: 22001,22002,22003  

4. 最后选1台机器,做 mongos 入口 端口号: 20000


因为1个程序占1个端口号,就相当于模拟了13台服务器

1个mongos, 3个 service config, 3个 shard1, 3个 shard2, 3个 shard3 


不废话了,开始部署

1. 使用 mongo 账号

su - mongo

2. iptables 开启端口

sudo iptables -A INPUT -p tcp --dport 20000 -j ACCEPT #开启20000端口

sudo iptables -A INPUT -p tcp --dport 21000 -j ACCEPT #开启22000端口

sudo iptables -A INPUT -p tcp --dport 22001 -j ACCEPT #开启22001端口

sudo iptables -A INPUT -p tcp --dport 22002 -j ACCEPT #开启22002端口

sudo iptables -A INPUT -p tcp --dport 22003 -j ACCEPT #开启22003端口

sudo service iptables save  # 保存 iptables


如果会用shell脚本,可以写到shell脚本里执行


3. 建文件夹,因为多个程序共用同一台服务器,所以做好文件分类

mkdir ~/mongo/mongos/data -p # 创建 mongos data 文件夹
mkdir ~/mongo/mongos/log -p # 创建 mongos log 文件夹
mkdir ~/mongo/configsvr/data -p # 创建 configsvr data 文件夹
mkdir ~/mongo/configsvr/log -p # 创建 configsvr log 文件夹
mkdir ~/mongo/shard1/data -p # 创建 shard1 data 文件夹
mkdir ~/mongo/shard1/log -p # 创建 shard1 log 文件夹
mkdir ~/mongo/shard2/data -p # 创建 shard2 data 文件夹
mkdir ~/mongo/shard2/log -p # 创建 shard2 log 文件夹
mkdir ~/mongo/shard3/data -p # 创建 shard3 data 文件夹
mkdir ~/mongo/shard3/log -p # 创建 shard3 log 文件夹


如果会用shell脚本,可以写到shell脚本里执行


4. 每台服务器执行以下语句

(yum安装使用mongod xxxx配置, 解压方式则先进入相应的bin目录,./mongod xxx配置)

mongod --configsvr --replSet repSvc1 --dbpath /home/mongo/mongo/configsvr/data/ --port 21000 --logpath /home/mongo/mongo/configsvr/log/log --fork
# --configsvr 代表这次启动的是 config server
# --replSet repSvcl 代表设置成 replica set 形式,id 为 repSvcl
# --dbpath 目录 代表数据存储的位置
# --port 21000 表示此程序绑定的端口号
# --logpath 目录 表示日志存储位置,( --fork 要求必须有 --logpath)
# --fork  以守护进程方式执行 (意思就是后台进程,只要服务器不重启,就一直存在)



mongod --shardsvr --replSet shard1 --port 22001 -dbpath /home/mongo/mongo/shard1/data/ --logpath /home/mongo/mongo/shard1/log/shar1.log --fork
# --shardsvr 代表这次启动的是 shard 分片
# --replSet repSvcl 代表设置成 replica set 形式,id 为 shard1
# --dbpath 目录 代表数据存储的位置
# --port 22001 表示此程序绑定的端口号
# --logpath 目录 表示日志存储位置,( --fork 要求必须有 --logpath)
# --fork  以守护进程方式执行 (意思就是后台进程,只要服务器不重启,就一直存在)


mongod --shardsvr --replSet shard2 --port 22002 -dbpath /home/mongo/mongo/shard2/data/ --logpath /home/mongo/mongo/shard2/log/shar2.log --fork
# --shardsvr 代表这次启动的是 shard 分片
# --replSet repSvcl 代表设置成 replica set 形式,id 为 shard2



mongod --shardsvr --replSet shard3 --port 22003 -dbpath /home/mongo/mongo/shard3/data/ --logpath /home/mongo/mongo/shard3/log/shar3.log --fork

# --shardsvr 代表这次启动的是 shard 分片
# --replSet repSvcl 代表设置成 replica set 形式,id 为 shard3



5. 配置 config server

1. 选取 192.168.222.36服务器

2. mongo --port 21000  # 表示登录21000 客户端 

3. 输入 rs.initiate({_id:"repSvc1", configsvr:true, members:[{_id:0, host:"192.168.222.36:21000"}]})  # 初始化配置

4. 输入 rs.add("192.168.222.37:21000")  #增加配置服务器 192.168.222.37:21000

5. 输入 rs.add("192.168.222.38:21000")  #增加配置服务器 192.168.222.38:21000

6. 输入 rs.status()  查看状态  PRIMARY 表示主服务器,SECONDARY 表示从服务器

7. 可以在其它服务器 使用 mongo --host 192.168.222.27 --port 21000 登录192.168.222.27:21000

8. 输入 rs.status() 查看状态, 如果报错说 not slaveOk 

则输入 rs.slaveOk()  就可以了

9. config server 配置完成


6. 配置 shard

1. 选取192.168.222.36服务器

2. mongo --host 192.168.222.36 --port 22001   #表示登录 mongo 的 22001端口应用

3. 输入 rs.initiate({_id:"shard1", members:[{ _id:0, host:"192.168.222.36:22001" }] }) #初始化replica set

4. 输入 rs.add("192.168.222.38:22001")   # 添加备份库

5. 输入 rs.addArb("192.168.222.37:22001") #添加仲裁

 (仲裁只做判决,不存数据,当36服务器宕机时,会选38做当前片的主库)

重复步骤2, 把 22002,22003 端口的分片也配置好,


注:initiate的时候也可以使用

#定义副本集配置
config = { _id:"shard1", members:[
                     {_id:0,host:"192.168.222.36:22001"},
                     {_id:1,host:"192.168.222.38:22001"},
                     {_id:2,host:"192.168.222.37:22001",arbiterOnly:true}
                ]  }
#初始化副本集配置
rs.initiate(config);


7. 配置 mongos

1. 选取192.168.222.37服务器

2. mongos --configdb 192.168.222.36:21000  --port 20000 --logpath

/home/mongo/mongo/mongos/log/mongs.log --fork

# --configdb 192.168.222.36:21000 表示指定的 config server 地址

# --port 20000 表示此程序绑定的端口号

3. 登录 mongos

mongo --host 192.168.222.37 --port 20000   #表示登录 mongo 的 20000端口应用

4. 创建账号 sa 密码 sa

use admin  # 此账号属于 admin,登录时需要选择admin

db.createUser( {

 user: "sa",
 pwd: "sa",
 roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase" ]

})

5. 可以使用 db.auth("sa", "sa") 来校验密码是否正确,返回1 则正确

6. 使用账号密码访问

a. 现在可以使用新版的 Robomongo 0.9.0-RC4 客户端来访问 

Address: 192.168.222.37:20000

选择 Perform authentication 

Database: admin  # 此账号属于 admin,登录时需要选择admin

User Name : sa

Password : sa

Auth Mechanism : SCRAM-SHA-1   

选择 Test 测试登录, save 保存

b. 也可以在服务器上,输入 mongo 192.168.222.37:20000/admin -u sa -p sa 登录

7. 输入 sh.addShard("shard1/192.168.222.36:22001")  # 添加 片键1

8. 输入 sh.addShard("shard2/192.168.222.36:22002")  # 添加 片键2

9. 输入 sh.enableSharding("school")  #  school 是数据库名称

10. 输入 sh.shardCollection("school.students", {"_id" : "hashed" }) # 在表 students的 _id 上建立hashed分片索引

11. 现在可以插入数据了

use school  # 进入 school库

db.students.insert({ name:"z1", age :2 })

db.students.insert({ name:"z2", age :2 })

db.students.insert({ name:"z3", age :2 })

db.students.insert({ name:"z4", age :2 })

....

db.students.insert({ name:"z18", age :2 })

一共插入了18条数据


12. 选择38服务器

a. mongo --host 192.168.222.38 --port 22001   #表示登录 mongo 的 22001端口应用

b. show dbs # 查看所有数据库,如果报错表示 not slaveOK() 则请输入 rs.slaveOK()

c. 会发现有 school 库, use school # 进入 school 数据库

d. show tables 会发现有 students 表

e. db.students.find() #发现只有几条数据??? 是因为shard1 分片只有几条数据,剩下的在shard2中

f. 此时,你可以登录 mongo --host 192.168.222.36 --port 22001 ,

因为主从关系,发现shard1 的数据和38里shard1的数据相同

g. 可以登录 mongo --host 192.168.222.36 --port 22002

use school

db.students.find() # 两个分片的数据相加就是18个,没错了

h. 输入 rs.status() 查找22002 那个ip:port 是 PRIMARY 

i. 选择对于的服务器, ps aux | grep mongod --shard 查找到对应的3个程序

j. kill -9 (port 22002) 的那个id #结束进程

k. 你会发现数据还是可以从客户端插入,它对应的备份库会变成 PRIMARY

l. 重新开启刚刚关闭的进程

mongod --shardsvr --replSet shard2 --port 22002 -dbpath /home/mongo/mongo/shard2/data/

--logpath /home/mongo/mongo/shard2/log/shar2.log --fork

m. 现在的主备已经完成了


13. 回到 mongos 入口(37服务器)

a. 可以是客户端,也可以是服务器访问

b. sh.addShard("shard3/192.168.222.36:22003") # 添加分片 shard3

c. 执行步骤12,会发现,部分数据已经自动转移至 shard3。 里面的动作是mongodb 自动实现的



此时,mongodb 3.2集群已经配置完成。

可以手动kill 掉任意2个 service config ,集群正常运行,

kill 掉任意1个分片的主从,集群也正常运行。


如果想使用13台服务器部署,可以使用配置文件,这里先不做叙述,有时间再写个使用配置文件部署的。


建议服务器照快照,因为期间可能会遇到各种的错,或者上网查找一下资料,或者留言。


这里有几个相关的网址:

添加仲裁者: https://docs.mongodb.com/manual/tutorial/add-replica-set-arbiter/

删除 shards 节点 :http://www.myexception.cn/go/1862417.html

Warning (soft rlimits too low.):http://blog.csdn.net/kk185800961/article/details/45613267

安装和卸载 mongodb : https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

mongodb 权限操作: http://www.2cto.com/database/201507/420854.html

mongodb replica set 添加删除节点的2种方法: http://www.jb51.net/article/52504.htm


如果要删除某个数据库

先进入库 : use school

再删除: db.dropDatabase()



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值