这篇文章只是让大家了解一下mysql的主从复制,并且实现了一个案例
但是这个案例不是典型的案例
后面会在写其他的配置方法主从复制解决的问题
- 数据分布
- 负载均衡
- 备份
- 高可用和故障切换
在这个案例中,我们只实现了备份 。其他几个点,我们后边一个一个实现,就不写概念了
主从复制是如何工作的
这里写的只是简单的实现过程,具体细节是很麻烦的,建议大家都去了解了解
- 主库会把数据的更改记录在一个二进制文件
- 从库会把主库的二进制文件复制到复制到自己的中继日志上(MySQL的日志类型有6中,不清楚的可以看看这篇文章【MySQL】日志分类)
- 从库读取中继日志的时间,然后重新放到备库的数据库上
开始准备
这是使用docker安装MySQL的流程
这里我们假定大部分配置采用默认值即可,在主库和备库都是全新
安装并且拥有同样的数据时这样的假设是合理的。接下来我们将展示如何一步步配置复制:假设有服务
器server1(IP地址172.10.0.2)和服务器server2(IP地址172.10.0.3)
在使用docker把MySQL8.0的主节点安装好后在创建俩个MySQL的从节点
分别执行下面语句,这俩个语句分别是创建mysql_slave 和 mysql_slave1的容器
docker run -itd --name mysql-slave -p 3307:3306 --net mynetwork --ip 172.10.0.3 -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -itd --name mysql-slave1 -p 3308:3306 --net mynetwork --ip 172.10.0.4 -e MYSQL_ROOT_PASSWORD=123456 mysql
可以看到我们现在创建了三个MySQL的容器
- 第一个是mysql-master
- 第二个是mysql-slave
- 第三个是mysql-slave1
然后三台节点都进入到各自的容器里
docker exec -it id /bin/bash
开始配置主从复制
创建账号
# 创建一个账号
CREATE USER 'master'@'172.10.0.%' IDENTIFIED WITH mysql_native_password BY '123456';
# 给予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'master'@'172.10.0.%';
修改主节点和从节点的配置文件在/etc.mysql/my.cnf
添加
server-id=1
这个server_id 主机跟从机的值坚决不可以一样 一般这个值是根据ip地址的后几位来确定
授权给从节点
CHANGE MASTER TO
MASTER_HOST='172.10.0.2',
MASTER_USER='master',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=0;
然后查看主从同步状态
Slave_IO_State、Slave_IO_Running和Slave_SQL_Running这三列
显示当前备库复制尚未运行。
开启主从复制
# 开启主从同步
start slave
# 停止主从复制
stop slave
然后在查看一下主从同步状态
最后一步开始测试主从复制
先给master创建一个数据库 kaka_test_master_slave
create datebase kaka_test_master_slave;
然后查看mysql_slave的数据库看有没有创建出来kaka_test_master_slave这个数据库
测试添加数据
创建表和添加测试数据
CREATE TABLE IF NOT EXISTS `phone` (
`phoneid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (phoneid)
);
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20))); I
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
查看mysql_slave的数据状态
数据一切正常
总结:
- 在这个案例中
- 我们只配置了一个master_slave 从机
- master_slave1这个从机没有配置
- 配置跟master_slave是一致的
- 在配置过程中我们需要注意几个问题
- 第一个:给主机创建用户和给予权限时版本不同是有区别的
- 第二个:在从机的my.cnf里边配置的server_id没有生效问题(咔咔暂时是用set global方式来做的,但是数据库重启就会失效),这个问题在这篇文章写完解决
- 第三个:对docker的配置一定要对啊!要不就完犊子了