MySQL 主从集群搭建

MySQL主从集群

数据库主从概念、优点、用途

主从数据库是什么意思呢,主是主库的意思,从是从库的意思。数据库主库对外提供读写的操作,从库对外提供读的操作。

MySQL 主从集群搭建_第1张图片

数据库为什么需要主从架构呢?

  • 高可用,实时灾备,用于故障切换。比如主库挂了,可以切从库。
  • 读写分离,提供查询服务,减少主库压力,提升性能
  • 备份数据,避免影响业务。

主从复制介绍

(1)MySQL数据库默认是支持主从复制的,不需要借助于其他的技术,我们只需要在数据库中简单的配置即可。

(2)MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库 从另一台MySQL数据库进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。

(3)二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的。

(4)简单来说就是一台服务器中的mysql数据库根据另一台服务器中的mysql数据库的日志文件进行分析然后执行sql语句进行数据复制。
MySQL 主从集群搭建_第2张图片

1.通过Docker搭建主从集群

1.2.镜像拉取

docker pull mysql:latest

1.3.启动主库镜像

docker run \
        --restart=always \
        -p 3306:3306 --name mysql-master \
        -v /opt/mysql-master/log:/var/log/mysql \
        -v /opt/mysql-master/data:/var/lib/mysql \
        -v /opt/mysql-master/conf/my.cnf:/etc/mysql/my.cnf \
        -v /opt/mysql-master/conf.d:/etc/mysql/conf.d \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -d mysql:latest --server-id=1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --log-bin=mysql-bin --sync_binlog=1

1.4.主库操作

docker exec -it mysql /bin/bash
mysql -uroot -p123456

# 修改mysql身份验证插件为mysql_native_password;
# 因为mysql 8.0+起;其默认的身份验证插件为caching_sha2_password;
# 如果不改会导致登录验证失败;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 创建从库数据同步用户slave;
CREATE USER slave IDENTIFIED WITH mysql_native_password BY '123456';
#  授权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' ;
# 生效
FLUSH PRIVILEGES;
# 查看主库状态
show master status;

1.5.记录bin-log信息

一定要记住show master status的执行结果;这两个值都很关键!

MySQL 主从集群搭建_第3张图片

1.6.启动从库镜像

这里的关键点在于——server-id!这个server-id就相当于每个库的身份证 有且唯一

docker run \
        --restart=always \
        -p 3307:3306 --name mysql-slave \
        -v /opt/mysql-slave1/log:/var/log/mysql \
        -v /opt/mysql-slave1/data:/var/lib/mysql \
        -v /opt/mysql-slave1/conf/my.cnf:/etc/mysql/my.cnf \
        -v /opt/mysql-slave1/conf.d:/etc/mysql/conf.d \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -d mysql:latest --server-id=2 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

1.7.从库操作

docker exec -it mysql /bin/bash
mysql -uroot -p123456

# 如果不在一台服务器,则直接使用外网ip即可
CHANGE MASTER TO MASTER_HOST='master ip ',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1357;

# 开启主从复制
start slave;

# 查看从库状态
show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.0.0.3
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1357
               Relay_Log_File: 6a5b3318f91e-mysql-bin.000003
                Relay_Log_Pos: 323
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
1.8.Docker相同主机查看IP
docker network inspect bridge

在这里插入图片描述

2.通过服务器搭建主从集群

提前准备两台服务器,并且在服务器中安装MySQL,服务器的信息如下:

数据库 IP地址 数据库版本
Master 192.168.1.2
Slave 192.168.1.3

2.1.将两台数据库服务器启动

MySQL 主从集群搭建_第4张图片

2.2.主库配置

服务器: 192.168.1.2

2.2.1.修改MySQL数据库的配置文件/etc/my.cnf
log-bin=mysql-bin   #[必须]启用二进制日志
server-id=1         #[必须]服务器唯一ID(唯一即可)

MySQL 主从集群搭建_第5张图片

2.3.重启MySQL服务

systemctl restart mysqld

2.4.创建数据同步的用户并授权

# 修改mysql身份验证插件为mysql_native_password;
# 因为mysql 8.0+起;其默认的身份验证插件为caching_sha2_password;
# 如果不改会导致登录验证失败;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 创建从库数据同步用户slave;
CREATE USER slave IDENTIFIED WITH mysql_native_password BY '123456';
#  授权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' ;
# 生效
FLUSH PRIVILEGES;
# 查看主库状态
show master status;

一定要记住show master status的执行结果;这两个值都很关键!

MySQL 主从集群搭建_第6张图片

2.5.从库配置

服务器: 192.168.1.3

修改MySQL数据库的配置文件/etc/my.cnf
server-id=2         #[必须]服务器唯一ID(唯一即可)

MySQL 主从集群搭建_第7张图片

2.6.重启MySQL服务
systemctl restart mysqld
2.7.登录数据库,设置主库地址及同步位置
# 如果不在一台服务器,则直接使用外网ip即可
CHANGE MASTER TO MASTER_HOST='master ip ',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1228;

# 开启主从复制
start slave;

# 查看从库状态
show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.1.2
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1228
               Relay_Log_File: 6a5b3318f91e-mysql-bin.000001
                Relay_Log_Pos: 323
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

成功

MySQL 主从集群搭建_第8张图片

你可能感兴趣的:(linux,mysql)