mongo 主从仲裁
参考资料:https://www.cnblogs.com/xiangnanxiao/p/15273224.html
创建路径:
mkdir /home/mongodb/master/configdb mkdir /home/mongodb/master/db mkdir /home/mongodb/slave/configdb mkdir /home/mongodb/slave/db mkdir /home/mongodb/arditer/configdb mkdir /home/mongodb/arditer/db
创建配置文件(三个配置文件保持一致,如果在同一个服务器中一份文件即可)
vi /home/mongodb/master/configdb/mongod.conf
net: #启动端口 port: 27017 #允许连接的IP(0.0.0.0作用与--bind_ip_all类似) bindIp: 0.0.0.0 systemLog: #重新启动mongodb的时候日志拼接在以前的日志文件上 logAppend: true security: #路径是容器映射到宿主机的路径 keyFile: "/data/configdb/mongodbKeyfile.key" #开启客户端连接认证 disabled 关闭授权 authorization: "enabled" replication: replSetName: "mongo_rs"
cp /home/mongodb/master/configdb/mongod.conf /home/mongodb/slave/configdb/
cp /home/mongodb/master/configdb/mongod.conf /home/mongodb/arditer/configdb/
生成key文件(需要注意三个都需要用同一个文件,否则会出现验证失败的情况)
openssl rand -base64 756 > /home/mongodb/master/configdb/mongodbKeyfile.key
#key文件必须设置成400,否则将会失败
chmod 400 /home/mongodb/master/configdb/mongodbKeyfile.key
cp /home/mongodb/master/configdb/mongodbKeyfile.key /home/mongodb/slave/configdb/
cp /home/mongodb/master/configdb/mongodbKeyfile.key /home/mongodb/arditer/configdb/
yaml文件:mongo.yaml
version: '3.7'
services:
rs1:
image: mongo:3.6
volumes:
- /home/mongodb/master/configdb/:/data/configdb/
- /home/mongodb/master/db/:/data/db/
command: mongod -f /data/configdb/mongod.conf
ports:
- "27110:27017"
rs2:
image: mongo:3.6
volumes:
- /home/mongodb/slave/configdb/:/data/configdb/
- /home/mongodb/slave/db/:/data/db/
command: mongod -f /data/configdb/mongod.conf
ports:
- "27111:27017"
rs3:
image: mongo:3.6
volumes:
- /home/mongodb/arditer/configdb/:/data/configdb/
- /home/mongodb/arditer/db/:/data/db/
command: mongod -f /data/configdb/mongod.conf
ports:
- "27112:27017"
docker-compose -f mongo.yaml -p mongo.yaml up -d
进入容器配置主从
docker exec -it mongoyaml_rs1_1 mongo admin
rs.initiate({_id:"mongo_rs",members:[{_id:0,host:"172.31.0.86:27110"},{_id:1,host:"172.31.0.86:27111"},{_id:2,host:"172.31.0.86:27112",arbiterOnly:true}]})
以上是配置主、从、仲裁的全部配置,以下则是配置权限
#切换至admin use admin #添加用户 db.createUser({user:'admin',pwd:'123456',roles:[{role:'root',db:'admin'}]}) #登录 db.auth('admin','123456') 添加测试数据: use test #给测试库添加数据 db.userinfo.insert({"name":"张三","sex":"男"}) db.userinfo.insert({"name":"wangwu","sex":"女"})
进入slave中查看是否已经同步数据
docker exec -it mongo_slave mongo admin #切换至test库 use test #登录 db.auth('admin','123456') #设置备机可读 rs.slaveOk() #查询数据 db.userinfo.find()
python脚本测试:
from pymongo import MongoClient MONGO_POC_URI = 'mongodb://admin:123456@172.31.0.86:27110,172.31.0.86:27111,172.31.0.86:27112/admin?replicaSet=mongo_rs' MONGO_POC_DB_ENV = 'test' mongo_poc_client = MongoClient(MONGO_POC_URI, maxPoolSize=10,readPreference='secondaryPreferred') mongo_poc_db = mongo_poc_client[MONGO_POC_DB_ENV] ret = mongo_poc_db["userinfo"].find() print(list(ret)) r=mongo_poc_db["userinfo"].insert_one({"name":"hello", "sex":"man"}) print(r.inserted_id)
=========
可以为每一个数据库都设置角色和权限。
-
Read:允许用户读取指定数据库(不可进行任何更改,只能查看)
-
readWrite:允许用户读写指定数据库(任何操作,包括删有权限db中的col权限)
-
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
-
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
-
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
-
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
-
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
-
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
-
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
-
root:只在admin数据库中可用。超级账号,超级权限