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 开启端口
3. 建文件夹,因为多个程序共用同一台服务器,所以做好文件分类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脚本里执行
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()