### ACID
- [x] 指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity [ˌætəmˈɪsɪti])、一致性(Consistency [kənˈsɪstənsi] )、隔离性(Isolation [ˌaɪsəˈleɪʃn])、持久性(Durability [ˌdjʊərə'bɪlətɪ])。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
- Atomic原子性: 一个事务的所有系列操作步骤被看成是一个动作,所有的步骤要么全部完成要么一个也不会完成,如果事务过程中任何一点失败,将要被改变的数据库记录就不会被真正被改变。
- Consistent一致性: 数据库的约束 级联和触发机制Trigger都必须满足事务的一致性。也就是说,通过各种途径包括外键约束等任何写入数据库的数据都是有效的,不能发生表与表之间存在外键约束,但是有数据却违背这种约束性。所有改变数据库数据的动作事务必须完成,没有事务会创建一个无效数据状态,这是不同于CAP理论的一致性"consistency".
- Isolated隔离性: 主要用于实现并发控制, 隔离能够确保并发执行的事务能够顺序一个接一个执行,通过隔离,一个未完成事务不会影响另外一个未完成事务。
- Durable持久性: 一旦一个事务被提交,它应该持久保存,不会因为和其他操作冲突而取消这个事务。很多人认为这意味着事务是持久在磁盘上,但是规范没有特别定义这点。
--------------------------------------------------
### CAP
- [x] CAP是分布式系统中进行平衡的理论,CAP原则是NOSQL数据库的基石。
- Consistent一致性: 同样数据在分布式系统中所有地方都是被复制成相同。
- Available可用性: 所有在分布式系统活跃的节点都能够处理操作且能响应查询。
- Partition Tolerant [ˈtɒlərənt]分区容错性: 在两个复制系统之间,如果发生了计划之外的网络连接问题,对于这种情况,有一套容错性设计来保证。
###### CAP和ACID一致性区别
- [x] ACID一致性是有关数据库规则,如果数据表结构定义一个字段值是唯一的,那么一致性系统将解决所有操作中导致这个字段值非唯一性的情况,如果带有一个外键的一行记录被删除,那么其外键相关记录也应该被删除,这就是ACID一致性意思。
- [x] CAP理论的一致性是保证同样一个数据在所有不同服务器上的拷贝都是相同的,这是一种逻辑保证,而不是物理,因为光速限制,在不同服务器上这种复制是需要时间的,集群通过阻止客户端查看不同节点上还未同步的数据维持逻辑视图。
---
#### BASE
###### BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
- 基本可用(Basically Available)
- [x] 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
- [x] 电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
- 软状态( Soft State)
- [x] 软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
- 最终一致性( Eventual Consistency)
- [x] 最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
###### ACID和BASE的区别与联系
- [x] ACID是传统数据库常用的设计理念,追求强一致性模型。BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
- [x] ACID和BASE代表了两种截然相反的设计哲学
- [x] 在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此ACID和BASE又会结合使用。
---
##### MySQL多数据源
- 一主 两备 (即1个Master和2个Slave)可以支持得起千万级别的数据量
- Master写入;并且数据同步到Slave里面,让Slave来读取
- 写入的比较少,所以用一个Master,读取的量比较大用两个左右的Slave来分担负载 —— 不建议有4个以上的Slave,这样会存在Slave从Master中同步数据发生延迟再读取的话会发生异常(数据一致性问题);也不建议有2个及2个以上的Master,多余一个Master就会引入非常非常多的东西,并且两个Master主库之间也要进行数据同步
##### 1. Mysql主从复制
- 1.复制已经(<code>C:\Program Files\MySQL\MySQL Server 5.7</code>)安装好的MySQL到其他地方并伴随文件夹(<code>C:\ProgramData\MySQL\MySQL Server</code> 5.7)重要的只是其中的<code>my.ini</code>这个默认文件到时候会修改配置(把后面这个文件夹里面的东西放到前面那个文件夹里面就行)
- 2.复制两次到其他地方分别命名为<code>-3307/-3308</code>
- 3.在这两个的文件里面的my.ini里面修改配置文件:
```
basedir="G:/Plugins/MySQL Server 5.7-3307"
datadir=G:/Plugins/MySQL Server 5.7-3307/Data
在3308的里面的my.ini也是同样的修改
```
- 4.初始化数据库:cmd在管理员权限下切换到复制的这个3307/bin里面执行初始化命令:<code>mysqld --initialize-insecure --user=mysql</code>
再执行安装命令:<code>mysqld -install mysql3307</code>
(远程连接数据库:<code>mysql -h 172.16.10.162 -P 3306 -u root -p</code>)
- 5.(MySQL服务删除命令:<code>mysqld --remove mysql3307</code>)
(MySQL导出或者备份所有的库:<code>mysqldump -u root -p --all-databases > backup.sql</code>)
- 6.在Navicat里面新建一个数据库(即为3306的从库),本地地址端口号为3307和3308;因为3307和3308两个端口里面的数据都是从3306里面拷贝过来的(或者初始化过来的);所以这两个端口的账号密码和3306的一致;并且能够连接成功能够在3307/8里面看到3306里面原有的表;(确保3307/8的Data文件夹里面有来自3306的ibdata1这个文件,这个是数据库的数据信息)
###### MySQL主从复制的原理: 二进制日志 bin log
- Master数据库操作数据的时候会产生二进制日志文件,Slave数据库就会读取到这个二进制日志文件里面的Master操作行为继而Slave也这样操作
- 打开Server-id:
- Master-MySQL的Server-id=1;slave-mysql的server-id即3307=2;3308=3;这样id依次递增
- 打开 log-bin (即二进制文件的名称)<code>log-bin=mysql-bin</code>(主从节点都可以是这个名字,因为在不同的文件夹下)
- Master:打开/新建<code>binlog-do-db</code>(配置要同步的数据库是哪个数据库)<code>binlog-do-db=mamabike</code>;或者用<code>binlog-ignore-db</code>
- Slave::打开/新建 <code>replicate-do-db=mamabike</code>(即配置Slave从Master复制哪个数据库)
- 在Navicat里面的Master数据库里面执行命令行:<code>SHOW MASTER STATUS</code>,会查询出File(二进制文件),Position(主向从传输的位置),Binlog_Do_DB(是传输复制哪个数据库)等其他几个数据
- 在Navicat里面的Slave数据库里面执行命令行:<code>change master to master_host='127.0.0.1',master_port=3306,master_user='root',master_password='war3sxkcs',master_log_file='mysql-bin.000001',master_log_pos=xxx</code>;这个master_log_pos的值是从上面Master里面查询出来的值,填在这个位置,一定要填对
- 开启主从复制:在Slave数据库执行命令行:<code>START SLAVE</code>;查看状态:<code>SHOW SLAVE STATUS</code>
##### 2. Spring多数据源-主多从读写分离
###### 简单场景:修改代码复杂,但是部署简单
![image](https://sxk.s3.didiyunapi.com/pic/mysql/1.jpg)
###### 复杂场景:加入中间件,外置修改
评论区