一.集群规划
1.1.配置规划
【注意】得部署奇数台。
节点 | Master | Slave1 | Slave2 |
IP | 192.168.2.98 | 192.168.2.99 | 192.168.2.100 |
配置实例 | a11c1configserver1 | a22c2configserver2 | a33c3configserver3 |
1.2.分片规划
说明:1个分片内有3个副本集。如果看不懂分片规划请看例子解释。(看懂忽略此例子)
例子:fang-s-a整行解释。a1-a2-a3副本集对应端口为28111。a1(在Master上)、a2(在Slave1)、a3(在Slave2) 对应着上面的配置实例。现在移至搭建Mongodb第8步操作解释,在主节点Master登录Mongo添加a2(Slave1)、a3(Slave2)这两个次要的副本集。
切片名称 | 主要副本集 | 次要副本集 | 次要副本集 | 端口 |
fang-s-a | a1(Master) | a2(Slave1) | a3(Slave2) | 28111 |
fang-s-b | b2(Slave1) | b1(Master) | b3(Slave2) | 28112 |
fang-s-c | c3(Slave2) | c1(Master) | c2(Slave1) | 29113 |
fang-cs | configserver1(Master) | configserver2(Slave1) | configserver3(Slave2) | 28200 |
二.搭建Mongodb
1.下载安装包(master) # wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.9.tgz # tar zxvf mongodb-linux-x86_64-rhel62-3.2.9.tgz -C /usr/local/ 解压 # mv /usr/local/mongodb-linux-x86_64-rhel62-3.2.9 /usr/local/mongo 改名 2.分发安装包至各节点(master) # scp -r /usr/local/mongo root@slave1:/usr/local/ # scp -r /usr/local/mongo root@slave2:/usr/local/ 3.创建db目录、日志目录、mongodb配置文件(三台)此处演示一台每台都要改数值对应 3.1.创建db目录 # mkdir -p /mongodb/a1 /mongodb/b1 /mongodb/c1 /mongodb/configserver1 3.2.创建日志目录 # mkdir -p /home/log/mongodb/a1 /home/log/mongodb/b1 /home/log/mongodb/c1 /home/log/mongodb/configserver1 3.3.创建mongodb配置文件 # touch /mongodb/mongod-a1-config.yml /mongodb/mongod-b1-config.yml /mongodb/mongod-c1-config.yml /mongodb/mongod-configserver1.yml 4. 生产和copy秘钥用户实例内部认证(master) # openssl rand -base64 755 > /mongodb/keyfile # chmod 400 /mongodb/keyfile 授权 # scp /mongodb/keyfile root@slave1:/mongodb/ 分发1 # scp /mongodb/keyfile root@slave2:/mongodb/ 分发2 5.配置mongodb文件(三台) 配mongod-a1-config.yml + b1 + c1 # vim /mongodb/mongod-a1-config.yml 添加如下。这里只是a1举例 b1+c1也是如此但要改内容的数值与之文件对应。注意下面有空格是固定的对准不然后面启动不了! # 日志位置 systemLog: destination: file # 前面空1格 logAppend: true # 空1格 path: /home/log/mongodb/a1/mongodb.log # 空1格 # db存储位置 storage: dbPath: /mongodb/a1 # 空1格 journal: # 空1格 enabled: true # 空2格 # fork : 后台运行 # pidFilePath: pidfile的位置 processManagement: fork: true # 空1格 pidFilePath: /var/run/mongod-a1.pid # 空1格 # 仅收听本地界面 net: port: 28111 # 注意这里是a1的端口28111、配置b1时要分配端口28112、配置c1时要分配端口28113。空1格 bindIp: 0.0.0.0 # 空1格 # operation剖析 operationProfiling: slowOpThresholdMs: 1000 # 空1格 mode: slowOp # 空1格 # 复制 replication: replSetName: fang-s-a # 注意配置b1时这里a要改为b、配置c1时改为c。空1格 # 分片 sharding: clusterRole: shardsvr # 空1格 6.配置mongod-configserver1.yml文件(三台) slave1数值是2 slave2是3注意以下格式有空格,严格空格,不然后面启动不了! # vim /mongodb/mongod-configserver1.yml # mongod config systemLog: destination: file # 空1格 logAppend: true # 空1格 path: /home/log/mongodb/configserver1/mongodb.log # 空1格 # Where and how to store data. storage: dbPath: /mongodb/configserver1 # 空1格 journal: # 空1格 enabled: true # 空2格 # fork : fork and run in background # pidFilePath:location of pidfile processManagement: fork: true # 空1格 pidFilePath: /var/run/mongod-configserver1.pid # 空1格 # network interfaces # Listen to local interface only, comment to listen on all interfaces. net: port: 28200 # 空1格 bindIp: 0.0.0.0 # 空1格 #operationProfiling: operationProfiling: slowOpThresholdMs: 1000 # 空1格 mode: slowOp # 空1格 #replication: replication: replSetName: fang-cs # 空1格 #sharding: sharding: clusterRole: configsvr # 空1格 7.启动(三台)这里演示一台启动master所有实例 # cd /usr/local/mongo/bin/ 进入mongo bin目录 # ./mongod -f /mongodb/mongod-a1-config.yml 启动config服务1-2-3 # ./mongod -f /mongodb/mongod-b1-config.yml # ./mongod -f /mongodb/mongod-c1-config.yml # ./mongod -f /mongodb/mongod-configserver1.yml 启动configserver1-2-3 8.登录Mongo(master) → slave1 → slave2 # ./mongo 192.168.2.98:28111/admin 28111是a1服务配置的端口 > use admin 转至主库下 > rs.initiate() 初始化fang-s-a的副本集 > rs.add("slave1:28111") 添加副本集 > rs.add("slave2:28111") > rs.conf() 查看副本集情况 (此时可以自行插入记录看看同步效果) # 登录到192.168.2.99 初始化fang-s-b 添加副本集 # ./mongo 192.168.2.99:28112/admin >rs.initiate() >rs.add("master:28112") >rs.add("slave2:28112") # 登录到192.168.2.100 初始化fang-s-c 添加副本集 # ./mongo 127.168.2.99:28113/admin rs.initiate() rs.add("master:28113") rs.add("slave1:28113") # 登录到192.168.2.98 初始化fang-cs添加副本集 # ./mongo 127.168.2.98:28200/admin > rs.initiate() rs.add("slave1:28200") rs.add("slave2:28200") 9. 添加分片集群 # 登录到192.168.2.98 # cd /usr/local/mongo/bin/ # ./mongos --port 28300 --configdb fang-cs/master:28200,slave1:28200,slave2:28200 --fork --logpath /home/log/mongodb/mongos.log --bind_ip 0.0.0.0 开启服务 # ./mongo 192.168.2.98:28300/admin 登录 > use admin > sh.addShard("fang-s-a/master:28111,slave1:28111,slave2:28111") > sh.addShard("fang-s-b/master:28112,slave1:28112,slave2:28112") > sh.addShard("fang-s-c/master:28113,slave1:28113,slave2:28113") 10.设置备节点永久读(验证副本集同步) 对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。 如果通过shell访问mongo,要在secondary进行查询。会出现如下错误: imageSet:SECONDARY> db.fs.files.find() error: { "$err" : "not master and slaveOk=false", "code" : 13435 } 有两种方法实现从机的查询: 第一种方法:db.getMongo().setSlaveOk(); 第二种方法:rs.slaveOk(); 但是这种方式有一个缺点就是,下次再通过mongo进入实例的时候,查询仍然会报错,为此可以通过下列方式 vi ~/.mongorc.js 增加一行rs.slaveOk(); 这样的话以后每次通过mongo命令进入都可以查询了
11.认证分片(登录mongos)
# ./mongo 192.168.2.131:28300/admin > use admin 启用分片键 > sh.enableSharding("mytest") > sh.shardCollection("mytest.student",{_id:"hashed"}) > for(var i=1;i<=50;i++){db.student.insert({age:i,"name":"mary",addr:"China"})} 测试 > db.student.find() 查看