在企业网站中,后端MySQL数据库只有一台时,会有以下问题:
遇到单点故障,服务不可用
无法处理大量的并发数据请求
数据丢失将会造成很大损失
增加MySQL数据库服务器,对数据进行备份,形成主备
确保主备MySQL数据库服务器数据是一样的
主服务器宕机了,备份服务器继续工作,数据有保障
通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力
首先要部署主从复制,只有主从复制完成了,才能在基础上进行数据的读写分离
基于语句的复制(默认)
在主服务器上执行的语句,从服务器执行同样的语句
基于行的复制
把改变的内容复制到从服务器
混合类型的复制
一旦发现基于语句无法精确复制时,就会采用基于行的复制
(1)在每个事务更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务
(2)Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作线程——I/O线程,I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,他会睡眠并等待Master产生新的事件。I/O线程将这些事件写入中继日志。
(3)SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能再Slave上并行操作。
实验环境防火墙和核心防护均已关闭
systemctl stop firewalld.service
setenforce 0
三台centos7.6 主机
一台主mysql服务器 ip地址为20.0.0.25
两台从mysql服务器 ip地址为20.0.0.23和20.0.0.22
实现主从复制
安装配置NTP
[root@localhost ~]# yum -y install ntp
[root@localhost ~]# vi /etc/ntp.conf //最后面添加这两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@localhost ~]# systemctl restart ntpd
[root@localhost mysql]# yum -y install ntpdate
[root@localhost mysql]# ntpdate 20.0.0.25
两台从服务器都如此操作
三台主机都需要安装MySQL 数据库。安装数据库方法可以参考我以前博客
https://blog.csdn.net/weixin_48191211/article/details/108320638
(1)修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项
[root@localhost ~]# vi /etc/my.cnf
server-id = 11 //修改
log-bin=master-bin //增加下两行
log-slave-updates=true
[root@localhost ~]# systemctl restart mysqld.service
(2)登陆mysq,给从服务器授权
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'20.0.0.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 599 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
(1)修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项
[root@localhost ~]# vim /etc/my.cnf
[root@localhost ~]# systemctl restart mysqld.service
server-id = 22 //修改 另一台改成33,三个id不能相同
relay-log=relay-log-bin //增加下两行
relay-log-index=slave-relay-bin.index
[root@localhost ~]# systemctl restart mysqld.service
(2)登陆mysql,配置同步
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> change master to master_host='20.0.0.25',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=599;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 20.0.0.25
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 599
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes //开启
Slave_SQL_Running: Yes //开启
Replicate_Do_DB:
Replicate_Ignore_DB:
(1)主服务器创建一个库
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> create database lx
-> ;
(2)两台从服务器查看是否同步
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lx | //同步成功
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)