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原理非常简单,总结一下:
每个从仅可以设置一个主。
主在执行sql之后,记录二进制log文件(bin-log)。
从连接主,并从主获取binlog,存于本地relay-log(relay-log日志记录的是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器),并从上次记住的位置起执行sql,一旦遇到错误则停止同步。
从这几条Replication原理来看,可以有这些推论:
主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。
如果主从的网络断开,从会在网络正常后,批量同步。
如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。
一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。
如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。
优点:
1. mysql的主从复制的主要优点是同步"备份", 在从机上的数据库就相当于一个(基本实时)备份库.
2. 在主从复制基础上, 通过mysqlproxy可以做到读写分离, 由从机分担一些查询压力.
3. 做一个双向的主从复制, 两台机器互相为主机从机, 这样, 在任何一个机器的库中写入, 都会"实时"同步到另一台机器, 双向的优点在于当一台主机发生故障时, 另一台主机可以快速的切换过来继续服务.
步骤:
1. 在两台机器上添加一个用于从机访问的帐号, 赋予REPLICATION SLAVE权限.
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slave';
MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户
为slave用户赋予任何数据库中任何表上的REPLICATION SLAVE权限, 此用户可以在网络任意位置访问, 访问时以密码slave标记.
当使用的是ubuntu的时候, 需要注意一点, /etc/mysql/my.cnf配置文件下的bind-address = 127.0.0.1这一行需要注释, 不然从机在请求时是连接不到的
2. 配置服务器编号, 开启bin-log 编辑mysql配置文件, linux: /etc/mysql/my.cnf, windows: c:/program files/mysql/mysql 5.0/my.ini
找到[mysqld]这个标签, 在它的下面有两行
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
打开这两行的注释, 注意这里的server-id是服务器编号, 所以, 两台服务器上的值要设置的不一样. 比如1和2
3. 使server-id和log-bin的配置修改生效: sudo /etc/init.d/mysql restart 或者windows下在服务里重启mysql服务
4. 分别重新打开一个mysql控台台, 配置主机
CHANGE MASTER TO
MASTER_HOST = 'host', #另一台机器的地址
MASTER_PORT = 3306, #另一台机器的端口
MASTER_USER = 'slave',#另一台机器上第一步分配的用户名
MASTER_PASSWORD = 'slave', #另一台机器上第一步分配的密码
MASTER_LOG_FILE = 'mysql-bin.000001',#另一台机器上执行SHOW MASTER STATUS得到的文件名
MASTER_LOG_POS = 192; #另一台机器上执行SHOW MASTER STATUS得到的偏移量
5. 开启同步
START SLAVE;
6.
检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。
这时可以在master数据库新建一个数据库,然后在slave 端show databases; 查看复制是否成功。