MongoDB多节点分片集群
创建目录
mkdir -p /data/mongodb/conf mkdir -p /data/mongodb/mongos/log mkdir -p /data/mongodb/config/data mkdir -p /data/mongodb/config/log mkdir -p /data/mongodb/shard1/data mkdir -p /data/mongodb/shard1/log mkdir -p /data/mongodb/shard2/data mkdir -p /data/mongodb/shard2/log mkdir -p /data/mongodb/shard3/data mkdir -p /data/mongodb/shard3/log
在node1中生成key文件,然后同步到其它节点:
openssl rand -base64 756 > /data/mongodb/conf/keyfile
Config Server配置:
cat > /data/mongodb/conf/config.conf << EOF # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/ configuration-options/ # where and how to store data. storage: dbPath: /data/mongodb/config/data directoryPerDB: false # where to write logging data. systemLog: destination: file quiet: false logAppend: true logRotate: reopen path: /data/mongodb/config/log/configsrv.log verbosity: 0 # network interfaces net: port: 27011 ipv6: false bindIpAll: true #bindIp: # replica set options replication: replSetName: replicaset #enableMajorityReadConcern: true # sharding options sharding: clusterRole: configsvr # process management options processManagement: fork: false pidFilePath: /data/mongodb/config/log/configsrv.pid # set parameter options setParameter: enableLocalhostAuthBypass: true # security options security: #authorization: enabled authorization: disabled #clusterAuthMode: keyFile #keyFile: /data/mongodb/conf/keyfile EOF
在3个节点中分配启动3个config Server:
/usr/local/mongodb-linux-x86_64-rhel70-7.0.0/bin/mongod -f / data/mongodb/conf/config.conf
这里使用supervisor启动:
yum install supervisor -y sed -i 's/minfds=1024/minfds=102400/g;s/minprocs=200/ minprocs=65535/g' /etc/supervisord.conf systemctl enable supervisord systemctl start supervisord cat > /etc/supervisord.d/configsvr.ini <<EOF [program:configsvr] command=/usr/local/mongodb-linux-x86_64-rhel70-7.0.0/bin/ mongod -f /data/mongodb/conf/config.conf autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ; 程序退出后自动重启,可选值:[ unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=root ; 用哪个用户启动进程,默认是root priority=999 ; 进程启动优先级,默认999,值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 stdout_logfile=/var/log/supervisor/configsvr.stdout.log stderr_logfile=/var/log/supervisor/configsvr.stderr.log EOF supervisorctl update
下载安装mongosh:
curl -O https://downloads.mongodb.com/compass/ mongosh-2.3.5-linux-x64.tgz
tar -zxvf mongosh-2.3.5-linux-x64.tgz -C /usr/local/
export PATH=/usr/local/mongosh-2.3.5-linux-x64/bin:$PATH
```
初始化集群配置:
mongosh --port 27011 --eval " rs.initiate({ _id: 'replicaset', configsvr: true, members: [ { _id: 0, host: '10.0.1.136:27011' }, { _id: 1, host: '10.0.1.137:27011' }, { _id: 2, host: '10.0.1.138:27011' } ] })" mongosh --port 27011 --eval " rs.status()"
分别在3个节点都创建3个分片配置分片集群:
Shard1:
cat > /data/mongodb/conf/shard1.conf << EOF # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/ configuration-options/ # where and how to store data. storage: dbPath: /data/mongodb/shard1/data directoryPerDB: false # where to write logging data. systemLog: destination: file quiet: false logAppend: true logRotate: reopen path: /data/mongodb/shard1/log/shard.log verbosity: 0 # network interfaces net: port: 27021 ipv6: false bindIpAll: true #bindIp: # replica set options replication: replSetName: shard1ReplSet #enableMajorityReadConcern: true # sharding options sharding: clusterRole: shardsvr # process management options processManagement: fork: false pidFilePath: /data/mongodb/shard1/log/shard.pid # set parameter options setParameter: enableLocalhostAuthBypass: true # security options security: authorization: disabled #authorization: enabled #clusterAuthMode: keyFile #keyFile: /data/mongodb/conf/keyfile EOF
Shard2:
cat > /data/mongodb/conf/shard2.conf << EOF # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/ configuration-options/ # where and how to store data. storage: dbPath: /data/mongodb/shard2/data directoryPerDB: false # where to write logging data. systemLog: destination: file quiet: false logAppend: true logRotate: reopen path: /data/mongodb/shard2/log/shard.log verbosity: 0 # network interfaces net: port: 27022 ipv6: false bindIpAll: true #bindIp: # replica set options replication: replSetName: shard2ReplSet #enableMajorityReadConcern: true # sharding options sharding: clusterRole: shardsvr # process management options processManagement: fork: false pidFilePath: /data/mongodb/shard2/log/shard.pid # set parameter options setParameter: enableLocalhostAuthBypass: true # security options security: authorization: disabled #authorization: enabled #clusterAuthMode: keyFile #keyFile: /data/mongodb/conf/keyfile EOF
Shard3:
cat > /data/mongodb/conf/shard3.conf << EOF # mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/ configuration-options/ # where and how to store data. storage: dbPath: /data/mongodb/shard3/data directoryPerDB: false # where to write logging data. systemLog: destination: file quiet: false logAppend: true logRotate: reopen path: /data/mongodb/shard3/log/shard.log verbosity: 0 # network interfaces net: port: 27023 ipv6: false bindIpAll: true #bindIp: # replica set options replication: replSetName: shard3ReplSet #enableMajorityReadConcern: true # sharding options sharding: clusterRole: shardsvr # process management options processManagement: fork: false pidFilePath: /data/mongodb/shard3/log/shard.pid # set parameter options setParameter: enableLocalhostAuthBypass: true # security options security: authorization: disabled #authorization: enabled #clusterAuthMode: keyFile #keyFile: /data/mongodb/conf/keyfile EOF ```
启动分版:
cat > /etc/supervisord.d/shard1.ini <<EOF [program:share1] command=/usr/local/mongodb-linux-x86_64-rhel70-7.0.0/bin/ mongod -f /data/mongodb/conf/shard1.conf autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ; 程序退出后自动重启,可选值:[ unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=root ; 用哪个用户启动进程,默认是root priority=999 ; 进程启动优先级,默认999,值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 stdout_logfile=/var/log/supervisor/shard1.stdout.log stderr_logfile=/var/log/supervisor/shard1.stderr.log EOF cat > /etc/supervisord.d/shard2.ini <<EOF [program:share2] command=/usr/local/mongodb-linux-x86_64-rhel70-7.0.0/bin/ mongod -f /data/mongodb/conf/shard2.conf autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ; 程序退出后自动重启,可选值:[ unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=root ; 用哪个用户启动进程,默认是root priority=999 ; 进程启动优先级,默认999,值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 stdout_logfile=/var/log/supervisor/shard2.stdout.log stderr_logfile=/var/log/supervisor/shard2.stderr.log EOF cat > /etc/supervisord.d/shard3.ini <<EOF [program:share3] command=/usr/local/mongodb-linux-x86_64-rhel70-7.0.0/bin/ mongod -f /data/mongodb/conf/shard3.conf autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ; 程序退出后自动重启,可选值:[ unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=root ; 用哪个用户启动进程,默认是root priority=999 ; 进程启动优先级,默认999,值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 stdout_logfile=/var/log/supervisor/shard3.stdout.log stderr_logfile=/var/log/supervisor/shard3.stderr.log EOF supervisorctl update
登陆任意节点,初始化副本集:
注:初始化副本集的操作不能在仲裁节点上执行!
mongosh 10.0.1.136:27021 定义副本集配置,"arbiterOnly":true 代表其为仲裁节点:
初始化副本集:
#分片1 mongosh --port 27021 --eval " rs.initiate({ _id: 'shard1ReplSet', members: [ { _id: 0, host: '10.0.1.136:27021' }, { _id: 1, host: '10.0.1.137:27021' }, { _id: 2, host: '10.0.1.138:27021'}, ] })" mongosh --port 27021 --eval "rs.status()" #分片2 mongosh --port 27022 --eval " rs.initiate({ _id: 'shard2ReplSet', members: [ { _id: 0, host: '10.0.1.136:27022' }, { _id: 1, host: '10.0.1.137:27022'}, { _id: 2, host: '10.0.1.138:27022'}, ] })" mongosh --port 27022 --eval "rs.status()" #分片3 mongosh --port 27023 --eval " rs.initiate({ _id: 'shard3ReplSet', members: [ { _id: 0, host: '10.0.1.136:27023'}, { _id: 1, host: '10.0.1.137:27023'}, { _id: 2, host: '10.0.1.138:27023'}, ] })" mongosh --port 27023 --eval "rs.status()" ```
Mongos server:
cat > /data/mongodb/conf/mongos.conf << EOF systemLog: destination: file quiet: false logAppend: true logRotate: reopen path: /data/mongodb/mongos/log/mongos.log verbosity: 0 # network interfaces net: port: 27017 ipv6: false bindIpAll: true #bindIp: # # sharding options sharding: configDB: replicaset/ 10.0.1.136:27011,10.0.1.137:27012,10.0.1.138:27013 # process management options processManagement: fork: false pidFilePath: /data/mongodb/mongos/log/mongos.pid #security: # keyFile: /data/mongodb/conf/keyfile # clusterAuthMode: keyFile EOF cat > /etc/supervisord.d/mongos.ini <<EOF [program:mongos] command=/usr/local/mongodb-linux-x86_64-rhel70-7.0.0/bin/ mongos -f /data/mongodb/conf/mongos.conf autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ; 程序退出后自动重启,可选值:[ unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=root ; 用哪个用户启动进程,默认是root priority=999 ; 进程启动优先级,默认999,值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 stdout_logfile=/var/log/supervisor/mongos.stdout.log stderr_logfile=/var/log/supervisor/mongos.stderr.log EOF mongosh --port 27017 --eval " sh.addShard('shard1ReplSet/ 10.0.1.136:27021,10.0.1.137:27021,10.0.1.138:27021') sh.addShard('shard2ReplSet/ 10.0.1.136:27022,10.0.1.137:27022,10.0.1.138:27022') sh.addShard('shard3ReplSet/ 10.0.1.136:27023,10.0.1.137:27023,10.0.1.138:27023') " mongosh --port 27017 --eval "sh.status();"
用户创建:
# 在其中一个配置服务器中创建集群管理账号 mongosh --port 27011 --eval " use admin db.createUser({ user: 'clusterAdmin', pwd: 'xxxx', roles: [ { role: "clusterAdmin", db: "admin" }, { role: "userAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" } ] })" mongosh --port 27011 --eval " use admin db.createUser({ user: "root", pwd: "xxxx", // 请修改为强密码 roles: ["root"] }) " # 在每个分片的主分片中创建集群管理账号 mongosh --port 27021 --eval " use admin db.createUser({ user: 'clusterAdmin', pwd: 'xxxx', roles: [ { role: "clusterAdmin", db: "admin" }, { role: "userAdminAnyDatabase", db: "admin" } ] }) db.createUser({ user: "root", pwd: "xxxx", // 请修改为强密码 roles: ["root"] }) " # show users
开启认证: 将配置中的认证打开
分片:
sed -i 's/authorization: disabled/#authorization: disabled/ g;s/#authorization: enabled/authorization: enabled/ g;s/#clusterAuthMode: keyFile/clusterAuthMode: keyFile/ g;s/#keyFile:/keyFile:/g' shard*.conf
Mongos:
security: keyFile: /data/mongodb/conf/keyfile clusterAuthMode: keyFile
Config:
security:
authorization: enabled
#authorization: disabled
clusterAuthMode: keyFile
keyFile: /data/mongodb/conf/keyfile
登录验证:
mongosh --port 27017 --username root --password --authenticationDatabase admin