MariaDB 10.1.44主从搭建(多主一从)测试

多主一从,也称为多源复制,数据流向:

  • 主库1 -> 从库s

  • 主库2 -> 从库s

部署环境


  • 数据库:MariaDB 10.1.44  (相比5.5,5.6而言,5.7同步性能更好,支持多源复制,可实现多主一从,主从库版本应保证一致,或者从服务器比主服务器高版本)

  • 操作系统:CentOS 7.x


  • 主库1:IP=192.168.10.1; PORT=3306; server-id=1; database=test1; 

  • 主库2:IP=192.168.10.2; PORT=3306; server-id=2; database=test2; 

  • 从库3:IP=192.168.10.3; PORT=3306; server-id=3; database=test3; 

配置约束

  • 主从库必须保证网络畅通可访问

  • 主库必须开启binlog日志

  • 主从库的server-id必须不同

【主库1】操作及配置

配置my.cnf

##########################
# log bin
##########################
#主数据库端ID号
server_id = 1           
 #开启二进制日志                  
log-bin = mysql-bin    
#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可                  
binlog-do-db = db        
#将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中                 
log-slave-updates                        
#控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失) 
sync_binlog = 1                    
#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_offset = 1           
#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_increment = 1            
#二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除  
expire_logs_days = 7                    
#将函数复制到slave  
log_bin_trust_function_creators = 1                         





binlog-do-db = test1 	#要同步的数据库

binlog-ignore-db = mysql #不需要同步的数据库 
binlog_ignore_db = information_schema
binlog_ignore_db = performation_schema
binlog_ignore_db = sys			

   


创建授权用户

连接mysql主数据库,键入命令mysql -u root -p,输入密码后登录数据库。创建用户用于从库同步复制,授予复制、同步访问的权限

mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

   

log_bin是否开启

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set

   

查看master状态

mysql> show master status \G;
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 438
     Binlog_Do_DB: test3
 Binlog_Ignore_DB: mysql,information_schema,performation_schema,sys

   

【主库2】配置及操作   

重复步骤1,server-id需要不同,其他的一样

   

【从库3】配置及操作

配置my.cnf

##########################
# log bin
##########################
server-id = 3
replicate-do-db = test1 	#要同步的数据库
replicate-do-db = test2 	#要同步的数据库
slave-skip-errors = all

      

设置【主库】信息

登录【从库3】,进入mysql命令行。

mysql> stop slave;
Query OK, 0 rows affected

mysql> change master 'app1' to master_host='192.168.10.1',master_user='account',master_password='123456',master_log_file='mysql-bin.000007',master_log_pos=615313854;
Query OK, 0 rows affected

mysql> change master 'app2' to master_host='192.168.10.2',master_user='account',master_password='123456',master_log_file='mysql-bin.000022',master_log_pos=1150;
Query OK, 0 rows affected


mysql> START ALL SLAVES;
Query OK, 0 rows affected

mysql>

   

MySQL彻底清除slave信息

在我们的MySQL,Master和Slave进行主从切换的时候,Slave成功升级为主库,那么这个时候就需要彻底清理从库的信息,不然监控系统会认为这台服务器是Slave,而且会报主从同步失败。
其实非常的简单,只需要以下两步:

mysql> stop slave;
mysql> reset slave all;

reset slave all;是清除从库的同步复制信息、包括连接信息和二进制文件名、位置。
从库上执行这个命令后,使用show slave status将不会有输出。

//必须和【主库】的信息匹配。
CHANGE MASTER TO
MASTER_HOST='192.168.10.212',     //主库IP
MASTER_PORT=4300,                              //主库端口
MASTER_USER='slave',                     //访问主库且有同步复制权限的用户
MASTER_PASSWORD='123456',      //登录密码
//【关键处】从主库的该log_bin文件开始读取同步信息,主库show master status返回结果
       MASTER_LOG_FILE='mysql-bin.000003',
//【关键处】从文件中指定位置开始读取,主库show master status返回结果
MASTER_LOG_POS=438
for channel '300';            //定义通道名称

查看同步状态

mysql> SHOW ALL SLAVES STATUS\G

  


只有【Slave_IO_Running】和【Slave_SQL_Running】都是Yes,则同步是正常的。
如果是No或者Connecting都不行,可查看mysql-error.log,以排查问题。