分布式集群下面有4个节点 如果由于网络原因导致 node1和node2在一个网络 记为A node3和node4在另外一个网络 记为B 网络A和网络B是隔绝的 所以就可能出现2个网络的节点往共享存储池中针对同一份数据存储多次 并且由于node和node2不知道其他节点的存在 所以就会尽可能的抢占集群资源 为了解决这个问题 就采用投票机制 SUM/2+1即总票数/2+1 如上图 4/2+1=3票 如果集群中4个节点有3个节点是存活的 就会工作 如果在集群中有3个节点 3/2+1=2 如果有2个节点就会继续工作 如果出现了脑裂即 node1和node2在一个网络 记为网络A node3和node4在另外一个网络 记为网络B 网络A中还剩2个节点 那么就自杀了 因为这个时候死掉比活着更安全 死掉充其量业务宕掉了 如果不死 那么就会把数据搞乱了 所以一半不会部署双数的节点 而是部署单数的节点
MDS (MetaData Server)
只有CephFS才会有这个角色 这个是存放文件系统的元数据(比如把文件系统格式成NTFS或EXT4 往EXT4写数据) 但因为是分布式文件系统 它有一个专门的角色来存放这个元数据 所以这个不是必须的 是可选的 而monitor是存放切片的元数据
Ceph关键概念
mon会计算数据存放在哪个osd 最后写到哪个硬盘中去 mds也可以存放多份
Ceph数据存储过程
一个文件进行切片 每一小块对应一个对象编号oid 对oid尽性hash计算 并加上一个掩码 得到一个gpid "gp类似于一个文件夹 里面存放的是一个一个小的切片" gpid是文件夹编号 然后通过crush算法 知道了 gpid这个文件夹里面的文件存放在哪些osd中
PG数量规划
Placement Group 归置组
不管通过什么方式写入数据进来 通过crushmap映射表路由到某一个pg 然后有pg把数据写入到osd中 osd写入到硬盘中
Crushmap算法
假设一个存储池有10个唯一数据的分片
如果算上副本的话 那么有30个分片 crushmap就是把pg数据打散写到各个硬盘中 monitor会管理crushmap
在创建存储池的一刹那 会把硬盘切分成很多分 放在一个map中 一个文件被切了10个分片 那么就会有10个oid 对oid进行hash计算 则一定会在hash环上找到一个位置
缺点:数据量特别多 每次寻址特别慢
假设有1000万个对象 monitor记录的映射数据就特别多 每次查询的时候就特别慢 为了解决这个问题 就引入了pg 归置组的概念
hash(oid) & mask 得到一个pgid
比如有128个pg hash(oid)值加上一个掩码得到一个pgid 所以把数据写入到pg来 pg是一个逻辑的概念 相当于一个文件夹 文件夹里面放了很多文件 通过文件夹找文件就很方便 没有文件夹的话 直接找文件 就会很慢 然后通过crush算法把gp数据写入到一些osd中
pg优势
缩小搜索区域 提高查询速度
pg的数量越多越好?
取值是2的n次方 计算公式:(osd的数量 * 每个osd的pg数)/ 副本数 / 存储池的数量 每个osd的pg数量 默认是100 存储池的数量比如是2 比如 9个osd 9*100/3/2=150 pg的取值是2的n次方 比150大的就是256 所以pg的数量是256 pg数量是在创建的时候规划的
OSD写流程
客户端写到主的缓存中 主的缓存写到2个副本的缓存 2个副本的缓存写入成功之后再回应给主 主副本在回应给客户端
oracle数据库后端存储可以用ceph
ceph也可以对接RGW对象存储