项目开发中用mysql做数据库存储时,经常会配置mysql主从服务。从库可分担一部分只读请求,且保证数据至少有一份备份。
Mysql复制原理
Mysql中的bin日志(二进制日志)会记录下所有修改了数据库的SQL语句。
例如:insert,update,delete,ALTER TABLE,grant等。
主从复制的原理其实就是把主服务器上的bin日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
流程图如下
1.主节点必须启用二进制日志,记录任何修改数据库数据的事件。
2.从节点开启一个线程(I/O Thread)把自己扮演成mysql的客户端,通过mysql协议,请求主节点的二进制日志文件中的事件
3.主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
4.从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具哪个二进制日志文件的哪个位置。
5.从节点启动另外一个线程(sql Thread ),把replaylog中的事件读取出来,并在本地再执行一次。
主从复制配置大致过程:
主节点:
启用二进制日志
为当前节点设置一个全局唯一的server_id
创建有复制权限的用户账号 REPLICATION SLAVE ,REPLICATION CLIENT。
从节点:
启动中继日志
为当前节点设置一个全局唯一的server_id
使用有复制权限的用户账号连接至主节点,并启动复制线程
具体操作步骤如下
一、配置主库节点
1.编辑mysql配置文件
Vi /etc/my.cnf
添加如下配置
log-bin=mysql-bin
server-id=1
innodb-file-per-table=ON
skip_name_resolve=ON
如下图所示
2.启动mysql服务,连接mysql
启动: Service mysqld start
Root用户连接mysql: mysql -uroot -p123456
查看主节点的server_id
show global variables like ‘%server%’;
在主节点上创建有复制权限的用户,
赋予权限:REPLICATION SLAVE ,REPLICATION CLIENT
例如用户名为: repluser
执行语句如下
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON . TO 'repluser'@'localhost' IDENTIFIED BY '123456';
不要忘了赋予其他机器访问此用户的权限:
` GRANT ALL PRIVILEGES ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;`
7.刷新 flush privileges;
至此master节点配置完成。
二、配置从库节点
1.编辑my.cnf文件,开启中继日志,添加如下参数
relay-log=relay-log
relay-log-index=relay-log.index
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON
2) 查看server_id信息
show global variables like ‘%server%’
三、从节点启动复制线程
2.查看从节点的状态信息: show slave status\G;
Slave_IO_Running和Slave_SQL_Running状态应该都是YES
如下图
至此,mysql主从复制配置完成。
四、测试
在主节点创建数据库,在从节点可看到会复制一个相同的数据库过来。
表的复制也是没问题的。
五、主从复制架构中应注意的问题:
从节点要设置某些限定使得它不能进行写操作,才能保证复制当中的数据一致。
1:限制从服务器为只读
在从服务器上设置:
read_only = ON,但是此限制对拥有SUPER权限 的用户均无效。
阻止所有用户:
mysq>FLUSH TABLES WITH READ LOCK;
2:如何保证主从复制时的事物安全?
a:在主节点设置参数
sync_binlog=1: Mysql开启bin-log日志使用bin-log时,默认情况下,并不是每次执行写入就与硬盘同步,这样在服务器崩溃时,就可能导致bin-log最后 的语句丢失。可以通过这个参数来调节,sync_binlog=N,使执行N次写入后,与硬盘同步。1是最安全的,但是也是最慢的。
如果用到innode 存储引擎:
innodb_flush_logs_at_trx_commit=ON(刷写日志:在事务提交时,要将内存中跟事务相关的数据立即刷写到事务日志中去。)
innodb_support_xa=ON (分布式事务:基于它来做两段式提交功能)
sync_master_info=1:每次给从节点dump一些事件信息之后,主节点的master info 信息会立即同步到磁盘上。让从服务器中的 master_info 及时更新。
b:在每个slave节点
skip_slave_start =ON (跳过自动启动,使用手动启动。)
relay_log也会在内从中先缓存,然后在同步到relay_log中去,可以使用下面参数使其立即同步。
sync_relay_log =1 ,默认为10000,即每10000次sync_relay_log事件会刷新到磁盘。为0则表示不刷新,交由OS的cache控制。
sync_relay_log_info=1每间隔多少事务刷新relay-log.info,如果是table(innodb)设置无效,每个事务都会更新。
注: 在从节点中 master.info是记录在主节点复制位置的文件。