MySQL主从介绍
- MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做做主从后,在A上写数据,另一台B也会跟着写数据,两者数据实时同步
- MySQL主从是基于binlog的,主上需要开启binlog才能进行主从。
binlog就是记录的MySQL的写入操作,主要就是创建,插入,修改,删除等等操作
binlog文件是一个二进制文件,无法直接cat查看。 - 主从过程大致有3个步骤
1主将更改操作记录到binlog里
2从将主的binlog事件(sql语句)同步到本机上并记录在relaylog里
3从根据relaylog里面的sql语句按顺序执行 - 主上有一个log dump线程,用来和从的I/O线程传递binlog
- 从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句落地
准备工作
需要准备两台虚拟机,分别都装上MySQL并且能正常运行
注意:克隆的虚拟机需要将网卡配置文件中的UUID删除掉,否则会有冲突
此次实验的环境是两台CentOS7.4系统的虚拟机
主服务器:
主机名:修改为mysql-master
IP:10.1.1.28
MySQL版本:5.6.35
从服务器
最小化安装的CentOS7.4系统,全新使用二进制包安装的MySQL服务
主机名:mysql-slave
IP:10.1.1.30
MySQL版本:5.6.35
配置主服务器
修改/etc/my.cnf配置文件
# 在/etc/my.cnf文件内容中添加下面两行配置
server-id=1028
log_bin=abcopy
启动或者重启mysqld服务
# /etc/init.d/mysqld restart
Shutting down MySQL.... SUCCESS!
Starting MySQL. SUCCESS!
//重启后查看 datadir 目录下的文件
# ls /data/mysql/
abcopy.000001 auto.cnf ib_logfile0 mysql performance_schema server-lnmp.pid
abcopy.index ibdata1 ib_logfile1 mysql-master.pid server-lnmp.err zrlog
其中 abcopy.000001 和 abcopy.index 两个文件是主从配置的关键文件
与abcopy.000001类似的文件后面会出现很多个,000002 000003等等
备份mysql库,然后恢复为 testbase 库,用于后面的测试
// 创建备份文件存放目录
# mkdir /mysqlbak
//备份mysql库
//注意如果没有将 mysql/bin 目录加入PATH
//那么mysql命令和mysqldump命令需要使用绝对路径,或者定义一个alias
# mysqldump -uroot -p123456 mysql > /mysqlbak/mysql.sql
//创建一个新的库 testbase
# mysql -uroot -p123456 -e "create database testbase"
// 将刚才备份的mysql库的文件恢复到testbase库
# mysql -uroot -p123456 testbase < /mysqlbak/mysql.sql
创建用于同步数据的用户
// 这个用户只需要两个权限,replication 和 slave,但是需要针对所有库
# mysql -uroot -p123456
mysql> grant replication slave on *.* to 'repl'@'10.1.1.30' identified by '123456'
锁表,备份所有需要同步的库
锁表是为了让数据库暂停到这一刻,只能读,不能写
然后进行备份,等会将备份的数据都恢复到从服务器里面
这样是为了让主服务器与从服务器之间的数据相同
// 锁表
# mysql -uroot -p123456 -e 'flush tables with read lock'
// 备份需要同步的库
// 注:mysql库是存放mysql用户数据和权限的,一般都不用同步,所以也不需要备份
// 所以这里只需要备份两个库: testbase zrlog
# mysqldump -uroot -p123456 -B testbase zrlog > /mysqlbak/base_bak.sql
查看主服务器的状态
# mysql -uroot -p123456 -e 'show master status'
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| abcopy.000001 | 661858 | | | |
+---------------+----------+--------------+------------------+-------------------+
注意:
这里需要记住两个地方,等会从服务器上会用到
File: abcopy.000001
Position:661858
配置从服务器
修改/etc/my.cnf 文件
// 在 /etc/my.cnf文件内容中添加下面的这一行配置就OK了,
server-id=1030
# 注:server-id 不能和主服务器相同
修改完后重启mysql服务
# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
将主服务器备份数据库的文件拷贝到从服务器上
//这里可以用scp命令,或者FTP等工具来拷贝文件
# scp 10.1.1.28:/mysqlbak/base_bak.sql ./
root@10.1.1.28's password: //这里输入源主机的密码
base_bak.sql 100% 681KB 81.7MB/s 00:00
创建对应的数据库,恢复数据
//这边需要创建两个库,testbase 和 zrlog ,从服务器还没有设置 mysql 的 root 密码
# mysql -uroot -e 'create database testbase'
# mysql -uroot -e 'create database zrlog'
//恢复数据
# mysql -uroot < ./base_bak.sql
//检查数据是否恢复成功
# mysql -uroot -e 'select count(*) from testbase.user'
+----------+
| count(*) |
+----------+
| 10 |
+----------+
//有数据,说明已经恢复成功了
配置从服务器参数
// 首先要进入mysql操作界面
# mysql -uroot
//关闭 slave
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
//配置slave参数
mysql> change master to master_host='10.1.1.28', master_user='repl', master_password='123456', master_log_file='abcopy.000001', master_log_pos=661858;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
# 参数解释
# change master to 固定命令
# master_host= 定义主服务器的ip,也可以是 ip:port
# master_user= 定义主服务器上用于同步的用户
# master_password= 定义同步用户的密码
# master_log_file= 定义主服务器上 show master status 查看到的 File
# master_log_pos= 定义主服务器上 show master status 查看到的 Position,不要加双引号或单引号
//然后开启 slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
// 这之后就可以解除主服务器的锁表状态了
// 注意这一步在主服务器上操作
# mysql -uroot -p123456 -e 'unlock tables'
查看主从同步状态是否正常
// 参看 Slave_IO_Running 和 Slave_SQL_Running 两个状态是否为 Yes
# mysql -uroot -e 'show slave status\G' | grep Running
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
//注:如果Slave_IO_Running为 Connecting
// 需要检查主服务器防火墙是否放行msyql的端口
// 或者查看slave参数的ip、user、password等参数是否定义正确
// 还需关注
# Seconds_Behind_Master: 0 //为主从延迟的时间
# Last_IO_Errno: 0 // IO线程错误代码
# Last_IO_Error: // IO线程错误信息
# Last_SQL_Errno: 0 // SQL线程错误代码
# Last_SQL_Error: // SQL线程错误信息
测试主从同步
// 先查看主服务器和从服务器的库是否相同
// 主服务器的库
# mysql -uroot -p123456 -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testbase |
| zrlog |
+--------------------+
// 从服务器的库,与主服务器相同
# mysql -uroot -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testbase |
| zrlog |
+--------------------+
// 在主服务器上创建一个库 test001
# mysql -uroot -p123456 -e 'create database test001'
# mysql -uroot -p123456 -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test001 | //此库就是刚创建的
| testbase |
| zrlog |
+--------------------+
// 查看从服务器是否自动创建这个库
# mysql -uroot -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test001 | //自动创建的
| testbase |
| zrlog |
+--------------------+
// 再删除主服务器的testbase库
# mysql -uroot -p123456 -e 'drop database testbase'
// 查看从服务器是否还有testbase库
# mysql -uroot -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test001 |
| zrlog |
+--------------------+
// 从服务器上的testbase也自动删除了。
注意:
千万不要在从服务器上做任何有关写入的操作,
在从服务器做写入操作会导致主从数据不一致,严重的需要重新做主从
拓展
有的同学,遇到主从不能正常同步,提示uuid相同的错误。这是因为克隆机器导致。
https://www.2cto.com/database/201412/364479.html
不停库不锁表在线主从配置
http://seanlook.com/2015/12/14/mysql-replicas/
主从不同步
http://www.rfyy.net/archives/2309.html
http://blog.51cto.com/storysky/259280
主主
关于 auto_increment https://blog.csdn.net/leshami/article/details/39779509
http://www.cnblogs.com/ygqygq2/p/6045279.html
mysql-proxy 实现读写分离
http://blog.51cto.com/zzclinux/1980487
mysql-proxy类似的产品有:
mycat 基于阿里的开源软件cobar,官网www.mycat.io
https://my.oschina.net/ruoli/blog/1789370
mycat实现分库分表
https://www.cnblogs.com/joylee/p/7513038.html
atlas 出自于360,不维护不更新了 https://blog.csdn.net/AnPHPer/article/details/80566385
mysql环形主从
http://ask.apelearn.com/question/11437
mysql架构演变 http://www.aminglinux.com/bbs/thread-8025-1-1.html
MHA架构
http://blog.51cto.com/xiaoshuaigege/2060768
比较复杂的mysql集群架构 http://ask.apelearn.com/question/17026