-----集群和安全----
1.副本集(相当于一台机器挂掉,另外一台来代替)
与主从复制的区别:副本集没有固定的主节点,副本集总有一个活跃点
(主,primary可读写)和一个或多个从节点secondary(备份,读或选举)
2.副本集的三种角色
1.primary主要成员 可读写
2.replicate 副本成员 可读,选举
3.arbiter 仲裁者 不存放任何业务数据(只负责选举主节点) rs.slaveOk() 也没有用
3.副本集的搭建
#建立三个文件夹放配置文件和log文件
#联系3个节点起来
#登录主节点
mongo --host=xxxx.xxx.xxx.xxx --port=27017
#初始化副本集用默认的配置
rs.initiate()
#查看节点运行状态
#添加副本从节点,公网ip
rs.add("180.76.159.126:27018")
#添加仲裁节点
rs.addArb("180.76.159.126:27019")
#查看主节点获取数据的状态
db.comment.find();
#从节点,不能使用show dbs;
#切换到从节点,让从节点承认是从节点,才可以看
rs.slaveOk() //默认true
#返回主节点查看
db.comment.find();
#可以到从节点查看,取消从节点
rs.slaveOk(false);
- 主节点选举原则
什么时候选举?
1.主节点故障
2.主节点网络不可达(心跳10秒)
3.人工干预 res.stepDown(600)
怎么选举?
1. 全部成员/2+1,大多数节点支持(没有节点,[除了自己投自己]就不满足)
2.票数相同,新的节点胜,通过oplog找到数据是新的节点的数据新旧
3.优先级大priority可以(可以设置额外票数)
默认 仲裁节点优先级为0 主节点1 从节点1
4.故障测试
#杀掉子节点,对操作没有问题
ps -ef | grep mongo
kill -2 4045#第二个参数
#主节点插入数据,副本节点挂,重启 会自动同步数据到子节点
#杀掉主节点27017,27018会成为主节点
#仲裁节点和主节点故障,副本节点还是副本节点
#成员恢复数量,又自动选举
#仲裁节点和副本节点都没有了,主节点自动降级为副本节点
5.springdata连接副本集,改ip
var config=rs.config();
config.members[0].host="xxid:27017";
rs.reconfig(config);
//工具修改副本名,也可以通过选择主节点和副本节点
//改配置文件,通过uri
uri: mongodb://xxid:port,xxid:port,xxid:port/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs
6.分片集群(把数据拆分到不同服务器的方法,可以让几台小服务器有一台大服务器的效果)shareded cluster 副本集的再备份一个服务器
拓展系统性能的方式:垂直拓展(就是加一台服务器的性能内存带宽,直接加,性能有上限),水平拓展(多台服务器联合,无上限)
组件
1.分片(副本集)
2.mongos路由,调用寻找分片的接口,返回所有数据
3.config servers 去寻找分片
如图mongo1
7.搭建副本集 sharding分片角色
//清除之前创建的monogo服务
//全部要自己搭建起来,是局域网ip和副本集的集群名不同
//配置文件的副本集 clusterRole:configsvr
//主节点mongos加入分片,通过配置文件加入配置节点
//不能插入数据,需要添加和开启分片
sh.addShard("myshardrs02/xxxip:xxport,xxip:xxport,xxip:xxport")
sh.enableSharding("articledb")#库名
//对库名.集合开启集合分片,根据自动生成的hash值范围分片(不同的片放在不同的地方)
sh.shardCollection("article.comment",{"nickname":"hashed"})
8.分片策略 哈希(平均分布,不确定范围)和范围(插入数据的时候,再分范围,确定范围用)策略
sh.shardCollection("article.author",{"age":1})
#看分片策略,就看不同客户端的查看数据
use articledb
#循环插入1000条数据,js语法,会平均分配
for(var i=1; i<=1000;i++){db.comment.insert({_id:i+"",nickname:"xxx"+i})}
show collections
db.comment.count()
show dbs
use articledb
db.comment.count()
#为了查看效果,默认会存在chunk块64m,我们设置成1m
use config
db.settings.save({_id:"chunksize",value:1})
#author保存2万条数据
#下一页
it
9.再增加一个路由节点(云服务器ip必须是公网才能启动)
10.springData连接
//还是一样
spring:
mongodb:
#连接哪个数据库
uri: mongodb:mongsip:port,ip:port/articledb
11.安全认证,类比mysql就是登录了有什么权限
0.启用访问控制才能进行读写操作
1.角色(默认的角色已经够用了)还有很多
内置的角色: 常用的 read只读 readWrite可以读写 userAdmin可以创建数据库和修改用户
root 超级管理员,所有权限
2.权限
3.使用
1.单机服务使用
//使用管理员才能管理,和mysql一样
use admin
//创建超管用户
db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
//专门管理myadmin用户,指定操作的数据库是admin数据库
db.createUser({user:"myadmin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
//查看创建了哪些用户
db.system.users.find()
//删除用户
db.dropUser("myadmin")
//修改用户密码
db.changeUserPassword("myroot","12345")
//必须切换admin 才能测试 用户登录
use admin #可以不用切换数据库验证
db.auth("myroot","12345")
// (常用)使用普通用户 只读和修改某个数据库,!!!必须切换admin登录超级管理员账号后,切换那个数据库才能添加 这个用户否则验证失败!!!
use articledb
// !!! db的名字 与切换的数据库名要一致
db.createUser({user:"aaa",pwd:"123456",roles:[{role:"readWrite",db:"articledb"}]})
#登录aaa用户
db.auth("aaa","123456")
12.在服务端开启了认证,客户端登录(经常使用)
#需要修改配置文件 mongod.conf
mongod --config ../config/mongod.conf
security:
authorization: enabled
#虽然进得去但是操作不了
#我们登录
db.auth("myroot","123456")
show collections
exit
#使用普通用户,必须切换数据库再验证
db.auth("aaa","12345")
13.springData 连接mongodb的两种方法
1. 加上
2.uri方式 用户名+密码
uri:mongodb://aaa:12345@ip:27017/article
14.集群安全认证 需要key文件加密(集群中key文件都相同)
1.副本集 全部启动起来
2.登录主节点
3.创建myroot账户
4.生成key文件
#生成90位的加密文件
openssl rand -base64 90 -out ./mongo.keyfile
#只对当前用户可读,比较安全 4读 2写 1执行
chmod 400 ./mongo.keyfile
#复制到每个节点的目录与conf文件一起
4.全部集群配置文件 把权限打开
security:
keyFile: /xxxx/mogo.keyfile
authorization: enabled
#在主节点有账户,从节点也有这个账户
15.分片集群 每个节点都需要keyfile,先放文件后创建用户