MySQL主从复制和读写分离
MySQL在企业中的拓扑图
在企业网站中,后端MySQL数据库只有一台时,会有以下问题
- 单点故障,服务不可用
- 无法处理大量的并发数据请求
- 数据丢失—大灾难
改造方法
- 增加MySQL数据库服务器,对数据进行备份,形成主备
- 确保主备MySQL数据库服务器数据是一样的
- 主服务器宕机了,备份服务器继续工作,数据有保障
更好的解决方案
- 通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力
MySQL主从复制
MySQL主从复制的类型
-
基于语句的复制(默认,一般都是用这种类型)
- 在主服务器上执行的语句,从服务器执行同样的语句
-
基于行的复制
- 把改变的内容复制到从服务器
-
混合类型的复制
- 一旦发现基于语句无法精确复制时,就会采用基于行的复制
主从复制的工作过程
- 每个事务更新数据完成之前,master在二进制日志记录这些改变。写入二进制日志完成后,master通知存储引擎提交事务。
- slave将master的Binary log复制到其中继日志(Relay log)。首先,slave开始一个工作线程——I/O线程,I/O线程在master上打开一个普通连接,开始binlog dump process。binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志
- sql slave thread(sql从线程)处理该过程最后一步。sql线程从中继日志读取事件,并重放其中的事件而更新 slave的数据。使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小
- 复制过程中有一个重要限制,即复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作
MySQL主从复制步骤
主机 | ip |
---|---|
主MySQL服务器 | 192.168.188.65 |
从MySQL服务器1 | 192.168.188.66 |
从MySQL服务器2 | 192.168.188.67 |
安装MySQL
我们通过二进制包安装
tar xf mysql-5.7.25-el7-x86_64.tar.gz -C /usr/local/
mv mysql-5.7.25-el7-x86_64 mysql
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql
chown -R mysql.mysql /usr/local/mysql
vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
server_id=1
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=mysql [\\d]>
添加环境变量
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
初始化
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
如果报错可以
yum install -y libaio
使用systemd管理mysql
vim /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
systemctl daemon-reload
systemctl start mysqld
netstat -lnt
设置密码
mysqladmin -uroot password '123'
登陆验证
mysql -uroot -p123
保证三台服务器都完整安装MySQL
建立时间同步环境
在主节点上搭建时间同步服务器
安装NTP(关闭防火墙/selinux)
yum -y install ntp
配置NTP
vim /etc/ntp.conf
# local clock
server 127.127.1.0 # 本地时间供给源
fudge 127.127.1.0 stratum 8 # 设置时区为+08区
重启服务并设置为开机启动
systemctl enable ntpd --now
在从节点上进行时间同步
yum -y install ntpdate
ntpdate 192.168.188.65
将时间误差缩小到0.00以下就行
配置主从复制
主节点配置
修改主节点配置
vim /etc/my.cnf
server_id = 1 # 服务器编号
log_bin = master-bin # 开启二进制日志
log-slave-updates = true # 开启从机复制
重启mysqld
systemctl restart mysqld
进入mysql查看二进制日志是否开启
show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
给服务器授权
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.188.%' IDENTIFIED BY '123';
刷新权限
FLUSH PRIVILEGES;
查看授权是否成功
select user,host from mysql.user