Mysql主从同步原理:
当master服务器上的数据发生改变时(增、删、改),则将其改变写入二进制binlog日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开启一个I/O 线程请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从库本地的中继日志中,从库(从节点)将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后IO线程和SQL线程将进入睡眠状态,等待下一次被唤醒。
注意几点:
1.master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
2.slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和 master数据保持一致了。
3.Mysql主从复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
4.Mysql主从复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)
5.master和slave两节点间时间需同步。
接下来开始主库的配置
首先我们需要再主库中的切入 MySQL配置文件中进行binlog和server-id的编辑
可以参考有道云笔记
进入编辑模式:vim /etc/my.cnf
然后保存退出并重启服务
保存退出 :wq
进行重启:service mysqld restart
然后可以根据命令查看创建好的log服务:ls /www/server/data/
然后进行用户授权 单词三:主库上的名字; 前面的test为MySQL主库的数据库, 后面不写默认为指定的库中所有的表 xiaoqiang为:根据上面用户密码设置的数据库 ,‘%’为所有的 ip都可以连接,然后加上线上设置的密码**
grant replication slave on test* to wangxiaoqiang@"%" identified by "6ajNFgN5CL46QAXG";
上面的用户授权方式会报一个密码格式不对的错误,这里在授权的时候用户的密码需要进行加密,所以我们应该去线上的phpMyAdmin上进行数据库和用户密码的设置
然后登录MySQL进行授权
mysql -uroot -p
查看主库编辑好的log日志
show master status
然后开始配置从库
同样,先进行数据的编辑,然后保存退出
然后进行重启
然后进入MySQL在从库中去进行主库的连接
在MySQL可以查看vim中编辑好的log文件
参考值
mysql> change master to
-> master_host="192.168.2.128", //指定主库IP地址
-> master_user="mysqluser", //主库授权用户
-> master_password="123qqq...A", //授权用户的密码
-> master_log_file="db128.000001", //主库binlog日志文件名
-> master_log_pos=2261338; //备份文件的日志偏移量
然后进行检测是否连接成功,然后主从数据库就可以进行同步了
change master to master_host="123.207.211.151", master_user="slaveuser",master_password="kwx0QEmQ8f39JhMz", master_log_file="151binlog.000001",master_log_pos=1380;
当我们配置好线上的主从之后然后我们可以将框架中的数据进行线上的同步,然后这样我们线下框架中的数据就能够同步到线上,接下来的数据CURD就和线下数据库没有关系了,这样就实现了框架和线上数据库的同步,然后本地的数据库就跟线上的数据库没有关系了。
在我们配置框架中的数据库的时候,数据库中的三个参数需要格外的注意
框架连接线上分布式数据库参数配置文档
如果想要配置一主多从的话需要在主数据库中进行第二个从库的用户名和密码的配置,然后在第二个从库中进行授权的时候只需要将用户名和密码改为第二个从库的用户名和密码即可。
**
如果想要将连接好的从库和主库进行解绑,只需要在从库上输入:
stop slave
change master to master_host=' 主库端口号 '
重启服务 slave start ;