生存还是毁灭,这是个值得考虑的问题。——莎士比亚《哈姆雷特》
在实际的生产中,为了解决MySQL的单节点故障已经提高MySQL的整体服务性能,一般都
会采用主从复制
举例:
当在一个复杂的业务系统中执行一条SQL语句时,如果这条SQL语句导致数据库表被锁定,并且执行时间较长,那么整个系统可能会因为这个SQL语句的执行而无法提供正常的服务,从而影响用户的体验。
简单来说,就好比你在超市排队结账,突然有人拿着一大堆商品在结账台上慢慢核对价格,导致后面的人都得等待。这个过程中,其他顾客无法快速结账,整个结账过程变得缓慢,影响了大家的购物体验。
在数据库中,如果一条SQL语句执行期间锁定了重要的数据库表,并且执行时间很长,那么其他操作可能需要等待这条SQL语句执行完成才能继续进行,这就会导致整个系统的服务暂时不可用,用户可能会感受到延迟或无法正常使用系统的问题。为了避免这种情况,需要在设计数据库和编写SQL语句时考虑到效率和并发性,以确保系统能够快速响应用户请求并保持稳定运行。
主从复制(Master-Slave Replication)是一种数据库复制技术,通常用于创建数据备份、提高系统可用性以及实现读写分离。在主从复制中,一个数据库服务器充当主服务器(Master),负责处理写操作和更新数据;而其他一个或多个数据库服务器则作为从服务器(Slave),复制主服务器的数据,并通常用于处理读操作。
主从复制的工作原理很简单:主服务器上的数据变化会被记录在二进制日志中,并通过网络传输到从服务器。从服务器接收到这些变化记录后,将其应用到自己的数据库中,从而保持与主服务器数据的一致性。
Mysql的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread),Master一条线程和Slave中的两条线程。
master(binlog dump thread)主要负责Master库中有数据更新的时候,会按照binlog格式,将更新的事件类型写入到主库的binlog文件中。
并且,Master会创建log dump线程通知Slave主库中存在数据更新,这就是为什么主库的binlog日志一定要开启的原因。
I/O thread线程在Slave中创建,该线程用于请求Master,Master会返回binlog的名称以及当前数据更新的位置、binlog文件位置的副本。
然后,将binlog保存在 「relay log(中继日志)」 中,中继日志也是记录数据更新的信息。
SQL线程也是在Slave中创建的,当Slave检测到中继日志有更新,就会将更新的内容同步到Slave数据库中,这样就保证了主从的数据的同步。
以上就是主从复制的过程,当然,主从复制的过程有不同的策略方式进行数据的同步,主要包含以下几种:
「同步策略」:Master会等待所有的Slave都回应后才会提交,这个主从的同步的性能会严重的影响。
「半同步策略」:Master至少会等待一个Slave回应后提交。
「异步策略」:Master不用等待Slave回应就可以提交。
「延迟策略」:Slave要落后于Master指定的时间。
对于不同的业务需求,有不同的策略方案,但是一般都会采用最终一致性,不会要求强一致性,毕竟强一致性会严重影响性能。
安装前准备
MySQL :: Download MySQL Community Server
MySQL安装包下载地址
找到自己想要的版本下载到本地即可,然后拉取到自己的服务器内
或者就是使用wget下载
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.32-1.el7.x86_64.rpm-bundle.tar
1·检查环境
rpm -qa | grep mysql
rpm -qa | grep mariadb
如果上方两条命令存在软件包的话,执行rpm -e进行删除,直接rpm -e 复制下来软件包名称即可
2·服务器时间检查
使用date查询时间是否准确,如果不准,centos7系统可以使用ntpdate同步时间或者重启chronyd服务 (systemctl restart chronyd)
安装
创建MySQL工作目录,解压安装包
mkdir mysql
tar xvf mysql-5.7.32-1.el7.x86_64.rpm-bundle.tar -C mysql
cd mysql
按照依赖关系依次安装rpm包,依赖关系依次为common → libs → client → server
rpm -ivh mysql-community-common-5.7.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.32-1.el7.x86_64.rpm
查看配置文件
cat /etc/my.cnf
默认存储目录:datadir=/var/lib/mysql
启动mysql : systemctl start mysqld
开机自启动: systemctl enable mysqld
登录数据库: mysql -uroot -p
查看初始密码: cat /var/log/mysqld.log | grep password
进入数据库修改root初始密码:alter user root@localhost identified by 'password';
主从配置:
A:主库
vim /etc/my.cnf
log-bin = mysql-bin #[必须]启用二进制日志
server-id = 11 #[必须]服务器唯一ID,默认是1,最好取ip的后3位
expire-logs-days = 7 #只保留7天的二进制日志,以防磁盘被日志占满
重启数据库 :systemctl restart mysqld
登录数据库查看log_bin是否成功开启:log_bin为ON则表示开启成功,OFF表示开启失败
show variables like '%log_bin%';
B:从库
vim /etc/my.cnf
log-bin = mysql-bin #从库可不启用二进制日志
server-id = 12 #[必须]服务器唯一ID,默认是1,最好取ip的后3位
expire-logs-days = 7 #只保留7天的二进制日志,以防磁盘被日志占满
重启MySQL:systemctl restart mysqld
C:同步操作
登录主库执行
主库创建同步账号
grant replication slave on *.* to 'slave'@'%' identified by 'Peng123..';
replication即可满足同步需求,如果不行,可以给all权限
查询数据库账号
select user,authentication_string,host from mysql.user;
查看主服务器上当前的二进制日知名和偏移量值,
show master status\G
从库执行
stop slave;
change master to
master_host='192.168.142.11',
master_user='slave',
master_password='Peng123..',
master_log_file='mysql-bin.000001',
master_log_pos=439;
master_host 主库主机的IP地址
master_port 主库的端口,默认为3306
master_user 实现复制的远程登录master的mysql的用户
master_password 实现复制的远程登录master的mysql的面
master_log_file 实现复制的binlog日志文件(主库的文件名)
master_log_pos 实现复制的binlog日志文件的偏移量(主库的偏移量)
start slave;
查看状态。出现两个yes则表明配置完成
show slave status\G
验证:在主库上创建数据库或者新增数据,查看从库是否同步完成
没有出现双yes原因
IO线程:可能是防火墙导致故障,关闭或者放通3306即可
systemctl stop firewalld
或者
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload