前言


分片技术是解决如今大数据量,高吞吐量的数据库应用对传统关系型单机数据库造成巨大压力的有效手段,mongodb不同于mysql等数据库需要依赖第三方中间件来实现sharding,增加架构复杂度和运维难度,mongodb内建分片技术,并且已经做到相当高的自动化

架构模型

mongodb 分片集群启动和关闭顺序_3c

由图可知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()

mongodb 分片集群启动和关闭顺序_3c_02

开启分片功能

对指定数据库启用分片:

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