主从数据库是什么意思呢,主是主库的意思,从是从库的意思。数据库主库对外提供读写的操作,从库对外提供读的操作。
数据库为什么需要主从架构呢?
(1)MySQL数据库默认是支持主从复制的,不需要借助于其他的技术,我们只需要在数据库中简单的配置即可。
(2)MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库 从另一台MySQL数据库进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
(3)二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的。
(4)简单来说就是一台服务器中的mysql数据库根据另一台服务器中的mysql数据库的日志文件进行分析然后执行sql语句进行数据复制。
docker pull mysql:latest
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
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;
一定要记住show master status的执行结果;这两个值都很关键!
这里的关键点在于——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
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
docker network inspect bridge
提前准备两台服务器,并且在服务器中安装MySQL,服务器的信息如下:
数据库 | IP地址 | 数据库版本 |
---|---|---|
Master | 192.168.1.2 | |
Slave | 192.168.1.3 |
服务器: 192.168.1.2
log-bin=mysql-bin #[必须]启用二进制日志
server-id=1 #[必须]服务器唯一ID(唯一即可)
systemctl restart mysqld
# 修改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的执行结果;这两个值都很关键!
服务器: 192.168.1.3
server-id=2 #[必须]服务器唯一ID(唯一即可)
systemctl restart mysqld
# 如果不在一台服务器,则直接使用外网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