October 6, 2018
MySQL中的半同步复制
"\u003cp\u003eMySQL当前存在的三种复制模式有:异步模式、半同步模式和组复制模式。注意:MySQL复制模式没有“同步复制”这一项的,文章中只是为了读者方便理解半同步复制的概念才介绍了同步复制概念 \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html\"\u003ehttps://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从MySQL5.5开始,MySQL以插件的形式支持半同步复制。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 异步复制(Asynchronous replication)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。\u003c/p\u003e\n\u003cp\u003e异步复制是MySQL最早的也是当前使用最多的复制模式,异步复制提供了一种简单的主-从复制方法,包含一个主库(master)和备库(一个,或者多个) 之间,主库执行并提交了事务,在这之后(因此才称之为异步),这些事务才在从库上重新执行一遍(基于statement)或者变更数据内容( …\u003c/p\u003e"
September 29, 2018
kubernetes中apiserver的证书
"\u003cp\u003e在kubernetes中,与api server 通讯时一般都需要使用https证书,这些证书文件存在放 /etc/kubernetes/pki 目录中(ubuntu)。主要有以下几种\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e/etc/kubernetes/pki/ca.{crt,key}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果你已有现成的证书也可以直接将证书复制到这个目录里即可。这时kubeadm就会跳过证书生成这个步骤。\u003c/p\u003e\n\u003cp\u003e证书生成后,kubeadm 接下来会为其它组件生成访问api server 所需要的配置文件,这些文件路径为: /etc/kubernetes/xxx.conf:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003els /etc/kubernetes/\nadmin.conf controller-manager.conf kubelet.conf scheduler.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里可以看到这四个配置文件,分别 为不同的组件之间提供配置。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/kubernetes-master.jp\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/kubernetes-master.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这些配置文件中存储的是Master节点的ip地址、端口号、证书目录等信息。这样对应的客户端(scheduler,kubelet, controller-manager等)就可以直接加载并读取相应的配置文件来与kube-apiserver 建立安全连 …\u003c/p\u003e"
September 24, 2018
Git中的git reset的三种参数的区别
"\u003cp\u003e我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是 “git-reset – Reset current HEAD to the specified state”, 注意这里主要操作的就是这个 \u003cstrong\u003eHEAD\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e为了方便我们先了解一下 Git 的工作流程\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/git_flow.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e相信大家对这个图已经很熟悉了,其中index也叫stage暂存区或者暂存索引区。git reset 共有三个互斥参数分别为”–soft”、”–mixed(默认参数)” 和 “–hard”,每种参数表示一种恢复模式,下面我们将分别看一下这git reset 三个参数的用法区别。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e前提条件\u003c/strong\u003e\n我们仓库中的Git 提交顺序为 “A(a.txt) -\u0026gt; B(b.txt) -\u0026gt; C(c.txt)“,当前分支为master。\n当前 HEAD 指向C,即 a47072e9f97eac4ac02c0abac82b26a9719663fc (HEAD -\u0026gt; master),我们以恢复到B(aad0c91e7b1d3577)点为准。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etest1 git:(master) …\u003c/code\u003e\u003c/pre\u003e"
September 18, 2018
MySQL中对MVCC的理解总结
"\u003ch1 id=\"一mvcc简介\"\u003e一、MVCC简介\u003c/h1\u003e\n\u003cp\u003eMVCC (Multiversion Concurrency Control),即多版本并发控制技术。InnoDB数据库的事务隔离级别就是通过UNDO和MVCC来实现的(ACID特性),旧数据存储在UNDO中,再通过DB_ROLL_PTR 回溯查找历史版本。\u003c/p\u003e\n\u003ch1 id=\"二mvcc原理\"\u003e二、MVCC原理\u003c/h1\u003e\n\u003cp\u003e1、通过DB_ROLL_PT 回溯查找数据历史版本2、通过read view判断行记录是否可见\u003c/p\u003e\n\u003cp\u003e理解这一块之前,我们必须先了解一下row的内部存储格式\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904183143992.png\" alt=\"image-20230904183143992\"\u003e\u003c/p\u003e\n\u003cp\u003e字段\b说明:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDB_ROW_ID:\u003cstrong\u003e长度6个字节。此值由\u003c/strong\u003eInnoDB自动生成\u003c/strong\u003e,聚集索引时使用。如果用户未显式指定表主键时,\u001b表优先使用\u003cstrong\u003e第一个非null的唯一索引\u003c/strong\u003e作为主键.否则使用DB_ROW_ID的值作为主键ID,聚集索引会使用此值。如果指定了表主键的话,则聚集索引使用指定的值。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDB_TRX_ID:\u003cstrong\u003e6个字节的事务ID。标记了最后\u003c/strong\u003e更新\u003c/strong\u003e此记录的事务ID,每开起一个新事务,其值自动+1\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDB_ROLL_PTR:\u003cstrong\u003e7字节的回滚指针。指向当前记录项的\u003c/strong\u003eundo log\u003c/strong\u003e记录,找之前版本的数据需通过此指针。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eMySQL中的MVCC原理\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.haohtml.com/wp-content/uploads/2018/09/mysql_mvcc_3.24.44.png\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/mysql_mvcc_3.24.44.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e首次 \u003ccode\u003einsert\u003c/code\u003e\u003c/strong\u003e …\u003c/p\u003e"
September 12, 2018
MySQL之ICP、MRR、BKA、BNL
"\u003ch1 id=\"index-condition-pushdownicp\"\u003eIndex Condition Pushdown(ICP)\u003c/h1\u003e\n\u003cp\u003eIndex Condition Pushdown (ICP)是mysql使用索引从表中检索行数据的一种优化方式。\u003c/p\u003e\n\u003ch3 id=\"icp原理\"\u003eICP原理\u003c/h3\u003e\n\u003cp\u003e禁用ICP,存储引擎会通过遍历索引定位基表中的行,然后返回给MySQL Server层,再去为这些数据行进行WHERE后的条件的过滤。\u003c/p\u003e\n\u003cp\u003e开启ICP,如果部分WHERE条件能使用索引中的字段,MySQL Server 会把这部分下推到存储引擎层,存储引擎通过索引过滤,把满足的行从表中读取出。ICP能减少引擎层访问基表的次数和MySQL Server 访问存储引擎的次数。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eICP的目标是减少从基表中全纪录读取操作的数量,从而降低IO操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e对于InnoDB表,ICP只适用于辅助索引。\u003c/p\u003e\n\u003ch3 id=\"icp标识\"\u003eICP标识\u003c/h3\u003e\n\u003cp\u003e当使用ICP优化时,执行计划的Extra列显示 \u003cstrong\u003eUsing index condition\u003c/strong\u003e提示\u003c/p\u003e\n\u003ch3 id=\"相关参数\"\u003e相关参数\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eoptimizer_switch=\u0026#34;index_condition_pushdown=on”;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e可以通过 SET optimizer_switch = …\u003c/p\u003e"
September 4, 2018
IO多路复用机制详解(转)
"\u003cp\u003e服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:\u003c/p\u003e\n\u003cp\u003e(1)\u003cstrong\u003e同步阻塞IO\u003c/strong\u003e(Blocking IO):即传统的IO模型。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182909126.png\" alt=\"image-20230904182909126\"\u003e\u003c/p\u003e\n\u003cp\u003e(2)\u003cstrong\u003e同步非阻塞IO\u003c/strong\u003e(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182842534.png\" alt=\"image-20230904182842534\"\u003e\u003c/p\u003e\n\u003cp\u003e(3)\u003cstrong\u003eIO多路复用\u003c/strong\u003e(IO Multiplexing):即经典的 \u003ca href=\"https://blog.csdn.net/linxcool/article/details/7771952\"\u003e反应器Reactor设计模式\u003c/a\u003e,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182800068.png\" alt=\"image-20230904182800068\"\u003e\u003c/p\u003e\n\u003cp\u003e(4)\u003cstrong\u003e异步IO\u003c/strong\u003e(Asynchronous IO):即经典的 \u003ca href=\"https://blog.csdn.net/xiongping_/article/details/45152333\"\u003eProactor设计模式\u003c/a\u003e,也称为异步非阻塞IO。不经常用。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182813616.png\" alt=\"image-20230904182813616\"\u003e\u003c/p\u003e\n\u003cp\u003e高性能I/O设计模式Reactor和Proactor: \u003ca href=\"https://blog.csdn.net/xiongping_/article/details/45152333\"\u003ehttps://blog.csdn.net/xiongping_/article/details/45152333\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/aspirant/p/9166944.html\"\u003eselect、poll、epoll之间的区别(搜狗面试)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e转自: …\u003c/p\u003e"
September 1, 2018
以B tree和B+ tree的区别来分析mysql索引实现
"\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/0371c9569736\"\u003ehttps://www.jianshu.com/p/0371c9569736\u003c/a\u003e\u003c/p\u003e"
August 31, 2018
Go的内存模型
"\u003cp\u003e\u003ca href=\"https://segmentfault.com/a/1190000008230146\"\u003ehttps://segmentfault.com/a/1190000008230146\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文: \u003ca href=\"https://golang.org/ref/mem\"\u003ehttps://golang.org/ref/mem\u003c/a\u003e\u003c/p\u003e"
August 30, 2018
如何优雅地关闭Go channel
"\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/d24dfbb33781\"\u003ehttps://www.jianshu.com/p/d24dfbb33781\u003c/a\u003e\u003c/p\u003e"
August 30, 2018
理解Go语言的nil
"\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/dd80f6be7969\"\u003ehttps://www.jianshu.com/p/dd80f6be7969\u003c/a\u003e\u003c/p\u003e"
August 28, 2018
[译]Go里面的unsafe包详解
"\u003cp\u003eunsafe包位置: \u003ccode\u003esrc/unsafe/unsafe.go\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e指针类型:\u003c/strong\u003e\n***类型:**普通指针,用于传递对象地址,不能进行指针运算。\n**unsafe.Pointer:**通用指针,用于转换不同类型的指针,不能进行指针运算。\n**uintptr:**用于指针运算,GC 不把 uintptr 当指针,uintptr 无法持有对象。uintptr 类型的目标会被 GC 回收。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eunsafe.Pointer 可以和 普通指针 进行相互转换。\nunsafe.Pointer 可以和 uintptr 进行相互转换。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e也就是说 unsafe.Pointer 是桥梁,可以让任意类型的指针实现相互转换,也可以将任意类型的指针转换为 uintptr 进行指针运算。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一般使用流程:\u003c/strong\u003e\n第一步:将结构体 -\u0026gt; 通用指针unsafe.Pointer(struct) -\u0026gt; uintptr(通用指针)获取内存段的起始位置start_pos,并记录下来,第二步使用。\n第二步:使用start_pos + unsafe.Offsetof(s.b) -\u0026gt; 将地址转为能用指 …\u003c/p\u003e"
August 28, 2018
golang中slice切片理解总结
"\u003cp\u003e首先我们对切片有一个大概的理解,先看一下slice的内部结构,共分三部分,一个是指向底层数组的时候,一个是长度len,另一个就是slice的容量cap了。如cap不足以放在新值的时候,会产生新的内存地址申请。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182516517.png\" alt=\"image-20230904182516517\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/image-20230904182527333.png\" alt=\"image-20230904182527333\"\u003e\u003c/p\u003e\n\u003cp\u003e先看代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n\n // 创建一个切片,长度为9,容量为10\n fmt.Println(\u0026#34;----- 1.测试切片变量append的影响(未申请新的内存空间)-----\u0026#34;)\n a := make([]int, 9,10)\n fmt.Printf( \u0026#34;%p len=%d cap=%d %vn\u0026#34; , a, len(a), cap(a), a)\n\n // 切片进行append操作,由于原来len(a)长度为9,而cap(a)容量为10,未达到扩展内存的要求,此时新创建的切片变量还指向原来的底层数组,只是数组的后面添加一个新值\n // 此时一共两个切片变量,一个是a,另一个是s4。但共指向的一个内存地址\n s4 := …\u003c/code\u003e\u003c/pre\u003e"
August 20, 2018
MySQL中的innodb_file_format 配置项解读
"\u003ch2 id=\"一innodb_file_format参数\"\u003e一:innodb_file_format参数\u003c/h2\u003e\n\u003cp\u003e在 innodb 1.0.6版本之前,innodb文件格式\u003ccode\u003einnodb_file_format\u003c/code\u003e只有 Antelope(Antelope 文件格式支持Redundant,Compact两种格式来存放行记录,Redundant是为了兼容之前版本而保留的。在mysql 5.1版本中,默认设置为Compact,用户可以通过 \u003ccode\u003eshow table status like 'table_name'\u003c/code\u003e来查看表使用的行格式row_format)\u003c/p\u003e\n\u003cp\u003e从innodb 1.0.6开始引入了新的文件格式 Barracuda 在原来的基础上(Antelope)新增了Dynamic和Compressed两种行格式。\u003c/p\u003e\n\u003ch2 id=\"二innodb_file_format如何使用\"\u003e二:innodb_file_format如何使用\u003c/h2\u003e\n\u003cp\u003e 一般, \u003ccode\u003einnodb_file_format\u003c/code\u003e 在配置文件中指定;\u003ccode\u003erow_format\u003c/code\u003e则在创建数据表时指定:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCREATE TABLE test2 (column1 INT PRIMARY KEY)\nENGINE=InnoDB ROW_FORMAT=Compressed KEY_BLOCK_SIZE=4;\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"三innodb_file_format--barracuda\"\u003e …\u003c/h2\u003e"
August 16, 2018
DBA必知的MySQL优化原理(推荐)
"\u003cp\u003e推荐阅读: \u003ca href=\"https://www.cnblogs.com/zishengY/p/6892345.html\"\u003ehttps://www.cnblogs.com/zishengY/p/6892345.html\u003c/a\u003e\u003c/p\u003e"
August 16, 2018
MySQL 5.6新特性MRR
"\u003ch2 id=\"一什么是mrr\"\u003e**一、什么是MRR **\u003c/h2\u003e\n\u003cp\u003eMMR全称是Multi-Range Read,是MYSQL5.6优化器的一个新特性,在MariaDB5.5也有这个特性。优化的功能在使用二级索引做范围扫描的过程中减少磁盘随机IO和减少主键索引的访问次数。\u003cstrong\u003e是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段。\u003c/strong\u003e(参考: \u003ca href=\"https://blog.csdn.net/caomiao2006/article/details/52205177\"\u003ehttps://blog.csdn.net/caomiao2006/article/details/52205177\u003c/a\u003e)\u003c/p\u003e\n\u003ch2 id=\"二mrr和没有mrr的区别\"\u003e**二、MRR和没有MRR的区别 **\u003c/h2\u003e\n\u003cp\u003e给出一个简单的例子,在innodb表执行下面的查询:\u003c/p\u003e\n\u003cp\u003eSELECT non_key_column FROM tbl WHERE key_column=x\u003c/p\u003e\n\u003cp\u003e在没有MRR的情况下,它是这样得到结果的:\u003c/p\u003e\n\u003cp\u003e1. select key_column, pk_column from tb where key_column=x order by key_column —\u0026gt;\n假设这个结果集是t\u003c/p\u003e\n\u003cp\u003e2. for each row in t ;\nselect non_key_column from tb where …\u003c/p\u003e"