MySQL数据库的主从同步在一些大型网站上比如淘宝、天猫都得到了很好的应用。这种架构主要解决系统发展过程中的数据库并发访问问题和单点问题。避免因一个数据库出现问题而导致整个系统瘫痪。
在前段时间我们为某公司开发了一套消费返现商城,网站上线仅仅一个月就吸引了50000多会员的注册,这是我们在开发这套系统之前所始料未及的,包括客户本身也是一脸懵逼。这跟前期的系统规划不无关系,所以今天分享这个内容也是希望其他朋友在做互联网项目的时候一定要做好相应的规划,如网站预期容纳多少人,日活大约多少,高峰期并发有多少等做一个大致的判断。
废话不说了。
MySQL主从同步原理:
MySQL 3.23版本开始支持单向同步。
一个服务器作为master(主服务器),一个或者多个服务器作为slave(从服务器)。master服务器把更新的内容写到二进制日志(binary log或binlog)中,并且维护了一个索引文件来记录日志循环的情况。这些日志中的更新部分会被发送到从服务器。一个从服务器连接到主服务器之后,获取主服务器最后一次成功增量更新的日志位置。
整个复制过程:
1、master记录二进制日志,在每个更新数据完成之前,master在二日志记录这些改变。在事件写入二进制日志完成后,master通知存储引擎提交事务。
2、slave 将 master 的 binary log 拷贝到它自己的中继日志(relay log)。
3、从中继日志总找出更新命令并执行到从服务器实现数据同步。
准备工作:
准备三个数据库,这三个数据库分别位于192.168.1.100,192.168.1.101,192.168.1.102三台服务器上。在同步之前需要将三个数据库保持数据一致性。(很重要,后期可能会介绍,可能不会介绍,不介绍了大家可以百度。但一定要记得数据要一致)
相关配置:
1、主数据库配置:(我们暂时把192.168.1.100定为主数据库)
修改数据库的配置文件,windows系统下一般是my.ini,Linux系统下一般是my.cnf位于/etc/目录下。
- //修改配置文件
- server-id = 1
- log-bin = mysql-bin
- binlog-do-db = 需要同步的数据库名称例如 mydb
- binlog-ignore-db = mysql 不要同步的数据库名称
说明:
server-id = 1 #这是数据库ID,此ID是唯一的,主库默认为1,其他从库以此ID进行递增,ID值不能重复,否则会同步出错
log-bin = mysql-bin 二进制日志文件,此项为必填项,否则不能同步数据
binlog-do-db = test #需要同步的数据库,如果需要同步多个数据库则继续添加此项 :
binlog-do-db = test1
binlog-do-db = test2
binlog-ignore-db = mysql #不同步的库
修改完成后重启mysql,查看日志状态 show variables like 'log_%';
确保log_bin 开启,重启后会在mysql data 目录下生成 mysql-bin.000001 及 mysql-bin.000002文件(不要删除2个文件,会造成mysql无法启动)。
在主服务器上创建同步账号,用户日志文件获取:
- GRANT REPLICATION SLAVE ON *.* TO "slave"@'%' IDENTIFIED BY '密码xxxxxx';
- flush privileges;
未完......