自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

灯火觅阑珊

衣带渐宽终不悔,为伊消得人憔悴

  • 博客(188)
  • 收藏
  • 关注

原创 Redis cluster 基于从库自动failover两轮投票的源码修改

目录一、修改源码二、测试环境三、测试结果可以通过从库广播避免二轮投票四、切换过程五、各节点完整日志一、修改源码通过前面分析,从库自动failover需要两轮投票的根本原因是,从库认为主库客观下线时,并不广播,无法通知负责投票的存活主库也修改挂掉主库的flgas。各个节点为一个主库所维护的clusterNode->flags是相互独立的。本文测试目的,是通过修改源码,在从库认为主库客观下线时,也将fail信息广播给其他节点,正常网络情况下可以认为其他节点可以同时收到广

2020-06-13 17:59:31 616

原创 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 642

原创 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 924

原创 Redis cluster 从库自动failover机制

目录一、每个节点维护的信息二、故障发现(主观下线)三、客观下线1.下线报告链表2.pfail到fail的转变四、从库通过clusterCron发起自动切换五、主库投票六、从库执行切换七、纪元更新一、每个节点维护的信息每个节点内的clusterState结构保存集群信息,从库自身视角所维护的一些信息。结构关键属性如下:在cluster.h文件中:typedef struct clusterState {clusterNode *myself; .

2020-06-13 17:31:39 1847

原创 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 299

原创 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 340

原创 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 842

原创 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 384

原创 MySQL innodb 表空间传输实现单表迁移

表空间传输,可以说是单表传输吧,在某些情况下会有它的使用场景,记录一下。例如在3306实例有一个t表mysql> desc t;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+--...

2020-04-29 12:10:17 425

原创 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 431

原创 两个insert之间发生死锁的例子

为什么没有产生唯一键冲突报错?因为还没获得行锁,无法判断唯一性一、简单insert之间的死锁测试表:mysql> select * from sam;+----+------+------+| id | col1 | col2 |+----+------+------+| 1 | 1 | 1 || 2 | 2 | 2 || 3 | 3 |...

2020-04-28 23:33:56 1072 2

原创 RR级别下,为什么唯一索引等值查询可以退化为行锁,而普通索引不行?

因为在等值查询时,由于唯一索引的唯一性,只要行锁,就能保证不会幻读;而普通索引的等值索引,还使用行锁的,那么可以插入相同的行,就会出现幻读。例如:select * from test where col=1 for update;如果col是唯一索引,那么只要锁住col=1的行,就无法产生幻读;如果col是普通索引,那么锁住col的行,依然可以插入col1=1的数据,那么重复执行就会比之...

2020-04-28 21:15:00 537

原创 null会存在索引里吗?null可以使用索引吗?为什么不建议列值默认是null?

一、null会存在索引里吗?别的RDBMS不清楚,Oracle是怎样的也记不清了,但是对于MySQL的二级索引,是存储null值的。例如:mysql> desc sam;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----...

2020-04-28 15:23:57 4297

原创 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 322

原创 一个不走索引的更新语句,到底会不会锁全表

经常看到有人说,如果一个DML不能走索引,就要锁全表。这正确吗?我曾经也这样以为,直到现在我才发现,对一半错一半吧。答案应该是:例如如下一个表:mysql> show create table sam\G*************************** 1. row *************************** Table: samCreate Ta...

2020-04-23 22:53:04 1880

原创 MySQL 行锁该怎么分析

一些可以用于排查的信息:1.information_schema.innodb_locks可以看到哪些事务在持有哪些锁,例如:+----------------------+-------------+-----------+-----------+-----------------------------------+------------+------------+----------...

2020-04-22 16:22:11 342

原创 关于Redis分布式锁的思考

一个分布式锁,需要满足以下:1.独享,即一个锁不能同时被两个客户端持有2.无死锁,即当一个持有锁的客户端异常退出了,锁要自动释放,否则其他客户端永远都拿不到锁3.单点问题,即若只用一个单实例来实现分布式锁,那么当这个节点挂了,也就导致分布式锁功能停止了。这其实并不是分布式锁的独有问题,单点问题是所有单实例Redis服务的共有问题。对于单点问题,Redis主从的方案也无法完全解决,例如客户...

2020-04-22 14:22:29 211

原创 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 1374 1

原创 临时表的特性,临时表是怎么写binlog的

临时表的特性,临时表是怎么写binlog的通过create temporary table …创建的临时表,仅对当前会话可见,当当前会话线程退出以后,将会自动删除临时表。需要注意的是,如果创建的临时表和已存在的表重名,那么访问该表明时,是访问临时表,如:mysql> use samDatabase changedmysql> show tables;+-----------...

2020-04-20 11:39:58 622

原创 关于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 399

原创 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 676

原创 一个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 204

原创 关于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 249

原创 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 590

原创 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 1108

原创 MongoDB 占用大量内存和Swap不释放

接到告警,一台部署了多实例MongoDB的机器内存和swap快用完了,排查发现下午某一个实例导入大量数据。为什么会用了这么多内存和swap?因为WiredTiger引擎使用内存的方式是:50% of (RAM - 1 GB)或256 MB,哪个更大就以哪个为上限。一个机器部署了多个实例,按照50% of (RAM - 1 GB)的比例分配,那当然是会把内存用完的。解决方式只能是重启实例了...

2020-01-09 15:35:44 3492

原创 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 1747

原创 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 357

原创 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 668

原创 MySQL 主从复制的一个BUG

发现一个主从复制的BUG,从库会自动跳过不存在的主键列,看例子。主库有一个sam表,其中id是自增主键:mysql> desc sam;+-------+---------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-----...

2020-01-03 17:04:24 373

原创 Linux 源码编译简单理解

源码安装通常会有以下步骤./configuremake make installconfigure是做一些检查工作,并且生成Makefile文件,简单来说就是指导下一步make命令应该怎么编译;make是参照Makefile文件进行自动编译;make install,将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录make clean清除上次的mak...

2019-12-13 11:08:35 195 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 5171 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 731

原创 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 1160 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 872

原创 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 348

原创 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 365

原创 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 154

原创 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 124

原创 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 249

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除