在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过一台主、多台从节点,主节点提供写操作,从节点提供读操作来实现读写分离,从而提升数据库的并发负载能力
问:主从同步(主从复制的)的原理。
答:主从同步的核心是二进制日志文件binary log,对数据库所有的增加、修改、删除操作都会在日志表里面记录一下的。mysql主从复制是异步的,串行化的,有延迟的,并不是实时的。
第一步,master主节点将改变的数据记录在本地的二进制日志中binary log,该过程称为二进制日志事件。
第二步,slave将master的binary log拷贝到自己的relay log(中继日志文件)中。
第三步,中继日志事件,将数据读取到自己的数据库之中。
下面我们会以2台linux服务器在docker容器中构建mysql镜像进行搭建主从复制进行数据备份实例
- 首先,确保CentOS系统已经安装了Docker的依赖组件。通过运行以下命令来安装这些组件:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 安装Docker的稳定版本存储库。以下命令来设置存储库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker引擎。运行以下命令来安装Docker:
sudo yum install docker-ce
- 启动Docker服务。运行以下命令来启动Docker服务并设置它在系统启动时自动启动:
sudo systemctl start docker
sudo systemctl enable docker
- 现在,你可以验证Docker是否正确安装。运行以下命令来检查Docker版本:
docker --version
-
在终端或命令提示符中执行以下命令,下载MySQL 5.7的镜像:
docker pull mysql:5.7
-
创建一个文件夹来存储MySQL的数据和配置文件。例如,可以在当前目录下创建一个名为
mysql_data
的文件夹。 -
在终端或命令提示符中执行以下命令,创建MySQL容器,并将数据和配置文件映射到本地文件夹:
docker run --name mysql -v /usr/local/etc/mysql/mysql_data:/var/lib/mysql -v /usr/local/etc/mysql/config:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=your_password -p 3306:3306 -d mysql:5.7
-d
参数表示在后台运行容器。-p
参数指定容器内部的端口号和主机的端口号映射关系。这里将容器的3306端口映射到主机的3306端口。--name
参数用于指定容器的名称,这里将容器命名为mysql-container
。-v
参数用于将主机上的文件夹与容器内的文件夹进行映射。将本地的/绝对路径/mysql_data
文件夹映射到容器内的/var/lib/mysql
文件夹。-e
参数用于设置MySQL的root用户密码。将your_password
替换为您自己的密码。
-
执行完上述命令后,MySQL容器将会在后台启动。您可以使用以下命令检查容器的状态:
docker ps
实现主从mysql数据库
-
准备两台Linux服务器,分别为主服务器和从服务器。假设主服务器IP为192.168.0.1,从服务器IP为192.168.0.2。
-
在主服务器上安装MySQL,并确保MySQL服务已启动。
-
登录到主服务器上的MySQL控制台,创建一个用于复制的用户,并授予复制权限。假设用户名为replication_user,密码为password,复制权限为REPLICATION SLAVE。
CREATE USER 'replication_user'@'192.168.0.2' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'192.168.0.2';
FLUSH PRIVILEGES;
- 在主服务器上找到MySQL的配置文件my.cnf(通常位于/etc/mysql/my.cnf或/etc/my.cnf),并进行如下更改,在[mysqld]部分添加以下配置:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = your_database_name
6.登录到从服务器上的MySQL控制台,创建一个用于复制的用户,并授予复制权限。假设用户名为replication_user,密码为password,复制权限为REPLICATION SLAVE。
CREATE USER 'replication_user'@'192.168.0.1' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'192.168.0.1';
FLUSH PRIVILEGES;
7.在从服务器上找到MySQL的配置文件my.cnf,并进行如下更改:
sudo nano /etc/mysql/my.cnf
在[mysqld]部分添加以下配置:
server-id = 2
保存并关闭文件。
8.重启主服务器和从服务器上的MySQL服务以使配置更改生效。
sudo service mysql restart
9.登录到从服务器上的MySQL控制台,设置从服务器连接到主服务器的相关参数。假设主服务器IP为192.168.0.1,主服务器端口为3306,复制用户名为replication_user,密码为password。
CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_PORT=3306, MASTER_USER='replication_user', MASTER_PASSWORD='password';
- 启动从服务器的复制进程。
START SLAVE;
- 检查从服务器的复制进程状态。
SHOW SLAVE STATUS\G
在结果中,确保以下字段的值为YES:
- Slave_IO_Running
- Slave_SQL_Running
如果两个字段的值都为YES,即表示主从复制已成功配置。