Skip to content

Commit 4e7b9ae

Browse files
add
1 parent 19ce29d commit 4e7b9ae

File tree

17 files changed

+318
-41
lines changed

17 files changed

+318
-41
lines changed

README.md

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
* [Tomcat](web/tomcat.md)
4242
* 协议
4343
* [HTTP 协议](web/http协议.md)
44-
* [TCP 的三次握手与四次分手](http://www.jellythink.com/archives/705)
44+
* [TCP 协议](web/tcp.md)
4545
* [CDN](web/CDN.md)
4646
* [其它](web/other.md)
4747

@@ -84,7 +84,7 @@
8484

8585
* 分布式数据框架
8686
* [cobar](middle-software/cobar.md)
87-
* [Mycat](https://github.com/MyCATApache/Mycat-Server)
87+
* [Mycat](middle-software/mycat.md)
8888
* [tsharding](middle-software/tsharding.md)
8989
* [tddl](https://github.com/alibaba/tb_tddl)
9090
* [sharding-jdbc](https://www.slahser.com/2016/06/25/%E5%BD%93%E5%BD%93%E7%9A%84sharding-jdbc%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB/)
@@ -97,7 +97,6 @@
9797
* [Spark](middle-software/Spark.md)
9898
* [Hadoop](middle-software/Hadoop.md)
9999
* [Hive](middle-software/Hive.md)
100-
* [Flink](middle-software/Flink.md)
101100
* [other框架](middle-software/big-data.md)
102101

103102
* 配置管理
@@ -124,12 +123,10 @@
124123
### 项目管理
125124

126125
* [论需求调研的重要性](project-management/论需求调研的重要性.md)
127-
* [项目生命周期](project-management/项目生命周期.md)
128-
* [项目管理案例](project-management/项目管理案例.md)
129-
* [代码规范](project-management/代码规范.md)
130-
* [git常用命令](project-management/git常用命令.md)
131-
* [ab性能压测](other/ab测试.md)
132-
* [maven仓库](http://www.mvnrepository.com/open-source/http-clients)
126+
* [项目管理](project-management/项目管理案例.md)
127+
* [代码管理](project-management/code.md)
128+
* [测试相关](project-management/test.md)
129+
133130

134131
### 运维
135132

@@ -142,17 +139,7 @@
142139

143140
* [Tom的读书单](other/book.md)
144141
* [个人成长与职业规划](other/person.md)
145-
* 学习网站
146-
* [infoQ](http://www.infoq.com/cn/)
147-
* [云栖社区](https://yq.aliyun.com/)
148-
* [并发编程网](http://ifeve.com/)
149-
* [开源中国](http://www.oschina.net/)
150-
* [stackoverflow](http://stackoverflow.com/)
151-
* 视频网站
152-
* [慕课网](http://www.imooc.com/)
153-
* [网易云课堂](http://study.163.com/)
154-
* [腾讯课堂](https://ke.qq.com/course/list/spark)
155-
* [github 伯乐在线](https://github.com/jobbole)
142+
* [学习网站](other/study.md)
156143
* [程序员素养](project-management/程序员素养.md)
157144

158145
### 其它

data-base/数据库连接池.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
2626

27-
附加功能:
27+
**附加功能**
2828

2929
* 监控,比如打印每一条sql详情,统计慢sql
3030
* 统计,sql调用次数、时间等

middle-software/Spark.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
---
44

5-
Spark Core
5+
### 一、Spark Core
66

77
* [读书笔记](Spark-core笔记.md)
88
* [Spark 安装、启动](Spark-stream.md)
@@ -13,7 +13,7 @@ Spark Core
1313
* [基本架构及原理](http://www.cnblogs.com/tgzhu/p/5818374.html)
1414
* [Spark从入门到调优,是否有捷径可走?](https://mp.weixin.qq.com/s/6dCZrPi9sI-BRX0L3F5z3g)
1515

16-
Spark Streaming
16+
### 二、Spark Streaming
1717

1818
* [读书笔记](Spark-stream笔记.md)
1919
* [github上的一些资料](https://github.com/allwefantasy/my-life)
@@ -22,11 +22,11 @@ Spark Streaming
2222
* [Spark Streaming中流式计算的困境与解决之道](http://mp.weixin.qq.com/s/URJg23Pz0rkFFAjWCdYB1w)
2323
* [以Flink为例,消除流处理常见的六大谬见](https://mp.weixin.qq.com/s/Mdcupaqfni_qPeZWUHxNVA)
2424

25-
Spark SQL
25+
### 三、Spark SQL
2626

2727
* [读书笔记](Spark-SQL笔记.md)
2828

29-
MLlib
29+
### 四、MLlib
3030

3131
* [读书笔记](Spark-MLlib笔记.md)
3232

middle-software/big-data.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
## 大数据相关的其它框架
22
----
33

4-
4+
* [Flink](Flink.md)
55
* [Flume](https://github.com/apache/flume)
66
* [Sqoop]()
77
* [Pig]()

middle-software/kafka.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
Kafka是由LinkedIn开发的一个开源分布式基于发布/订阅的消息系统,Scala编写。
77
Producer向broker push消息;Consumer从broker pull消息(pull模式则可以根据Consumer的消费能力以适当的速率消费消息)
88

9-
#### 目标:
9+
### 目标:
1010

1111
* 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
1212
* 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
1313
* 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输(注意:非整体有序,如果有顺序要求,可以只配置一个partition)。
1414
* 同时支持离线数据处理和实时数据处理。
1515

1616

17-
#### 核心组件:
17+
### 核心组件:
1818

1919
* Broker
2020

@@ -59,7 +59,7 @@ Kafka集群会保留所有的消息,无论其被消费与否。两种策略删
5959
* 二是基于Partition文件大小,可以通过配置$KAFKA_HOME/config/server.properties
6060

6161

62-
#### 消息的有序性
62+
### 消息的有序性
6363

6464
* https://github.com/chenryn/logstash-best-practice-cn/blob/master/contrib_plugins/kafka.md
6565
* https://github.com/chenryn/ELKstack-guide-cn/blob/master/logstash/scale/kafka.md
@@ -71,6 +71,10 @@ Kafka集群会保留所有的消息,无论其被消费与否。两种策略删
7171
kafka 的消息模型是对 topic 分区以达到分布式效果。每个 topic 下的不同的 partitions (区)只能有一个 Owner 去消费。所以只有多个分区后才能启动多个消费者,对应不同的区去消费。其中协调消费部分是由 server 端协调而成。使用者不必考虑太多。只是消息的消费是无序的。
7272

7373
总结:如果想保证消息的顺序,那就用一个 partition。 kafka 的每个 partition 只能同时被同一个 group 中的一个 consumer 消费。
74+
75+
### 源码分析
76+
77+
* [源码分析笔记]()
7478

7579
### 其它资料
7680

middle-software/mycat.md

Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
## mycat
2+
3+
---
4+
5+
### 一、问题
6+
7+
* 目前有哪些好的开源分布式数据框架?
8+
* 引入成本如何?
9+
* 是否支持分布式事务?
10+
* 是否支持动态修改配置项?
11+
* 集群性能如何?
12+
* 社区是否活跃?内部源码?
13+
* mycat如何搭建读写分离?
14+
* mycat如何做到主从切换?
15+
* 支持哪些分片算法?
16+
* 查询多张分表,支持结果集合并,如果涉及翻页或排序,需要对合并后的结果做二次加工处理。
17+
*
18+
19+
20+
### 二、数据相关
21+
22+
分布式数据库特性:
23+
24+
* 透明性。用户不需要了解内部结构,表现就象一个传统的单处理机系统。
25+
* 扩展性。通过横向扩展使集群的整体性能提升。
26+
* 可靠性。不允许单点,如果一台机器坏了,则其他机器能接替它进行工作。
27+
28+
数据分片:
29+
30+
* 水平切分。按分表键,将表的行数据拆分到多个节点库中。逻辑上单表,物理上多表。
31+
* 垂直切分。一个数据库由很多表组成,每个表对应不同的业务。垂直切分,将表进行分类分布到不同的节点上。类似电商按商品线、交易线、会员线、店铺线等拆分到不同的DB。
32+
33+
技术点:
34+
35+
* 支持多数据源
36+
* 主库、备库切换
37+
* 分库
38+
* 分表
39+
* 支持千亿级别大表
40+
* 事务、分布式事务
41+
* 读写分离
42+
* 数据合并
43+
* 在线扩容
44+
* 数据迁移
45+
* 系统监控
46+
47+
### 三、Mycat核心组件及配置
48+
49+
**Mycat是java编写的!!!**
50+
51+
#### 核心组件
52+
53+
* 逻辑库(Schema)
54+
55+
数据库中间件被当成作一个或多个数据库集群构成的逻辑库。
56+
57+
* 逻辑表(table)
58+
59+
逻辑表可以分布在一个或多个分片库中,也可以不分片。
60+
61+
```
62+
<table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>
63+
```
64+
t_user分片表,数据按照规则被切分到dn1、dn2两个节点。
65+
66+
```
67+
<table name="t_node" primaryKey="id" autoIncrement="true" dataNode="dn1" />
68+
```
69+
t_node表,非分片表,只存在于节点dn1。
70+
71+
`primaryKey:逻辑表对应真实表的主键。对于分片规则使用非主键进行分表,如果使用主键查询会,会扫描所有分表,配置了该属性,mycat会缓存主键与dn的信息,避免所有表扫描,提升性能。但如果缓存没有命中,还是会把SQL发给所有的dn执行来获取数据。`
72+
73+
* 分片节点(dataNode)
74+
75+
```
76+
<dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/>
77+
<dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>
78+
```
79+
一个大表被分到不同的分片数据库上,每个表分片所在的数据库就是分片节点
80+
81+
* 节点主机(dataHost)
82+
83+
```
84+
<dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
85+
<heartbeat>show status like 'wsrep%'</heartbeat>
86+
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
87+
</writeHost>
88+
</dataHost>
89+
```
90+
同一台机器上可以有多个分片数据库。为了避免单节点主机并发数量的限制,尽量将读写压力高的分片节点均匀地放在不同的节点主机上。
91+
92+
`上面只列了几个核心参数,更多参数详细说明可参考《基于mycat中间件P22》`
93+
94+
#### 配置文件:
95+
96+
* server.xml
97+
98+
主要是配置系统信息,有两个重要标签 user、system
99+
100+
* schema.xml
101+
102+
主要是逻辑库、逻辑表、分片规则 、分片节点、数据源
103+
104+
* sequence
105+
106+
在分库分表的情况下,数据库的自增主键无法保证在集群中是全局唯一的主键,因此mycat提供了全局的sequence,并支持本地配置、数据库配置等多种实现方式。
107+
108+
* rule.xml
109+
110+
分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。
111+
112+
* log4j.xml
113+
114+
日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题。
115+
116+
autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件
117+
118+
* lib
119+
120+
MyCAT自身的jar包或依赖的jar包的存放目录。
121+
122+
* logs
123+
124+
MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件
125+
126+
#### 分片规则
127+
128+
* 取模分片(常用的方式)
129+
130+
对分表键id按总的分表数求模计算,比如模为0,放在第1张表,模为1,放在第2张表。
131+
132+
* 枚举分片
133+
134+
配置文件中配置可能的枚举id,指定数据分布到不同的物理节点上。本规则适用于按省份或县区来拆分数据。
135+
136+
* 范围分片
137+
138+
按分片字段的某个范围放入对应分片。比如0~1kw,放在第1张表,1kw~2kw,放在第2张表
139+
140+
* 范围求模算法
141+
142+
范围分片+取模分片的组合。先根据id找到对应的分片组,分片组内使用求模可以保证组内的数据分布比较均匀。事先规定好分片的数量,数据扩容时按分片组扩容,原有的分片组的数据不需要迁移。由于分片组的数据分布比较均匀,所以分片组内可以避免热点数据问题。
143+
0~1kw=5 //表示该组有5个分片节点
144+
145+
* 固定分片hash算法
146+
147+
* 取模范围算法
148+
149+
* 字符串hash求模范围算法
150+
151+
与取模算法类似,该算法支持数字、符号、字母取模。截取长度为prefixLength的子串,再对子串中每个字符的ascii码求和得出sum,然后对sum进行求模运算。
152+
153+
* 一致性hash算法
154+
155+
有效解决分布式数据的扩容问题。`每个真实的数据库节点会被映射为N倍虚拟节点,默认是160倍`
156+
157+
* 按日期(天)分片
158+
159+
从开始时间算起,每隔sPartionDay天,对应一个数据分区。
160+
161+
* 按月单小时算法
162+
* 自然月分片算法
163+
* 日期范围hash算法
164+
165+
先根据日期的范围分组,再根据时间hash分到每组下对应的分片。
166+
167+
168+
169+
### 四、mycat优势
170+
171+
* 对Cobar代码进行了重构,使用NIO重构了网络模块,并优化了Buffer内核,增强了聚合、join等基本特性
172+
* 支持绝大部分数据库,如oracle、mysql、sqlserver、db2、MongoDB 等,成为通用数据库中间件
173+
* 支持透明的读写分离机制,减轻写库压力,提高数据库的并发查询能力
174+
* 大表水平分片方式支持100亿级的数据存储
175+
* 内建数据库集群故障切换机制,实现了自动切换
176+
* 提供reload命令,例如更新了schema.xml文件后,不用重启即可进行配置文件更新。
177+
178+
179+
180+
### 五、源码分析
181+
182+
mycat前身Amoeba、Cobar。
183+
184+
[github 源码](https://github.com/MyCATApache/Mycat-Server)
185+
186+
Mycat核心是拦截用户发过来SQL语句,做一些分析,例如SQL解析、分片分析、路由分析、读写分离分析、缓存分析等,然后将SQL语句发往后端的真实数据库,并将返回的结果做适当处理,最终返回给用户。
187+
188+
**架构剖析**
189+
190+
191+
192+
193+
194+
### 六、Mycat安装
195+
196+
如何安装?
197+
198+
[https://github.com/MyCATApache/Mycat-Server](https://github.com/MyCATApache/Mycat-Server)
199+
200+
`下载文件直接解压。执行./mycat start 启动`
201+
202+
```
203+
./mycat start 启动
204+
./mycat stop 停止
205+
./mycat console 前台运行
206+
./mycat restart 重启服务
207+
./mycat pause 暂停
208+
./mycat status 查看启动状态
209+
```
210+
211+
### 七、Mycat实战
212+
213+
#### 1.搭建读写分离
214+
215+
主数据提供写操作,从数据库提供读操作,有效减轻单台数据库的压力,主数据库进行写操作后,数据及时同步到所读的数据库,尽可能保证两边数据一致。
216+
217+
```
218+
主(M1)<----> 备(M2)
219+
|
220+
|
221+
从(S1)
222+
```
223+
224+
* balance为0。不开启读写分离,所有的读全发送到M1
225+
* balance为1。所有的读发送到S1和M2
226+
* balance为2。所有的读发送到M1、M2和S1
227+
* balance为3。所有的读发送到S1
228+
229+
230+
#### 2.搭建主备切换
231+
232+
#### 3.mycat+percona+haproxy+keepalived
233+
234+
#### 4.mha+keepalived

0 commit comments

Comments
 (0)