1.企业高可用性标准
全年无故障率(非计划内故障停机)
99.9% ----> 0.001*365*24*60=525.6 min
99.99% ----> 0.0001*365*24*60=52.56 min
99.999% ----> 0.0001*365*24*60=5.256 min
2.负载均衡:有一定的高可用性
LVS Nginx
主备系统:有高可用性,但是需要切换,是单活的架构
KA , MHA, MMM
真正高可用(多活系统):
NDB Cluster Oracle RAC Sysbase cluster , InnoDB Cluster(MGR),PXC , MGC
3.主从复制简介
基于二进制日志复制的
主库的修改操作会记录二进制日志
从库会请求新的二进制日志并回放,最终达到主从数据同步
主从复制核心功能:
辅助备份,处理物理损坏
扩展新型的架构:高可用,高性能,分布式架构等
4.主从复制搭建过程
a.清理掉3308上的数据
# rm -fr /data/3308/data/*
# rm -fr /data/3308/mysql-bin.*
b.启用3307
#systemctl start mysqld3307
c.初始化3308
# mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/3308/data
d.启动3308
# systemctl start mysqld3308
# mysql -S /data/3308/mysql.sock -e"select @@port"; #确认端口
e.检查配置
主库 3307 检查二进制日志是否开启
# cat /data/3307/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
server_id=7
log_bin=/data/3307/mysql-bin #二进制文件已开启
两个库的id是否不一样(一般建议主库的id小一些)
# mysql -S /data/3308/mysql.sock -e"select @@server_id";
+-------------+
| @@server_id |
+-------------+
| 8 |
+-------------+
# mysql -S /data/3307/mysql.sock -e"select @@server_id";
+-------------+
| @@server_id |
+-------------+
| 7 |
+-------------+
f.在主库3307 创建复制用户
# mysql -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'192.168.1.%' identified by '123'";
g.考虑到主库可能运行时间较长,所以先把数据备份出来,这样在同步数据时会快很多
# mysqldump -uroot -S /data/3307/mysql.sock -A --master-data=2 --single-transaction -R -E --triggers > /tmp/full.sql
或者也可以使用昨天的备份,因为白天备份库可能会影响性能
h.在从库3308上,恢复主库的备份
# mysql -S /data/3308/mysql.sock
mysql> set sql_log_bin=0;
mysql> source /tmp/full.sql;
i.在从库上设置要同步的信息
可以使用mysql> help change master to 查看具体的命令
CHANGE MASTER TO
MASTER_HOST='192.168.1.109',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
其中 MASTER_LOG_FILE 的信息需要使用下面的方式来查看
vim /tmp/full.sql
的第22行中的
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=154;
这一段话
在从库上执行如下操作
# mysql -S /data/3308/mysql.sock
CHANGE MASTER TO
MASTER_HOST='192.168.1.109',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
j.从库开启复制线程
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
k.查看主从复制的状态
mysql> show slave status \G
如果看到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两项为yes,则说明搭建OK
也可以在主库做一些操作,然后到从库中看是否同步过去了
# mysql -S /data/3307/mysql.sock -e "create database sakura"
# mysql -S /data/3308/mysql.sock -e "show databases"
l.trouble shooting
如果没有成功 没有看到2个yes 就去下面看日志 last io error last sql error
如何重新设定呢
i.stop slave
ii. reset slave all
iii. 正确的change master to ...
iv.start slave
如果涉及到重新对应binlog文件和position号,则在主库执行
show master status
然后找出对应的 binlog文件以及 position
5.主从复制的工作过程(原理)
a.从库执行 change master to 命令(其中包含主库的连接信息以及binlog文件以及positon)
b.从库会将以上信息记录到master.info文件
c.从库执行 start slave 命令,立即开启 IO线程和sql线程
d.从库的IO线程会读取 master.info的信息,从而获取主库的连接信息以及binlog文件以及positon
e.从库IO线程会请求连接主库,主库会提供一个dump线程来和从库的IO线程交互
f.从库的IO线程会根据binlog的位置信息,请求主库新的binlog
g.主库通过dump线程将最新的binlog 通过网络传输给从库的IO线程
h.从库的IO线程接收到新的binlog日志 存储到tcp/ip缓存 立即返回ack给主库 并更新master.info
i.IO线程将tcp/ip中缓存的数据转存到磁盘的relaylog中
j.sql线程读取relay.info中的信息,获取到上次已经应用过的relaylog的位置
k.sql线程和会按照上次的位置点回放最新的relaylog,再次更新relay.info
l.从库会自动purge应用过relay进行定期清理
补充 一旦主从复制构建成功 主库当中发生了新的变化 都会通过dump线程发送信号给io线程,从而增强了主从复制的实时性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)