(我这里是安装在3个节点上,分别为:node1,node2,node3)
1. 安装 mongodb到node1,2,3节点
https://blog.youkuaiyun.com/ZZPJackie/article/details/107141382
2. 在node1,node2,node3创建一个mongo目录
mkdir /opt/mongo
mongos, config, shard1,shard2,shard3分别对应三个子目录用来存 data,log, run (后面会创建)
3. 在node1,node2,node3先创建config server
1.分别在多台机器上创建mongo config server对应的目录
mkdir -p /opt/mongo/config/{log,data,run}
- 分别在多台机器上修改config server的配置文件
cat >> /opt/mongo/config/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo/config/log/mongod.log
storage:
dbPath: /opt/mongo/config/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/mongo/config/run/mongod.pid
net:
port: 24000
replication:
replSetName: config
sharding:
clusterRole: configsvr
EOF
3. 启动所有的mongo config server服务
mongod --config /opt/mongo/config/mongod.conf
若出现如下错误:
Failed global initialization: BadValue: Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly. locale::facet::_S_create_c_locale name not valid
解决办法:
手动设置变量,在命令行里敲只是临时的重启后没有用了,这需要在环境变量配置文件里添加一行。
vi /etc/profile
export LC_ALL=C
source /etc/profile
再执行 : mongod --config /opt/mongo/config/mongod.conf
运行结果如上图
4, 测试登录node1,2,3中一台的config server, 以创建配置并激活:
(以登录node1中的mongo config server为例) : mongo --port 24000
5. 运行配置:
#创建配置
config = {
_id : "config",
members : [
{_id : 0, host : "192.168.121.200:24000" },
{_id : 1, host : "192.168.121.201:24000" },
{_id : 2, host : "192.168.121.202:24000" }
]
}
注意: _id: config 必须与前面的 config server配置文件中的 replSetName: config 一致. host分别为node1,2,3的地址
6. 初始化副本集配置:
rs.initiate(config)
- 查看分区状态:
rs.status()
4. 给node1,2,3 各创建第一个分片和副本集
- 修改mongo shard1 server的配置文件:
mkdir -p /opt/mongo/shard1/{log,data,run}
- 分别在多台机器上修改shard1 server的配置文件:
cat >> /opt/mongo/shard1/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo/shard1/log/mongod.log
storage:
dbPath: /opt/mongo/shard1/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/mongo/shard1/run/mongod.pid
net:
port: 25001
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
EOF
注意: clusterRole: shardsvr && replSetName: shard1
3. 启动所有的shard1 server:
mongod --config /opt/mongo/shard1/mongod.conf
- 登陆任意一台shard1服务器(希望哪一台机器是主,就登录到那一台机器上,这里是准备将node1设为shard1的主节点),初始化副本集
mongo --port 25001
- 使用admin数据库
use admin
- 定义副本集配置
config = {
_id : "shard1",
members : [
{_id : 0, host : "192.168.121.200:25001" },
{_id : 1, host : "192.168.121.201:25001" },
{_id : 2, host : "192.168.121.202:25001" }
]
}
注意:shard1 名字与上面的要一样
副本集中各节点的顺序, 第一个节点是主节点
7. 初始化副本集配置
rs.initiate(config);
- 查看分区状态
rs.status()
5. 给node1,2,3 各创建第二个分片和副本集
- 修改mongo shard2 server的配置文件
mkdir -p /opt/mongo/shard2/{log,data,run}
- 分别在多台机器上修改shard2 server的配置文件
cat >> /opt/mongo/shard2/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo/shard2/log/mongod.log
storage:
dbPath: /opt/mongo/shard2/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/mongo/shard2/run/mongod.pid
net:
port: 25002
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
EOF
- 启动所有的shard2 server
mongod --config /opt/mongo/shard2/mongod.conf
- 登陆任意一台shard2服务器(希望哪一台机器是主,就登录到那一台机器上,这里是准备将node2设为shard2的主节点),初始化副本集
mongo --port 25002
- 使用admin数据库:
use admin
- 定义副本集配置:
config = {
_id : "shard2",
members : [
{_id : 0, host : "192.168.121.201:25002" },
{_id : 1, host : "192.168.121.200:25002" },
{_id : 2, host : "192.168.121.202:25002" }
]
}
- 初始化副本集配置:
rs.initiate(config);
- 查看分区状态:
rs.status()
6. 给node1,2,3 各创建第三个分片和副本集:
方法同上
7. 安装配置 mongos 进程, 给node1, 2,3各创建目录
- 创建 mongos 进程所在的目录
mkdir -p /opt/mongo/mongos/{log,data,run}
- 添加mongs的配置文件
cat >> /opt/mongo/mongos/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo/mongos/log/mongod.log
processManagement:
fork: true
pidFilePath: /opt/mongo/mongos/run/mongod.pid
net:
port: 23000
sharding:
configDB: config/192.168.121.200:24000,192.168.121.201:24000,192.168.121.202:24000
EOF
- 启动所有的路由服务器
mongos --config /opt/mongo/mongos/mongod.conf
- 登录其中的一台路由节点,手动启用分片
mongo --port 23000
- 添加分片到mongos
sh.addShard("shard1/192.168.121.200:25001,192.168.121.201:25001,192.168.121.202:25001")
sh.addShard("shard2/192.168.121.201:25002,192.168.121.200:25002,192.168.121.202:25002")
sh.addShard("shard3/192.168.121.202:25003,192.168.121.200:25003,192.168.121.201:25003")
- 设置slave可读(在命令行中生效一次),如果配置从接到可读,那么是连接客户端指定的
rs.slaveOk()
8. node1,node2,node3 联接 mongos 客户端, 来操作mongo集群,并在其中创建库并开启分片功能
1.创建库:use mybike
2 创建 bike集合:db.createCollection("bike")
给bike集合创建索引: db.bike.ensureIndex({loc:"2d",status:1})
3 对mybike这个数据库开启分片功能:
use admin
4 对mybike这个数据库开启分片功能
db.runCommand({"enablesharding":"mybike"})
5 对mybike数据库下的bikes集合按id的hash进行分片
db.runCommand({"shardcollection":"mybike.bike","key":{_id:'hashed'}})
6 又切换回 mybike库:use mybike
7 切换到 mybike库,向bike集合中插入数据
db.bike.insert( {"status": 1, "loc": [28.189153,112.960318],"qrcode":""} )
db.bike.insert( { "status": 1, "loc": [28.189155,112.960318],"qrcode":""} )
db.bike.insert( {"status": 1, "loc": [28.189159,112.960318],"qrcode":""} )
db.bike.insert( {"status": 1, "loc": [28.189163,112.960318],"qrcode":""} )
db.bike.insert( { "status": 1, "loc": [28.189170,112.960318],"qrcode":""} )
db.bike.insert( {"status": 1, "loc": [28.189393,112.943868],"qrcode":""} )
db.bike.insert( { "status": 1, "loc": [28.197871,112.957641],"qrcode":""} )
db.bike.insert( {"status": 1, "loc": [28.201437,112.960336],"qrcode":""} )
db.bike.insert( {"status": 1, "loc": [28.201487,112.960336],"qrcode":""} )
db.bike.insert( {"status": 1, "loc": [28.20392,112.958953],"qrcode":""} )
db.bike.insert( {"status" : 1, "loc" : [ 28.204381, 112.959887 ], "qrcode" : ""} )
db.bike.insert( { "status" : 1, "loc" : [ 28.204391, 112.959885 ], "qrcode" : "" } )
db.bike.insert( { "status" : 1, "loc" : [ 28.204481, 112.959789 ], "qrcode" : "" } )
db.bike.insert( { "status" : 1, "loc" : [ 28.204181, 112.959671 ], "qrcode" : "" } )
db.bike.insert( { "status" : 1, "loc" : [ 28.204881, 112.959556 ], "qrcode" : "" } )
db.bike.insert( { "status" : 1, "loc" : [ 28.204681, 112.959874 ], "qrcode" : "" } )
db.bike.insert( { "status" : 1, "loc" : [ 28.204201, 112.959867 ], "qrcode" : "" } )
db.bike.insert( { "status" : 1, "loc" : [ 28.2043941, 112.959854 ], "qrcode" : "" } )
9. 测试查询的各种情况
- 在mongos 进程中查询得到的结果是所有分片要满足条件的结果
先在 node1 上,以mongo --port 23000
登录.
show dbs
use mybike
show collections
db.bike.find()
可以查到所有数据
2. 如果指定以某个 shard登录,则只能查到这个 分片上的数据
在node2上,以它上面的主节点 shard2: 25002 登录
mongo --port 25002
shard2:PRIMARY> 这个提示符表明当前是 shard2分片,并且是主节点
(如果登录的是从节点的话,默认是没有访问权限,要执行shard2:SECONDARY> rs.slaveOk()
)
输入以下命令:
use mybike
db.bike.find()
只能看到在这个分区上的数据,这就说明 以后利用客户端应该联接 mongos 进程,而不能直联 shard
- 对某个备份节点 slave进行操作:
比如 node2上的 shard3: 25003 :mongo --port 25003
shard3:SECONDARY> 表明这是一个备份节点
rs.slaveOk()
启用 备份节点可读
就可以查到备份节点上的数据
说明集群及分片、副本安装成功!!!!