MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
单向复制有利于健壮性、速度和系统管理:
· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为份。
· 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助.
2 . 环境
RHEL 6.5 mysql5.1.71
Master(A) 172.25.193.11
Slave(B) 172.25.193.12
Slave(C) 172.25.193.13
3. Mysql A B C 复制
有两种方式:第一种为A到B到C,即B为A的slave,也为C的master;另一种为A是B和C的master,此种情况下,可以做到读写分离,写的操作可以放到A上,读的操作放到B和C上,在BC上可以做成负载均衡,A上可以采用高可用HA。
下面为AB复制
4配置
master server配置
1)创建同步帐户,并给予权限
mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO Yedda@'172.25.193.12' IDENTIFIED BY
'redhat';
mysql>Flush privileges;
2)配置 /etc/my.cnf 配置文件
在[mysqld]下添加一下参数
log-bin=mysql-bin 启动二进制日志系统
binlog-do-db=test 二进制需要同步的数据库名
server-id=1 必须为1到232–1之间的一个正整数值
binlog-ignore-db=mysql 避免同步 mysql 用户配置,以免不必要的
麻烦
3 )service mysqld restart
slave server 配置
1 ) 配置 /etc/ my.cnf 文件
在[mysqld]下添加一下参数
server-id=2
master-host=192.168.0.11
master-user=test
master-password=test
master-port=3306
master-connect-retry=60
replicate-ignore-db=mysql
replicate-do-db=test
3 )service mysqld restart
5检测
在master上用命令查看
在slave上执行以下命令
如果都是yes ,表示从库的I/O,Slave_SQL线程都正确开启.表明数据库正在同步
你也可以通过在master server上的test库中添加数据,看slave server是否同步.
6.双向复制
slave server配置
1 )修改 /etc/my.cnf 文件( 红字为添加内容 )
server-id=2从服务器 ID 号,不要和主 ID 相同
master-host=172.25.193.11指定主服务器 IP 地址
master-user=test 制定在主服务器上可以进行同步的用户名
master-password=123 密码
master-port=3306 同步所用的端口
master-connect-retry=60 断点重新连接时间
replicate-ignore-db=mysql 屏蔽对 mysql 库的同步
replicate-do-db=test 同步数据库名称
log-bin=mysql-bin 启动二进制日志系统
binlog-do-db=test 设置同步数据库名
binlog-ignore-db=mysql 避免同步mysql用户配置,以免不必要的麻烦
2)重新启动 mysql 服务,创建一个同步专用账号
service mysqld restart
mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO test@'192.168.0.11'
IDENTIFIED BY 'test';
mysql>Flush privileges
master server配置
1)修改/etc/my.cnf文件
修改/etc/my.cnf文件(红色为添加部分)
log-bin=mysql-bin 启动二进制日志系统
binlog-do-db=test 二进制需要同步的数据库名
server-id=1 本机数据库 ID 标示为主
binlog-ignore-db=mysql 避免同步 mysql 用户配置,以免不必要的麻烦
master-host=172.25.193.12 设置从原 slave 数据库同步更新
master-user=test 更新用户
master-password=test 密码
master-port = 3306 端口
replicate-do-db=test 需要更新的库
replicate-ignore-db=mysql 屏蔽对 mysql 库的同步
2) service
mysqld restart
检测
在master上用下面的命令查看mysql> show master status;
记录File和Position的值,下面会用到。
在slave上执行以下命令:
mysql> slave stop;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host='192.168.0.12', master_user='test',
master_password='test', master_log_file='mysql-bin.000001',
master_log_pos=98;
Query OK, 0 rows affected (0.28 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
.....
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
如果都是yes ,表示从库的I/O,Slave_SQL线程都正确开启.表明数据库正在同步
你也可以通过phpmyadmin在master、slave上的test库中修改数据,看彼此是否同步
7.A-B-C
B的my.cnf配置文件中要记得在mysqld下加 log_slave_updates,其他配置相同。
数据恢复
shell > cd /var/lib/mysql
查看命令可用:
mysqlbinlog mysql-bin.000001
mysql# mysqlbinlog --start-position=477 --stop-position=580 mysql-bin.000001 | less
回到需要恢复的slave上:
mysqlbinlog --start-position=477 --stop-position=580 mysql-bin.000001 | mysql
或者
将master上的mysql-bin.000001直接拷贝到slave的任意目录下即可。
前面的环境与接下来的操作会有冲突,所以在安装配置前,请将之前的mysql卸载,
rpm -e mysql-libs --nodeps
在master slave上解压安装
tar xf mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
yum install -y *
AB复制方法与之前相同,不再赘述
之前采用的是指定pos号,只要有足够的带宽,io并发复制速度会很快,但是sql线程却只能单线处理,造成了极大的延迟,而新的版本中解决了这个尿点,并且线程多达16个,下面就
来实验一下吧
1)slave server 配置:
vim /etc/my.cnf
mysql> stop slave;
mysql> change master to master_host='172.25.193.2', master_user='Yedda',
Master_password=’Yedda1052*’,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
2)master server 配置:
vim /etc/my.cnf
测验
在master上插入数据后,在slave上
开启的线程可通过以下来查看
mysql> show processlist;
By Yedda