目录
架构
masterA: 123.23.23.1
masterB: 123.23.23.2
互为主从,数据互相同步,通过binary log 数据互相同步,其实两个库里面的数据是一致的。
简单来说,相比主从更具有健壮性。
mysql 安装
这里可以参考网上的mysql服务器安装教程 ,略过
集群配置
服务器:
masterA: 123.23.23.1
masterB: 123.23.23.2
修改各个master配置文件my.cnf
文件位置一般在 /etc/my.cnf 或者mysql安装目录/public/mysql/my.cnf
masterA:
[mysqld]
server-id=1
auto_increment_offset=1
auto_increment_increment=2 #奇数ID
log-bin=mysql-bin
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=0
sync_binlog=0
max_binlog_size=1024M
replicate_wild_ignore_table =mysql.%
replicate_wild_ignore_table =test.%
replicate_wild_ignore_table =information_schema.%
replicate_wild_ignore_table =performance_schema.%
max_connections=3000
max_connect_errors=30
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
default-storage-engine=INNODB
lower_case_table_names=1
slave_skip_errors=ddl_exist_errors
skip-character-set-client-handshake
init-connect='SET NAMES utf8'
character-set-server=utf8
wait_timeout=1800
interactive_timeout=1800
skip-name-resolve
masterB:
[mysqld]
server-id=2
auto_increment_offset=2 #AUTO_INCREMENT列值的起点,也就是初始值。取值范围是1 .. 65535
auto_increment_increment=2 #偶数ID 控制列中的值的增量值,也就是步长。其默认值是1,取值范围是1 .. 65535
log-bin=mysql-bin
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=0
sync_binlog=0
max_binlog_size=1024M
replicate_wild_ignore_table =mysql.%
replicate_wild_ignore_table =test.%
replicate_wild_ignore_table =information_schema.%
replicate_wild_ignore_table =performance_schema.%
max_connections=3000
max_connect_errors=30
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
default-storage-engine=INNODB
lower_case_table_names=1
slave_skip_errors=ddl_exist_errors
skip-character-set-client-handshake
init-connect='SET NAMES utf8'
character-set-server=utf8
wait_timeout=1800
interactive_timeout=1800
skip-name-resolve
其实主要配置是
server-id=1
auto_increment_offset=1
auto_increment_increment=2 #奇数ID
log-bin=mysql-bin
然后分别重启两个数据库。
注意:
两台数据库的配置差别就在于server-id不同,以及auto_increment_offset的不同,如果有N个主,每个主的auto_increment_offset可分别设置为1、2….直到N, 而auto_increment_increment设置为N。
建立授权用户
查看具有权限的用户:Repl_slave_priv
select host,user,Repl_slave_priv from mysql.`user`
一般root用户即可满足。
添加主从同步账户
(PS:笔者在操作中发现,这步命令执行失败显示:1045 - Access denied for user 'root'@'%' (using password: YES),但是密码没错,用户也是有权限的,很尴尬,查找 了半天这个命令也不通过,然后续继续往下执行,发现还是可以实现同步数据,希望有大佬看到这里,给我留个言,让我了解下,感谢!)
我想了下,因为我是用root@%用户登录的,所以,这步其实是可以省略的,但是为什么会报错呢
在masterA上执行:
grant replication slave on *.* to 'root'@'123.23.23.2' identified by 'password';
flush privileges;
在masterB上执行:
grant replication slave on *.* to 'root'@'123.23.23.1' identified by 'password';
flush privileges;
查看主库状态
masterA执行:
show master status;
得到结果:
记下下面的File和Position对应的值。
同理masterB上面也是这样操作。
配置同步信息
在masterA上执行:B的 File和Position的值在这里放这里
change master to
master_host='123.23.23.2',master_port=3306,master_user='root',master_password='****',master_log_file='mysql-bin.000001',master_log_pos=3013;
在masterB上执行:A的File和Position的值在这里放这里
change master to
master_host='123.23.23.1',master_port=3306,master_user='root',master_password='****',master_log_file='mysql-bin.000001',master_log_pos=3013;
随后分别在两个主库执行:
start slave;
show slave status;
显示下面的结果即为正常:
到此,两个主库已经建立了互为主从关系,我们可以测试在masterA新建一个数据库是否会在masterB库中出现。
配置从节点
假设我们新增一个从节点,是masterB的从节点:
理论上说,需要执行我在上面说的哪个执行不了的步骤,用在masterA上面执行的即可,执行不通过,也可以继续往下走:
在slaveC上执行:B的 File和Position的值在这里放这里
change master to
master_host='123.23.23.2',master_port=3306,master_user='root',master_password='****',master_log_file='mysql-bin.000001',master_log_pos=3013;
随后在slaveC上执行:
start slave;
show slave status;
显示和Slave_IO_Running 和Slave_SQL_Running 都是Yes,就是正常的,
另外,如果项配置从库只读,可以在从库的my.cnf里面添加一个 read-only = 1 或者在客户端执行
set read_only = 1;
不过此命令对超级管理员无效,请注意。