注意:上述连接中MongoDB分片集群的配置服务器部分,在新版本(3.2之后)中使用的是复制集。如果是之前的版本照着装就行。
http://www.cnblogs.com/zhoujinyi/p/4635444.html
这个是新版本的分片集群安装方式
http://www.jb51.net/article/92847.htm
这个是分片的原理讲解
##实际测试
mongo版本:3.6
部署环境:
10.1.8.75 配置3台、路由1台、分片1台
10.1.8.78 分片1台、路由1台
10.1.8.52 分片1台
1、在10.1.8.75上启动3台配置服务器,端口分别为(20000、21000、22000)。并配置复制集。
config1服务器:
mkdir -p /usr/local/src/fenpian/config1/config
vim mongod_20000.conf ##编辑配置文件,可放到config1目录下
#数据目录
dbpath=/usr/local/src/fenpian/config1/config
#日志文件
logpath=/usr/local/src/fenpian/config1/mongodb_config.log
#日志追加
logappend=true
#端口
port = 20000
#最大连接数
maxConns = 50
pidfilepath = /usr/local/src/fenpian/config1/mongo_20000.pid
#日志,redo log
journal = true
#刷写提交机制
journalCommitInterval = 200
#守护进程模式
fork = true
#刷写数据到日志的频率
syncdelay = 60
#storageEngine = wiredTiger
#操作日志,单位M
oplogSize = 1000
#命名空间的文件大小,默认16M,最大2G。
nssize = 16
noauth = true
#不启用认证
unixSocketPrefix = /tmp
configsvr = true
#此机器是配置服务器
bind_ip=0.0.0.0
replSet = configdbs
#配置服务器的复制集名称,该版本必须加
config2服务器:
mkdir -p /usr/local/src/fenpian/config2/config
vim mongod_21000.conf ##编辑配置文件,可放到config2目录下
#数据目录
dbpath=/usr/local/src/fenpian/config2/config
#日志文件
logpath=/usr/local/src/fenpian/config2/mongodb_config.log
#日志追加
logappend=true
#端口
port = 21000
#最大连接数
maxConns = 50
pidfilepath = /usr/local/src/fenpian/config2/mongo_21000.pid
#日志,redo log
journal = true
#刷写提交机制
journalCommitInterval = 200
#守护进程模式
fork = true
#刷写数据到日志的频率
syncdelay = 60
#storageEngine = wiredTiger
#操作日志,单位M
oplogSize = 1000
#命名空间的文件大小,默认16M,最大2G。
nssize = 16
noauth = true
#不启用认证
unixSocketPrefix = /tmp
configsvr = true
#此机器是配置服务器
bind_ip=0.0.0.0
replSet = configdbs
#配置服务器的复制集名称,该版本必须加
config3服务器:
mkdir -p /usr/local/src/fenpian/config3/config
vim mongod_22000.conf ##编辑配置文件,可放到config3目录下
#数据目录
dbpath=/usr/local/src/fenpian/config3/config
#日志文件
logpath=/usr/local/src/fenpian/config3/mongodb_config.log
#日志追加
logappend=true
#端口
port = 22000
#最大连接数
maxConns = 50
pidfilepath = /usr/local/src/fenpian/config3/mongo_22000.pid
#日志,redo log
journal = true
#刷写提交机制
journalCommitInterval = 200
#守护进程模式
fork = true
#刷写数据到日志的频率
syncdelay = 60
#storageEngine = wiredTiger
#操作日志,单位M
oplogSize = 1000
#命名空间的文件大小,默认16M,最大2G。
nssize = 16
noauth = true
#不启用认证
unixSocketPrefix = /tmp
configsvr = true
#此机器是配置服务器
bind_ip=0.0.0.0
replSet = configdbs
#配置服务器的复制集名称,该版本必须加
启动各个配置服务器:mongod -f mongod_***.conf
初始化配置服务器复制集:执行下列命令
>mongo --port 20000
>config = {
_id : "configdbs",
members : [
{_id : 0, host : "10.1.8.75:20000" },
{_id : 1, host : "10.1.8.75:21000" },
{_id : 2, host : "10.1.8.75:22000" }
]
}
>rs.initiate(config)
>rs.slaveOk()
>rs.status()
2、在10.1.8.75、10.1.8.78上各开启一个路由服务器,端口为30000。两台机器的配置相同,重复执行两次即可。
mkdir -p /usr/local/src/fenpian/router
vim mongod_30000.conf
#日志文件
logpath=/usr/local/src/fenpian/router/mongodb_route.log
#日志追加
logappend=true
#端口
port=30000
#最大连接数
maxConns = 100
#绑定地址
bind_ip=0.0.0.0
pidfilepath = /usr/local/src/fenpian/router/mongo_30000.pid
configdb=configdbs/10.1.8.75:20000,10.1.8.75:21000,10.1.8.75:22000 #必须是1个或则3个配置 。
#configdb=127.0.0.1:20000 #报错
fork=true
启动路由服务器:mongos -f mongod_30000.conf
3、在3台服务器上各启动一个分片服务器,端口为40000.如果每个分片都是复制集的话,就按照配置复制集的方式配置好就行了(参看复制集配置文档)。我这里就用1台做分片了。
三台一样,各自执行即可。
mkdir -p /usr/local/src/fenpian/node1/data
vim mongod_40000.conf ##可放到node1目录下
port=40000 #端口
dbpath= /usr/local/src/fenpian/node1/data #数据文件存放目录
logpath= /usr/local/src/fenpian/node1/mongodb.log #日志文件存放目录
logappend=true #使用追加的方式写日志
fork=true #以守护程序的方式启用,即在后台运行
maxConns=500 #最大同时连接数
bind_ip=0.0.0.0 #只允许通过本机访问
#noauth=true #不启用验证
#auth=true #启用验证
#replSet=test
oplogSize=200 # 200M
shardsvr=true ##说明下此服务器是分片服务器
启动各个分片服务器:mongod -f mongod_40000.conf
4、添加服务分片
mongo --port 30000 #连接到路由服务器
>sh.status() #查看分片情况
>sh.addShard("10.1.8.75:40000") #添加分片,三台都加上,命令一样,换IP即可
>sh.status() #查看分片情况
5、使用分片
>sh.enableSharding("dba") #首先对数据库启用分片
>sh.shardCollection("dba.account",{"name":1}) #对集合使用分片
>sh.status() #看下是否已经生效
6、插入数据试下。pymongo没安装的先用pip安装。多插入点数据才能看到分片的效果
vim test.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#随即写MongoDB Shard 测试
import pymongo
import time
from random import Random
def random_str(randomlength=8):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(randomlength):
str+=chars[random.randint(0, length)]
return str
def inc_data(conn):
conn.test.authenticate("lidonghai", "lidonghai137846", mechanism='SCRAM-SHA-1')
db = conn.dba
# db = conn.test
collection = db.account2
for i in range(1000000):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(15):
str+=chars[random.randint(0, length)]
string = str
collection.insert_one({"name" : string, "age" : 123+i, "address" : "hangzhou"+string})
if __name__ =='__main__':
conn = pymongo.MongoClient(host='10.1.8.75',port=30000)
StartTime = time.time()
print "===============$inc==============="
print "StartTime : %s" %StartTime
inc_data(conn)
EndTime = time.time()
print "EndTime : %s" %EndTime
CostTime = round(EndTime-StartTime)
print "CostTime : %s" %CostTime
>sh.status() #看下是否已经生效
7、分片的认证授权
0)连接上路由服务器后先创建个用户:
>use admin
>db.createUser(
... {
... user: "lidonghai",
... pwd: "lidonghai137846",
... roles: [
... { role: "root", db: "admin" }
... ]
... }
... )
1)生成一个KeyFile文件
openssl rand -base64 741 > mongodb-keyfile
chmod 600 mongodb-keyfile
2)mongod: 复制到各个分片服务器上,如果是复制集也都要复制上去,再添加参数:
auth = true
keyFile = /usr/local/mongodb-keyfile
3)Config服务器上添加参数:
auth = true
keyFile = /usr/local/mongodb-keyfile
4)mongos上添加参数,因为mongos本来就是从config里加载数据的,所以只需要添加keyfile文件即可
keyFile = /usr/local/mongodb-keyfile
5)最后重启各个服务 (关闭顺序:路由服务器、分片服务器、配置服务器。开启顺序:配置服务器、分片服务器、路由服务器)
6)连接到路由服务器测试即可