一主多从或者是一主一从的解决方案再项目中读写分离是非常常见的。但在实际的项目中可能会遇到多个项目组各自开发维护独立的小项目,这里的独立是只独立的服务器,独立的数据库实例,独立的缓存等等;
一、现实场景
我曾经遇到过这样一个公司,大大小小有十几个项目在运行,因初期么有统一规划,没有统一的数据中心,7,8台阿里云服务器交叉着部署着小集群,有些服务器应用和数据并存;在好几台服务器上都有Mysql实例,也到积累了不少重要的用户数据。目前急需把这些数据做主从同步,以防万一。但服务器资源有限,而且不想大改动到已有的项目。
二、多主一从同步方案
想到把所有服务器上的mysql数据实例同步到一台服务器上,用不同的库明区分开(形成一个新的数据中心)。利用mysql5.7以上支持的多主一从,注意低版本的mysql不支持多源复制。
三、多源同步配置步骤
1、先把各服务器上的mysql版本升级到5.7以上,目前最新的8.0以上版本;升级的同事也要更新原有项目的mysql引擎(更新mysql.date.dll版本),否则连接失败;
2、主库my.ini配置(默认安装路径C:\ProgramData\MySQL\MySQL Server 8.0)
打开my.nin
搜索到 server-id 给分配个id(必须唯一)然后加上下面配置
#主从同步配置
#server-id和log-bin必须设置
#设置master的serverid(id:801是自己定义,确保唯一即可)
server-id=801
#要生成的二进制日记文件名称
log-bin =mysql-bin
#binlog日志格式,mysql默认采用statement,建议使用mixed混合模式
binlog_format= MIXED
#binlog过期清理时间
expire_logs_days = 1
#binlog每个日志文件大小
max_binlog_size = 100M
#要同步的数据库(linux下多个库用,隔开)
binlog-do-db=mysql_test
#不同步的数据库,如果指定了binlog-do-db这里应该可以不用指定的
#binlog-ignore-db=mysql
修改完保存(保存一点要注意-----如果是记事本打开编辑,保存时编码一定要选择ANSI,否则服务器重失败)
3、第二、三……个主重复以上操作(注意server-id不同就行)
4、从库配置
同样是搜索到server-id 给分配个id(必须唯一)然后加上下面配置
#主从同步配置开始
max_relay_log_size=500M
relay-log=relay-bin
# mysql5.7 多源复制从库加的配置参数
# 这个参数是必须的
master-info-repository = table
# 这个参数是必须的
relay-log-info-repository = table
#选要同步的库(多个用,隔开)
replicate-do-db=mysql_test
replicate-do-db=mysql2_test
# 所要同步的数据库的单个表(库名.表名)
#replicate-wild-do-table = mysql1.mysql_log
#replicate-wild-do-table = mysql1.callback_log
#replicate-wild-do-table =mysql2.company
#设定需要忽略的复制表
replicate-wild-ignore-table=mysql1_test.callbackrecord
replicate-wild-ignore-table=mysql1_test.operate_record
replicate-wild-ignore-table=mysql1_test.operate_record_backup
replicate-wild-ignore-table=mysql1_test.order
replicate-wild-ignore-table=mysql1_test.order_backup
#主从同步配置结束
配置完重启mysql
5、初始化从库数据库
首次可以先给主数据库加上锁
mysql > flush tables with read lock;
再用mysqldump 备份数据库
mysqldump -uroot -p123456 mysql1_test > c:\mysql1_test.sql
登录从库导入数据
mysql控制台:
则 mysql 先 use 数据库名,然后再执行source命令
source c:\mysql1_test.sql
初始化数据也可以用工具中的同步数据 Navicat Premium 12
如果对实时数据要求不是很严格可以不给数据库上锁
6、同步开始
(1)先查看主库二进制日志的信息
show master status;
查看当前的master_log_file='mysql-bin.000001',master_log_pos=65634
(2)登录从库
//停止同步
mysql>stop slave;
//配置连接主库1通道:for channel '802'; 802为主库1的server-id 如果不确定可以在主库上执行show variables like 'server_id';查看;用户是可以查询和复制主库日志的用户,可以在主库中单独创建一个mysql用户来做主从连接
mysql>change master to
master_host='192.168.0.1',master_port=63079,master_user='root',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=156 for channel '802';
//配置连接主库2通道
mysql>change master to master_host='192.168.0.2',master_port=63079,master_user='root',master_password='12345678',master_log_file='mysql-bin.000001',master_log_pos=156 for channel '801';
//启动同步
mysql>start slave;
//查看同步状态
mysql>show slave status \G
如果以下两个都为YES即同步状态成功
Slave_IO_Running:Yes
Slave_SQL_Running:YES
登录主库解锁
mysql > unlock tables;
到此多主一从配置完成
4902

被折叠的 条评论
为什么被折叠?



