A:主从
主master 3307 —> 从slave 3309
主从可以缓解读的压力,但是一旦主宕机了,就不能写了;
B:双主双从
主master 3307 —> 从slave 3309
主master 3308 —> 从slave 3310
3307 <—> 3308 互为主从
2个写节点,每个写节点下又是2个读节点;
C:文件配置
1、配置每一台MySQL服务器的配置文件my.cnf
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set=utf8
[mysqld]
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
character-set-server=utf8
lower_case_table_names=1
autocommit = 1
2、所有节点配置文件加上binlog配置
- 3339配置:
log-bin=mysql-bin
server-id=3339 - 3341配置:
log-bin=mysql-bin
server-id=3341 - 3340配置:
log-bin=mysql-bin
server-id=3340 - 3342配置:
log-bin=mysql-bin
server-id=3342
server-id=实例的端口(server-id要唯一)
3、第一台主服务器3339的my.cnf文件增加如下配置:(Master 3339)
auto_increment_increment=2
auto_increment_offset=1
log-slave-updates
sync_binlog=1
4、第二台主服务器3341的my.cnf文件增加如下配置:(Master 3341)
auto_increment_increment=2
auto_increment_offset=2
log-slave-updates
sync_binlog=1
D:配置项说明:
- auto_increment_increment
控制主键自增的自增步长,用于防止Master与Master之间复制出现重复自增字段值,通常auto_increment_increment=n,有多少台主服务器,n 就设置为多少; - auto_increment_offset=1
设置自增起始值,这里设置为1,这样Master的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID
注意auto_increment_offset的设置,不同的master设置不应该一样,否则就容易引起主键冲突,比如master1的offset=1,则master2的offset=2,master3的offset=3 - log-slave-updates
在双主模式中,log-slave-updates 配置项一定要配置,否则在master1(3339)上进行了更新数据,在master2(3341)和slave1(3340)上会更新,但是在slave2(3342)上不会更新 - sync_binlog
sync_binlog表示每几次事务提交,MySQL把binlog缓存刷进日志文件中,默认是0,最安全的是设置为1;
(一)Docker安装MySql容器:
(1)主master1
docker run -p 3339:3306 --name mysql_master -v /d/docker/MasterMySql/my.cnf:/etc/mysql/my.cnf -v /d/docker/MasterMySql/logs:/logs -v /d/docker/MasterMySql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
(2)从slave1
docker run -p 3340:3306 --name mysql_slave -v /d/docker/SlaveMySql/my.cnf:/etc/mysql/my.cnf -v /d/docker/SlaveMySql/logs:/logs -v /d/docker/SlaveMySql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
(3)主master2
docker run -p 3341:3306 --name mysql_master2 -v /d/docker/MySql/Master/my.cnf:/etc/mysql/my.cnf -v /d/docker/MySql/Master/logs:/logs -v /d/docker/MySql/Master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
(4)从slave2
docker run -p 3342:3306 --name mysql_slave2 -v /d/docker/MySql/Slave/my.cnf:/etc/mysql/my.cnf -v /d/docker/MySql/Slave/logs:/logs -v /d/docker/MySql/Slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
(二)主master创建slave用户
创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
CREATE USER ‘slave’@’%’ IDENTIFIED BY ‘123456’;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@’%’;
(三)主从同步设置
(1)查询主库 show master status;
主master1
主master2
(2)设置从库同步
- stop slave;
- change master to master_host=‘192.168.1.225’,master_user=‘slave’,master_password=‘123456’,master_port=3341,master_log_file=‘mysql-bin.000003’,master_log_pos=619,master_connect_retry=30;
- start slave;
- show slave status;
上图红圈显示两个YES,则表示成功。
(3)设置两主库互为主从
主master1
- stop slave;
- change master to master_host=‘192.168.1.225’,master_user=‘slave’,master_password=‘123456’,master_port=3341,master_log_file=‘mysql-bin.000003’,master_log_pos=619,master_connect_retry=30;
- start slave;
- show slave status;
主master2 - stop slave;
- change master to master_host=‘192.168.1.225’,master_user=‘slave’,master_password=‘123456’,master_port=3339,master_log_file=‘mysql-bin.000002’,master_log_pos=416,master_connect_retry=30;
- start slave;
- show slave status;