MySQL主从配置——双主
本人是测试环境,准备了两台安装好mysql的服务器(masterA和masterB),可以保证没数据写入,否则需要先将两台服务器上的数据一致,然后再进行主从配置,步骤是:先masterA锁表-->masterA备份数据-->masterA解锁表-->将masterA数据导入masterB-->设置主从。
环境
MySQL双主(主主)架构思路:
- 两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;
- masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;
- 所有提供服务的从服务器与masterB进行主从同步(即可实现双主多从);
架构图
搭建主从配置
创建主从同步用户
masterA:
[root@adailinux ~]# mysql -uroot
mysql> grant replication slave on *.* to 'repl'@'192.168.8.132' identified by '123456';
#注:在此指定IP为masterB(从服务器)的IP
mysql> flush privileges;
masterB:
[root@adailinux ~]# mysql -uroot
mysql> grant replication slave on *.* to 'repl'@'192.168.8.131' identified by '123456';
#注:在此指定IP为masterA(主服务器)的IP
mysql> flush privileges;
配置mysql(/etc/my.cnf)
配置masterA
[root@adailinux ~]# vim /etc/my.cnf
[mysqld]
datadir = /data/mysql
socket = /tmp/mysql.sock
server_id = 1 #指定server-id,必须保证主从服务器的server-id不同
auto_increment_increment = 2 #设置主键单次增量
auto_increment_offset = 1 #设置单次增量中主键的偏移量
log_bin = mysql-bin #创建主从需要开启log-bin日志文件
log-slave-updates #把更新的日志写到二进制文件(binlog)中
配置masterB
[root@adailinux ~]# vim /etc/my.cnf
[mysqld]
datadir = /data/mysql
socket = /tmp/mysql.sock
server_id = 2 #指定server-id,必须保证主从服务器的server-id不同
auto_increment_increment = 2 #设置主键单次增量
auto_increment_offset = 2 #设置单次增量中主键的偏移量
log_bin = mysql-bin #创建主从需要开启log-bin日志文件
log-slave-updates #把更新的日志写到二进制文件(binlog)中
以上为同步配置的核心参数!
参数解析
log-slave-updates = true
#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
自增长ID:
#masterA:
auto_increment_offset = 1
auto_increment_increment = 2
#奇数ID
#masterB:
auto_increment_offset = 2
auto_increment_increment = 2
#偶数ID
其他参数:
binlog-format=ROW #日志格式
#binlog-do-db=TSC #同步数据库名称
binlog-ignore-db=mysql #忽略数据库名称
replicate-do-db=TSC #指定进行主从的数据
replicate-ignore-db=mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
replicate-ignore-db = zabbix #忽略不进行主从同步的数据
skip-character-set-client-handshake #忽略应用程序想要设置的其他字符集
init-connect='SET NAMES utf8' #连接时执行的SQL
character-set-server=utf8 #服务端默认字符集
wait_timeout=1800 #请求的最大连接时间
interactive_timeout=1800 #和上一参数同时修改才会生效
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式
#expire_logs_days = 20 #设置log-bin的保留时间(在此不设置)
#max-binlog-size= 512M #限定log-bin文件的大小
注: 开始配置my.cnf时添加了全部参数进去,但是最后即便同步配置完成了也未能完成新建的库的同步,暂时未找到原因(猜测:和replicate参数有关),之后持续更新。
重启MySQL服务
分别重启masterA和masterB并查看主库状态。
[root@adailinux ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
masterA:
[root@adailinux ~]# mysql -uroot
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 419 | TSC | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
masterB:
[root@adailinux ~]# mysql -uroot
mysql> show master status
-> ;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 419 | TSC | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
配置同步信息
masterA:
[root@adailinux ~]# mysql -uroot
mysql> change master to master_host='192.168.8.132',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=419;
#注:IP为masterB的IP(即,从服务器的IP)
mysql> start slave;
Query OK, 0 rows affected (0.05 sec)
mysql> show slave status\G;
在此查看有如下状态说明配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
masterB:
[root@adailinux ~]# mysql -uroot
mysql>change master to master_host='192.168.8.131',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=419;
Query OK, 0 rows affected, 2 warnings (0.06 sec)
mysql> start slave;
Query OK, 0 rows affected (0.04 sec)
mysql> show slave status\G
在此查看有如下状态说明配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主从同步测试
在masterA上创建一个库:
mysql> create database adai0001;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| adai0001 |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.04 sec)
查看masterB上的库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| adai0001 |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.02 sec)
即,配置完成!
常见错误
执行“show slave status\G”后,masterB正常,masterA中状态如下:
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
说明masterA同步masterB(A为从服务器;B为主服务器)未成功!查看错误日志:
[root@adailinux ~]# less /data/mysql/adailinux.err
2017-09-01 23:52:34 3579 [ERROR] Slave I/O: error connecting to master 'repl@192.168.8.132:3306' - retry-time: 60 retries: 3, Error_code: 1130
没有更多信息,查询错误代码:
[root@adailinux ~]# perror 1130
MySQL error code 1130 (ER_HOST_NOT_PRIVILEGED): Host '%-.64s' is not allowed to connect to this MySQL server
意识是不允许连接该服务器,常见的原因有两种:
- 防火墙问题:查看防火墙,关闭系统防火墙,或增加iptables规则开放3306端口
- 权限问题:在创建同步用户‘repl’时授权不不正确,解决办法是更改用户权限
经过上面两种操作,一般能解决该问题,如果还没解决,只能再继续排错了。
该部分内容持续更新...
参考
自动同步脚本:https://www.2cto.com/database/201312/261880.html
主从同步复制:http://www.cnblogs.com/ygqygq2/p/6045279.html
http://www.cnblogs.com/kristain/articles/4142970.html
官方文档(关于参数server-id、 auto_increment_increment):
https://dev.mysql.com/doc/refman/5.7/en/replication-options-master.html
相关推荐
MySQL主从复制是一种数据库同步技术,可以将一台MySQL服务器(称为master)上的数据变动实时复制到一台...然而,配置和维护MySQL主从复制需要对MySQL的内部机制和复制原理有充分理解,才能保证数据同步的正确性和效率。
MySQL主从配置的优点主要有两方面: 1. 负载均衡:通过将查询操作分散到多个从服务器上,减轻了主服务器的压力,提高了系统的查询效率。 2. 数据冗余与故障恢复:从服务器可以作为主服务器的备份,一旦主服务器出现...
MySQL 主从复制主库已有数据的解决方案 在 MySQL 主从复制中,主库可能已经运行了一段时间,并且已经有了数据,这种情况在实际业务中很常见。这时,如何应对开启主从复制前主库有数据的场景?本文将介绍两种解决...
下面我们将深入探讨MySQL主从数据库配置的两大核心优势——实现服务器负载均衡和通过复制实现数据的异地备份。 **一、实现服务器负载均衡** 在MySQL主从架构中,负载均衡是通过在主服务器和从服务器之间分配工作...
其中,“MySQL主从复制”是一项重要的技术,它通过将一个MySQL服务器(主服务器)的数据复制到一个或多个MySQL服务器(从服务器)来实现数据冗余和负载均衡。这种机制不仅能够提高系统的可用性和可靠性,还能够在不...
对于深入理解MySQL主从原理、问题解决和实际应用,你可以阅读《MySQL主从原理、问题、解决方案和应用——丁奇》这本书。书中详细讲解了MySQL主从复制的各个方面,包括配置、优化、故障排查等,是学习和实践MySQL主从...
MySQL主从复制简单背景 一、环境说明 二、数据库安装 1、下载MariaDB10.1.24二进制通用包 2、创建用于运行MySQL服务的用户和用户组、数据和日志 粗放目录并授权 3、安装步骤 4、添加配置文件,启动服务 三、主从复制...
+———-+————–+——————————-+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +——————-+———-+————–+——————————-+ | mysqld-bin.000001 | 3260 | | mysql,...
MySQL主从复制是一种数据同步机制,可以实现数据的实时或接近实时的同步。这种机制允许一个或多个从服务器接收来自主服务器的更新,从而保持数据的一致性。 **主从复制原理**: 1. **主服务器**(Master)将数据更改...
MySQL主从数据库服务器的设置是数据库高可用性和数据冗余的一种常见策略,它允许数据从一个主服务器(Master)实时同步到一个或多个从服务器(Slave)。这种配置对于数据备份、负载均衡以及故障恢复都至关重要。以下...
### MySQL主从复制与读写分离详解 #### 第八章:MySQL主从复制与读写分离 本章节主要探讨MySQL的主从复制机制及其在实际部署中的应用——读写分离技术。通过具体案例来理解其背后的原理和技术要点,并提供一个实践...
### MySQL主从复制的问题及解决方案 #### 一、复制概述 MySQL主从复制是一种非常重要的技术,它使得数据能够在不同的服务器之间同步,从而构建出高度可靠、可扩展的数据库架构。复制不仅支持高可用性和灾难恢复,...
MySQL主从复制是一种数据库高可用性和负载均衡的技术,它允许数据从一个服务器(主服务器)同步到一个或多个其他服务器(从服务器)。这种技术在大型系统中尤其常见,用于实现数据备份、故障恢复和读写分离,以提高...
《MySQL主从复制与MHA:mha4mysql详解》 在MySQL数据库系统中,主从复制是一项重要的功能,它允许数据在多个服务器之间进行实时同步,以实现高可用性和故障转移。MHA(Master High Availability)是针对MySQL主从...
在MySQL主从复制中,二进制日志起着至关重要的作用。它是主服务器记录所有改变数据的SQL语句的记录,以便从服务器能够重新执行这些语句以保持与主服务器的数据同步。二进制日志的配置主要涉及以下方面: - **启用与...
- **主从复制**: 通过配置一台或多台从服务器来复制主服务器的数据,以实现数据冗余和读写分离。 - **主主复制**: 两台服务器互为主从,提高写操作的可用性。 - **双主复制**: 类似于主主复制,但重点是实现多活环境...
证书准备: CA证书: 第一步:创建CA私钥 [root@localhost CA]# (umask 066;openssl genrsa -out /...————————————————————————————– mysql准备私钥及证书申请文件 : 第一步:创建mysq
MHA,全称MySQL High Availability,是一款开源的、基于Python编写的MySQL主从复制故障切换管理工具。它能够在检测到主库故障时自动将一个从库提升为主库,并更新所有从库的复制关系,确保服务的连续性和数据的一致...