MySQL 主从复制原理及环境搭建

一、主从复制的目的:
MySQL内建的复制功能是构建基于MySQL的大规模、高性能应用的基础,复制功能的目的是构建高性能的应用,同时也是高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。
比较常见的用途有以下几种:
1、数据分布:备份特定数据库
2、负载均衡:读写分离
3、高可用性和故障切换:从库的存在可以缩短宕机时间
二、主从复制的原理和步骤
简单的说就是master将数据库的改变写入binary log二进制日志,这个日志会记录下所有修改了数据库的SQL语句(insert,update,delete,grant等),slave同步这些二进制日志,并根据这些二进制日志进行数据操作,其实就是把主服务器上的binary log复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
整体来说,主从复制有以下步骤:
1、主节点必须启用二进制日志,记录任何修改数据库数据的事件。
2、从节点开启一个线程I/O Thread把自己扮演成mysql的客户端,通过mysql协议,请求主节点的二进制日志文件中的事件。
3、主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
4、从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪个二进制日志文件的哪个位置。
5、从节点启动另外一个线程(sql Thread ),把replaylog中的事件读取出来,并在本地再执行一次。
其原理图如下:
三、复制中线程的作用
从节点:
I/O Thread:从Master请求二进制日志事件,并保存于中继日志中。
Sql Thread:从中继日志中读取日志事件,在本地完成更新。
主节点:
Dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向从节点发送二进制事件。
如果从节点需要作为其他节点的主节点时,是需要开启二进制日志文件的。这种情况叫做级联复制。如果只是作为从节点,则不需要创建二进制文件。
四、主从复制配置过程
主节点:
1、启用二进制日志。
2、为当前节点设置一个全局唯一的server_id。
3、创建有复制权限的用户账号 replication slave。
从节点:
1、启动中继日志。
2、为当前节点设置一个全局唯一的server_id。
3、使用有复制权限的用户账号连接至主节点,并启动复制线程。
五、主从复制配置
主节点:
1、编辑 /etc/my.cnf 文件,[mysqld]下添加:
server-id=1 #设置服务器id,主节点和从节点的id需要设为不同
log-bin=mysql-bin         #开启二进制日志
#binlog_format=STATEMENT #设置binlog格式(默认:STATEMENT)
#binlog-do-db=testdb         #需要同步的数据库
#binlog-ignore-db=mysql #可以根据实际需求添加需要忽略的数据库
#expire_logs_days=7 #自动清理7天前的log文件,可根据需要修改
#log-slave-updates                    #在作为从数据库的时候,有写入操作也要更新二进制日志文件
#auto-increment-increment=2   #表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是 1 .. 65535
#auto-increment-offset=1          #表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是 1 .. 65535
完整如下:
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
user=mysql
port=3306
server-id=1
log-bin=mysql-bin
#binlog_format=STATEMENT
#binlog-do-db=testdb
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema
#binlog-ignore-db=sys
#expire_logs_days=7
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
binlog 日志三种格式:


2、重启服务
3、主库全备
#mysqldump -uroot -p123 -A -R --triggers --master-data=2 --singletransaction|gzip > /opt/full.sql.gz
4、创建一个主从复制用户
#mysql> grant replication slave on *.* to '用户名'@'%' identified by '123456';
5、查询binlog信息,后边从节点会用到
show variables like 'log_bin'; #查看是否打开binlog
show master status; #查看当前正在写入的binlog文件
show binary logs; #查看binlog日志文件列表
6、其他命令
#重启
systemctl restart mysqld
flush logs;    #刷新日志,此刻开始产生一个新编号的binlog文件
从节点:
1、编辑 /etc/my.cnf 文件,[mysqld]下添加
[mysqld]
server-id=2
2、重启服务
3、导入数据库
#scp /opt/full.sql.gz 192.168.1.102:/opt/         #将全备拷贝到从库
#zcat /opt/full.sql.gz |mysql -uroot -p #导入数据库
#zcat /opt/full.sql.gz |head -25 #查找位置点
4、执行 change master to 语句
CHANGE MASTER TO
MASTER_HOST='192.169.5.210',    #主节点IP
MASTER_PORT=3308,                    #主节点端口
MASTER_USER='root',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=475;
5、开启主从复制
start slave;
show slave status; #查看主从复制状态
#stop slave; #关闭主从复制
#reset slave all; #重置主从复制
6、主节点插入数据,验证是否成功

7、其他命令
#重启
systemctl restart mysqld
#启停SQL线程
mysql> stop slave sql_thread;
mysql> start slave sql_thread;
#启停IO线程
mysql> stop slave io_thread;
mysql> start slave io_thread;