作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
在大型的互联网系统中,读的请求非常频繁,单个数据库节点不能满足读的要求,常见的做法是:读写分离
,将读操作分布至多个数据库从节点。
除了高性能外,高可用和容灾也是不容忽视的要求,许多系统会做数据备份,通过主从复制将数据备份至另一台物理服务器或者异地机房。
MySQL支持多种类型的数据复制:
- 基于语句的复制:技术成熟、复制数据高效,但在一些特殊场景(如:语句中含有now()等表示当前时间的函数)中会导致数据不一致。
- 基于行的复制:基于表的变化记录行信息,是最安全的复制方式,如果语句更新了大量的行,会生成很大的日志,效率受影响。
- 混合模式:兼顾基于语句和基于行的优点,正常情况下用基于语句来复制数据,对于不安全的语句采用基于行的方式来复制数据。
MySQL的复制过程:Master输出bin log(二进制日志),Slave拉取bin log写入本地的relay log(中继日志),然后解析重放操作。详细步聚如下:
- Master提交事务之前,将改变的内容串行地写入bin log。
- Slave通过I/O线程连接到Master,请求从指定日志文件的指定位置开始拉取内容。
- Master收到请求后,通过自身的I/O线程读取指定文件的指定位置后面的内容并返回给Slave。
- Slave收到响应后,将日志内容写入本地的relay log。
- Slave的SQL线程解析relay log,还原操作(在Slave端重放Master的操作),保持数据一致。
一、环境
- RedHat 5.x / CentOS 5.x
- GCC 4.1.2
- MySQL Master 5.5.43,已经存在数据,IP地址为192.168.56.102,监听端口为19826
- MySQL Slave 5.5.43,新建的实例(无数据),IP地址为192.168.56.102,监听端口为19836。
二、配置服务器ID和二进制日志
说明:
- Master和Slave必须用不同的服务器ID,如果有多个Slave,每个Slave的服务器ID也必须唯一。
- Master必须输出bing log。
1、配置Master
打开Master的配置文件my.cnf:
修改内容:
2、配置Slave
打开Slave的配置文件my.cnf:
修改内容:
注:配置完成后,重启master和slave。
三、授权和复制配置
1、配置Master
1)登陆Master。
2)在Master建立用于主从复制的账号并授权。
结果如下:
3)导出Master的数据库。
在操作系统命令行执行如下命令:
说明:
- –master-data=2 表示输出change master to 语句并在前面加上注释符(#),在Slave上执行change master to 时会用到。
4)查看Master状态。
结果如下:
2、配置Slave
1)登陆Slave。
在操作系统命令行执行如下命令:
2)导入数据库。
在mysql命令行执行如下命令:
3)查看Slave状态。
在mysql命令行执行如下命令:
4)配置复制。
在mysql命令行执行如下命令:
说明:db19826.sql中有一行内容记录导出数据时bin log日志文件及其位置。
5)启动Slave线程。
在mysql命令行执行如下命令:
6)查看Slave状态。
在mysql命令行执行如下命令:
mysql输出如下信息:
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.56.102 Master_User: repl_user Master_Port: 19826 Connect_Retry: 60 Master_Log_File: mysql-bin.000008 Read_Master_Log_Pos: 107 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000008 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 403 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 26 1 row in set (0.00 sec)
注:Slave_IO_Running和Slave_SQL_Running必须都是Yes,否则就说明存在错误,主从同步没有配置成功。
四、验证
1、查看Master的进程
在Master的mysql命令行输入如下命令:
2、查看Slave的进程
在Slave的mysql命令行输入如下命令:
3、主从数据复制校验
1、在Master新建一个表,SQL语句如下:
然后再插入一条记录:
2、进入Slave查看,同样可以看到新增了一个表account_cp,并且存在一条一样的记录。