MySQL通过数据库的复制,分片方法实现数据的分布式存储. 一般分分为一主和多主两种模式.
关键字: MySQL Replication
statement 记录语句原句, 总从环境不一致是如可能执行结果不同, 如进行delete主从使用的索引可能不一致.
row: 记录真是操作行的id, 避免上述情况
mixed: 属于前两种情况的折中, 对于可能引起主从不一致的使用row, 否则使用statement
主备延迟:原因主要有 机器性能差, 备库查询,报表较多导致压力大, 大事务的执行(归档类数据,大表)
可靠性优先:
通过SBM seconds_behind_master,记录当前备库延迟了多少秒, 可靠性备份步骤
可用性优先:
不等待主备机同步, 直接完成切换, 这时候可能会出现数据不一致. 如果binlog为mixed模式,
如果binlog为row模式,由于同步的时候记录rows 信息所以, 当主库和备库执行顺序相反时, 主备同步的应用线程会报错 duplicate key error错误从而防止.主备不同步.
可靠性方案的依赖seconds_behind_master, 可用性方案可能导致部分数据不一致
关键字: MySQL master master Replication
Circular Replication 循环复制,两个服务器之间进行异步binlog复制, 这种情况下,一般是master节点提供读写, stand-by master提供读操作, master出现故障切换到stanby-master库.
master-standby 模式中mater节点也会有自己的slave , standby主库节点间采用半同步复制, 数据丢失的风险降到最低.
主从结构,主库通过异步或半同步方式同步数据到备库, 主库发生故障从库,从库选一个节点做为主库, 从库其他节点从新的主节点复制数据.
与第一个个方案相类似,为了减少主节点的复制压力, 增加了中继节点
存在问题:
主主模式循环复制
可能存在问题:
使用半同步方式保证了主节点和备份主节点之间数据同步, 当主节点发生故障时,执行主节点故障转移时,此拓扑效果很好。 备用主服务器充当热备份服务器,因为与其他从属服务器相比,备用主服务器具有最新数据的可能性最高。
多源复制可用于将多个主服务器备份到单个服务器,合并表分片
MySQL和MariaDB具有不同的多源复制实现,其中MariaDB必须具有配置了gtid-domain-id的GTID,以区分原始事务,而MySQL为从属服务器复制的每个主服务器使用单独的复制通道。 在MySQL中,可以将多源复制拓扑中的主服务器配置为使用基于全局事务标识符(GTID)的复制或基于二进制日志位置的复制。
混合复制是Galera提供的MySQL异步复制和虚拟同步复制.
硬编码实现数据分片: 根据业务数据特点, 通过具体应用的属性来设置分片
映射表外部存储: 解耦一种方式防止,应用字段调整导致,重新分片处理
对于一个分布式系统而言,网络失效一定会发生, 分区耐受性P存在情况下, 一致性和可用性必须二选一。
最终一致性:通过各种解决方式最终达到一致。
最终一致写冲突解决方案:
ACID:传统数据库
BASE: NoSQL
Zookeeper 和分布式一致性架构
脑裂: 一次故障由于网络调整导致两个数据库集群的, 虚拟IP互通导致,数据库无法启动.
数据库主主备份:
zookeeper的分布式一致性保证。
投票选举模式
三个阶段:
1 Prepare阶段:Propser 向Acceptors发出Prepare请求。 Acceptors针对收到Prepare进行Promise承诺。
投票要有顺序, Proposal ID 全局递增
zookeeper使用协议
Administrator • setData(“/config/param1”, "value” ,-1)
Consumer • getData("/config/param1", true)
Monitoring process:
1. Watch on /nodes
2. On watch trigger do getChildren(/nodes, true)
3. Track which nodes have gone away
Each Node:
1. Create /nodes/node-${i} as ephemeral nodes
2. Keep updating /nodes/node-${i} periodically for node status changes (status updates could be load/iostat/cpu/others)
爬虫禁爬协议
哪些文档中包含关键词,通过文档矩阵构建倒排索引, 词和文档列表
存在的问题:
证明设计的产品必要性对现有工作有帮助.
功能目标
非功能目标.
约束
集群:
容量:
可用性:
伸缩性,平滑扩容
高性能:
/**
* 映射关系算法主要算法过程,构造物理节点到虚拟节点的映射关系
* 客户端路由一般不需要该方法,server端迁移的时候若以虚拟节点为单位迁移需要调用该方法
* @param physicalNodesNum 映射关系中物理节点的数目
* @param virtualNodesNum 映射关系中虚拟节点的数目
* @return List方式的二维数组,第一维(级)物理节点,第二维(级)是虚拟节点
*/
public static List<List<Integer>> makeP2VMapping(int physicalNodesNum, int virtualNodesNum) {
List<List<Integer>> h = new ArrayList<List<Integer>>();
List<Integer> t = new ArrayList<Integer>();
for (int i = 0; i < virtualNodesNum; i++) {
t.add(i);
}
h.add(t);
if (physicalNodesNum == 1) {
return h;
}
for (int k = 2; k <= physicalNodesNum; k++) {
List<List<Integer>> temp1 = new ArrayList<List<Integer>>();
List<Integer> temp3 = new ArrayList<Integer>();
int y[] = new int[k];
for (int i = 1; i <= k; i++) {
y[i - 1] = (virtualNodesNum - sumY(y, i - 1)) / (k + 1 - i);// 初始化物理节点内虚拟节点数目
}
for (int j = 0; j < (k-1); j++) {
List<Integer> temp2 = new ArrayList<Integer>();
for (int x = 0; x < h.get(j).size(); x++) {
if (x < y[j]) {
temp2.add(h.get(j).get(x));
} else {
temp3.add(h.get(j).get(x));
}
}
temp1.add(temp2);
}
temp1.add(temp3);
h = temp1;
}
return h;
}
private static int sumY(int[] y, int i) {
int sum = 0;
for (int k = 0; k < i; k++) {
sum += y[k ];
}
return sum;
}
递增的处理, 每次从新增一个物理节点, 从原有节点取出排在后面的节点放到新的物理节点里 . 如10个虚拟节点映射到3个物理节点, 一共循环三次:
对等 Node 访问
双写保证可用性(W=2, R=1)
基于分区算法查找两个 Node
数据恢复和数据同步
数据分组
架构师训练营作业-李智慧老师相关讲义
Photo by Vlad Chețan from Pexels
https://medium.com/swlh/zero-downtime-master-slave-replication-4f2814138edf
Mysql实战45讲
领取专属 10元无门槛券
私享最新 技术干货