前言
分片技术是解决如今大数据量,高吞吐量的数据库应用对传统关系型单机数据库造成巨大压力的有效手段,mongodb不同于mysql等数据库需要依赖第三方中间件来实现sharding,增加架构复杂度和运维难度,mongodb内建分片技术,并且已经做到相当高的自动化
架构模型
由图可知mongodb分片集群由三部分组成mongos,config servers,shard nodes
环境准备
ID | IP | ROLE |
1 | 10.0.60.79 | mongos |
2 | 10.0.60.81 | config servers |
3 | 10.0.61.82 | shard node1 |
4 | 10.0.61.83 | shard node2 |
搭建步骤
本次搭建在centos7.5上
以下步骤依次在所有节点执行
解压数据库tgz软件包至/usr/local下
tar -C /usr/local -zxvf mongodb-linux-x86_64-rhel70-4.0.19.tgz
创建mongod用户组与用户:
groupadd mongoduseradd mongod -g mongod
创建软连接
ln -s /usr/local/mongodb-linux-x86_64-rhel70-4.0.19 /usr/local/mongo
设置环境变量
vi /root/.bash_profilevi /home/mongod/.bash_profilePATH = $PATH:/usr/local/mongo/binsource .bash_profile
或者直接将二进制文件cp过去:
sudo cp /path/to/the/mongodb-directory/bin/* /usr/local/bin/
分片集群各部分组件搭建顺序(程序启动顺序也是如此):
1.“config server” -> 2. “shard” -> 3. “mongos”
配置config server
config server为元数据服务器,存储分片集群元数据与配置信息,3.4版本后需部署为副本集,本次部署资源有限,在当前节点上,部署三个config server实例组成副本集
创建数据目录:
mkdir -p /mongodb/configserver/db1mkdir -p /mongodb/configserver/db2mkdir -p /mongodb/configserver/db3chown -R mongod.mongod /mongodb/configserver/db1chown -R mongod.mongod /mongodb/configserver/db2chown -R mongod.mongod /mongodb/configserver/db3
创建日志目录:
mkdir -p /mongodb/configserver/log1chown -R mongod.mongod /mongodb/configserver/log1mkdir -p /mongodb/configserver/log2chown -R mongod.mongod /mongodb/configserver/log2mkdir -p /mongodb/configserver/log3chown -R mongod.mongod /mongodb/configserver/log3
创建配置文件:
在/mongodb/configserver目录下创建三个配置文件:mongo_configserver1.conf,mongo_configserver2.conf,mongo_configserver3.conf
模板参考:
vim /mongodb/configserver/mongo_configserver1.conf
# 数据文件路径dbpath = /mongodb/configserver/db1# 日志文件路径logpath = /mongodb/configserver/log1/configserver1.log# 端口(21001,21002,21003)port = 21001# 绑定ipbind_ip = 0.0.0.0# 是否以守护进程方式运行fork = true# 副本集名称replSet = rs-config# 定义当前实例为config serverconfigsvr = true# 是否开启认证#auth = true# 认证密钥文件#keyFile = /mongodb/configserver/db1/mongokeyfile
依次启动config server:
mongod -f /mongodb/configserver/mongo_configserver1.confmongod -f /mongodb/configserver/mongo_configserver2.confmongod -f /mongodb/configserver/mongo_configserver3conf
初始化副本集:
mongo --port 21001config = {_id : "rs-config",members : [{_id : 0, host : "10.0.60.81:21001" }, {_id : 1, host : "10.0.60.81:21002" }, {_id : 2, host : "10.0.60.81:21003"}]}rs.initiate(rs-config)rs.status()
配置shard nodes:
shard节点用于保存真实数据,以下步骤依次操作在10.0.60.82,10.0.60.83
创建数据目录:
mkdir -p /mongodb/shardserver/db1mkdir -p /mongodb/shardserver/db2mkdir -p /mongodb/shardserver/db3chown -R mongod.mongod /mongodb/shardserver/db1chown -R mongod.mongod /mongodb/shardserver/db2chown -R mongod.mongod /mongodb/shardserver/db3
创建日志目录:
mkdir -p /mongodb/shardserver/log1chown -R mongod.mongod /mongodb/shardserver/log1mkdir -p /mongodb/shardserver/log2chown -R mongod.mongod /mongodb/shardserver/log2mkdir -p /mongodb/shardserver/log3chown -R mongod.mongod /mongodb/shardserver/log3
创建配置文件:
在/mongodb/shardserver下创建三个配置文件:mongo_shardserver1.conf,mongo_shardserver2.conf,mongo_shardserver3.conf
模板参考:
vim /mongodb/shardserver/mongo_shardserver1.conf
# 数据文件路径dbpath = /mongodb/shardserver/db1# 日志文件路径logpath = /mongodb/shardserver/log1/shardserver1.log# 端口(27017,27018,27019)port = 27017# 绑定ipbind_ip = 0.0.0.0# 是否以守护进程方式运行fork = true# 副本集名称replSet = rsshard# 定义当前实例为shard servershardsvr= true# 是否开启认证#auth = true# 认证密钥文件#keyFile = /mongodb/shardserver/db1/mongokeyfile
初始化副本集:
mongo --port 27017config = {_id : "rs-shard2", members : [ {_id : 0, host : "10.0.60.83:27017" }, {_id : 1, host : "10.0.60.83:27018" }, {_id : 2, host : "10.0.60.83:27019"} ] }rs.initiate(config)rs.status()
配置mongos
mongos模块作为分片集群的查询入口,不存储真实数据,因此不需要创建数据目录,只需创建日志路径:
mkdir -p /mongodb/mongos/logsudo chown -R mongod:mongod /mongodb/mongos
vim /mongodb/mongos/mongos.conf
# 日志文件路径logpath = /mongodb/mongos/log/mongos.log# 端口port = 20001# 绑定ipbind_ip = 0.0.0.0# 是否以守护进程方式运行fork = true#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字configdb = rs-config/10.0.60.81:21001,10.0.60.81:21002,10.0.60.81:21003
启动mongos:
mongos -f /mongodb/mongos/mongos.conf
添加shard集群:
sh.addShard("rs-shard1/10.0.60.82:27017,10.0.60.82:27018,10.0.60.82:27019")sh.addShard("rs-shard2/10.0.60.83:27017,10.0.60.83:27018,10.0.60.83:27019")
查看分片集群配置:
sh.status()
开启分片功能
对指定数据库启用分片:
mongos>sh.enableSharding("test")
对指定库下指定集合(test.test)进行分片,id为片键,需要有索引,1为分片类型(范围分片:1,哈希分片:hashed)
mongos>sh.shardCollection("test.test",{"id":1})
分片集群安全认证:
mongos节点创建用户:
mongo --port 20001use admindb.createUser({user: "sysadmin",pwd: "123456",roles: ['clusterAdmin','dbAdminAnyDatabase','userAdminAnyDatabase','readWriteAnyDatabase','backup','restore']})
在mongos节点创建keyfile认证文件,文件大小为756字符,需要小于1024字符
openssl rand -base64 756 > /mongodb/mongos/mongokeyfilechown -R mongod.mongod /mongodb/mongos/mongokeyfilechmod 600 /mongodb/mongos/mongokeyfile
创建成功后依次拷贝至集群所有节点mongodb部署目录下
依次修改mongo_configserver.conf,mongo_shard.conf,mongos.conf
auth=truekeyfile = mongodb部署目录/mongokeyfile
最后依次重启所有节点:config server->shard node->mongos