主从同步原理



主从同步原理

  1. 主服务器验证连接
  2. 主服务器为从服务器开启一个线程
  3. 从服务器将主服务器日志的偏移位告诉主服务器
  4. 主服务器检查该值是否小于当前二进制日志偏移位
  5. 如果小于,则通知服务器来取数据
  6. 从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠
  7. 当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器进入工作状态
  8. 从服务器SQL线程执行二进制日志,随后进入睡眠状态

配置实验环境

  1. 下载mysql安装包 # wget http://mirrors.sohu.com/mysql/MySQL-5.5/MySQL-server-5.5.38-1.rhel5.i386.rpm # wget http://mirrors.sohu.com/mysql/MySQL-5.5/MySQL-client-5.5.38-1.rhel5.i386.rpm
  2. 执行安装 # rpm -ivh MySQL-server-5.5.36-1.rhel5.i386.rpm # rpm -ivh MySQL-client-5.5.36-1.rhel5.i386.rpm
  3. 错误处理 缺少Perl包 error: Failed dependencies:/usr/bin/perl is needed by MySQL-server-5.5.36-1.rhel5.i386 安装Perl即可 # yum install -y perl
    与原先版本冲突 查看系统已经安装的版本 # rpm -qa | grep mysql 卸载 # rpm -e --nodeps mysql-libs-5.1.71-1.el6.i686 4.复制配置文件 # cp /usr/share/mysql/my-large.cnf /etc/my.cnf
  4. 启动服务 # service mysql start

设置主服务器

修改my.cnf配置文件如下

  1. log-bin=mysql-bin [必须]服务器ID,必须唯一,通常取IP最后一位
  2. server-id=1 [必须]服务器ID,必须唯一,通常取IP最后一位
  3. binlog-do-db=testdb [新增加]设置binlog记录的数据库,多个写多条
  4. binlog-ignore-db=testdb1 [非必须]设置binlog不记录的数据库,多个写多条
  5. expire-logs-days=10 设置binlog保存的天数为,默认保存30天

添加登录主服务器的账号

创建用户并授权

mysql> grant replication slave on *.* to 'slave'@'%' identified by 'admin888';

刷新授权表

mysql> flush privileges;

查看用户

mysql> select user,host from mysql.user;

锁定主服务器所有表

mysql> flush tables with read lock;

备份所有数据库数据

# mysqldump -uroot -p testdb>testdb.sql 导出testdb数据库当当前文件夹下的testdb.sql文件

复制数据到slave

# scp testdb.sql root@192.168.1.101:/root

查看主服务器状态

mysql> show master status

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 |      474 | hd           |                  |
+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

设置从服务器

修改mysql配置文件

# vim /etc/my.cnf

# 启用二进制文件
log-bin=mysql-bin
# 不能与主服务器相同,通常使用IP最后一位
server-id=2

重启mysql服务

service mysql restart ###导入从主服务器复制的sql文件 # mysql -uroot -padmin888 testdb<testdb.sql > 如果出现错误 ERROR! MySQL server PID file could not be found! > 执行 # rm -rf /var/lib/mysql/mysql-bin.index

同步binlog日志

mysql> change master to master_host='192.168.1.101',master_user='slave',master_password='admin888',master_log_file='mysql-bin.000009',master_log_pos=474;

开启从服务器(slave)同步

mysql> start slave;

解除主服务器(master)表锁定

mysql> unlock tables;

同步测试

comments powered by Disqus