MySQL Master/Slave原理分析:
单向同步是基于MySQL的二进制日志的(binlog),所以要开启二进制日志功能(默认开启)。MySQL将所有更新的内容记录到二进制日志中,Master/Slave通过三个线程来完成同步。在Master上有一个线程,用来发送二进制日志,在Master上show processlistG可以查看线程的名字(Binlog Dump)。在Slave上有两个线程,I/O线程用来连接Master,接受来自Master的更新二进制日志,并把它保存到中继日志(relay log)中,SQL线程用来读取中继日志中SQL语句并执行更新操作。
Master/Slave优点:
系统服务稳定:当Master宕机时,可以切换Slave服务。
系统服务速率加快:更新操作在Master上进行,查询操作在Slave上进行,达到了负载均衡的效果,减轻了Master的负载,加快服务响应时间。
系统数据易备份、恢复:数据备份可以在Slave上进行而不干扰Master的服务。
注意:
一切更新操作要在Master上进行,否则会造成Master/Slave同步冲突。
两个数据库版本要相同,或者slave比master版本高![@more@]
MySQL安装过程可以参考附件脚本。
Master:192.168.10.21
Slave:192.168.10.22
Master:
创建同步账户,并给予权限
grant all on test.* to mysql@192.168.10.22 identified by 'mysql';
flush privileges;
配置/etc/my.cnf
在[mysqld]下添加配置参数
log-bin=mysql-bin 启动二进制日志系统,默认启动binlog-do-db=test 二进制需要同步的数据库名
server-id=1binlog-ignore-db=mysql 避免同步 mysql 用户配置,以免不必要的麻烦
/etc/init.d/mysql restart
Slave:
配置 /etc/ my.cnf 文件
在[mysqld]下添加一下参数
server-id=2 从服务器 ID 号,不要和主 ID 相同,
如果设置多个从服务器,每个从服务器必
须有一个唯一的server-id值,必须与主服
务器的以及其它从服务器的不相同。可以
认为server-id值类似于IP地址:这些ID值
能唯一识别复制服务器群集中的每个服务
器实例。
master-host=192.168.10.21 指定主服务器 IP 地址
master-user=mysql 指定在主服务器上可以进行同步的用户名
master-password=mysql 密码
master-port=3306 同步所用的端口
master-connect-retry=60 断点重新连接时间
replicate-ignore-db=mysql 屏蔽对 mysql 库的同步,以免有麻烦
replicate-do-db=test 同步数据库名称
/etc/init.d/mysqld restart
在Master上执行 show master satus;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 | 196 | test | mysql |
+------------------+----------+--------------+------------------+
在Slave上执行show slave statusG
.......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
........
说明数据正在同步,如果执行结果是empty,执行以下操作
在slave上执行以下命令:
slave stop;
change master to master_host='192.168.10.21', master_user='mysql',
master_password='mysql, master_log_file='mysql-bin.000011',
master_log_pos=196;
slave start;
测试方法:在Master上更新test数据库,查看Slave test数据库的内容是否更新。
搭建双向同步
其实原理很简单,只需要把Master/Slave变成 Master/Master就行。配置简单,倒着顺序再配置一遍就行
在Master配置添加:
master-host=192.168.10.22
master-user=mysql
master-password=mysql
master-port=3306
master-connect-retry=60
replicate-ignore-db=mysql
replicate-do-db=test
/etc/init.d/mysqld restart
在Slave执行操作:
grant all on test.* to mysql@192.168.10.21 identified by 'mysql';
flush privileges;配置添加:log-bin=mysql-bin
binlog-do-db=test
binlog-ignore-db=mysql 避免同步 mysql 用户配置,以免不必要的麻烦
/etc/init.d/mysqld restart
首先实现Master/Slave的第一个优点:数据备份可以在Slave上进行而不干扰Master的服务
采用scp服务进行备份
192.168.10.16是文件服务器
192.168.10.22是Slave
首先需要开启ssh服务,在Slave上使用ssh-keygen生成公钥文件id_rsa.pub
ssh-copy-id -i .ssh/id_rsa.pub westos@192.168.10.16
Slave采用ssh登录文件服务器不需要密码了
测试:ssh westos@192.168.10.16
发现直接进入文件服务器
备份脚本见附件
备份周期
crontab -e 每天凌晨备份数据库
0 0 * * * /opt/mysqldump.sh(备份脚本)