- 博客(188)
- 收藏
- 关注
原创 Redis cluster 基于从库自动failover两轮投票的源码修改
目录一、修改源码二、测试环境三、测试结果可以通过从库广播避免二轮投票四、切换过程五、各节点完整日志一、修改源码通过前面分析,从库自动failover需要两轮投票的根本原因是,从库认为主库客观下线时,并不广播,无法通知负责投票的存活主库也修改挂掉主库的flgas。各个节点为一个主库所维护的clusterNode->flags是相互独立的。本文测试目的,是通过修改源码,在从库认为主库客观下线时,也将fail信息广播给其他节点,正常网络情况下可以认为其他节点可以同时收到广
2020-06-13 17:59:31
850
原创 Redis cluster gossip
目录一、通信节点选择1.每0.1秒,如果发现有其他节点连不上,则尝试重连2.每1秒,从5个随机节点中,选出一个其中最久没有通信的节点,进行ping3.每0.1秒,如果发现有超过cluster-node-time/2没有通信成功的节点,则向这个节点发送ping二、gossip ping 所发送的信息1.节点自身的信息2.附带1/10的其他节点信息,如果1/10少于3,那么至少附带3个其他节点的信息一、通信节点选择通过clusterCron() /* This i...
2020-06-13 17:48:34
813
原创 Redis cluster 从库自动failover需要两轮投票的分析
从库自动failover,有三种情况1.由存活的主节点判断挂掉的主节点为客观下线(fail),即其他主节点抢先收集够了pfail数,然后广播fail信息到从库,从库clusterCron检查到挂掉主库的fail并发起投票时,其他主节点会正常投票从库的日志是:76803:S 09 Jun 12:21:09.240 * FAIL message received from bb7664a96fc83d3f31c2649ec37894a4944ed38b about 64cdc10096644b5bc362
2020-06-13 17:42:22
1047
原创 Redis cluster 从库自动failover机制
目录一、每个节点维护的信息二、故障发现(主观下线)三、客观下线1.下线报告链表2.pfail到fail的转变四、从库通过clusterCron发起自动切换五、主库投票六、从库执行切换七、纪元更新一、每个节点维护的信息每个节点内的clusterState结构保存集群信息,从库自身视角所维护的一些信息。结构关键属性如下:在cluster.h文件中:typedef struct clusterState {clusterNode *myself; .
2020-06-13 17:31:39
2056
原创 xtrabackup和mysqldump备份大致过程
xtrabackup备份过程1.从最新的checkpoint开始读redo,因为直接拷贝数据文件,有可能还有脏数据留在内存还未刷到磁盘,不能直接从当前redo lsn读起,而是checkpoint读起;2.拷贝ibdata和数据文件3.拷贝ibd4.flush tables with read lock前,观察ftwrl-wait-timeout秒,如果已经执行超过ftwrl-wait-threshold秒的慢查询在观察期间不能结束,则终止备份进程;这是防止直接发起ftwrl,当无法flush t
2020-05-08 17:35:32
344
原创 MongoDB 关于用户认证
1.开启用户认证步骤1.1以非用户认证模式开启实例,如配置文件中注释#auth=true1.2在admin下创建一个管理用户,至少要有userAdmin或userAdminAnyDatabase权限use admindb.createUser( { user: "root", pwd: "sam", roles: [ { role: "root", db: "a...
2020-05-07 14:44:33
401
原创 MongoDB 报错AuthenticationFailed Missing credentials for authenticating as internal user
复制集开启auth验证后,日志报错:[ReplicationExecutor] Error in heartbeat request to 127.0.0.1:37017; AuthenticationFailed Missing credentials for authenticating as internal user原因是开启auth之后,需要增加keyFile验证。创建keyfil...
2020-05-07 14:29:33
915
原创 MySQL 一些容易迷惑的加锁例子
以下实验基于这个表,当然隔离级别是RR,不然RC下也没那么多复杂的加锁情况了:mysql> select * from sam;+----+------+------+| id | c2 | c3 |+----+------+------+| 1 | 1 | 1 || 5 | 5 | 5 || 10 | 10 | 10 |+----...
2020-05-02 13:59:32
434
原创 MySQL innodb 表空间传输实现单表迁移
表空间传输,可以说是单表传输吧,在某些情况下会有它的使用场景,记录一下。例如在3306实例有一个t表mysql> desc t;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+--...
2020-04-29 12:10:17
522
原创 MySQL binlog_row_image不同取值影响查询结果
介绍一个前提,对于一个事务内,DML是当前读,而且DML所做的更新,对本事务也是可见的。例如,假设sam表只有一行数据是col1=1,当全表update后,虽然事务还未提交,而且即使在RR级别下,SQL1建立了一致性视图,但经过SQL2更新后,SQL3是能够看到自身更新的数据,这是因为SQL2更新后,所有数据行的trx_id都变为当前事务的trx_id,自然是可见的。也可以这样理解,我自己做的...
2020-04-29 11:22:10
482
原创 两个insert之间发生死锁的例子
为什么没有产生唯一键冲突报错?因为还没获得行锁,无法判断唯一性一、简单insert之间的死锁测试表:mysql> select * from sam;+----+------+------+| id | col1 | col2 |+----+------+------+| 1 | 1 | 1 || 2 | 2 | 2 || 3 | 3 |...
2020-04-28 23:33:56
1186
2
原创 RR级别下,为什么唯一索引等值查询可以退化为行锁,而普通索引不行?
因为在等值查询时,由于唯一索引的唯一性,只要行锁,就能保证不会幻读;而普通索引的等值索引,还使用行锁的,那么可以插入相同的行,就会出现幻读。例如:select * from test where col=1 for update;如果col是唯一索引,那么只要锁住col=1的行,就无法产生幻读;如果col是普通索引,那么锁住col的行,依然可以插入col1=1的数据,那么重复执行就会比之...
2020-04-28 21:15:00
621
原创 null会存在索引里吗?null可以使用索引吗?为什么不建议列值默认是null?
一、null会存在索引里吗?别的RDBMS不清楚,Oracle是怎样的也记不清了,但是对于MySQL的二级索引,是存储null值的。例如:mysql> desc sam;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----...
2020-04-28 15:23:57
4670
原创 MySQL 行格式总结
compact1.隐藏列,6 bytes 事务id列,7 bytes 回滚指针列,1 bit 删除标记位;2.变长行头,记录变长列的长度3.5 bytes 行头,用于连续行之间的链接和行锁4.位向量,null标记位,假设可为null的列为N,那么需要celling(N/8) bytes5.null值不占用行的空间6.存在非null值的列数据7.如果无显示指定主键,多一个6 bytes...
2020-04-27 22:19:37
381
原创 一个不走索引的更新语句,到底会不会锁全表
经常看到有人说,如果一个DML不能走索引,就要锁全表。这正确吗?我曾经也这样以为,直到现在我才发现,对一半错一半吧。答案应该是:例如如下一个表:mysql> show create table sam\G*************************** 1. row *************************** Table: samCreate Ta...
2020-04-23 22:53:04
2018
原创 MySQL 行锁该怎么分析
一些可以用于排查的信息:1.information_schema.innodb_locks可以看到哪些事务在持有哪些锁,例如:+----------------------+-------------+-----------+-----------+-----------------------------------+------------+------------+----------...
2020-04-22 16:22:11
379
原创 关于Redis分布式锁的思考
一个分布式锁,需要满足以下:1.独享,即一个锁不能同时被两个客户端持有2.无死锁,即当一个持有锁的客户端异常退出了,锁要自动释放,否则其他客户端永远都拿不到锁3.单点问题,即若只用一个单实例来实现分布式锁,那么当这个节点挂了,也就导致分布式锁功能停止了。这其实并不是分布式锁的独有问题,单点问题是所有单实例Redis服务的共有问题。对于单点问题,Redis主从的方案也无法完全解决,例如客户...
2020-04-22 14:22:29
263
原创 MySQL grant之后是否需要flush privileges
MySQL grant之后是否需要flush privileges在MySQL旧版本的使用上,很多人习惯直接更新mysql.user等表来完成用户的修改密码,修改权限等,最后需要flush privileges来生效。而使用grant来授权或revoke来收权,是不需要执行flush privileges的。直接修改系统表的方式之所以需要flush privileges,是改了系统表之后,内...
2020-04-21 14:40:02
1552
1
原创 临时表的特性,临时表是怎么写binlog的
临时表的特性,临时表是怎么写binlog的通过create temporary table …创建的临时表,仅对当前会话可见,当当前会话线程退出以后,将会自动删除临时表。需要注意的是,如果创建的临时表和已存在的表重名,那么访问该表明时,是访问临时表,如:mysql> use samDatabase changedmysql> show tables;+-----------...
2020-04-20 11:39:58
713
原创 关于double write的思考
double write是Innodb防止部分写的特性,大致原理是:在把buffer pool脏页刷盘时,先把脏页写入内存中的double write buffer,之后将double write buffer的全部内容分两次写入系统表空间上连续的128个页,然后再把系统表空间上的double write数据写入到各个数据页对应的表的数据文件上。那么问题就来了:1.既然直接从buffer p...
2020-04-19 11:26:54
455
原创 insert into bak select * from test会锁表吗
答案是跟隔离级别有关系,RR级别下会将test表所有记录上行锁,以及所有记录间隔上gap锁;对bak插入的记录加行锁;RC级别下test表不加任何锁;对bak插入的记录加行锁;即区别在于test表上的锁。实验证明:1.RR级别会话1执行insert into bak select * from test;mysql> begin;Query OK, 0 rows affect...
2020-04-16 18:03:57
747
原创 一个redo和binlog两段提交的思考
对于事务提交,是这样一个流程:1.发出commit语句;2.redo进入prepare阶段;3.写binlog;4.redo进入commit阶段;5.事务完成提交还有两个参数有关联,1.innodb_flush_log_at_trx_commit各取值含义:0,事务提交时,将redo保留在redo buffer,redo日志既不write到OS cache,也不fsync到磁盘,...
2020-04-15 23:40:11
235
原创 关于RR和间隔锁的一些实验
关于RR和间隔锁的一些实验测试表如下:mysql> show create table test\G*************************** 1. row *************************** Table: testCreate Table: CREATE TABLE `test` ( `id` int(11) NOT NULL, ...
2020-04-15 16:25:08
278
原创 Redis 免阻塞删除大list
vi delete_list.sh#!/bin/bash#循环删除listlist_len=redis-cli -p 6379 llen key_namewhile true;doif [ $list_len -ge 3000 ];thenredis-cli -p 6379 ltrim key_name 0 -3000sleep 0.5list_len=redis-cli -p ...
2020-03-31 15:37:35
654
原创 Linux ssh rsa配置免密后仍然需要输密码的一种解决方式
想要A免密登陆B,使用了以下方式配置ssh免密登陆:1.A执行ssh-keygen -t rsa2.B执行mkdir -p ~/.ssh3.A执行scp ~/.ssh/id_rsa.pub user@B:~/.ssh/authorized_keys4.尝试ssh B,发现仍然需要输入密码原因:B执行mkdir -p ~/.ssh,还需要执行chmod 700 .ssh,否则可以从/va...
2020-03-20 16:18:08
1170
原创 MongoDB 占用大量内存和Swap不释放
接到告警,一台部署了多实例MongoDB的机器内存和swap快用完了,排查发现下午某一个实例导入大量数据。为什么会用了这么多内存和swap?因为WiredTiger引擎使用内存的方式是:50% of (RAM - 1 GB)或256 MB,哪个更大就以哪个为上限。一个机器部署了多个实例,按照50% of (RAM - 1 GB)的比例分配,那当然是会把内存用完的。解决方式只能是重启实例了...
2020-01-09 15:35:44
3784
原创 MongoDB 添加分片和删除分片
一、添加分片搭建好复制集后,登陆mongos,添加分片:db.runCommand( { addshard:“repset3/127.0.0.1:37017,127.0.0.1:37018,127.0.0.1:37019”,name:“s3”});注意要打开balancer,否则新加入分片后不会自动将数据打散:startBalancer()可以设置窗口避开高峰时期:db.setting...
2020-01-09 15:19:00
1890
原创 linux lvm简单理解和使用
PV由独立的分区或磁盘组成;VG由一个或多个PV组成,可以再添加PV进行扩容;LV从VG里分配空间,可以再从VG里拿空间资源进行扩容。LV用于挂载目录。所以资源分配流程是PV->VG->LV,如果要扩容LV,要从VG里拿空间资源,如果VG不够了,要增加新的PV。1.创建PVpvcreate /dev/dfa2.创建VGvgcreate vg1 /dev/dfa3.创建...
2020-01-09 15:01:52
400
原创 redis-trib.rb 关于ruby的一些问题
/usr/bin/env: ruby: No such file or directory原因是没安装ruby下意识的解决方法就是yum install ruby -ygem install redis但是也会遇到报错:ERROR: Error installing redis: redis requires Ruby version >= 2.3.0.这是因为ce...
2020-01-07 11:19:24
736
原创 MySQL 主从复制的一个BUG
发现一个主从复制的BUG,从库会自动跳过不存在的主键列,看例子。主库有一个sam表,其中id是自增主键:mysql> desc sam;+-------+---------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-----...
2020-01-03 17:04:24
434
原创 Linux 源码编译简单理解
源码安装通常会有以下步骤./configuremake make installconfigure是做一些检查工作,并且生成Makefile文件,简单来说就是指导下一步make命令应该怎么编译;make是参照Makefile文件进行自动编译;make install,将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录make clean清除上次的mak...
2019-12-13 11:08:35
232
1
原创 Redis 指定目录安装
一般Redis的安装方式:tar -zxvf redis-4.0.14.tar.gzcd redis-4.0.14makemake install这种源码编译方式默认是将Redis安装至/usr/lcoal/bin目录下,如果想要自定义安装目录,例如想要将Redis安装在/usr/local/redis目录下,可以将make install替换成:make PREFIX=/usr/l...
2019-12-13 10:31:17
5735
1
原创 MongoDB profiler慢查询日志
在查询记录方面,MySQL有slowlog和general log,而MongoDB同样可以使用profiler来记录操作日志。不同的是,profiler要么记录所有操作日志,或者慢查询日志,而不能想MySQL一样slow log和general log分开设置。profiler的概念:1.慢查询阈值,slowms;2.profiling级别,可分为0,1,2三级;0表示关闭profiler...
2019-12-12 16:21:35
812
原创 MongoDB 如何在shell监控脚本中执行查询
在shell监控脚本中,通常需要以非交互的方式连接到数据库实例查询一些信息,例如MySQL的mysql -e就非常方便,但是对于MongoDB来说,并不能直接在登陆命令后加上查询命令来直接执行,例如mongo --port 27017 "rs.status()"MongoDB shell version: 3.0.6connecting to: 127.0.0.1:27017/rs.stat...
2019-12-12 15:09:48
1242
1
原创 Redis 从库对于键过期的处理,源码
我们都知道对于单实例或者主库实例中,带有过期属性的键,在过期后会有主动删除和惰性删除两种策略来处理。但是在从库,键过期以后,也会采用同样的方式来处理吗?先看一下官方的解释:How expires are handled in the replication link and AOF fileIn order to obtain a correct behavior without sacri...
2019-12-11 10:41:24
933
原创 LVS 概念、原理、工作模式和调度算法
一、LVS概念DS,director server,LVS服务器RS,real server,LVS后端提供服务的服务器Client,客户端,指使用LVS的用户CIP,client IP,客户端IP,即lvs使用者的IPVIP,virtual IP,LVS服务器给客户端提供的连接IPDIP,director IP,用于和real server通讯的IP地址RIP,real IP,后端...
2019-12-05 11:32:22
386
原创 MongoDB CURD之DELETE
MongoDB删除文档的方式有deleteManydeleteOneremove1.删除所有文档db.inventory.deleteMany({})db.bios.remove({ })等效于SQL:delete from inventory;但建议使用db.inventory.drop()2.删除符合条件的所有文档db.inventory.deleteMany({ stat...
2019-11-29 15:40:23
434
原创 MongoDB CURD之UPDATE
MongoDB实现update的方式有updateOneupdateManyreplaceOne1.更新匹配条件的第一条文档db.inventory.updateOne( { item: "paper" }, { $set: { "size.uom": "cm", status: "P" }, $currentDate: { lastModified: t...
2019-11-29 15:30:57
187
原创 MongoDB CURD之READ
一、查询所有列MongoDB查询使用find()。1.无条件查询db.sam.find()等效于SQL:select * from sam;2.等值条件db.sam.find({name:“Sam”})等效于SQL:select * from sam where name=‘Sam’;3.in条件db.sam.find({name:{KaTeX parse error: Expe...
2019-11-29 15:04:35
147
原创 MongoDB CURD之CREATE
CURD中的C,表示创建或者插入,在MongoDB的特性中,并不需要显示地先创建一个collection,因为MongoDB不对表结构有固定的要求,如果一个表尚未存在,那么在插入第一条document时,该表即被创建。一、语法插入文档有两种方式:1.插入单条文档db.collection.insertOne()如:db.sam.insertOne({name:“Sam”,age:25}...
2019-11-29 12:23:47
299
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人