一主多从架构可以缓解读的压力,但是一旦主宕机了,就不能写了。
所以我们可以采用双主双从架构。
这里我们接着本人之前的一台Linux主机启动多个MySQL的文章中所配置的数据库,名称为 3307 3308 3309 3310:
https://blog.csdn.net/weixin_41548316/article/details/90204195
3307 3308 互为主从。
1.环境配置
在第一台主服务器 3307 的/usr/local/mysql-5.7.18/data/3307/my.cnf文件做如下配置:
[client]
port = 3307
socker = /usr/local/mysql-5.7.18/data/3307/mysql.sock
default-character-set=utf-8
[mysqld]
port = 3307
socker = /usr/local/mysql-5.7.18/data/3307/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3307
log-error = /usr/local/mysql-5.7.18/data/3307/error.log
pid-file = /usr/local/mysql-5.7.18/data/3307/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit=1
log-bin=mysql-bin
server-id=3307
auto_increment_increment=2
auto_increment_offset=1
log-slave-updates
sync_binlog=1
第二台主服务器 3308 的my.cnf文件加入如下配置:
[client]
port = 3308
socker = /usr/local/mysql-5.7.18/data/3308/mysql.sock
default-character-set=utf-8
[mysqld]
port = 3308
socker = /usr/local/mysql-5.7.18/data/3308/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3308
log-error = /usr/local/mysql-5.7.18/data/3308/error.log
pid-file = /usr/local/mysql-5.7.18/data/3308/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit=1
log-bin=mysql-bin
server-id=3308
auto_increment_increment=2
auto_increment_offset=2
log-slave-updates
sync_binlog=1
两台从库my.cnf大致相同,只需要修改文件夹名称和server-id即可:
[client]
port = 3309
socker = /usr/local/mysql-5.7.18/data/3309/mysql.sock
default-character-set=utf-8
[mysqld]
port = 3309
socker = /usr/local/mysql-5.7.18/data/3309/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3309
log-error = /usr/local/mysql-5.7.18/data/3309/error.log
pid-file = /usr/local/mysql-5.7.18/data/3309/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit=1
server-id=3309
字段说明:
log-bin:二进制文件的位置
server-id:服务id,每台库的server-id值都要唯一
auto_increment_increment : 插入数据时主键的自增步长
auto_increment-offset:增长的起始值
如:3307 中步长为 2,起始值为1,插入数据的主键为 1,3,5,7...。同样3308步长为2,起始值为2,所以插入数据主键为2,4,6,8...。
log-slave-updates:设置两台主服务器,彼此间复制的数据要不要往其下面的从服务器复制。有这个字段表示往下面从服务器复制。
sync_binlog:从库复制的延迟。值为0表示延迟时间长,1表示延迟时间短。
port:端口号 3307
socker:IP和port
datadir:数据路径
log-error:错误文件文位置
pid-file :pid文件位置
character-set-server :字符集
lower_case_table_names:是否忽略表大小写 1为忽略
autocommit:自动提交 1为是
2.服务启动
进入/usr/loacl/mysql-5.7.18/bin/中,执行:
./mysql_safe --defaults-file=/usr/loacl/mysql-5.7.18/data/3307/my.cnf &
./mysql_safe --defaults-file=/usr/loacl/mysql-5.7.18/data/3308/my.cnf &
./mysql_safe --defaults-file=/usr/loacl/mysql-5.7.18/data/3309/my.cnf &
./mysql_safe --defaults-file=/usr/loacl/mysql-5.7.18/data/3310/my.cnf &
查看一下:
OK,没有问题。
3.设置主从关系。
1)首先使用端口,主机登陆两台主MySQL:
./mysql -uroot -p -P3307 -h127.0.0.1
./mysql -uroot -p -P3308 -h127.0.0.1
2)然后分别在两台主服务器上创建数据的账号并且授权:
grant replication slave on *.* to 'copy'@'%' identified by '123456';
*.* : 其中第一个*表示所有数据库名,第二个*表示所有的数据库表
'copy'@'%':copy表示用户名,%表示ip地址,可以具体到某个ip 如:copy@127.0.0.1
3)查看两台主库的状态:
3307:
show master status;
File为 mysql-bin.000001,Position为154表示正常
所以上图显示不正常需要重置:
stop slave;#如果之前启动过,需要先关闭
reset master;#重置
重置之后File为 mysql-bin.000001,Position为154即可
3308:
show master status;
同理不正常需要重置。
注意:如果你的两台从服务器之前开启过服务,你需要分别停止复制:
stop slave;
reset slave;
4)在从slave服务器上设置主Master:
注意:在3308和3309的主为3307,同理3307和3310的主为3308。
搞清楚主从关系后,在3308和3309执行如下操作:
CHANGE MASTER TO
MASTER_HOST='192.168.254.128',//本人Linux IP地址
MASTER_USER='copy',
MASTER_PASSWORD='123456',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000001', //binlog日志
MASTER_LOG_POS=154; //偏移量
在3307和3310执行如下操作:
CHANGE MASTER TO
MASTER_HOST='192.168.254.128',
MASTER_USER='copy',
MASTER_PASSWORD='123456',
MASTER_PORT=3308,
MASTER_LOG_FILE='mysql-bin.000001', //binlog日志
MASTER_LOG_POS=154; //偏移量
5)开启复制
注意:四台服务器意义上都具有从角色,所有都执行启动
start slave;
6)验证
四台服务器意义上都具有从角色,每台服务器都执行如下命令,查看从服务器状态:
show slave status \G
只有 Slave_IO_Running和Slave_SQL_Running两个线程都为Yes才表示状态没有问题。^ _ ^..