每一个数据库的业务都对应着一个前端的业务,
主从复制架构的必要性?
第一点是两个服务器如果有一台服务器出现故障,那么另一台服务器可以正常工作,以保障前端业务可以被正常访问,第二点是两个服务器可以共同去处理数据,提升处理数据的读写操作。
无论是要避免单点故障还是说要提升数据库的数据读写效率。
基本的要求是要保证所有数据库服务器上的数据要是一致的,要是相同的。这样就算挂掉任何一个服务器都不会影响我数据的正常读写操作。
那么如何实现多台数据库服务器之间的数据同步和数据一致。
专业上的名词就是主从复制.
一.主从复制
如上图所示,所谓的主从复制就是主数据库服务器上的数据可以复制给从数据库服务器一份,以此来减少单点故障导致业务停止,以及提升数据的读写效率【缓解单台数据库服务器的数据负载】。
主从复制的工作原理
如上图所示,主服务器的所有写操作,都会被记录到主服务器本地的二进制日志文件中,随后主服务器上会产生一个线程,这个线程负责将主服务器二进制日志文件中的内容,发送到从服务器,随后从服务器会产生一个IO线程,这个线程的工作有两个,第一个工作内容是读取,主服务器发送过来的二进制日志文件的写操作内容,第二个工作是将主服务器发送过来的二进制日志文件内容写到从服务器本地的二进制日志文件中,而从服务器的SQL线程的主要工作有两个,第一个主要工作是将从服务器的二进制日志文件中的写操作内容,读取出来,第二个工作是执行在本地机器,以此保证数据的一致性。
从服务器上的这个日志文件是中继日志,
如何检测主从复制架构配置成功,这主要看从服务器上是否存在两个线程,一个线程是IO线程,一个线程是SQL线程。
主从复制架构的核心关注点就是要确保两个服务器之间的数据同步。
主从复制中一直会有的是时间延迟的问题。
二进制日志文件是用来记录自己机器上发生的写操作的,而从服务器上的中继日志文件是用来记录主服务器上发生的写操作的。
设计主从复制架构的一些准备工作。
1.主服务器上需要开启二进制日志文件用来记录自身的写操作。
2.每一台服务器上都需要有自己的server_ID用来标明自身的身份。
3.从服务器上的IO线程可以到主服务器上去读取二进制日志文件中的写操作内容,那么主服务器上就需要有一个允许从服务器连接主服务器的远程用户。
主从复制架构的作用
1.避免单点故障导致前端业务停止。
2.方便做数据的冷备份,不会影响数据的正常读写【可以把从服务器工作停掉,然后去备份从服务器上的数据。】
3.主从复制架构可以帮助我们缓解单台服务器的工作负载,这种缓解单台服务器的工作负载的方式叫做读写分离。【即在主从复制的结构之上我们可以去配置读写分离。】
对于数据库而言除了写入数据的操作,其他的操作都是读操作。
如上图所示,此时主服务器只负责写操作,从服务器只负责读操作,读写分离一定是在主从复制的架构上实现的。
并且这个主从复制架构构建好之后,只能是主服务器执行写操作,从服务器执行读操作,只能是主服务器往从服务器上同步数据,不可能是从服务器往主服务器上同步数据,【所以在主从复制环境中只能是主服务器执行写操作,从服务器执行读操作。】
读写复制如何在主从架构环境中实现?
读写分离的实现:
1.代码,开发【所有的写操作都是主服务器执行,所有的读操作都是从服务器执行。】
用户名 密码 IP
如果由于我服务性质的变化,我服务器的IP发生了变化,那么代码中相对应的服务器的IP地址也要发生变化。
2.数据库中间件软件
接受前端业务发起的数据库连接。数据库中间件软件能够帮助我们分析前端业务所执行的操作是读操作还是写操作,如果是写操作就由中间件转到主服务器上执行,如果是读操作就由中间件转到从服务器上执行,并且这个数据库中间件软件还能够隐藏我后端数据库软件的信息。不好的地方是如果数据库中间件挂了,数据库服务也就挂了,
数据库中间件软件mysql-proxy,atlas软件由360公司做的二次开发,myCAT软件
读写分离的实现方式:
a.开发代码
b.数据库中间件软件
常见主从复制架构:
一主一从
一主多从
双主复制
二.主从复制架构的基本配置
环境描述:
192.168.183.10 Master服务器
192.168.183.11 Slave服务器
场景演示:
一般不会在一个服务一上线的时候,就去配置多台数据库服务器,一般会在这个业务上线一段时间,以后,这个业务起来以后,才会去考虑配置主从复制架构。
所以此时有一台服务器已经有了大量的数据,你现在买了一台新的数据库服务器作为从数据库服务器,那么现在要做的工作就是把主数据库服务器做一个完全备份,然后把这个完全备份在从数据库服务器上去执行一遍,此时这个从服务器上就有了主服务器上大致的数据,
此时我们再次去考虑如何减少主服务器将数据复制到从服务器的时间延迟的问题?
所以此时有一台服务器已经有了大量的数据,你现在买了一台新的数据库服务器作为从数据库服务器,那么现在要做的工作就是把主数据库服务器做一个完全备份,然后把这个完全备份在从数据库服务器上去执行一遍,此时这个从服务器上就有了主服务器上大致的数据,
1.关闭防火墙和seLinux,时间同步,设置主服务器的主机名,设置从服务器的主机名。
2.安装mariadb-server数据库,导入jiaowu数据库。
如上图所示,此时主服务器和从服务器提供数据库服务的软件都安装成功。
如上图所示,这是在主服务器上设置数据库软件的启动和开机自启。
如上图所示,刚刚安装的数据库软件是没有密码的,这个-p的选项可以不用写。此时可以将这个数据库文件导入到数据库中。
3.在master服务器上启用server_id,二进制日志文件
如上图所示,启动这个server_id=10,并且设置二进制日志文件名称为master,因为没有指定专门存放二进制日志文件的目录,所以这个二进制日志文件默认是存放在数据库的数据目录下。
随后使用systemctl restart mariadb来重启数据库服务。
4.在master服务器创建允许从服务器连接的远程用户。
如上图所示,这是在主服务器上创建了一个允许192.168.183.11从服务器远程连接的用户,【创建用户还有授权的操作同时完成。】
5.完全备份master服务器数据,在slave服务器上进行恢复。
如上图所示,这是将master数据库数据,进行完全备份以减少数据库之间进行数据备份时产生的时间延迟,并且使用rsync这个工具,将差异的文件内容,传输到slave服务器上,准备在slave服务器上进行数据恢复。
如上图所示,用mysql -uroot < sql文件,将sql文件中的数据导入到数据库中。
6.在slave服务器上配置server_id
如上图所示,这是在slave服务器的/etc/my.cnf文件中去配置这个slave服务器的server_id=11
如上图所示,随后把服务重启使得配置文件中的内容生效。
7.在slave服务器上连接master服务器
slave服务器连接master服务器的IP地址,连接master服务器的用户名,连接master服务器,用户的密码,连接master服务器的端口,连接master服务器的二进制日志文件名称,【将来这个master主服务器的二进制日志的存放路径无所谓,只需要在slave服务器远程连接master服务器的时候,添加上master服务器的二进制日志文件名称就可以了。】
随后的MASTER_LOG_POS=4,和之前的MASTER_LOG_FILE='master2-bin.001',这两行配置的意思是指示slave服务器从master服务器的哪个二进制日志文件的哪个事件的位置开始复制数据。
如上图所示,可以从完全备份文件的最后部分来看,master数据库服务器所使用的二进制日志文件,以及最后一个事件的结束位置。
如上图所示,这是在slave服务器上做的,此时slave服务器就可以连接master服务器了。
8.启动复制线程
如上图所示,这是在slave服务器上去启动IO和slave线程,
9.在slave服务器上查看复制线程状态
如上图所示,这是在slave服务器上查看复制线程的状态。
如上图所示,此时slave服务器上的IO线程和SQL线程都启动了,这就代表,这个slave服务器和master服务器之间的主从复制架构配置成功了。
如上图所示,这行配置是从服务器上生成的中继日志的名称。
如上图所示,从服务器的中继日志默认是存放在数据目录中。
随后在中继日志中记录事件的最后一个位置是526
如上图所示,这就表示master服务器和slave服务器的数据同步。
上面一行数据表示的是从服务器读取主服务器的最后一个事件的位置,下面一行表示的是从服务器复制数据到哪个事件的位置了。当这两个数字的位置是一致的时候,表示master服务器和slave服务器的数据同步。
如上图所示,这是数值表示的就是从服务器与主服务器之间的时间延迟。
主从复制就叫做AB复制。