实验环境:
rhel6.5 mysql5.1 firewall selinux disabled
master 172.25.67.1
slave1 172.25.67.2
slave2 172.25.67.3
mysql 的 AB 复制
注: mysql 数据库的版本,两个数据库版本要相同,或者 slave 比 master 版本高!
在 master slave 上安装 mysql 软件
mysql 软件可以在 http://www.mysql.com[/上下载,源码或是 rpm 包都可以,由于 RHEL6 自带mysql 软件包,直接 yum 安装。
yum install mysql mysql-server -y
master server 配置
1)配置 /etc/my.cnf 配置文件
在[mysqld]下添加一下参数
log-bin=mysql-bin #启动二进制日志系统
binlog-do-db=test #二进制需要同步的数据库名,如果需要同步多个库,例如要再同 步westos库,再添加一行“binlog-do-db=westos”,以此类推
server-id=1 #必须为 1 到 232–1 之间的一个正整数值
binlog-ignore-db=mysql #禁止同步 mysql 数据库
2 ) 启动 master
service mysqld start
3)创建同步帐户,并给予权限
mysql>grant replication slave,reload,super on *.* to redhat@’172.25.67.2’ identified by ‘redhat’;
建立一个帐户redhat,并且只能允许从172.25.67.2这个地址上来登陆,密码是redhat
mysql>Flush privileges;
调试:
在 master 上用下面的命令查看
mysql> show master status;
+---------------------+-----------+----------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+-----------+----------------+-------------------+
| mysql-bin.000001 | 118 | test | mysql |
+---------------------+-----------+----------------+-------------------+
记录 File 和 Position 的值,下面会用到。
slave1 配置
1 ) 配置 /etc/ my.cnf 文件
在[mysqld]下添加一下参数
server-id=2
从服务器 ID 号,不要和主 ID 相同,如果设置多个从服务器,每个从服务器必须有一个唯一的 server-id 值,必须与主服务器的以及其它从服务器的不相同。可以认为 server-id 值类似于 IP 地址:这些 ID 值能唯一识别复制服务器群集中的每个服务器实例。
2 ) 启动 slave
service mysqld start
3) 在 slave1 上执行一下命令
mysql>change master to master_host='172.25.67.1',master_user='redhat',master_password='Wlong+007',master_log_file='mysql-bin.000001',master_log_pos=118;
Query OK, 0 rows affected (0.28 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
.....
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
注:G后面不能再加分号;,因为\G在功能上等同于;,如果加了分号,那么就是;;(2个分号),SQL语法错误。如果都是 yes,表示从库的 I/O,Slave_SQL 线程都正确开启.表明数据库正在同步你也可以通过在 master server 上的 test 库中添加数据,看 slave server 是否同步,更多详细信息以及参数设置,请参考 MySQL Manual 手册.
注意:在同步之前确保 master 与 slave 上的数据一致性。
出现错误:主从如果是同一个虚拟机复制生成的两台auto.cnf文件中server-uuid相同,Slave_IO_Running: Null 进程可能无法启动
相关文件作用:
1. mysql-bin.index: 服务器一旦开启二进制日志,会产生一个与二日志文件同名,但是以.index 结尾的文件。它用于跟踪磁盘上存在哪些二进制日志文件。MySQL 用它来定位二进制日志文件。
2. mysqld-relay-bin.index: 该文件的功能与 mysql-bin.index 类似,但是它是针对中继日志,而不是二进制日志。
3. master.info :保存 master 的相关信息。不要删除它,否则,slave 重启后不能连接 master。
4. relay-log.info :包含 slave 中当前二进制日志和中继日志的信息。
如果写操作较少,而读操作很多时,可以采取这种结构。你可以将读操作分布到其它的 slave,从而减小master 的压力。但是,当 slave 增加到一定数量时,slave 对 master 的负载以及网络带宽都会成为一个严重的问题。这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。
当设置 log_slave_updates 时,你可以让 slave 扮演其它 slave 的 master。此时,slave 把 SQL 线程执行的事件写进行自己的二进制日志(binary log),然后,其它的 slave 可以获取这些事件并执行它,从而有效缓解master 的压力。
添加一个 slave2:
1. 由于 master 上已经有数据,而新加的 slave2 没有,必须在配置复制前同步数据。
1) 在 master 上执行一下命令
mysql> FLUSH TABLES WITH READ LOCK;
锁表
mysqldump --all-databases --lock-all-tables > backup.db
mysql> UNLOCK TABLES;表解锁
2)如果你仅使用 MyISAM 表,你可以使用 mysqlhotcopy 拷贝,即使服务器正在运行。
mysqlhotcopy -u root -p westos mysql bakcup
2. 在 slave1 上加入以下设置:
vi /etc/my.cnf
server-id=2
log-bin=mysql-bin
binlog-ignore-db=mysqlbinlog-do-db=test
log-slave-updates
/etc/init.d/mysqld restart
3. 在 slave1 上创建同步帐户,并给予权限
mysql>grant replication slave,reload,super on *.* to redhat@'172.25.67.3' identified by 'redhat';
mysql>Flush privileges;
调试:
在 master 上用下面的命令查看
mysql> show master status;
+---------------------+-----------+----------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+-----------+----------------+-------------------+
| mysql-bin.000001 | 166 | test | mysql |
+---------------------+-----------+----------------+-------------------+
1 row in set (0.00 sec)
- 在 slave2 上执行一下命令
mysql> change master to master_host='192.168.0.12', master_user='westos',
master_password='westos', master_log_file='mysql-bin.000001', master_log_pos=217;
mysql> slave start;
mysql> show slave status\G;
.....
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....
mysql>change master to master_host='172.25.67.1',master_user='redhat',master_password='Wlong+007',master_log_file='mysql-bin.000001',master_log_pos=166;
测试:
在master中创建一个 test 库:
master:
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| nagdb |
| test |
+--------------------+
4 rows in set (0.00 sec)
slave:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
MySQL并行复制
实验环境:
rhel6.5 mysql5.7 firewall selinux disabled
master : 172.25.67.1
slave1 : 172.25.67.2
所需安装包:
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm
master的设置和主从复制一样;
slave的配置:
vim /etc/my.cnf
server-id=2
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master-info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
其它操作都相同