一.集群规划
规划分片、副本集、服务配置、配置实例
切片名称 | Master | Slave1 | Slave2 | 端口 |
fang-s-a | a1 | a2 | a3 | 28111 |
fang-s-b | b2 | b1 | b3 | 28112 |
fang-s-c | c3 | c1 | c2 | 29113 |
fang-cs | configserver1 | configserver2 | configserver3 | 28200 |
fang-cs实例 | a1、b1、c1 | a2、b2、c2 | a3、b3、c3 |
二.搭建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 logAppend: true path: /home/log/mongodb/a1/mongodb.log # db存储位置 storage: dbPath: /mongodb/a1 journal: enabled: true # fork : 后台运行 # pidFilePath: pidfile的位置 processManagement: fork: true pidFilePath: /var/run/mongod-a1.pid # 仅收听本地界面 net: port: 28111 # 注意这里端口b1要改28112、c1要改28113 bindIp: 0.0.0.0 # operation剖析 operationProfiling: slowOpThresholdMs: 1000 mode: slowOp # 复制 replication: replSetName: fang-s-a # 注意b1配置这里a要改b、c1要改28113 # 分片 sharding: clusterRole: shardsvr 6.配置mongod-configserver1.yml文件(三台) slave1数值是2 slave2是3注意以下格式是固定不然后面启动不了! # vim /mongodb/mongod-configserver1.yml # mongod config systemLog: destination: file logAppend: true path: /home/log/mongodb/configserver1/mongodb.log # Where and how to store data. storage: dbPath: /mongodb/configserver1 journal: enabled: true # fork : fork and run in background # pidFilePath:location of pidfile processManagement: fork: true pidFilePath: /var/run/mongod-configserver1.pid # network interfaces # Listen to local interface only, comment to listen on all interfaces. net: port: 28200 bindIp: 0.0.0.0 #operationProfiling: operationProfiling: slowOpThresholdMs: 1000 mode: slowOp #replication: replication: replSetName: fang-cs #sharding: sharding: clusterRole: configsvr 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)slave1slave2 # ./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命令进入都可以查询了