1.背景
分布式环境下为了保证Mysql的查询效率,我们会配置Mysql的主从复制用来做读写分离,master主机用来做写主机,slave主机用来做读主机,读主机从写主机来复制数据,通常为了保证高可用性,我们需要至少双主双从,当一个主节点挂了之后,另一个主节点会被当作写主机进行数据的写入。
2.一主一从的配置
我这里偷个懒,使用docker搭建的mysql,不过和正常安装的mysql之间区别不大,接下来,我们开始配置一主一从的配置
2.1 配置master机器mysql的配置文件
正常安装的mysql直接配置 /etc/my.cnf即可,我这里使用的是docker搭建的mysql,所以配置 /etc/mysql/mysql.conf.d/mysqld.cnf
vim /etc/mysql/mysql.conf.d/mysqld.cnf
如果这里和我一样使用的是docker搭建的mysql,容器里面肯定是没有vim命令的,使用下面两条命令来安装一下
apt-get update
apt-get install vim -y
编辑master主机的配置文件,在[mysqld]下加入如下配置
server_id = 1
log-bin = master-bin
binlog-do-db = testdb
binlog_format = ROW
保存退出
这里把参数解释一下
server_id 代表mysql服务器的唯一ID
log-bin代表启用二进制文件,后面的代表二进制文件的名称
binlog-do-db代表需要复制的数据库名称
binlog_format这个参数我们这里着重讲一下
格式 | 含义 | 优缺点 |
---|---|---|
STATEMENT | 记录的是DQL,DML,DDL语句 | 节省空间,磁盘IO小,如果出现系统变量,sysdate()等函数从数据库会和主数据库出现不一致的情况 |
ROW | 记录的是每一行的数据 | 精确的复制数据到从库文件占用空间大,网络IO大,磁盘IO大 |
MIXED | 前面2者的混合 | 准确性高,文件大小适中,还是会有数据不一致的情况出现 |
2.2 配置slave机器的mysql配置文件
修改配置文件(非docker安装的用户直接配置 /etc/my.cnf)
vim /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]标签下添加以下内容
server_id = 2
replicate-do-db = testdb
replicate-do-db 代表了从数据库需要复制的数据库名称
2.3 配置两台机器开始复制
① 将上述配置好的mysql服务重新启动
② 如果在2台机器上面部署的,记得打开防火墙的3306端口
③ 配置具有同步权限的账户
grant replication slave on *.* to 'account'@'%' identified by '123456';
生产环境中,一定不能指定用户访问IP为%,会有安全问题,这里为了演示,不做限制。
刷新一下数据
flush privileges;
④进入到master主机mysql中
show master status;
这里有2个重要的值
File下面的字符串 binlog文件的名称,后面我们要指定slave主机从这个文件中获取数据
Position下面的数字,代表偏移量,表示后面slave的主机从哪里开始复制。
⑤进入到slave主机的mysql中
CHANGE MASTER TO
MASTER_HOST='master主机的IP',
MASTER_USER='account',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000002', # master主机binlog文件的名称
MASTER_LOG_POS=154, # binlog文件的偏移量
master_port=3306;
开始备份
start slave;
查看从机备份情况
show slave status\G;
只要看到这两项都为YES之后,表示已经开始备份了。
这时候我们创建一个testdb数据库,
发现从数据库中也创建了一个同样的数据库;
这时,无论是创建表还是插入数据,从数据库都会一直复制数据了。
3.多主多从的配置
我们这里以双主双从来分析,其实与一主一从类似,双主双从只是让两台主机也具有互相复制的功能即可。
3.1 master节点的配置
master1节点
server_id = 1
log-bin = master1-bin
binlog-do-db = testdb
binlog_format = ROW
# 主节点宕机恢复之后变成从数据库之后,写入操作写入二进制文件中
log-slave-updates
# 自增字段每次增长的值
auto-increment-increment=2
# 自增字段的起始值
auto-increment-offset=1
# 设置自增字段的起始和增长值是为了保证多个主节点的情况下自增的字段不会重复
master2节点
server_id = 2
log-bin = master2-bin
binlog-do-db = testdb
binlog_format = ROW
log-slave-updates
auto-increament-increment=2
# 自增的起始值为2
auto-increment-offset=2
3.2 Slave节点的配置
slave1节点
server-id = 3
replicate-do-db = testdb
slave2节点
server-id = 4
replicate-do-db = testdb
3.3 配置双主双从的复制
① 4台mysql全部重启
②开启4台mysql的服务端口
③ 2台master节点全部新建一个同步权限的用户
grant replication slave on *.* to 'account'@'%' identified by '123456';
清理一下数据
flush privileges;
④查看两台主机的binlog状态
# 查看master1节点
show master status;
#查看master2节点
show master status;
⑤ 设置从节点复制的主机节点
slave1 复制 master1
CHANGE MASTER TO
MASTER_HOST='master1主机的IP',
MASTER_USER='account',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master1-bin.000002', # master1主机binlog文件的名称
MASTER_LOG_POS=154, # binlog文件的偏移量
master_port=3306;
slave2 复制 master2
CHANGE MASTER TO
MASTER_HOST='master2主机的IP',
MASTER_USER='account',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master2-bin.000002', # master2主机binlog文件的名称
MASTER_LOG_POS=154, # binlog文件的偏移量
master_port=3306;
⑥两台从主机开启复制
start slave
⑦ 查看两台从主机的复制状态
show slave status\G;
查看两个选项是否为Yes;
CHANGE MASTER TO
MASTER_HOST='master1主机的IP',
MASTER_USER='account',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master1-bin.000002', # master1主机binlog文件的名称
MASTER_LOG_POS=154, # binlog文件的偏移量
master_port=3306;
master1 复制 master2
CHANGE MASTER TO
MASTER_HOST='master2主机的IP',
MASTER_USER='account',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master2-bin.000002', # master2主机binlog文件的名称
MASTER_LOG_POS=154, # binlog文件的偏移量
master_port=3306;
⑨ 开启两台master节点的复制功能
start slave;
4. 关闭主从复制
从机停止同步
stop slave;
主机停止同步
stop slave;
reset master;