MySQL的Replication是一种多个MySQL的数据库做主从同步的方案,特点是异步,广泛用在各种对MySQL有更高性能,更高可靠性要求的场合。与之对应的另一个技术是同步的MySQL Cluster,但因为比较复杂,使用者较少。
下图是MySQL官方给出了使用Replication的场景:
Mysql 的 Replication 是一个异步的复制过程,从一个MySQL节点(称之为Master)复制到另一个MySQL节点(称之Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(SQL 线程和 I/O 线程)在 Slave 端,另外一个线程(I/O 线程)在 Master 端。
要实现 MySQL 的 Replication ,首先必须打开 Master 端的 Binary Log,因为整个复制过程实际上就是 Slave 从 Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
看上去MySQL的Replication原理非常简单,总结一下:
从这几条Replication原理来看,可以有这些推论:
如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。
主从配置:
实验环境: Master: 192.168.1.250 已经通过源码安装mysqlmysql-5.1.51
Slave: 192.168.1.128 已经通过源码安装mysqlmysql-5.1.51
1. 登陆Master主机,创建mysql 的slave用户
mysql> grant replication slave,reload,super on *.* to [email protected] identified by 'slave';
2. 修改master的mysql配置文件 my.ini 或 my.cnf
server-id=1 #设置 server id
log-bin= mysql-binlog # 打开二进制日志 ,最好放在不同的硬盘上,减小 IO 消耗
expire_logs_day= 1 0 # 设置二进制日志保存日期
max_binlog_size=500M # 设置 每个 binlog 文件的大小
3. 重新启动mysql服务
# service mysql restart
4. 获取相关的db信息, 供slave链接db时使用
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000027 | 183 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
5. 登陆slave 主机,修改my.ini 或 my.cnf 配置文件
server-id=2 # 配置多个从服务器时依次设置 id 号
slave-skip-errors=all # mysql 复制可能出现主服务器上可以运行的语句,从服务器不能够运行,所以我们在 my.cnf 加一句 slave-skip-errors=all 意思是忽略所有的 sql 语句错误!
relay-log= mysql -relay-bin # 该文件用于存放 Slave 端的 I/O 线程从 Master 端读取的二进制文件信息
关闭 binlog 主要考虑到我们使用 Master 的 binlog 进行增量备份,这里就不需要了。
6. 重启mysql 服务后,slave主机登陆mysql,进行slave服务器授权(这之前可以用mysqldump将master数据库导入到slave数据库)
mysql> change master to master_host='192.168.1.250', master_user='slave', master_password='slave',master_log_file='mysql-bin.000027',master_pos=183;
7. 启动slave同步。
mysql> start slave;
8. 检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。
mysql> show slave status
这时可以在master数据库新建一个数据库,然后在slave 端show databases; 查看复制是否成功。