• Golang database/sql 数据库连接源码阅读

    Golang database/sql 数据库连接源码阅读 代码仓库 database/sql 打开数据库连接方法 打开数据库连接 sql.Open() 返回 *sql.DB // Open 打开一个由数据库驱动名称和驱动特定的数据源名称指定的数据库, // 通常至少包括一个数据库名称和连接信息。 // // 大多数用户会通过一个特定于驱动的连接助手函数来打开数据库,该函数返回一个 [*DB]。 // Go 标准库中不包含数据库驱动。请参见 <https://golang.org/s/sqldrivers> 获取第三方驱动列表。 // // Open 可能仅验证其参数而不创建数据库连接。要验证数据源名称是否有效,请调用 [DB.Ping]。 // // 返回的 [DB] 对象是线程安全的,可以被多个 goroutine 并发使用,并维护自己的空闲连接池。 // 因此,Open 函数通常只需调用一次。通常不需要关闭 [DB]。 func Open(driverName, dataSourceName string) (*DB, error) { driversMu.RLock() driveri, ok...

  • raft

    分布式系统下的一致性问题 分布式系统有多个服务节点,给定一系列操作,在约定协议的保障下,使得它们对处理结果达成某种程度的协同。 分布式系统中的节点通信存在两种模型: 共享内存(Shared memory) 消息传递(Messages passing)。 基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:进程可能会响应慢、被杀死或者重启,消息可能会延迟、丢失、重复;发生上面任意一种异常都会对分布式系统中各个节点对某一个值达成一致性产生问题。 一致性 强一致性 弱一致性 最终一致性 共识算法 共识算法(Consensus Algorithm)是分布式系统中用于在多个节点之间就某个值达成一致的算法,即使在存在节点故障、网络分区的情况下,也能确保系统状态的一致性。 共识算法解决的问题 共识算法解决的是分布式系统对某个提案(Proposal),大部分节点达成一致意见的过程。提案泛指多个事件发生的顺序、某个键对应的值…对于分布式系而言,各个节点通常都是相同的确定性状态机模型(又称为状态机复制问题,State-Machine Replication),从相同初始状态开始接收相同顺序的指令,则可以保证相同的结果状态。 这里共识算法需要解决两个基本问题: 如何提出一个待共识的提案(令牌传递、随机选取…) 如何让多个节点对提案达成共识(投票、规则验证…) 现实网络环境中存在各种各样的问题,在分布式环境下,共识算法还需要解决如通信问题(网络中断、分区)、节点故障、消息伪造… CAP定理 CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点,只能满足三项中的两项: C(一致性):任何事务都应该是原子的,所有副本上的状态都是事务成功提交后的结果,并保持强一致性。 A(可用性):系统正常节点能在有限时间内完成对操作请求的应答。 P(分区容错性):系统中的网络可能发生分区故障(成为多个子网、节点上线和下线),节点之间的通信无法保障,而网络故障不应该影响到系统正常服务。 结论:在分布式系统中 P 必须要保证,只能在 C 和 A 之间权衡: 保 C(强一致性)→ 可能牺牲可用性(如 Zookeeper) 保 A(高可用)→ 只能是最终一致性(如 Dynamo、Cassandra) 三类系统模型 CA(一致性+可用性):包括完全严格的仲裁协议,例如2PC(两阶段提交)。 CP(一致性+分区容错性): 包括多数仲裁协议,其中少数分区不可用,例如Paxos。 AP(可用性+分区容错性): 包括执行最终一致性的协议,例如Gossip。...

  • pt-osc 执行流程

    地址 https://github.com/percona/percona-toolkit/tree/3.x/bin 使用文档 详细执行流程如下: 相关环境参数检查 检查该表格是否存在 show create table tbosc create table _tbosc_new alter table _tbosc_new  创建删除触发器 pt_osc_dbddl_tbosc_del (如果数据修改的时候,还没有拷贝过来,修改后再拷贝则是覆盖,正确;如果是已经拷贝过来,再修改,也是正确,这里同时会检查是否具有主键或者唯一索引,如果都没有,这一步会报错,提示The new table dbosc._tbosc_new does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger.) 创建更新触发器 pt_osc_dbddl_tbosc_upd 创建插入触发器 pt_osc_dbddl_tbosc_ins 按块拷贝数据到新表,拷贝过程对数据行持有S锁 analyze 新表 rename 表名,RENAME TABLE dbddl.tbosc TO dbddl._tbosc_old,...