原理
MySQL
mysql主从复制原理:
(1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
mysql主从怎么实现:
分别修改主从数据库的配置文件my.ini,然后在master上创建一个专门用于复制的账户, 这个新增的账户可以在表mysql.user中进行查询, 我第一次操作的时候,到这里就完成了这个账号的创建,
但是到真正复制的时候,却发现复制没有成功,排查错误的时候发现master生成的binlong没有问题,然后查看slave的状态, 在结尾处有这样一行错误: 使用weidai这个账号无法连接到master,所以应该是没有获取到master的binlog,导致中继日志无法生成。我反复检查了账号和密码都没有发现问题,然后查找相关资料,才发现是因为在master创建新用户的时候少了一步操作:新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问。 这就是出现前面错误的原因。另外还有一种办法是重新启动mysql服务器,来使新设置生效。
获取主数据库中此刻数据的位置,主要用于从数据启动后,复制数据的起始位置,但是在获取这个状态值之前,主数据库就不能再有数据的修改操作,所以需要先设置读锁定有效
主库进行数据备份,备份结束后可以释放读锁,主库就可以进行写操作
启动从数据库,对刚才备份的数据进行还原,这个时候主从数据库在备份那个时间点的数据是一致的。
在从数据库上进行复制行为的相关配置
这个时候配置完成,但是还需要启动slave线程,否则从数据库不能进行同步,
在master中创建表和新增数据,在slave中观察: 可以看出,我在master中进行的操作,都能在slave中体现出来,这个时候slave就如同是master的镜子一样。
主从同步状态解读,在slave上使用命令进行查看:show slave status;
flannel工作原理:
数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
Flannel通过Etcd服务维护了一张节点间的路由表,详细记录了各节点子网网段 。
源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器。
kubernetes Pod创建 的 工作流程:
第一步:
kubectl 向api server 发起一个create pod 请求
第二步:
api server接收到pod创建请求后,不会去直接创建pod,而是生成一个包含创建信息的yaml。
第三步:
apiserver 将刚才的yaml信息写入etcd数据库。到此为止仅仅是在etcd中添加了一条记录, 还没有任何的实质性进展。
第四步:
scheduler 查看 k8s api ,类似于通知机制。
首先判断:pod.spec.Node == null?
若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node。
然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)
ps:同样上述操作的各种信息也要写到etcd数据库中中。
第五步:
kubelet 通过监测etcd数据库(即不停地看etcd中的记录),发现api server 中有了个新的Node;
如果这条记录中的Node与自己的编号相同(即这个Pod由scheduler分配给自己了);
则调用node中的docker api,创建container。
CentOS6和CentOS7的区别:
防火墙规则:[CentOS6] iptables, [CentOS7] firewalld
服务启动命令:[CentOS6]servic,[CentOS7]systemctl
网卡:[CentOS6]eth0,[CentOS7]ens33
ipconfig 变成了 ip addr
Mysql存储原理:
1.连接池:最上层负责和客户端进行连接,比如jdbc,odbj这样的数据库连接的API,在这一层有连接池的概念,类似于线程池,连接池可以同时处理很多个数据库请求。同时这一层有SSL的安全概念,可以确保连接是安全的;
2.SQL接口:当SQL语句进入MySQL后,会先到SQL接口中,这一层是封装层,将传过来的SQL语句拆散,将底层的结果封装成SQL的数据格式;
3.解析器:这一层负责将SQL语句进行拆分,验证,如果语句有问题那么就返回错误,如果没问题就继续向下执行;
4.优化器:对SQL查询的结果优化处理,产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。比如select a,b from c where d。在这里会先查询c表中符合d的数据并将他们的ab项进行投影,返回结果,并不会直接把整张表查出来;
5.缓存:对要查询的SQL语句进行hash后缓存,如果下一次是相同的查询语句,则在SQL接口之后直接返回结果;
6.存储引擎:MySQL有很多种存储引擎,每一种存储引擎有不同的特性,他们负责组织文件的存放形式,位置,访问文件的方法等等。比较常用的有innoDB,MyISAM,MEMORY等;
7.文件系统:真正存放物理文件的单位;
系统优化怎么做-Linux系统配置优化:
1.永久关闭selinux: selinux提高系统安全性,但会造成很多麻烦,一般关闭
/etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled,保存后退出,重启生效
2.设置系统的级别为3:init 3 节约系统资源
3.加大系统文件描述符最大值
vim /etc/security/limits.conf
noproc 是代表最大进程数
nofile 是代表最大文件打开数



