一、实验目的与环境

  1. **实验目的:**<br /> MySQL是现在互联网最常用的开源数据库产品。但是我们平常开发使用,大都是用的单机服务。而在实际生产中,往往数据量会极为庞大,并且数据的安全性要求也更高,这样单机的MySQL,不管是性能还是安全都是达不到要求的。所以在生产环境中,MySQL必须是要搭建一套主从复制的架构,同时可以基于一些工具实现高可用架构。然后,在此基础上,就可以基于一些中间件实现读写分离架构。最后如果数据量非常大,还必须可以实现分库分表的架构。<br /> 当然,MySQL的这些架构搭建还是比较复杂的,通常会由专门的运维人员来搭建。所以这次实验的目的,并不是要大家就学会去搭建MySQL集群,而是带大家对生产环境下的MySQL架构有一定的理解,能够在自己的生产项目中运用上MySQL的生产架构。同时,也是为后面学习ShardingSphere分库分表打下基础。<br /> **实验环境:**<br /> 1Linux服务器两台:centos7<br /> 2mysql版本:mysql-8.0.20
说明:

关于MySQL的安装:Linux服务的基础安装,在之前学习MySQL优化课程时已经讲解过,这里就不再多做介绍了。MySQL服务器安装方式,大家可以参考官网的手册,自行进行。

MySQL安装手册地址:https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html

如果有同学想要在Linux上进行实验而MySQL安装实在有问题的话,可以推荐大家使用宝塔面板,可以省掉非常多的MySQL安装的问题。

另外,对于熟悉Docker的同学,可以直接用Docker来搭建,更为简单高效,也是未来互联网企业进行服务搭建的主流方式。大家以后学Docker的时候也可以留意下。

二、基础环境介绍

两台服务器,均安装CentOS7。
1、192.168.232.128 作为mysql主节点部署
2、192.168.232.129 作为mysql从节点部署
mysql版本:mysql-8.0.20
为了便于使用,两个mysql服务需要打开远程登录权限,开启方式需要在本机登录mysql,执行以下语句。

#开启远程登录
use mysql;
update user set host='%' where user='root';
flush privileges;

三、搭建主从集群

1、理论基础

主从架构有什么用?通过搭建MySQL主从集群,可以缓解MySQL的数据存储以及访问的压力。
1、数据安全
给主服务增加一个数据备份。基于这个目的,可以搭建主从架构,或者也可以基于主从架构搭建互主的架构。
2、读写分离
对于大部分的JAVA业务系统来说,都是读多写少的,读请求远远高于写请求。这时,当主服务的访问压力过大时,可以将数据读请求转为由从服务来分担,主服务只负责数据写入的请求,这样大大缓解数据库的访问压力。
要理解,MySQL的主从架构只是实现读写分离的一个基础。实现读写分离还是需要一些中间件来支持,比如ShardingSphere。
3、故障转移-高可用
当MySQL主服务宕机后,可以由一台从服务切换成为主服务,继续提供数据读写功能。
对于高可用架构,主从数据的同步也只是实现故障转移的一个前提条件,要实现MySQL主从切换,还需要依靠一些其他的中间件来实现。比如MMM、MHA、MGR。
在一般项目中,如果数据库的访问压力没有那么大,那读写分离不一定是必须要做的,但是,主从架构和高可用架构则是必须要搭建的。

2、同步的原理

MySQL服务的主从架构一般都是通过binlog日志文件来进行的。即在主服务上打开binlog记录每一步的数据库操作,然后从服务上会有一个IO线程,负责跟主服务建立一个TCP连接,请求主服务将binlog传输过来。这时,主库上会有一个IO dump线程,负责通过这个TCP连接把Binlog日志传输给从库的IO线程。接着从服务的IO线程会把读取到的binlog日志数据写入自己的relay日志文件中。然后从服务上另外一个SQL线程会读取relay日志里的内容,进行操作重演,达到还原数据的目的。我们通常对MySQL做的读写分离配置就必须基于主从架构来搭建。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21420049/1646299085432-26fb0652-4121-4169-b305-a4f61d2f3339.png#clientId=u0a10e56d-bcb6-4&from=paste&height=206&id=uaf676d6d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=411&originWidth=631&originalType=binary&ratio=1&size=175948&status=done&style=none&taskId=u09747b07-f291-416d-bd60-863517d2627&width=315.5)
MySQL的binlog不光可以用于主从同步,还可以用于缓存数据同步等场景。

例如Canal,可以模拟一个slave节点,向MySQL发起binlog同步,然后将数据落地到Redis、Kafka等其他组件,实现数据实时流转。

3、搭建主从集群

3.1 配置master主服务器

首先,配置主节点的mysql配置文件: /etc/my.cnf 这一步需要对master进行配置,主要是需要打开binlog日志,以及指定severId。我们打开MySQL主服务的my.cnf文件,在文件中一行server-id以及一个关闭域名解析的配置。然后重启服务。
[mysqld]
server-id=47
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
# 设置连接端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/mysql-files
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

配置说明:主要需要修改的是以下几个属性:
server-id:服务节点的唯一标识。需要给集群中的每个服务分配一个单独的ID。
log_bin:打开Binlog日志记录,并指定文件名。
log_bin-index:Binlog日志文件
重启MySQL服务, service mysqld restart
然后,我们需要给root用户分配一个replication slave的权限。

#登录主数据库
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;
#查看主节点同步状态:
show master status;

在实际生产环境中,通常不会直接使用root用户,而会创建一个拥有全部权限的用户来负责主从同步。