Mysql主从架构搭建

一、背景

传统的单机数据库,所有的读和写操作都在同一台数据库上进行操作。随着业务的增加,可能会遇到数据库压力过大的问题,这个时候可以使用“读写分离”来解决早期遇到的问题。一台数据库负责写,其他的数据库负责读(可水平增加)。

二、环境

mysql需要使用mysql版本为5.7,5.7为目前比较主流的版本,同时支持多主一从。

下载并安装MySQL5.7官方的Yum源
wget ‘https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm’ 下载yum源
rpm -Uvh mysql57-community-release-el7-11.noarch.rpm 安装yum源
查看/etc/yum.repos.d/mysql-community-source.repo下的yum源文件,是否默认安装5.7(enable)
yum install -y mysql-community-server 这一步安装的过程比较慢,需要耐心等待
systemctl start mysqld.service 启动服务
systemctl enable mysqld.service 这步骤会报错,需要斟酌
不知道从什么版本开始,mysql默认的密码不为空了,所以安装向导初始化之前必须先找到初始化密码才可以进行安装

注意:使用navicat连接时。navicat报错1146:执行命令 sudo mysql_upgrade -u root -p –force

三、原理

数据库之所以能进行主从复制,主要是因为二进制文件binlog的存在。多台数据库之间可以通过线程进行通信,从库不断的从主库读取binlog日志并且把内容同步到从库上。

四、架构

1、主从复制

(1)设置master主库

log-bin=mysql-bin # 默认在是/var/lib/mysql下
server-id=1 #主库id,必须唯一
binlog-do-db=test # 要同步的库
binlog-ignore-db=mysql #不给从机同步的库(多个写多行)
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys 
expire_logs_days=7 #自动清理 7 天前的log文件,可根据需要修改

(2)重启主库服务
(3)需要为从库创建一个登录主库的账号
grant replication slave on . to ‘wjy_slave’@‘192.168.181.%’ identified by ‘wjy123456’;
如果报1819错误表示密码太简单了,先运行set global validate_password_policy=0;设置完这句以后密码就只判断长度了,运行select @@validate_password_length;查看一下规定长度,照着长度设置即可。
select user,host from mysql.user;可以看到自己添加的备份用户了
(4)show master status; 查看主库配置
(5)设置从库

server-id = 2 # 集群内唯一
read-only=true # 从库只读,但是root依然可以修改,所以需要设置非root账号进行使用

(6)重启从库服务
(7)change master to master_host=‘192.168.181.128’, master_port=3306, master_user=‘wjy_slave’, master_password=‘wjy123456’, master_log_file=‘mysql-bin.000001’, master_log_pos=154;从库连接主库,里面所有的参数读要跟master一致。
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
(8)start slave;开启从库服务,也可以使用stop slave;停止从库或者reset slave;重置slave信息。
(9)show slave status;查看从库状态,最重要的是关注两个参数:Slave_IO_Running和Slave_SQL_Running都要为yes。如果有报错,需要根据相应的错误去解决问题。
(10)测试
主库添加信息“2222”和“杨过”
在这里插入图片描述
从库进行了同步
在这里插入图片描述
这边我们也发现,因为主从是通过binlog进行同步的,所以在同步之前的数据没有写入到当前log里面,因此也就没有办法自动进行同步了。

2、一主多从

有了主从复制的操作案例。我们进行一主多从的配置时是非常简单的。只需要按照相同的配置,再添加一台从库服务器即可。

server-id = 3 # 唯一
read-only=true

change master to master_host=‘192.168.181.138’, master_port=3306, master_user=‘wjy_slave’, master_password=‘wjy123456’, master_log_file=‘mysql-bin.000003’, master_log_pos=976
start slave;

搞定,按照主从复制的方法进行测试。当主库进行数据添加的时候,多个从库进行了同步的更新。

3、互为主从

互为主从时,需要注意Id步长的问题,每一台只生成一个固定步长的id。这边因为是两台机器,所以步长为2。
A数据库只生产ID为 1 3 5 7 9 。。。 的数据。
B数据库只生产ID为 2 4 6 8 10 。。。。

    auto-increment-increment = 2 
    auto-increment-offset = 100(另外一台配置单数101)

刪掉所有日志,reset slave;
再执行flush logs;
可以保证你不会因为binlog的原因导致出错。

此时开启start slave;我们发现
在这里插入图片描述
两台mysql服务器按照自己预先设置的ID步长进行数据添加,ID不冲突,并且互为主从,互相复制。

4、多主多从结构

多主多从结构,其实就是在双主结构上把从库也加入进来。唯一需要注意的:从库只会读取一台主库上的binlog,而每台主库的binlog都是“残缺”的,因此需要使用

log-slave-updates=on

来促使多台主库之间更新互相之间的binlog,重启服务即可。

五、测试与思考

1、如果从库数据不同步,会出现什么情况?
答:如果从库人为加入一条数据,那么同步就失效了,因此主从架构里从库一定不要写入数据。
2、如果同步之前,主库就有数据会怎么样?
答:不会自动同步,只会同步binlog里面的数据。所以还是停掉主库(防止数据写入),先进行备份,再进行主从架构配置。
3、从库怎么设置智能只读?
答:read-only=true可以让从库只读,但是这边依然无法限制root权限的人进行修改和写操作,一般做法是创建一个普通权限的用户,登录的时候用普通权限,这样就只能只读了。但是如果用root依然是可以修改的。
4、如果主库重启会怎么样?
答:binlog的名称发生了改变。主库重启,从库会自动跟上binlog的位置。
5、如果从库重启会怎么样?
答:从库会自动跟上binlog的位置。
6、长时间关机会倒是BInlog更新对不上。(重点)
答:需要到日志目录下(正常是/var/lib/mysql)将所有binlog删除。删除完回到Mysql命令行执行flush logs;刷新日志。必要时reset slave;重置一些从库信息。然后再继续配置主从架构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值