复制(Replication)简单的说就是同步数据库,类似于拷贝数据库到另一台服务器上,但它是实时地保证两个数据库的完全同步。用于分布式数据库。  

    主从复制:MySQL主从复制的原理就是从服务器读取主服务器的binlog,然后根据binlog的记录来更新数据库。
     mysql主从架构中其实就一个主在工作,而从就相当于一个备份机器,从通过日志监测的方式来备份主库上的数据而保证主库的数据安全。在这种架构中如果从上的数据做了改变,主数据是不会发生任何变化的。

使用MySQL主从复制的好处有:

1、采用主从服务器这种架构,稳定性得以提升。如果主服务器发生故障,我们可以使用从服务器来提供服务。

2、在主从服务器上分开处理用户的请求,可以提升数据处理效率。

3、将主服务器上的数据复制到从服务器上,保护数据免受意外的损失。

     为什么会有mysql的主主复制。因为在一些高可用的环境中,mysql的主从不能满足现实中的一些实际需求。比如,一些流量大的网站数据库访问有了瓶颈,需要负载均衡的时候就用两个或者多个的mysql服务器,而这些mysql服务器的数据库数据必须要保持一致,那么就会用到主主复制。

    


master:
首先将bin-log日志打开
其次将server-id设置为1
将log-slave-updates给关闭掉(默认的情况下mysql是关闭的)

[root@master ~]# vi /etc/my.cnf 
log-bin=mysql-bin
server-id=1

[root@master ~]# mysql -uroot -p
Enter password: 
mysql> grant replication slave on *.* to 'admin'@'172.17.237.%' identified by '123456' ;
Query OK, 0 rows affected (0.00 sec)
---------------------------------------------------------------------------------------------------------------------------------
建立一个帐户admin,并且允许从172.17.237.0这个网段来登陆,密码是123456。
添加后在从服务器上用 mysql -h172.17.237.111 -uadmin -p123456 来测试下是否可以访问主数据库 
报错:Mysql:is not allowed to connect to this MySQL server 
解决办法:从服务器上创建一个远程超级用户
grant all privileges on *.* to admin@'%' identified by '123456' with grant option;

-----------------------------------------------------------------------------------------------------------------------------------
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
mysql-bin.000001 | 335 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> 

slave1:
首先将bin-log日志打开
其次将server-id设置为2
将log-slave-updates打开

[root@slave1 ~]# mysql -h172.17.237.111 -uadmin -p123456 -----测试 能够登录 授权成功
Welcome to the MySQL monitor. Commands end with ; or \g.
[root@slave1 ~]# vi /etc/my.cnf
server-id=2
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
log-bin=mysql-bin
[root@slave1 ~]# mysql -uroot -p
Enter password: 
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='172.17.237.111', master_user='admin', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=335;
Query OK, 0 rows affected (0.02 sec)

mysql> start slave
-> ;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.237.111
Master_User: admin
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 335
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes -----两项为yes则配置成功
Slave_SQL_Running: Yes

温馨提示:
1.防火墙
2.selinux
3.网络通不通
4.pos不对
5.配置打错
6.更改配置或其他操作以后:slave stop然后再slave start