当单台MYSQL服务器无法满足当前网站流量时的优化方案。需要搭建mysql集群技术。
一. 数据同步的几种方式:
1. 触发器,在数据库中建立增删改的触发器,每当数据库有变化,就会激活触发器,进而执行相应的操作,缺点是性能问题;
2. 时间戳,即在要同步的表里增加一个字段,当数据变化后,这个字段会发生相应的变化,然后根据这个字段的值来进行同步,可以是日期类型,记录当前的时间,缺点是有些延时,并且是每个表都要有这个字段。这中间还会涉及到逻辑删除;
3. 日志记录,通过分析数据库的日志,来获取数据库中变化的数据,缺点有些延时,并且对于没有提供日志分析接口的数据库,开发难度较大;
-
功能:
当向主服务器插入|修改|删除数据时,数据会自动同步到从服务器。
注意:主从复制是单向的,只能主 -> 从
1 发射型(一主多从):一般使用在:备份、读写分离。
2 双向同步
3 环形(多主多从):一般使用:当主服务器压力大时、跨地区的网站实现数据同步
在环形结构中,如果同时向三台服务器的同一表插入记录会出现“ID冲突的问题”。
解决办法:让三台服务器生成不同的ID;这个可以MYSQL的配置文件中设置
第一台:1,4,7...
第二台:2,5,8..
第三台:3,6,9...
二、实际配置
1.主机A的IP:10.0.0.4 主机B的IP:10.0.0.114 主机B的IP:10.0.0.113
主从服务器配置:
A、B两台服务器上修改mysql的配置文件:my.ini添加:
server_id=1 #为服务器指定一个server-id(主从服务器的ID值不能重复)
log-bin=mysql-bin
在A主服务器上为从服务器创建一个用来同步数据的账号
创建了一个只有REPLICATION SLAVE权限的账号:用户名:slave 密码:111111
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '111111';
在A主服务器执行SQL查看主服务器当前bin日志的状态
SHOW MASTER STATUS;
注意:每次修改数据时这两个值都会改变,所以在查看了这两个值之后,不要操作主服务器、直接到从服务器配置完成之后,否则这个值对应不上会同步失败。
设置B从服务器并启动复制功能
stop slave;
CHANGE MASTER TO MASTER_HOST='10.0.0.4',MASTER_USER='slave',MASTER_PASSWORD='111111',MASTER_LOG_FILE='mysql-bin.00002',MASTER_LOG_POS=8863;
start slave;
查看同步是否正确执行
show slave status \G;
如果是两个YES那么代码成功!完成!
说明:在配置成功之前,主服务器上的数据不会自动到从服务器上来。所以需要在配置之前先把主服务器上的所有数据先手动的导到从服务器上来,然后配置完主从之后,数据以后就同步了。
2.双向同步
1、在上面的基础上更改A、B两台服务器上修改mysql的配置文件:my.ini添加,其它操作同上
server-id = 1 #MySQL服务器标志,必须唯一
log-bin=mysql-bin #二进制日志文件的位置和命名
log-slave-updates=1 #事件自动更新到日志中
sync_binlog=1 #日志文件同步到磁盘上
replicate_do_db=test #要同步的数据库名称
2、对主机A添加专门用于同步的账户,操作过程和主从同步类似;
3.环形同步
采用环形操作,即A是B的主服务器,B是C的主服务器,C又是A的主服务器,依次类推组成一个环状结构。这样ABC三台服务器,在任意一台执行数据操作,数据均会同步其他服务器上。
1、分别配置A、B、 C的my.ini, 其中需注意A、B、C的server-id是不同的;
server-id = 1
log-bin=mysql-bin
log-slave-updates=1
slave-skip-errors=all
replicate_do_db=test
auto_increment_increment=3 #每次加几
auto_increment_offset=1 #从第几个数开始加
2. 配置完成后,重启各主机的服务;
3、对主机A添加专门用于同步的账户,操作过程和主从同步类似;
或者指定主服务器IP
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.0.0.4:3306' IDENTIFIED BY '111111';
4、遇到以下出错的情况
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Slave can not handle replication events with the checksum that master is configured to log; the first event 'mysql-bin.000016' at 120, the last event read from './mysql-bin.000016' at 120, the last byte read from './mysql-bin.000016' at 120.'
这是由于mysql5.6 的 binlog_checksum 默认设置的是 CRC32。 5.5 或者更早的版本没有这个变量binlog_checksum。修改配置文件:添加
binlog_checksum=none
然后重启master。
https://blog.csdn.net/yabingshi_tech/article/details/53319904