一.集群规划
1.1.配置规划
【注意】得部署奇数台。
节点 | Master | Slave1 | Slave2 |
IP | 192.168.2.98 | 192.168.2.99 | 192.168.2.100 |
配置实例 | a1\b1\c1\configserver1 | a2\b2\c2\configserver2 | a3\b3\c3\configserver3 |
1.2.分片规划
说明:1个分片内有3个副本集。如果看不懂分片规划请看例子解释。(看懂忽略此例子)
例子:fang-s-a整行解释。a1-a2-a3副本集对应端口为28111。a1(在Master上)、a2(在Slave1)、a3(在Slave2) 对应着上面的配置实例。现在移至搭建Mongodb第8步操作解释,在主节点Master登录Mongo添加a2(Slave1)、a3(Slave2)这两个次要的副本集。
切片名称 | 主要副本集 | 次要副本集 | 次要副本集 | 端口 |
fang-s-a | a1(Master) | a2(Slave1) | a3(Slave2) | 28111 |
fang-s-b | b2(Slave1) | b1(Master) | b3(Slave2) | 28112 |
fang-s-c | c3(Slave2) | c1(Master) | c2(Slave1) | 29113 |
fang-cs | configserver1(Master) | configserver2(Slave1) | configserver3(Slave2) | 28200 |
二.搭建Mongodb
1.下载安装包(master)
# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.9.tgz
# tar zxvf mongodb-linux-x86_64-rhel62-3.2.9.tgz -C /usr/local/ 解压
# mv /usr/local/mongodb-linux-x86_64-rhel62-3.2.9 /usr/local/mongo 改名
2.分发安装包至各节点(master)
# scp -r /usr/local/mongo root@slave1:/usr/local/
# scp -r /usr/local/mongo root@slave2:/usr/local/
3.创建db目录、日志目录、mongodb配置文件(三台)此处演示一台每台都要改数值对应
3.1.创建db目录
# mkdir -p /mongodb/a1 /mongodb/b1 /mongodb/c1 /mongodb/configserver1
3.2.创建日志目录
# mkdir -p /home/log/mongodb/a1 /home/log/mongodb/b1 /home/log/mongodb/c1 /home/log/mongodb/configserver1
3.3.创建mongodb配置文件
# touch /mongodb/mongod-a1-config.yml /mongodb/mongod-b1-config.yml /mongodb/mongod-c1-config.yml /mongodb/mongod-configserver1.yml
4. 生产和copy秘钥用户实例内部认证(master)
# openssl rand -base64 755 > /mongodb/keyfile
# chmod 400 /mongodb/keyfile 授权
# scp /mongodb/keyfile root@slave1:/mongodb/ 分发1
# scp /mongodb/keyfile root@slave2:/mongodb/ 分发2
5.配置mongodb文件(三台) 配mongod-a1-config.yml + b1 + c1
# vim /mongodb/mongod-a1-config.yml 添加如下。这里只是a1举例 b1+c1也是如此但要改内容的数值与之文件对应。注意下面有空格是固定的对准不然后面启动不了!
# 日志位置
systemLog:
destination: file # 前面空1格
logAppend: true # 空1格
path: /home/log/mongodb/a1/mongodb.log # 空1格
# db存储位置
storage:
dbPath: /mongodb/a1 # 空1格
journal: # 空1格
enabled: true # 空2格
# fork : 后台运行
# pidFilePath: pidfile的位置
processManagement:
fork: true # 空1格
pidFilePath: /var/run/mongod-a1.pid # 空1格
# 仅收听本地界面
net:
port: 28111 # 注意这里是a1的端口28111、配置b1时要分配端口28112、配置c1时要分配端口28113。空1格
bindIp: 0.0.0.0 # 空1格
# operation剖析
operationProfiling:
slowOpThresholdMs: 1000 # 空1格
mode: slowOp # 空1格
# 复制
replication:
replSetName: fang-s-a # 注意配置b1时这里a要改为b、配置c1时改为c。空1格
# 分片
sharding:
clusterRole: shardsvr # 空1格
6.配置mongod-configserver1.yml文件(三台) slave1数值是2 slave2是3注意以下格式有空格,严格空格,不然后面启动不了!
# vim /mongodb/mongod-configserver1.yml
# mongod config
systemLog:
destination: file # 空1格
logAppend: true # 空1格
path: /home/log/mongodb/configserver1/mongodb.log # 空1格
# Where and how to store data.
storage:
dbPath: /mongodb/configserver1 # 空1格
journal: # 空1格
enabled: true # 空2格
# fork : fork and run in background
# pidFilePath:location of pidfile
processManagement:
fork: true # 空1格
pidFilePath: /var/run/mongod-configserver1.pid # 空1格
# network interfaces
# Listen to local interface only, comment to listen on all interfaces.
net:
port: 28200 # 空1格
bindIp: 0.0.0.0 # 空1格
#operationProfiling:
operationProfiling:
slowOpThresholdMs: 1000 # 空1格
mode: slowOp # 空1格
#replication:
replication:
replSetName: fang-cs # 空1格
#sharding:
sharding:
clusterRole: configsvr # 空1格
7.启动(三台)这里演示一台启动master所有实例
# cd /usr/local/mongo/bin/ 进入mongo bin目录
# ./mongod -f /mongodb/mongod-a1-config.yml 启动config服务1-2-3
# ./mongod -f /mongodb/mongod-b1-config.yml
# ./mongod -f /mongodb/mongod-c1-config.yml
# ./mongod -f /mongodb/mongod-configserver1.yml 启动configserver1-2-3
8.登录Mongo(master) → slave1 → slave2
# ./mongo 192.168.2.98:28111/admin 28111是a1服务配置的端口
> use admin 转至主库下
> rs.initiate() 初始化fang-s-a的副本集
> rs.add("slave1:28111") 添加副本集
> rs.add("slave2:28111")
> rs.conf() 查看副本集情况 (此时可以自行插入记录看看同步效果)
# 登录到192.168.2.99 初始化fang-s-b 添加副本集
# ./mongo 192.168.2.99:28112/admin
>rs.initiate()
>rs.add("master:28112")
>rs.add("slave2:28112")
# 登录到192.168.2.100 初始化fang-s-c 添加副本集
# ./mongo 127.168.2.99:28113/admin
rs.initiate()
rs.add("master:28113")
rs.add("slave1:28113")
# 登录到192.168.2.98 初始化fang-cs添加副本集
# ./mongo 127.168.2.98:28200/admin
> rs.initiate()
rs.add("slave1:28200")
rs.add("slave2:28200")
9. 添加分片集群
# 登录到192.168.2.98
# cd /usr/local/mongo/bin/
# ./mongos --port 28300 --configdb fang-cs/master:28200,slave1:28200,slave2:28200 --fork --logpath /home/log/mongodb/mongos.log --bind_ip 0.0.0.0 开启服务
# ./mongo 192.168.2.98:28300/admin 登录
> use admin
> sh.addShard("fang-s-a/master:28111,slave1:28111,slave2:28111")
> sh.addShard("fang-s-b/master:28112,slave1:28112,slave2:28112")
> sh.addShard("fang-s-c/master:28113,slave1:28113,slave2:28113")
10.设置备节点永久读(验证副本集同步)
对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。
如果通过shell访问mongo,要在secondary进行查询。会出现如下错误:
imageSet:SECONDARY> db.fs.files.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
有两种方法实现从机的查询:
第一种方法:db.getMongo().setSlaveOk();
第二种方法:rs.slaveOk();
但是这种方式有一个缺点就是,下次再通过mongo进入实例的时候,查询仍然会报错,为此可以通过下列方式
vi ~/.mongorc.js
增加一行rs.slaveOk();
这样的话以后每次通过mongo命令进入都可以查询了
11.认证分片(登录mongos)
# ./mongo 192.168.2.131:28300/admin
> use admin 启用分片键
> sh.enableSharding("mytest")
> sh.shardCollection("mytest.student",{_id:"hashed"})
> for(var i=1;i<=50;i++){db.student.insert({age:i,"name":"mary",addr:"China"})} 测试
> db.student.find() 查看