重庆市设计公司网站,做封面怎么把网站加上去,网页制作平台有,全球十大猎头公司排名文章目录 MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式 MySQL主从复制实验环境准备关闭防火墙和 SELinux时间同步主服务器设置从服务器设置 MySQL 主从复制配置主服务器配置从服务器配置#xff08;以 Slave1 为例… 文章目录 MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式 MySQL主从复制实验环境准备关闭防火墙和 SELinux时间同步主服务器设置从服务器设置 MySQL 主从复制配置主服务器配置从服务器配置以 Slave1 为例Slave2 配置类似验证 常见问题 MySQL半同步复制MySQL主从复制的几个同步模式半同步复制配置主数据库配置从数据库配置查看半同步是否在运行 参数说明 问答 MySQL主从复制
MySQL主从复制是一种数据库复制技术用于将数据从一个MySQL数据库服务器称为主服务器或主库复制到一个或多个MySQL数据库服务器称为从服务器或从库。这种技术主要用于数据备份、读写分离、负载均衡等场景以提高数据库系统的可用性和性能。 主从复制的应用场景 数据备份通过主从复制可以将主服务器的数据实时同步到从服务器从而实现数据备份和灾难恢复。 读写分离在主服务器上处理写操作如INSERT、UPDATE等在从服务器上处理读操作如SELECT等以减轻主服务器的负载并提高系统的吞吐量。 负载均衡通过配置多个从服务器可以将读操作分散到不同的从服务器上从而实现负载均衡。
MySQL主从复制的分类
基于SQL语句的复制STATEMENT 优点执行效率高因为只需要复制SQL语句占用空间小因为只存储了SQL语句而非实际数据性能消耗低因为复制过程相对简单。缺点在高并发高负载情况下由于SQL语句的执行顺序、执行时间等因素可能导致主从复制精确度下降。例如当主库和从库选择的索引不一致时相同的SQL语句可能产生不同的结果集。 基于行的复制ROW 优点精确度高因为复制的是具体的行数据变化不受SQL语句执行顺序、执行时间等因素的影响。缺点占用空间大因为需要复制每一行数据的变化性能消耗高因为复制过程需要处理大量的行数据。 混合类型的复制MIXED 原理默认采用基于SQL语句的复制当发现基于语句的复制无法保证精确复制时如上述索引不一致的情况会切换到基于行的复制。优点结合了基于SQL语句复制和基于行复制的优点既保证了复制效率又提高了复制精确度。
MySQL主从复制原理
MySQL主从复制的原理主要涉及两个日志bin log和relay log和三个线程IO线程、SQL线程、DUMP线程
两个日志 bin log二进制日志主库上的数据更新操作如INSERT、UPDATE、DELETE等会被记录到二进制日志中。relay log中继日志从库上的IO线程会从主库上拉取二进制日志事件并将其保存到中继日志中。随后从库上的SQL线程会读取中继日志中的事件并在本地进行重放即将事件解析为SQL语句并逐一执行。 三个线程 DUMP线程主库上为每个从库的IO线程请求开启的线程负责发送二进制日志事件给从库。IO线程从库上用于与主库通信的线程负责从主库上拉取二进制日志事件并保存到中继日志中。SQL线程从库上用于读取中继日志中的事件并在本地进行重放的线程。
MySQL主从复制的配置步骤
MySQL主从复制的配置步骤通常包括以下几个步骤
主从服务器时间同步确保主从服务器的时间一致以避免因时间差异导致的数据不一致问题。修改配置文件在主从数据库的配置文件中配置二进制日志、中继日志、server-id每个节点都不同、gtid等相关参数。创建复制用户在主库上创建一个专门用于复制的用户并授予主从复制权限。对接主库在从库上使用CHANGE MASTER TO语句对接主库并配置相关的复制参数如主库地址、用户名、密码、二进制日志文件名和位置等。启动同步在从库上使用START SLAVE语句启动同步过程。检查状态在从库上使用SHOW SLAVE STATUS语句查看IO线程和SQL线程的状态是否都是YES以确保同步过程正常进行。
MySQL主从复制的同步模式
MySQL主从复制支持以下三种同步模式
异步复制 原理主库在执行完客户端提交的事务后会立即将结果返回给客户端而不关心从库是否已经接收并处理这些事务。优点效率高因为主库不需要等待从库的响应。缺点数据一致性差如果主库在事务提交后崩溃而这些事务还没有被复制到从库上那么从库上的数据将不完整。 半同步复制 原理主库在执行完客户端提交的事务后会等待至少一个从库接收并写到relay log中才返回给客户端。优点相对于异步复制提高了数据的安全性。缺点仍然存在一定的延迟至少一个TCP/IP往返的时间且需要在低延时的网络中使用。 全同步复制 原理主库在执行完客户端提交的事务后会等待所有从库都执行了该事务才返回给客户端。优点数据一致性好因为所有从库都执行了相同的事务。缺点性能差因为主库需要等待所有从库的响应才能继续处理下一个事务。
MySQL主从复制实验
环境准备
Master 服务器IP 地址 192.168.80.10运行 MySQL 5.7Slave1 服务器IP 地址 192.168.80.11运行 MySQL 5.7Slave2 服务器IP 地址 192.168.80.12运行 MySQL 5.7Amoeba 服务器IP 地址 192.168.80.20运行 JDK 1.6 和 Amoeba客户端 服务器IP 地址 192.168.80.30运行 MySQL 客户端
关闭防火墙和 SELinux
在所有服务器上执行以下命令
systemctl stop firewalld
systemctl disable firewalld
setenforce 0时间同步
主服务器设置
安装 NTP
yum install ntp -y编辑 NTP 配置文件
vim /etc/ntp.conf在末尾添加
server 127.127.80.0
fudge 127.127.80.0 stratum 8启动 NTP 服务
service ntpd start从服务器设置
安装 NTP 和 ntpdate
yum install ntp ntpdate -y启动 NTP 服务
service ntpd start使用 ntpdate 进行时间同步
/usr/sbin/ntpdate 192.168.80.10设置定时任务每 30 分钟同步一次时间
crontab -e添加以下行
*/30 * * * * /usr/sbin/ntpdate 192.168.80.10MySQL 主从复制配置
主服务器配置
编辑 MySQL 配置文件
vim /etc/my.cnf在 [mysqld] 部分添加或修改以下配置
server-id11
log-binmysql-bin
binlog_formatmixed
expire_logs_days7
max_binlog_size500M
skip_slave_start1# 数据安全性高的设置
innodb_flush_log_at_trx_commit1
sync_binlog1# 或者性能较快的设置推荐在磁盘IO压力大时使用
# innodb_flush_log_at_trx_commit2
# sync_binlog500重启 MySQL 服务
systemctl restart mysqld授权从服务器连接
GRANT REPLICATION SLAVE ON *.* TO myslave192.168.80.% IDENTIFIED BY 123456;
FLUSH PRIVILEGES;查看主服务器状态
SHOW MASTER STATUS;
如显示以下
-------------------------------------------------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
-------------------------------------------------------------
| mysql-bin.000002 | 339 | | |
-------------------------------------------------------------
1 row in set (0.00 sec)记录 File 和 Position 的值。 File 列显示日志名Position 列显示偏移量
从服务器配置以 Slave1 为例Slave2 配置类似
编辑 MySQL 配置文件
vim /etc/my.cnf在 [mysqld] 部分添加或修改以下配置
[mysqld]
# 设置服务器的唯一ID用于复制环境中的主从识别
server-id22# 启用中继日志用于复制过程中的数据传输
relay-logrelay-bin# 设置InnoDB存储引擎的缓冲池大小这里设置为2GB
# 缓冲池是用于缓存数据和索引的内存区域较大的缓冲池可以提高性能
innodb_buffer_pool_size2048M# 关闭二进制日志的同步写入到磁盘操作可以提高性能但降低数据安全性
# 在某些情况下你可能希望在确认事务提交后再写入磁盘这时可以设置为1
sync_binlog0# 设置InnoDB事务日志的刷新策略这里设置为每秒刷新一次
# 这个值可以在性能和数据安全性之间做出权衡0表示每次事务提交都刷新1表示每次事务提交都写入并刷新2表示每秒刷新一次
innodb_flush_log_at_trx_commit2# 禁止从服务器更新二进制日志适用于不需要将从服务器的更改记录到二进制日志的场景
log-slave-updates0# 启用中继日志自动恢复功能当从服务器重启时可以自动应用未完成的中继日志事件
relay_log_recovery1在添加或修改这些配置项后你需要重启MySQL服务以使更改生效。这些配置项可以根据你的具体需求和服务器的性能进行调整。例如如果你对数据安全性有更高的要求可能会将sync_binlog设置为1并且可能需要调整innodb_flush_log_at_trx_commit的值来平衡性能和安全性。 2. 重启 MySQL 服务
systemctl restart mysqld配置从服务器同步
CHANGE MASTER TO
master_host192.168.80.10,
master_port3306,
master_usermyslave,
master_password123456,
master_log_filemysql-bin.000002, -- 使用从主服务器获取到的文件名
master_log_pos339; -- 使用从主服务器获取到的位置启动从服务器同步
START SLAVE;查看从服务器状态
SHOW SLAVE STATUS\G;确保 Slave_IO_Running 和 Slave_SQL_Running 的值都是 Yes。
验证
验证主从复制效果 在主服务器上进入执行
create database db_test;在从服务器中查看
show databases;常见问题
如果 Slave_IO_Running 是 No可能的原因包括 网络不通MySQL 配置文件错误密码、日志文件名、位置偏移量不正确防火墙未关闭 如果遇到错误可以尝试执行 RESET SLAVE; 来重置从服务器配置然后重新配置。
MySQL半同步复制
MySQL主从复制的几个同步模式
异步复制Asynchronous replication 描述主库执行完事务后立即返回结果给客户端不关心从库是否已经接收并处理。问题如果主库崩溃已经提交但尚未传到从库的事务会丢失可能导致数据不一致。 全同步复制Fully synchronous replication 描述主库等待所有从库都执行完事务后才返回结果给客户端。性能影响由于需要等待所有从库性能会受到严重影响。 半同步复制Semisynchronous replication 描述主库等待至少一个从库接收到并写到relay log中后才返回结果给客户端。优点提高了数据安全性但会有一定延迟至少一个TCP/IP往返时间。适用场景适合低延时网络环境。
半同步复制配置
主数据库配置
vim /etc/my.cnf在 [mysqld] 区域添加以下内容
# 加载mysql半同步复制的插件
plugin-loadrpl_semi_sync_mastersemisync_master.so
# 开启半同步复制功能设置为ON或1
rpl_semi_sync_master_enabledON
# 超时时间单位为毫秒这里设置为1000ms即1秒
rpl-semi-sync-master-timeout1000保存并重启MySQL服务
systemctl restart mysqld从数据库配置
vim /etc/my.cnf在 [mysqld] 区域添加以下内容
# 加载mysql半同步复制的插件
plugin-loadrpl_semi_sync_slavesemisync_slave.so
# 开启从库的半同步复制功能
rpl_semi_sync_slave_enabledON保存并重启MySQL服务
systemctl restart mysqld查看半同步是否在运行
在主数据库执行
-- 查看主库半同步状态
SHOW STATUS LIKE Rpl_semi_sync_master_status;
-- 查看半同步复制超时时间
SHOW VARIABLES LIKE rpl_semi_sync_master_timeout;在从数据库执行可能需要重启IO线程后状态才会更新为ON
-- 查看从库半同步状态
SHOW STATUS LIKE Rpl_semi_sync_slave_status;重启从数据库上的IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;再次在主库查询半同步状态
SHOW STATUS LIKE %Rpl_semi%;参数说明
Rpl_semi_sync_master_clients半同步复制客户端的个数。Rpl_semi_sync_master_net_avg_wait_time平均等待时间单位毫秒。Rpl_semi_sync_master_net_wait_time总共等待时间。Rpl_semi_sync_master_net_waits等待次数。Rpl_semi_sync_master_no_times关闭半同步复制的次数。Rpl_semi_sync_master_no_tx表示没有成功接收从库提交的次数。Rpl_semi_sync_master_status表示当前是异步模式还是半同步模式ON为半同步。Rpl_semi_sync_master_timefunc_failures调用时间函数失败的次数。Rpl_semi_sync_master_tx_avg_wait_time事务的平均传输时间。Rpl_semi_sync_master_tx_wait_time事务的总共传输时间。Rpl_semi_sync_master_tx_waits事务等待次数。Rpl_semi_sync_master_wait_pos_backtraverse可以理解为后来的先到了而先来的还没有到的次数。Rpl_semi_sync_master_wait_sessions当前有多少个session因为从库的回复而造成等待。Rpl_semi_sync_master_yes_tx成功接受到从库事务回复的次数。
注意
如果半同步复制发生超时由rpl_semi_sync_master_timeout参数控制会暂时关闭半同步复制转而使用异步复制。在一主多从的架构中开启半同步复制不要求所有从库都是半同步复制。MySQL 5.7 版本极大地提升了半同步复制的性能通过独立出一个ack collector thread专门用于接收从库的反馈信息解决了5.6版本中dump thread成为性能瓶颈的问题。
问答 在什么情况下半同步复制会将为异步复制 当主库在半同步复制超时时间内没有收到从库的响应就会降为异步复制半同步复制超时时间参数为rpl_semi_sync_master_timeout默认值为10s 当主库发送完一个事务事件后主库在半同步复制超时时间内收到了从库的响应就会恢复为半同步复制 mysql主从复制不一致问题如何解决 1.在主库使用mysqldump对数据不一致的库或表进行完全备份并show master status检查当前的二进制日志和偏移量 mysqldump -uroot -p密码 库名 表名 mysql_bak.sqlshow master status;2.使用scp把备份文件远程复制到从库在从库关闭同步导入数据备份 scp mysql_bak.sql 从库IP:目录/stop slave;mysql -uroot -p密码 库名 mysql_bak.sql3.在从库使用change master to 重新进行主从复制对接再开启同步 change master to master_host主库IP,master_port3306,master_user用户,master_password密码,master_log_filebinlog文件名,master_log_pos偏移量;change master to master_host主库IP,master_port3306,master_user用户,master_password密码,master_auto_position1; #使用GTID主从复制模式start slave;主要步骤 导出主库数据恢复到从库重新开启主从同步。 关于mysql主从复制延迟问题 原因主库可以并发多线程执行写入操作而从库的SQL线程默认是单线程串行化复制从库的复制效率可能会跟不上主库的写入速度 如何判断发生了主从复制延迟 可通过在从库执行show slave status查看输出的Seconds_Behind_Master参数的值来判断是否发生了主从复制延迟。如果值为正值则表示已经出现主从复制延迟数值越大表示从库落后主库越多 导致主从复制延迟有哪些因素 主库写入操作并发量太大事务数太多网络延迟从库硬件比主库差太多使用了全同步复制事务太大慢SQL语句太多 延迟问题的解决 网络优化 将从库分布在宇主库相同的局域网或网络延迟较小的环境中 硬件优化 从库配置更好的硬件使用更高规格的CPU和内存使用固态硬盘和RAID提升磁盘的读写性能 配置优化 innodb_buffer_pool_size #从库加大Innodb引擎缓存池的大小让更多的数据读写在内存中完成减少磁盘IO压力 slave_parallel_workers #从库使用多线程并行复制 log-slave-updates0 #从库从主库复制的数据时不写入到二进制日志减少磁盘IO压力 innodb_flush_log_at_trx_commit2 #从库不使用双1设置减少磁盘IO压力 sync_binlog0 架构优化 主从复制的同步模式采用 半同步复制或异步复制采用读写分离避免读写操作相互阻塞 操作优化 将大型事务拆分成多个较小的事务 优化一些SQL语句操作比如可将多个操作合并到一个SQL语句执行 创建索引避免全表扫描