复制解决的问题
负载均衡
数据备份
数据分布
升级测试
复制的工作原理
(1)master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将更改应用到自己的数据上。
常见的复制拓扑
一主库多备库
主库 一 分发主库 一 备库
主--主复制 (双主)
环形复制
创建复制帐号
1、在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中
命令如下:
mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.*
TO [email protected]’10.100.0.200’
IDENTIFIED BY ‘1234’;
建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234。这里@后面的ip地址就是slave的ip
(如果因为mysql版本新旧密码算法不同,可以设置:set password for ‘backup‘@‘10.100.0.200‘=old_password(‘1234‘))
拷贝数据
(假如是你完全新安装mysql主从服务器,这个一步就不需要。因为新安装的master和slave有相同的数据)
关停Master服务器,将Master中的数据拷贝到B服务器中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!
配置复制(刚安装的数据库)
环境一主多备master slave1 slave2
ip 192.168.10.6192.168.10.37 192.168.10.158
service-id 6 37 158
主库配置:vim /etc/my.cnf
Log-bin=mysql-bin //打开二进制日志
Server-id=6
Service mysqld start //重启mysql进程
Mysql> reset master;
Mysql>grant replication slave,replication client on *.* to [email protected]’192.168.10.%’ identified by ‘luliechu’;
Mysql> flush privileges;
备库配置:vim /etc/my.cnf
Log-bin=mysql-bin //打开二进制日志
Server-id=37
Relay_log=mysql_relay-bin
Log_slave_updates=1
Read_only=1
Service mysqld start //重启mysql进程
Mysql> reset master;
Mysql>change master to master_host=’192.168.10.6’, master_user=’rep1’, master_password=’luliechu’, master_log_file=’mysql-bin.000001’, master_log_pos=0;
Mysql>Start slave;
查看主从复制状态
Mysql>show slave status\G
配置复制(已运行一段时间的数据库)
环境一主多备master slave1 slave2
ip 192.168.10.6192.168.10.37 192.168.10.158
service-id 6 37 158
初始化备库(使其和主库数据一致)
Master上配置:
Mysql>flush tables with read lock;
#mysqldump --lock-all-tables --all-databaes>all.sql
#mysql -e ‘show master status’
Mysql>unlock tables;
#rsync -av all.sql 192.168.10.158:/
Slave2:
Mysql>source /all.sql
备库的配置:
备库配置:vim /etc/my.cnf
Log-bin=mysql-bin //打开二进制日志
Server-id=37
Relay_log=mysql_relay-bin
Log_slave_updates=1
Read_only=1
Service mysqld start //重启mysql进程
Mysql> reset master;
Mysql>change master to master_host=’192.168.10.6’, master_user=’rep1’, master_password=’luliechu’, master_log_file=’mysql-bin.000001’, master_log_pos=699;