前言:
- 在企业应用中,成熟的业务通常数据量都比较大
- 单台MySQL在交全性、―高可用性和高并发方面都无法满足实际的需求
- 配置多台主从数据库服务器以实现读写分离
- 高可用性:
指的是冗余备份
包含性能指标(五大负载+内核优化方向)
安全性指标:网络部分安全性、通讯加密,用户登陆、管理权限安全性 - MySQL的设计思路
1、MySQL主从复制:让slave服务器中的中继日志同步master二进制日志
2、MySQL读写分离:基于主从复制以功能性拆分成读和写,缓解MySQL读写的压力,解决读写比例失恒,单台读写瓶颈的问题。
3、MHA高可用:对master服务器做一个冗余备份工作。 - 三种方式:
1、纵向扩展:强化自己服务器(五大资源,内核优化 加数据库内的优化,索引,存储过程,select查询等等
2、横向扩展:增加服务器数量
3、借助于内存/缓存数据库:Redis,来帮助MySQL缓存一些高热数据,减少MySQL压力
除此之外可以考虑是否需要做一些架构,服务上的改动
MySQL主从复制原理
- MySQL的复制类型
基于语句的复制
基于行的复制
混合类型的复制 - MySQL主从复制使用的机制
全同步
半同步
异步(默认) - MySQL主从复制的工作过程
主从复制原理核心在于2个日志文件,3个线程(4个线程)
2个日志:二进制日志和中继
三个线程:master上的dump线程,slave上的IO线程和SQL线程
目的:slave上的中继日志趋近实时同步master上的二进制日志
过程:
dump线程会监听二进制日志的更新,如果有更新则会通知slave IO
首先slave上的IO线程向master上申请同步二进制日志的更新内容
dump线程会把同步的sql日志内容与slave服务器,slave的IO线程会把写入自己的中继日志
slave sql线程把日志中的更新语句同步执行到数据库内部,以达到和master数据库趋近一致 - ##master
二进制日志
线程:dump,用于监听binlog同时通知SLAVE I/O
##slave
relay log
线程1 :I/O
负责向master请求更新的日志内容
将更新的内容同步到本地的relay log
线程2: sql
将本地的relay log中的更新内容(对本地relay log 做监听),同步执行到自己数据库内
主从复制配置
- 准备5台虚拟机
client端 192.168.112.100
master 192.168.112.110
slave1 192.168.112.120
slave2 192.168.112.130
ameoba 192.168.112.140
- 设置同步时间,
- 3台虚拟机设置计划任务
crontab -e
*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com
- 设置主从复制同步
- master修改配置文件
[root@master ~]# vim /etc/my.cnf
log_bin=master-bin #开启二进制日志文件(之后生成的日志名为master-bin)
log_slave_updates=true #开启从服务器日志同步
server_id=1 #主服务器id为1(不可重复)
重新启动服务
[root@master ~]# systemctl restart mysqld
- slave1、slave2从服务器配置
slave1:
log_bin=master-bin #开启二进制日志文件
server_id = 2 #设置 server1 id为22,server1 id为2
relay-log=relay-log-bin #从服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #定义relay-log的位置和名称(index索引)
slave2:
log_bin=master-bin #开启二进制日志文件
server_id = 3 #设置 server1 id为22,server2 id为3
relay-log=relay-log-bin #从服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #定义relay-log的位置和名称(index索引)
重新启动服务:
- 主服务器创建用户和授权
mysql> show master status
-> ;
mysql> change master to master_host='192.168.112.110',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=154; 添加主服务器
- 开启主服务器
mysql> grant replication slave on *.* to 'myslave'@'192.168.112.%' identified; 建设用户myslave用户,并设置权限
mysql> flush privileges; 刷新
- 同步数据库
[root@master ~]#mysqldump -u root -p123456 --all-databases > /opt/all-databases
#主服务机上完全备份所有库
[root@slave ~]#spc root@192.168.100.7:/opt/all-databases /opt/ #在服务器下载到/opt/下
mysql -u root -p
->source /opt/all-databases; #生成所有表
- 开启服务器
分别从slave1、slave2上
mysql> change master to master_host='192.168.112.110',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=604; 添加主服务器
mysql> start slave; 开启
mysql> show slave status\G; 查收服务状态是否开启
- 测试
创建一个表
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> create database zhongguo;
在slave1、slave2上查看表
总结
主从复制产生的两个日志:
二进制日志(bin-log):不可以拿来使用,同步到数据库内部的文件。需要使用工具备份
中继日志(relay-log):可以被sql线程直接引用,同步到数据库内部的
主从原理:
master的dump线程监控二进制,通知slave I/O
slave 的I/O过来之后,会请求读取二进制更新内容,并写入自己的relay—log
slave 的sql线程会读取本地relay—log同步写入到slave的mysql数据库中