一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合。复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础
下面就是我本地测试的环境,三台虚拟机作为mongodb存储的复制集
172.25.128.53 172.25.128.55 172.25.128.60
首先关闭selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config setenforce 0
停止防火墙并取消开机启动
systemctl stop firewalld.service systemctl disable firewalld.service
在三台机器上分别创建目录,下载mongodb包
配置服务数据存放目录
mkdir -p /data/mongodb
下载mongdb包并解压
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz tar -zxvf mongodb-linux-x86_64-4.0.9.tgz mv mongodb-linux-x86_64-4.0.9 /usr/local/mongodb
启动配置文件存放的文件夹
mkdir -p /usr/local/mongodb/conf
配置服务日志存放目录
mkdir -p /usr/local/mongodb/log vi /etc/profile #最后一行添加 export PATH=$PATH:/usr/local/mongodb/bin
三台服务器上都要执行
分片1服务数据存放目录和日志存放文件
mkdir -p /data/mongodb/shard1 touch /usr/local/mongodb/log/shard1.log
分片2服务数据存放目录和日志存放文件
mkdir -p /data/mongodb/shard2 touch /usr/local/mongodb/log/shard2.log
分片3服务数据存放目录和日志存放文件
mkdir -p /data/mongodb/shard3 touch /usr/local/mongodb/log/shard3.log
分别在三台服务器上配置mongodb配置文件,vi /usr/local/mongodb/conf/config.conf,内容如下
dbpath=/data/mongodb logpath=/usr/local/mongodb/log/config.log port=27018 logappend=true fork=true maxConns=5000 #复制集名称 replSet=shard #置参数为true configsvr=true #允许任意机器连接 bind_ip=0.0.0.0
分别启动三台服务器的配置服务
mongod -f /usr/local/mongodb/conf/config.conf
连接mongo,只需在任意一台机器执行即可
mongo --port 27018
初始化复制集
rs.initiate({_id:"shard",members:[{_id:0,host:"172.25.128.53:27018"},{_id:1,host:"172.25.128.55:27018"},{_id:2,host:"172.25.128.60:27018"}]})
其中_id:"shard"是上面config.conf配置文件里的复制集名称
查看状态
rs.status()
等几十秒左右,执行上面的命令查看状态,三台机器的配置服务就已形成复制集,其中1台为PRIMARY,其他2台为SECONDARY
分片服务部署(3台服务器执行相同操作)
1.在/usr/local/mongodb/conf目录创建shard1.conf、shard2.conf、shard3.conf,内容如下
dbpath=/data/mongodb/shard1 #其他2个分片对应修改为shard2、shard3文件夹 logpath=/usr/local/mongodb/log/shard1.log #其他2个分片对应修改为shard2.log、shard3.log port=27001 #其他2个分片对应修改为27002、27003 logappend=true fork=true maxConns=5000 storageEngine=mmapv1 shardsvr=true replSet=shard1 #其他2个分片对应修改为shard2、shard3 bind_ip=0.0.0.0
端口分别是27001、27002、27003,分别对应shard1.conf、shard2.conf、shard3.conf
还有数据存放目录、日志文件这几个地方都需要对应修改。
在3台机器的相同端口形成一个分片的复制集,由于3台机器都需要这3个文件,所以根据这9个配置文件分别启动分片服务
mongod -f /usr/local/mongodb/conf/shard1.conf mongod -f /usr/local/mongodb/conf/shard2.conf mongod -f /usr/local/mongodb/conf/shard3.conf
2.将分片配置为复制集,连接mongo,只需在任意一台机器执行即可
mongo --port 27001
这里以shard1为例,其他两个分片则再需对应连接到27002、27003的端口进行操作即可
切换数据库:
use admin
初始化复制集:
rs.initiate({_id:"shard1",members:[{_id:0,host:"172.25.128.53:27001"},{_id:1,host:"172.25.128.55:27001"},{_id:2,host:"172.25.128.60:27001"}]})
以上是基于分片1来操作,同理,其他2个分片也要连到各自的端口来执行一遍上述的操作,让3个分片各自形成1主2从的复制集
登陆27002端口操作
mongo --port 27002 use admin rs.initiate({_id:"shard2",members:[{_id:0,host:"172.25.128.53:27002"},{_id:1,host:"172.25.128.55:27002"},{_id:2,host:"172.25.128.60:27002"}]})
登陆27003端口操作
mongo --port 27003 use admin rs.initiate({_id:"shard3",members:[{_id:0,host:"172.25.128.53:27003"},{_id:1,host:"172.25.128.55:27003"},{_id:2,host:"172.25.128.60:27003"}]})
注意端口及仲裁节点的问题即可,操作完成后3个分片都启动完成,并完成复制集模式
路由服务部署(3台服务器执行相同操作)
在/usr/local/mongodb/conf目录创建mongos.conf,vi /usr/local/mongodb/conf/mongos.conf内容如下
systemLog: destination: file logAppend: true path: /usr/local/mongodb/log/mongos.log processManagement: fork: true # pidFilePath: /var/log/mongodb/mongos.pid # network interfaces net: port: 27017 bindIp: 0.0.0.0 sharding: configDB: shard/172.25.128.53:27018,172.25.128.53:27018,172.25.128.53:27018
分别在三台服务器启动mongos
mongos -f /usr/local/mongodb/conf/mongos.conf
启动分片功能
连接mongo
mongo
切换数据库
use admin
添加分片,只需在一台机器执行即可
sh.addShard("shard1/172.25.128.53:27001,172.25.128.55:27001,172.25.128.60:27001") sh.addShard("shard2/172.25.128.53:27002,172.25.128.55:27002,172.25.128.60:27002") sh.addShard("shard3/172.25.128.53:27003,172.25.128.55:27003,172.25.128.60:27003")
查看集群状态
sh.status()
设置分片chunk大小
use config db.settings.save({"_id":"chunksize","value":1})
模拟写入数据
use sulao for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"sulao_"+i})}
启用数据库分片
sh.enableSharding("sulao")
创建索引,对表进行分片
db.user.createIndex({"id":1}) sh.shardCollection("sulao.user",{"id":1})
查看分片状态
sh.status() # 查看分片情况