1 期望效果
假设我们现在有两个服务器,两个服务器都有数据库,然后我们命名一个叫主数据库(Master),一个叫从数据库(Slave)
-
数据备份和容灾:通过主从复制,可以将主数据库的数据复制到一个或多个从数据库中。这样,在主数据库发生故障或数据丢失时,可以使用从数据库作为备份进行数据恢复和容灾操作。
-
高可用性:通过主从复制,可以实现数据库的高可用性。当主数据库发生故障时,可以将一个从数据库提升为新的主数据库,继续提供数据服务,从而避免系统的停机时间。
-
读写分离:主从复制可以将读操作和写操作分离,从而提高系统的读取性能。读操作可以在从数据库上进行,从而减轻主数据库的负载。这对于读多写少的应用场景非常有用。
-
负载均衡:通过在从数据库上分发读操作,可以实现负载均衡,将读请求分摊到多个数据库服务器上。这可以提高系统的并发处理能力和性能。
-
数据分析和报告:通过从数据库复制主数据库的数据,可以在从数据库上进行数据分析、报告生成等工作,而不会影响主数据库的性能。这对于生成复杂的查询报告和大数据分析非常有用。
-
数据分发:主从复制还可以用于将数据传输到不同地理位置的数据库服务器,从而实现数据分发和数据共享的需求。
2实现原理
主从复制的实现原理如下:
-
主数据库(Master):主数据库是数据的源头,负责处理客户端的写操作(如插入、更新、删除等)。在主数据库上有一个特殊的进程,称为二进制日志(binary log)。这个进程负责将所有的写操作记录到二进制日志文件中。
-
从数据库(Slave):从数据库是主数据库的副本,它负责接收主数据库的写操作并将其应用到自己的数据库中。在从数据库上运行一个特殊的进程,称为复制进程(replication process)。复制进程连接到主数据库,并从主数据库获取二进制日志文件。它解析二进制日志中的写操作,并在从数据库上执行相同的操作,以保持数据的一致性。
3搭建主从数据库
首先两个要有服务器
节点 | ip | 数据库 | 角色 |
---|---|---|---|
节点1 | 47.92.114.208 | Mysql | 主服务器 |
节点2 | 121.196.217.190 | Mysql | 从服务器 |
开始着手实现配置主从数据库
3.1 服务器端口设置
服务器上的数据库默认都是在3306端口的,所以如果想要自己的数据库能够在其他地方登录,就要开放指定的3306端口和打开防火墙,可以通过黑窗口开放。假设是Linux服务器上。
-
添加防火墙规则:允许 TCP 协议通过 3306 端口。
sudo firewall-cmd --permanent --add-port=3306/tcp
-
重新加载防火墙规则
sudo firewall-cmd --reload
-
启用并启动防火墙服务:
sudo systemctl enable firewalld sudo systemctl start firewalld
我用的是在阿里云上的服务器,所以直接在阿里云的官网上设置的开放端口
主服务器和从服务器都要开设这个端口,当能够在自己的本机通过navicat连接到服务器上的mysql那就是成功了。
3.2主服务器配置
1、vim /etc/my.cnf打开配置,修改部分内容 找到这个几个内容,记录一下,一般不用改
vim /etc/my.cnf
也可以在下面加上 read-only = 0 这个参数指定了从服务器的只读模式,1代表只读 0 代表读写,一般默认就是0,所以我就没写
如果需要修改要进行重启mysql
systemctl restart mysqld
2、登录mysql,注意这里一定要登录有最高权限的那个mysql账号(一般账号是root),不然后续操作进行不了
mysql -uroot -p<密码>
3、登录上后就创建一个用于远程连接的账号,并授予主从复制的权限
#创建用户,并设置密码,该用户可以在其他主机连接该mysql服务。
create user '<用户名>'@'<端口>' identified with mysql_native_password by '<密码>';
示例,用户名testUser,密码@Rr123,%的意思是可以在任意主机连接
create user 'testUser'@'%' identified with mysql_native_password by '@Rr123';
#为这个账号分配主从复制的权限
grant replication slave on . to 'testUser'@'%'
4、查看此时主数据的binlog日志状态
show master status ;
下面的数据意思是当前数据库正在写入的二进制文件叫mysql-bin.000009,当前写到的位置是1291 这两个数据是需要记录的,后续要用,ok从现在开始主库就配置好了,在从库配置好之前就不要动主库了。
3.3 从服务器配置
1、vim /etc/my.cnf; 同样先打开配置进行设置
log-bin=slave-a-bin
:这个参数指定了二进制日志文件的名称前缀
binlog_format=mixed
:这个参数定义了二进制日志的格式,要和主数据库的格式一样
server-id = 2
:这个参数指定了服务器的唯一标识符,不能和主数据库一样
read-only = 1
:这个参数指定了从服务器的只读模式,1代表只读 0 代表读写
从数据设置只读模式,可以使数据库更安全,不会出现从数据库中数据比主数据库内容多的情况
修改完配置后要重启mysql服务systemctl restart mysqld
2、从库配置,也就是用从库使用主库刚才配置的账号密码去建立主从配置连接。
#mysql 8.0.23及其以上的版本这样操作
change replication source to source_host='47.92.114.208', source_user='testUser', source_password='@Rr123', source_log_file='mysql-bin.000009', source_log_pos=1291;
#mysql 8.0.23以下的版本这样操作
change master to master_host='47.92.114.208',master_user='testUser',master_password='@Rr123',master_log_file='mysql-bin.000009',master_log_pos=1291;
3、连接成功后开启同步操作
start replica;#mysql 8.0.23及其以后
start slave;#mysql 8.0.23之前
4、查看主从同步状态
show start replica;#mysql 8.0.23及其以后
show start slave;#mysql 8.0.23之前
比如可以show replica status\G;这样写,意思就是把每一列数据转换成每一行,这样看数据更清晰
然后找到下面这两个部分都是yes,就是配好了
5、再往后就可以自己去尝试了,在主库上进行的增删改操作,从库中都会自动复制数据
追加:我主库上本来就有的那部分数据怎么同步?
主从复制只能复制之后配置之后的增删改操作,可以在配置主从复制之前就把主数据中的内容转存sql文件然后配置到从数据库中,然后再进行主从配置