学习总结
linux的学习总结
https://blog.csdn.net/qq_35919588/article/details/80426634
1,NoSql介绍
- NoSql(Not Only Sql):泛指非关系型数据库
- 主要是用来处理大型数据:
- 举个例子: 比如存放一个员工,员工的信息有很多属性,这些关系需要多个字段多张表进行存储,不如把这些数据存放在一个json字符串中比较方便,知识为了方便查看
- 在开发中查询的占比比较大,把一些不经常修改或者是不修改的数据存放在非关系数据库中,查询比较方便
- 主要用于大数据中,进行解析分析
- 分类:
- 键值(Key-Value)存储数据库
- 主要使用到hash表,一个特定的值和一个指针指向特定的数据
- 优点: 简单易部署
- 缺点: 只对部分数据进行查询或者更新的时候,效率就会显的低下
- 列存储数据库:
- 用来应对分布式存储的海量数据
- 价值对存在,就是键对应着多条数据
- 文档型数据库:
- 查询效率比较高,
- 对事物的支持不友好
- 比如:json的存储格式
- 图形数据库,图片 ,音频,视频,文件服务器:
- 使用灵活的图形模型,并且能够扩展到多个服务器上.
- NoSql没有标准的查询语言(标准的sql语句), 数据库查询需要制定数据库模型,
- 许多nosql数据库都有rest式的数据接口或者查询API
- 键值(Key-Value)存储数据库
- 应用场景:
-
1 1、数据模型比较简单; 2 2、需要灵活性更强的IT系统; 3 3、对数据库性能要求较高; 4 4、不需要高度的数据一致性; nosql 弱化事务 没有事务 当当购物车 5 5、对于给定key,比较容易映射复杂值的环境(redis)。 6
-
2,redis学习总结:
该笔记借鉴的作者是:
https://blog.csdn.net/u012562943/article/details/49514341[ 详解 ]
- redis使用C语言写的,开源的,支持网络交互的,基于内存持久化的Key-Value数据库
- redis数据结构
- 字符串(strings)
- 字符串类别(lists)
- 字符串集合(sets)
- 有序字符串集合(sorted sets)
- 哈希(hashes)
- redis持久化---两种:
- RDB(Redis DataBase):redis数据库
- BGSAVE: 建立一个子进程来将磁盘写入快照中
- SAVE: 创建快照的同时不会执行其他命令
- shutdown: 关闭redis的时候也会执行save命令,阻塞客户端不再执行命令,save之后关闭服务器
- 将数据存放在磁盘中
- 文件是: .rdb结尾
- AOF(Append Only File): 仅附加文件
- 将所有的指令存放在文件中,下次直接执行文件中的指令就可以恢复数据
- 文件是: .
- 两种方式可以同时使用,redis重启优先会AOF的方式恢复数据,AOF的方式恢复数据完整度高.
- 也可以不适用redis,redis就是一个内存数据库;
- RDB(Redis DataBase):redis数据库
- 持久化配置:
- redis.conf配置文件中
- appendonly yes: 开启AOF持久化
- 也可以调节AOF日志的记录频率: appendfsync [options]
- always: 每个redis写命令都要同步到硬盘中,严重降低redis速度
- everysec: 每秒执行一次同步显式的将多个写命令同步到磁盘中
- no: 由操作系统决定何时同步(发生故障时会丢失大量的数据,不推荐)
- AOF的重写:
- 执行BGREWRITEAOF命令
- 或者在配置文件中配置自动重写: auto-aof-rewrite-percentage选项
- redis.conf配置文件中
- redis持久化 ----RDB:
- 是将redis中某一时刻的数据持久化到磁盘中,用快照的方式持久化,过程如下
- 先将数据写入到一个临时文件中,待持久化过程结束,将这个临时文件替换上次持久化好的文件
- RDB单独创建一个子进程来持久化,而主进程是不会进行任何IO操作的,确保redis的性能
- 优点: 处理大量数据,恢复不是特别重要的数据,RDB方式比AOF更加高效
- 是将redis中某一时刻的数据持久化到磁盘中,用快照的方式持久化,过程如下
- redis持久化----AOF:
- AOF持久化策略默认每秒钟把缓存中的写指令记录到磁盘中一次, redis可以保持很好的处理性能,及时redis故障也只是缺失最后一秒的数据
- 如果在追加日志时,恰好遇到磁盘空间满...一些突发情况导致日志写入不完整, redis提供了redis-check-aof工具,可以进行对日志的修复
- 因为采用了追加方式,如果不做任何处理的话,AOF文件越来越大,为此,redis提供了AOF文件重写机制当AOF文件超过阈值时,redis就会启动AOF文件的内容压缩只保留可以恢复数据的最小指令集
- 例子: 调用多少次指令就存放多少次指令,这样效率比较低,可以把这些指令存放到一个set集合集合中,过滤掉一些重复的指令,只保留数据最终的存出结果,这就是重写机制的原理
- AOF重写时, 任然采用的是先写临时文件,全部完成后再替换的流程;
- AOF比较好用的地方:
- 如果说不小心删除了redis中的所有数据,此时可以通过AOF的持久化,暂停redis,将AOF文件指令中的失误指令删除,重启的时候会重新执行AOF文件,这样数据就恢复了,如果说AOF已经被重写了就不能采取上边的操作了
- 缺点:在同等数据规模下,AOF文件要比RDB文件的体积大,并且AOF方式的恢复比RDB要慢
- 重写AOF文件获取最小指令集: BFREWRITEAOF
- redis中AOF常见的问题:
-
1 1.备份被写坏的AOF文件 2 2.运行redis-check-aof –fix进行修复 3 3.用diff -u来看下两个文件的差异,确认问题点 4 4.重启redis,加载修复后的AOF文件
-
- redis持久化----AOF重写
- 执行流程:
- 重写的时候redis创建一个"重写的子进程",
- 这个子进程会读取现有的AOF文件,
- 将文件中的指令分析解压并写入到一个临时的文件中.
- 此时主进程会将新接收的写指令累计在缓存区中,一遍继续写入到原有的AOF文件中
- "重写子进程"完成工作后,会给父进程发一个信号,父进程将会把内存中缓存的指令追加到新AOF中
- 追加完成后,redis就会用新AOF文件替换AOF文件之后在有新的写指令追加到新的AOF文件中
- 注意: 重写重写没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,替换原有的aof文件,类似快照
- aof重新完成后会删除旧的文件,旧的文件体量比较大,可能会导致系统随时挂起
- 如何去解决:
- 可以配置执行重写的频率,根据文件的大小或者命令的条数达到多少来执行重写
- 执行流程:
- 主从用法(待续):
Redis①和memcahed②对比:
- 共同点:
- 底层都是用C语言编写,都是基于key-value内存存储
- 不同点:
- ①支持多种数据类型,比如:String,List,set,zset,hash
- ②支持简单的数据类型, 比如:String,Object
- ①最大存储1G
- ②默认存储不超过一兆
- ①存储的数据可以持久化
- ②存储的数据不能持久化,断点就会丢失
- ①单线程,并发串行执行,将单进程单线程效率发挥到最大
- ②多线程,支持多线程并发访问, 数据安全 锁
- ①3.0版本后自身支持集群
- ②自身不支持集群(使用中间件)
3,mycat学习总结(简单学习):
https://www.cnblogs.com/fxwl/p/7990906.html [详解](借鉴学习的网站)
- 阿里开源的管理分布式数据库的中间件:
- 主要是做到读写分离
1,主要由三个配置文件组成:
server.xml: Mycat的配置文件, 设置账号, 参数等
schema.xml: Mycat对饮的物理数据库和数据库表的配置
rule.xml: Mycat分片(分库分表)规则
- server.xml:
- user标签:
-
1 <user name="root"> 2 <property name="password"></property> 3 <property name="schemas">TESTDB</property> 4 </user>
- user用户配置节点
- schemas数据库名,这里的数据库会和schema.xml中的配置关联, 多个用逗号隔开
-
- privileges标签:
-
1 <!-- 可以有多个这种标签的配置 --> 2 <privileges check="false"> 3 </privileges>
- check表示是否开通DML权限,默认关闭
- dml顺序说明: insert,update,select, delete
- 举个例子:
-
1 <schema name="db1" dml="0110" > 2 <table name="tb01" dml="0000"></table> 3 <table name="tb02" dml="1111"></table> 4 </schema> 5 6 db1的权限是update,select。 7 tb01的权限是啥都不能干。 8 tb02的权限是insert,update,select,delete。 9 其他表默认是udpate,select。
-
- system标签: --------所有的配置都适合系统配置有关的
-
1 <property name="charset">utf8</property> 2 字符集 3 <property name="processors">1</property> 4 处理线程数量,默认是cpu数量。 5 <property name="bindIp">0.0.0.0</property> 6 mycat 服务监听的 IP 地址,默认值为 0.0.0.0。 7 8 <property name="serverPort">8066</property> 9 定义 mycat 的使用端口,默认值为 8066。 10 11 <property name="managerPort">9066</property> 12 定义 mycat 的管理端口,默认值为 9066。
-
- user标签:
- schema.xml:
- schema: 设局库设置,此数据库为逻辑数据库,和server.xml总的schema对应
- dataNode分片信息,也就是分库相关配置
- dataHost: 物理数据库,真正存储数据的数据库
- schema标签:
-
1 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="10"> 2 </schema> 3 schema标签用来定义mycat实例中的逻辑库,mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema标签来划分这些不同的逻辑库 4 如果不配置schema标签,所有表的配置会属于同一个默认的逻辑库。逻辑库的概念和MySql的database的概念一样,我们在查询两个不同逻辑库中的表的时候,需要切换到该逻辑库下进行查询。 5 6 --name 逻辑数据库名,与server.xml中的schema对应 7 --checkSQLschema 数据库前缀相关设置,当该值为true时,例如我们执行语句select * from TESTDB.company 。mycat会把语句修改为 select * from company 去掉TESTDB。 8 --sqlMaxLimit 当该值设置为某个数值时,每条执行的sql语句,如果没有加上limit语句,Mycat会自动加上对应的值。不写的话,默认返回所有的值。 9 需要注意的是,如果运行的schema为非拆分库的,那么该属性不会生效。需要自己sql语句加limit。
-
- dataNode标签:
-
1 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="10"> 2 </schema> 3 schema标签用来定义mycat实例中的逻辑库,mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema标签来划分这些不同的逻辑库 4 如果不配置schema标签,所有表的配置会属于同一个默认的逻辑库。逻辑库的概念和MySql的database的概念一样,我们在查询两个不同逻辑库中的表的时候,需要切换到该逻辑库下进行查询。 5 6 --name 逻辑数据库名,与server.xml中的schema对应 7 --checkSQLschema 数据库前缀相关设置,当该值为true时,例如我们执行语句select * from TESTDB.company 。mycat会把语句修改为 select * from company 去掉TESTDB。 8 --sqlMaxLimit 当该值设置为某个数值时,每条执行的sql语句,如果没有加上limit语句,Mycat会自动加上对应的值。不写的话,默认返回所有的值。 9 需要注意的是,如果运行的schema为非拆分库的,那么该属性不会生效。需要自己sql语句加limit。
-
- dataHost标签:
-
1 这个标签直接定义了具体数据库实例,读写分离配置和心跳语句。 2 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 3 <heartbeat>select user()</heartbeat> 4 <writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="123456"> 5 <readHost host="hostS1" url="192.168.1.101:3306" user="root" password="123456" /> 6 </writeHost> 7 </dataHost> 8 --name 唯一标示dataHost标签,供上层使用 9 --maxCon 指定每个读写实例连接池的最大连接。 10 --minCon 指定每个读写实例连接池的最小连接,初始化连接池的大小 11 --balance 负载均称类型 12 balance="0":不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 13 balance="1":全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1-S1,M2-S2 并且M1 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。 14 balance="2":所有读操作都随机的在writeHost、readHost上分发 15 balance="3":所有读请求随机的分发到writeHst对应的readHost执行,writeHost不负担读写压力。(1.4之后版本有) 16 --writeType 负载均衡类型。 17 writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . 18 writeType="1",所有写操作都随机的发送到配置的 writeHost。1.5以后版本废弃不推荐。 19 --switchType -1不自动切换 20 1 默认值 自动切换 21 2 基于MySql主从同步的状态决定是否切换心跳语句为 show slave status 22 3 基于mysql galary cluster 的切换机制(适合集群)1.4.1 心跳语句为 show status like 'wsrep%' 23 --dbType 指定后端链接的数据库类型目前支持二进制的mysql协议,还有其他使用jdbc链接的数据库,例如:mongodb,oracle,spark等 24 --dbDriver 指定连接后段数据库使用的driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb,其他类型的则需要使用JDBC驱动来支持。 25 如果使用JDBC的话需要符合JDBC4标准的驱动jar 放到mycat\lib目录下,并检查驱动jar包中包括如下目录结构文件 META-INF\services\java.sql.Driver。 在这个文件写上具体的driver类名,例如com.mysql.jdbc.Driver 26 writeHost readHost指定后端数据库的相关配置给mycat,用于实例化后端连接池。 27 --tempReadHostAvailable 28 如果配置了这个属性 writeHost 下面的 readHost 仍旧可用,默认 0 可配置(0、1)。
-