

| ps -ef ps -aux 当前系统正运行的进程 特定进程ps -aux | grep redis |
| netstat -tunlp | grep 端口号,用于查看指定的端口号的进程情况,如查看8000端口的情况,netstat -tunlp | grep 8000 |

cd usr: 切换到该目录下usr目录
cd ..(或cd../): 切换到上一层目录
cd /: 切换到系统根目录
cd ~: 切换到用户主目录
cd -: 切换到上一个操作所在目录
mkdir 目录名称: 增加目录
ls或者ll 查看目录
find 目录 参数: 寻找目录/文件(查)
mv 目录名称 新目录名称: 修改目录的名称(改)
mv 目录名称 目录的新位置: 移动目录的位置---剪切(改)
cp -r 目录名称 目录拷贝的目标位置: 拷贝目录(改),-r代表递归拷贝
rm -rf 目录
touch 文件名称: 文件的创建(增)
cat/more/less/tail 文件名称 文件的查看(查) #### 查
cat: 查看显示文件内容
more: 可以显示百分比,回车可以向下一行, 空格可以向下一页,q可以退出查看
less: 可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
tail-10 : 查看文件的后10行,Ctrl+C结束 #### 删
rm -rf 文件: 删除文件(删) #### 解压缩
tar -zcvf 打包压缩后的文件名 要打包压缩的文件
tar -xvf 解压缩文件 #### 安装
yum
rpm(源码包) gcc-> make make install ## Linux用户管理
useradd 选项 用户名:添加用户账号
userdel 选项 用户名:删除用户帐号
usermod 选项 用户名:修改帐号
passwd 用户名:更改或创建用户的密码
passwd -S 用户名 :显示用户账号密码信息
passwd -d 用户名: 清除用户密码
groupadd 选项 用户组 :增加一个新的用户组
groupdel 用户组:要删除一个已有的用户组
groupmod 选项 用户组 : 修改用户组的属性


程序逻辑参考其他语言,注意语法格式
| 管道 | 前一个结果作为后一个参数 |

· 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了! · 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题! · 一致性问题: 消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!
| 对比方向 | 概要 |
|---|---|
| 吞吐量 | 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比 十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。 |
| 可用性 | 都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
| 时效性 | RabbitMQ 基于erlang开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。其他三个都是 ms 级。 |
| 功能支持 | 除了 Kafka,其他三个功能都较为完备。 Kafka 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |
| 消息丢失 | ActiveMQ 和 RabbitMQ 丢失的可能性非常低, RocketMQ 和 Kafka 理论上不会丢失。 |
public class EventHandlerRedisUtil {
public static void push(EventMessage message, String key) {
ListRedisTemplate listRedisTemplate = SpringUtil.getBean(ListRedisTemplate.class);
SetRedisTemplate setRedisTemplate = SpringUtil.getBean(SetRedisTemplate.class);
String jsonStr = JSONArray.toJSONString(message);
listRedisTemplate.lpush(key, jsonStr);
setRedisTemplate.sadd(key, jsonStr);
}
}
该工具类用于将消息事件push进Redis的List中,同时再将该消息事件保存在Set数据结构中,防止消息事件取出来的过程中突然重启导致消息事件丢失,由于Redis已做持久化处理,所以项目再次重会重新加载Set的消息到List中。
/**
* 消息事件处理异步工具类
* Created by zch on 2017/9/6.
*/
public class EventHandlerAsyncUtil {
private static ExecutorService executorService = null;
public static void submit(Runnable runnable) {
if(null == executorService) {
executorService = Executors.newFixedThreadPool(300, new CustomizableThreadFactory("event-handler-async-pool-"));
}
executorService.submit(runnable);
}
}
该工具类用于异步执行消息事件。
· redo log //重做日志
· undo log //回滚日志
· bin log //二进制日志
· error log //错误日志
· slow queryl og //慢查询日志
· general log // 一般查询日志
· relay log //中继日志
物理格式的日志,记录的是物理数据页面的修改信息,是顺序写入 redo log file 中去的
事务开始之后就开始写,而不是事务提交前。重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M,Innodb存储引擎先将重做日志写入innodb_log_buffer。
逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。
事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性
当事务提交之后,undo log并不能立马被删除, 而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。
undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。 默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。 因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。 因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。
1,用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。
2,用于数据库的基于时间点的还原。
逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。 但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息, 也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。 在使用mysqlbinlog解析binlog之后一些都会真相大白。 因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。
事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。 这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。 因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。 这是因为binlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。
binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。
- 二进制日志的作用之一是还原数据库的,这与redo log很类似,很多人混淆过,但是两者有本质的不同
1,作用不同:redo log是保证事务的持久性的,是事务层面的,binlog作为还原的功能,是数据库层面的(当然也可以精确到事务层面的),虽然都有还原的意思,但是其保护数据的层次是不一样的。
2,内容不同:redo log是物理日志,是数据页面的修改之后的物理记录,binlog是逻辑日志,可以简单认为记录的就是sql语句
3,另外,两者日志产生的时间,可以释放的时间,在可释放的情况下清理机制,都是完全不同的。
4,恢复数据时候的效率,基于物理日志的redo log恢复数据的效率要高于语句逻辑日志的binlog
关于事务提交时,redo log和binlog的写入顺序,为了保证主从复制时候的主从一致(当然也包括使用binlog进行基于时间点还原的情况),是要严格一致的, MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。

innodb引擎中的redo/undo log与mysql binlog是完全不同的日志,它们主要有以下几个区别:
· 1、层次不同,redo/undo 是indodb层维护的,而binlog是mysql server层维护的,跟采用何种引擎没有关系,记录的是所有引擎的更新操作的日志记录
· 2、记录内容不同,redo/undo记录的是每个页的修改情况,属于物理加逻辑的方式(redo log到物理页,页内采用逻辑日志,undo log采用的是逻辑日志),目的是保证数据的一致性,binlog记录的是事物操作内容,比如一条语句DELETE FROM TABLE WHERE i > 1之类的,不管采用的是什么引擎,当然格式是二进制的,要解析日志内容可以用这个命令mysqlbinlog -vv BINLOG。
· 3、记录时机不同,redo/undo在事物执行过程中会不断的写入,binlog是在事物最终commit前写入,binlog什么时候刷新到磁盘跟参数sync_binlog相关。
显然,我们执行SELECT等不涉及数据更新的语句是不会记binlog的,而涉及到数据更新则会记录。要注意的是,对支持事务的引擎如innodb而言,必须要提交了事务才会记录binlog。
binlog刷新到磁盘的时机跟sync_binlog参数息息相关,如果此参数配置为0,表示MySQL不控制binlog的刷新,则直接由文件系统决定什么时候刷新到磁盘,如果设置为不为0,则表示隔多少个事物刷新到磁盘,设置为1是最安全,在系统故障时最多丢失一个事务的更新,但是会对性能有所影响。一般情况下会设置为100或者0,牺牲一定的一致性来获取更好的性能。
Dubbo是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
<properties>
<dubbo.version>2.7.0</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
</dependencies>

图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
负载均衡改善了跨多个计算资源(例如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动的的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。使用具有负载平衡而不是单个组件的多个组件可以通过冗余提高可靠性和可用性。负载平衡通常涉及专用软件或硬件 - Random LoadBalance(默认,基于权重的随机负载均衡机制)
- 随机,按权重设置随机概率。
- 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 - ConsistentHash LoadBalance
- 一致性 Hash,相同参数的请求总是发到同一提供者。(如果你需要的不是随机负载均衡,是要一类请求都到一个节点,那就走这个一致性hash策略。)
- 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
在实际生产中,假如zookeeper注册中心宕掉,一段时间内服务消费方还是能够调用提供方的服务的,实际上它使用的本地缓存进行通讯,这只是dubbo健壮性的一种提现。