工作原理
1、主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
2、从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql 协议,请求主节点的二进制日志文件中的事件
3、主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
4、从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个,在后面详细讲解)。
5、从节点启动另外一个线程(sql Thread ),把 Relay log 中的事件读取出来,并在本地再执行一次
配置mysql主从同步
准备两台测试的虚拟机,如上安装mysql环境,并开启mysql服务
主master : 10.0.0.1
从slave : 10.0.0.2
1、配置主库:
1)、授权给从数据库服务器
mysql> GRANT REPLICATION SLAVE ON *.* to 'async'@'10.0.0.2' identified by '123456'; mysql> FLUSH PRIVILEGES;
2)、修改主库配置文件,开启binlog,并设置server-id,每次修改配置文件后都要重启mysql服务才会生效
vim /etc/my.cnf
在该配置文件[mysqld]下面添加下面内容:
[mysqld] log-bin=/var/lib/mysql/binlog server-id=1 binlog-do-db = cmdb datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ......
server-id:master端的ID号【必须是唯一的】;
log-bin:同步的日志路径及文件名,一定注意这个目录要是mysql有权限写入的(我这里是偷懒了,直接放在了下面那个datadir下面);
binlog-do-db:要同步的数据库名
还可以显式设置不同步的数据库:
binlog-ignore-db = mysql 不同步mysql库和test库
binlog-ignore-db = test
修改配置文件后,重启服务:service mysqld restart
如果启动失败,通过cat /var/log/mysqld.log | tail -30 查看mysql启动失败的日志,从日志内容寻找解决方案。
3)、查看主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复
mysql> show master status; +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | binlog.000001 | 1304 | cmdb | | +---------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
主服务器已配置好。
2、配置从库
1)、理所当然也是从配置文件着手,在/etc/my.cnf 添加下面配置:
[mysqld] server-id=2 master-host=192.168.8.10 master-user=rep1 master-password=test123456 master-port=3306 replicate-do-db=cmdb ...... # 开启中继日志 relay-log=relay-log relay-log-index=relay-log.index server-id=2 innodb_file_per_table=ON skip_name_resolve=ON
重启时报错:mysqld: unknown variable ‘master-host=
说明mysql不认识这些变量,网上搜罗了一番,原因是mysql5.5+版本主从复制不支持这些变量,需要在从库上用命令来设置:
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.1', MASTER_PORT=3306, MASTER_USER='async', MASTER_PASSWORD='123456', MASTER_LOG_FILE='binlog.000001', #重启主节点该值会变化,请停止同步后改变该值重新启动同步 MASTER_LOG_POS=1304; #后面两个参数的值与主库保持一致
PS: 最好在从服务器的my.cnf里设置read_only选项,防止发生意外(连接用户[rep1]不能有SUPER权限,否则无效)
2)、启动slave进程
mysql> slave start; #或者start slave; 不同版本不一样 Query OK, 0 rows affected (0.04 sec)
3)、查看slave的状态,
show slave status\G;
如果下面两项值为YES,则表示配置正确:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
从库正在等待主库更新数据。。。Waitin for master to send event...