1.主从复制 主从分离:
2.主从复制的作用:
- 实现读写分离
- 跨主机热备份数据
- 作为数据库高可用性的基础
3.读写分离的原理和作用:
在主库上处理事务性操作(写入操作),在从库上处理查询操作(读操作),再通过主从复制将主库上的数据同步给从库。
作用: 通过读写分离可以分担数据库单节点的负载压力,提高数据库的读写性能
4.主从复制的分类:
优点 | 缺点 | ||
statement | 基于语句的复制 | 执行效率高,占用空间小 | 无法保证在高并发负载时候的精准度 |
row | 基于行的复制 | 精确度高 | 执行效率低,占用空间大 |
mixwd | 混合类型的复制(默认采用基于语句的复制,一旦发现基于语句无法保证精度复制时,就会采用基于行的复制) |
5.主从复制的原理:
基于二进制日志进行数据同步的
6.主从复制的过程:
关键词:两个日志,三个线程
- 主库(master)如果发生数据更新,会将写入操作记录到二进制日志(bin log)里
- 从库(slave)探测到主库的二进制日志发生了更新,就会开启IO线程向主库请求二进制日志事件
- 主库会为每个从库IO线程的请求开启DUMP线程,并发送二进制日志事件给从库
- 从库接收到二进制日志事件后会保存到自己的中继日志(relay log)中 附:在半同步模式下从库会返回确认信息给主库,主库会用ack收集线程接收从库反馈的确认信息(5.7版本开始支持)
- 从库还会开启SQL线程读取中继日志里的事件,并在本地重放(将二进制日志事件解析成sql语句逐一执行),从而实现主库和从库的数据一致
7. 主从复制的配置步骤:
1)主从服务器先做时间同步
2)修改主从数据库的配置文件,主库开启二进制日志,从库开启中继日志
3)在主库创建主从复制的用户,并授予主从复制的权限
4)在从库使用 change master to 对接主库,并 start slave 开启同步
5)在从库使用 show slave status\G 查看 IO线程和 SQL线程的状态是否都为 YES
8. 主从复制的同步模式:
1)异步复制 主库在执行完客户端提交的事务后就会立即响应给客户端
2)半同步复制 主库在执行完客户端提交的事务后,只要等待一个从库返回响应给主库,才会响应给客户端
3)全同步复制 主库在执行完客户端提交的事务后,要等待所有从库返回都响应给主库,才会响应给客户端
9. 在什么情况下半同步复制会降为异步复制?
当主库在半同步复制超时时间内(rpl_semi_sync_master_timeout)没有收到从库的响应,就会自动降为半同步复制。
当主库发送完一个事务事件后,主库在超时时间内收到了从库的响应,就会又恢复为半同步复制。
10.主从复制延迟问题?
根本原因:主库可以并发多线程执行写入操作,而从库的SQL线程默认是单线程串行化复制,从库的复制效率可能会跟不上主库的写入速度
11.如何判断发生了主从复制延迟?
通过在从库执行show slave status\G命令,查看输出的Seconds_Behind_Master参数的值来判断,是否有发生主从延时。如果为正值表示主从已经出现延时,数字越大表示从库落后主库越多。
12. 导致主从复制延迟有哪些因素?
1)主库写入操作并发量太大
2)网络延迟
3)从库硬件比主库差
4)使用了同步复制
5)慢SQL语句过多
13. 延迟的解决:
网络方面: | 将从库分布在相同局域网内或网络延迟较小的环境中。 |
硬件方面: | 从库配置更好的硬件(CPU 内存 固态硬盘),提升随机写的性能。 |
配置方面: | sync_binlog=0 innodb_flush_log_at_trx_commit=2 #由于从库不需要这么高的数据安全性,所以不使用 双1设置 #从库同步的事件不记录到从库自身的二进制日志中 #加大innodb引擎缓存池大小,让更多数据读写在内存中完成,减少磁盘的IO压力 |
架构方面: | 主从复制的同步模式采用 异步复制 或 半同步复制 或 并行复制 采用读写分离架构 |
操作方面: | 将大事务拆分为多个较小的事务 优化 DDL 操作,合并多个 DDL 操作为一个批处理操作 |
14. 主从复制不一致问题的解决:
方法一:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
1)先进入主库,进行锁表,防止数据写入
flush tables with read lock;
set gloabl read_only=1;
2)进行数据全量备份
mysqldump -u root -p密码 库名 表名 > XXX.sql
3)使用scp命令把备份文件传到从库机器,进行数据恢复
scp XXX.sql 从库IP:目录/
stop slave;
mysql -u root -p密码 < XXX.sql
4)使用 change master to 重新做主从复制
change master to master_host='主库IP', master_port=3306, master_user='用户名', master_password='密码', master_log_file='二进制文件', master_log_pos=二进制事件位置;
附:二进制文件和二进制事件位置需要在主库查询 show master status;
start slave;
5)主库解锁
unlock tables;
set gloabl read_only=0;
方法二:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况.
stop slave;
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
现在主从同步状态正常了
实验 :实现MySQL主从复制 :
开启三台虚拟机:一主(1)190.168.18.10,两从(2,3)192.168.18.20,192.168.18.30
(1)开启同步,确认三台MySQL是同一版本
(2)初始化
[root@l1 ~]# systemctl disable --now firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@l2 ~]# setenforce 0
[root@l2 ~]# vim /etc/selinux/config
(3)Mysql主从服务器时间同步(这里我们使用方法2)
方法一:
[root@l3 ~]# rpm -q ntpdate //如果没有安装yum安装一下,yum install ntp -y
ntpdate-4.2.6p5-29.el7.centos.2.x86_64
[root@l3 ~]# ntpdate ntp.aliyun.com //阿里云时区代理服务器
24 Jun 23:57:41 ntpdate[89313]: adjust time server 203.107.6.88 offset 0.003549 sec
[root@l1 ~]# which ntpdate
/usr/sbin/ntpdate
[root@l1 ~]# crontab -e
crontab: installing new crontab
[root@l1 ~]#
——————————————————————插入——————————————————————————————————————————————
*/30 * * * * /sbin/ntpdate ntp.aliyun.com &> /dev/null
//每半个小时自动化同步,并混合输出
————————————————————————————————————————————————————————————————————————
方法二:
//ntp和chrony只能启动一个(因为他们使用同一个端口)
[root@l1 ~]# rpm -q ntp
ntp-4.2.6p5-29.el7.centos.2.x86_64
[root@l1 ~]# systemctl status ntpd
● ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@l1 ~]#
或者
[root@l1 ~]# rpm -q chrony
chrony-3.4-1.el7.x86_64
[root@l1 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2024-06-04 19:46:13 CST; 2 weeks 6 days ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 734 (chronyd)
Tasks: 1
CGroup: /system.slice/chronyd.service
└─734 /usr/sbin/chronyd
6月 24 23:23:47 l1 chronyd[734]: Can't synchronise: no selectable sources
6月 24 23:23:47 l1 chronyd[734]: Source 185.209.85.222 offline
6月 24 23:23:47 l1 chronyd[734]: Source 117.80.231.60 offline
6月 24 23:23:47 l1 chronyd[734]: Source 202.118.1.81 offline
6月 24 23:23:47 l1 chronyd[734]: Source 202.112.31.197 offline
6月 24 23:23:47 l1 chronyd[734]: Source 185.209.85.222 online
6月 24 23:23:47 l1 chronyd[734]: Source 117.80.231.60 online
6月 24 23:23:47 l1 chronyd[734]: Source 202.118.1.81 online
6月 24 23:23:47 l1 chronyd[734]: Source 202.112.31.197 online
6月 24 23:25:58 l1 chronyd[734]: Selected source 202.112.31.197
[root@l1 ~]#
[root@l1 ~]# vim /etc/chrony.conf
————————————————————————————————————
server ntp.aliyun.com iburst
————————————————————————————————————
[root@l1 ~]# systemctl restart chronyd.service
[root@l1 ~]#
方法三:
[root@node ~]# yum -y install ntp //安装 ntp
[root@node ~]# systemctl start ntpd
[root@node ~]# systemctl enable ntpd //启动 ntp 服务
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
[root@node ~]# systemctl status ntpd //查看 ntp 服务
● ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2022-08-04 08:00:47 CST; 7h left
Main PID: 20746 (ntpd)
Tasks: 1
Memory: 768.0K
CGroup: /system.slice/ntpd.service
└─20746 /usr/sbin/ntpd -u ntp:ntp -g
Aug 04 08:00:47 node ntpd[20746]: Listen normally on 6 lo ::1 UDP 123
Aug 04 08:00:47 node ntpd[20746]: Listen normally on 7 ens33 fe80::8a83:7297:7cb8:9934 UDP 123
Aug 04 08:00:47 node ntpd[20746]: Listening on routing socket on fd #24 for interface updates
Aug 04 08:00:47 node systemd[1]: Started Network Time Service.
Aug 04 08:00:47 node ntpd[20746]: 0.0.0.0 c016 06 restart
Aug 04 08:00:47 node ntpd[20746]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
Aug 04 08:00:47 node ntpd[20746]: 0.0.0.0 c011 01 freq_not_set
Aug 04 08:00:56 node ntpd[20746]: 0.0.0.0 c61c 0c clock_step -28798.353463 s
Aug 04 00:00:57 node ntpd[20746]: 0.0.0.0 c614 04 freq_mode
Aug 04 00:00:58 node ntpd[20746]: 0.0.0.0 c618 08 no_sys_peer
[root@node ~]# vim /etc/ntp.conf //修改 ntp.conf 文件
[root@node ~]# grep server /etc/ntp.conf
# Use public servers from the pool.ntp.org project.
#server 0.centos.pool.ntp.org iburst
server ntp.aliyun.com iburst
#broadcast 192.168.1.255 autokey # broadcast server
#broadcast 224.0.1.1 autokey # multicast server
#manycastserver 239.255.254.254 # manycast server
[root@node ~]# systemctl restart ntpd //重启服务
[root@node ~]# ntpq -p //检查同步状态
remote refid st t when poll reach delay offset jitter
==============================================================================
203.107.6.88 100.107.25.114 2 u 2 64 1 30.975 149.499 0.393
注:ntp和chrony服务只能开启一个,因为他们同时使用同一个端口
启动MySQL
[root@l1 ~]# systemctl status mysqld.service
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since 一 2024-06-17 23:51:10 CST; 1 weeks 0 days ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Main PID: 30663 (mysqld)
Tasks: 28
CGroup: /system.slice/mysqld.service
└─30663 /usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/mysqld.pid
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.842984Z 0 [Note] Skipping generation of SSL certif...tory.
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.842988Z 0 [Warning] A deprecated TLS version TLSv1...gher.
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.842989Z 0 [Warning] A deprecated TLS version TLSv1...gher.
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.843545Z 0 [Warning] CA certificate ca.pem is self signed.
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.843597Z 0 [Note] Skipping generation of RSA key pa...tory.
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.843661Z 0 [Note] Server hostname (bind-address): '... 3306
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.843677Z 0 [Note] - '0.0.0.0' resolves to '0.0.0.0';
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.844290Z 0 [Note] Server socket created on IP: '0.0.0.0'.
6月 17 23:51:10 l1 mysqld[30660]: 2024-06-17T15:51:10.847382Z 0 [Note] Failed to start slave threads for...el ''
6月 17 23:51:10 l1 systemd[1]: Started MySQL Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@l1 ~]#
关闭三台主机同步操作
(4)主服务器的mysql配置
----主服务器的mysql配置-----
vim /etc/my.cnf
server-id=11
log-bin=mysql-bin #添加,主服务器开启二进制日志
binlog_format=mixed
#选配项
expire_logs_days=7 #设置二进制日志文件过期时间,默认值为0,表示logs不过期
max_binlog_size=500M #设置二进制日志限制大小,如果超出给定值,日志就会发生滚动,默认值是1GB
skip_slave_start=1 #阻止从库崩溃后自动启动复制,崩溃后再自动复制可能会导致数据不一致的
#"双1设置",数据写入最安全
innodb_flush_log_at_trx_commit=1 #redo log(事务日志)的刷盘策略,每次事务提交时MySQL都会把事务日志缓存区的数据写入日志文件中,并且刷新到磁盘中,该模式为系统默认
sync_binlog=1 #在进行每1次事务提交(写入二进制日志)以后,Mysql将执行一次fsync的磁盘同步指令,将缓冲区数据刷新到磁盘
---------------------------------------------------------------
#"双1设置"适合数据安全性要求非常高,而且磁盘IO写能力足够支持的业务,比如订单、交易、充值、支付消费系统。"双1模式"下,当磁盘IO无法满足业务需求时,比如11.11活动的压力。推荐一下性能较快的设置,并使用带蓄电池后备电源,防止系统断电异常。
innodb_flush_log_at_trx_commit=2 #每次事务提交时MySQL都会把日志缓存区的数据写入日志文件中,但是并不会同时刷新到磁盘上。该模式下,MySQL会每秒执行一次刷新磁盘操作
sync_binlog=500 #在进行500次事务提交以后,Mysql将执行一次fsync的磁盘同步指令,将缓冲区数据刷新到磁盘
---------------------------------------------------------------
systemctl restart mysqld
mysql -u root -pabc123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.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 列显示偏移量
[root@l1 ~]# vim /etc/my.cnf
—————————插入—————————————
server-id = 1
log-bin=mysql-bin
binlog_format=mixed
——————————————————————————
[root@l1 ~]# systemctl restart mysqld.service //重启服务
[root@l1 ~]# mysql -uroot -pabc123 //进入数据库
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.44-log Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> create user 'myslave'@'192.168.18.%' identified by 'myslave123';//创建用户
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'myslave'@'192.168.18.%'; //给权限
Query OK, 0 rows affected (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 |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 775 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
(5)从服务器的mysql配置:
----从服务器的mysql配置----
vim /etc/my.cnf
server-id = 22 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=relay-log-bin.index #定义中继日志文件的位置和名称,一般和relay-log在同一目录
#选配项
innodb_buffer_pool_size=2048M #用于缓存数据和索引的内存大小,让更多数据读写在内存中完成,减少磁盘操作,可设置为服务器总可用内存的 70-80%
sync_binlog=0 #MySQL不做任何强制性的磁盘刷新指令,而是依赖操作系统来刷新数据到磁盘
innodb_flush_log_at_trx_commit=2 #每次事务log buffer会写入log file,但一秒一次刷新到磁盘
log-slave-updates=0 #slave 从 master 复制的数据会写入二进制日志文件里,从库做为其他从库的主库时设置为 1
relay_log_recovery=1 #当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log, 并且重新从 master 上获取日志,这样就保证了 relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。
systemctl restart mysqld
mysql -u root -pabc123
#配置同步,注意 master_log_file 和 master_log_pos 的值要与 Master 查询的一致
CHANGE master to master_host='192.168.80.10',master_port=3306,master_user='myslave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=339;
#基于整个数据库的同步
CHANGE master to master_host='192.168.80.10',master_port=3306,master_user='myslave',master_password='123456';
start slave; #启动同步,如有报错执行 reset slave;
show slave status\G #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
#一般 Slave_IO_Running: No 的可能性:
1、网络不通
2、my.cnf配置有问题
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭
(6)二号机(从服务器):
[root@l2 ~]# vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
[root@l2 ~]# systemctl restart mysqld.service
[root@l2 ~]# mysql -u root -pabc123;
change master to master_host='192.168.18.10', master_port=3306, master_user='myslave', master_password='myslave123', master_log_file='mysql-bin.000001', master_log_pos=775;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与 Master 查询的一致
mysql> start slave; #开启同步
show slave status\G #查看
(7)三号机(从服务器):
[root@l3 ~]# vim /etc/my.cnf
vim /etc/my.cnf
server-id = 3 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=relay-log-bin.index #定义中继日志文件的位置和名称,一般和relay-log在同一目录
__________________________________
server-id = 3
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
__________________________________
systemctl restart mysqld
mysql -u root -pabc123;
change master to master_host='192.168.18.10', master_port=3306, master_user='myslave', master_password='myslave123', master_log_file='mysql-bin.000001', master_log_pos=775;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与 Master 查询的一致
start slave; #开启同步
show slave status\G #查看
[root@l3 ~]# systemctl restart mysqld.service
[root@l3 ~]# mysql -u root -pabc123;
change master to master_host='192.168.18.10', master_port=3306, master_user='myslave', master_password='myslave123', master_log_file='mysql-bin.000001', master_log_pos=775;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与 Master 查询的一致
mysql> start slave; #开启同步
show slave status\G #查看
(8)验证:
主服务器进程创建库、表,并插入数据
———————————————————————主服务器——————————————————
mysql> create database cywl; //创建库
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cywl |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use cywl;
Database changed
mysql> create table xy101 (id int, name varchar(20)); //创建表
Query OK, 0 rows affected (0.00 sec)
mysql> insert into xy101 values (1, 'yuan'); //插入数据
Query OK, 1 row affected (0.01 sec)
mysql> insert into xy101 values (2, 'zhi');
Query OK, 1 row affected (0.00 sec)
mysql> select * from xy101;
+------+------+
| id | name |
+------+------+
| 1 | yuan |
| 2 | zhi |
+------+------+
2 rows in set (0.00 sec)
mysql>
——————————————————从服务器查看验证——————————————————
mysql> select * from cywl.xy101;
+------+------+
| id | name |
+------+------+
| 1 | yuan |
| 2 | zhi |
+------+------+
2 rows in set (0.00 sec)
mysql>
实验:搭建半同步模式
半同步复制 : 主库在执行完客户端提交的事务后,只要等待一个从库返回响应给主库,才会响应给客户端
此实验基于以上主从复制实验结果为基础
三台虚拟机:一主(1)190.168.18.10,两从(2,3)192.168.18.20,192.168.18.30
主服务器:
(1)添加半同步模式参数,并重启mysql服务;
vim /etc/my.cnf
###添加半同步模式的参数
plugin-load=rpl_semi_sync_master=semisync_master.so #加载mysql半同步复制的插件
rpl_semi_sync_master_enabled=ON #或者设置为"1",即开启半同步复制功能
rpl-semi-sync-master-timeout=1000 #超时时间为1000ms,即1s
systemctl restart mysqld
vim /etc/my.cnf
————————————————————————————————————————————————————————————————
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=ON
rpl-semi-sync-master-timeout=1000
————————————————————————————————————————————————————————————————
systemctl restart mysqld
[root@l1 ~]# systemctl restart mysqld.service
从服务器(两个服务器配置一致):
从服务器二号机
vim /etc/my.cnf
————————————插入————————————————————————————————
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=ON
————————————————————————————————————————————————
systemctl restart mysqld
从服务器三号机和二号机操作一样
主服务器查看:
mysql -u root -pabc123;
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 #表示没有成功接收slave提交的次数
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因为slave的回复而造成等待
Rpl_semi_sync_master_yes_tx #成功接受到slave事物回复的次数
实验:搭建MySQL读写分离:
centos7-2(192.168.9.210)与centos7-5(192.168.9.120)
二号机(192.168.18.20),三号机(192.168.18.30)做从服务器;
centos7-8(192.168.9.150)
一号机(192.168.18.10)做主服务器;
centos7-7(192.168.9.140)
四号机(192.168.18.40)Amoeba服务器
该“案例实施:搭建MySQL读写分离”,是在“案例实施:搭建MySQL主从复制”的基础上进行的,因此此处省略MySQL主从复制的步骤
Amoeba服务器:
1.初始化操作
[root@l4 ~]# systemctl disable --now firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@l4 ~]# setenforce 0
[root@l4 ~]# vim /etc/selinux/config
[root@l4 ~]#
[root@l4 ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@l4 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 914412 0 914412 0% /dev
tmpfs 931496 0 931496 0% /dev/shm
tmpfs 931496 10448 921048 2% /run
tmpfs 931496 0 931496 0% /sys/fs/cgroup
/dev/mapper/centos-root 38770180 4576740 34193440 12% /
/dev/sda1 1038336 191104 847232 19% /boot
tmpfs 186300 12 186288 1% /run/user/42
tmpfs 186300 0 186300 0% /run/user/0
/dev/sr0 4635056 4635056 0 100% /mnt
[root@l4 ~]#
2.安装 Java 环境
rpm -qa | grep jdk
yum remove java*
#因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
[root@l4 ~]# cd /opt/
[root@l4 opt]# ls
amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin rh
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
//按yes,按enter
mv jdk1.6.0_14/ /usr/local
ls
mkdir /usr/local/amoeba
tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
cd /usr/local
vim /etc/profile.d/jdk1.6.sh
export JAVA_HOME=/usr/local/jdk1.6.0_14
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$AMOEBA_HOME/bin
#添加配置
source /etc/profile
java -version
cd /usr/local/amoeba/bin
./amoeba #如显示amoeba start|stop说明安装成功
cd /usr/local/amoeba/conf/
cp amoeba.xml{,.bak} #修改前先进行备份
vim amoeba.xml #修改amoeba配置文件
<property name="user">lin</property> ##30行修改用户名
<property name="password">lin123</property> ##32行修改密码
##115行默认服务器连接到master组 #该用户名及密码为客户端连接amoeba的用户名及密码
<property name="defaultPool">master</property>
##117行去掉注释并修改
<property name="writePool">master</property>
<property name="readPool">slaves</property>
主从服务器创建用户
主服务器:
mysql -uroot -pabc123
create user 'amoeba'@'192.168.18.%' identified by 'amoeba123';
grant all on *.* to 'amoeba'@'192.168.18.%';
两个从服务器
mysql -uroot -pabc123
grant all on *.* to 'amoeba'@'192.168.18.%' identified by 'amoeba123';
Amoeba服务器
cd /usr/local/amoeba/conf/
cp dbServers.xml{,.bak}
vim dbServers.xml
注释23行
##设置为amoeba用户
<property name="user">amoeba</property>
##删除30行注释,28行注释添加完整,29行密码修改
<property name="password">amoeba123</property>
##44行47行分别设置主服务器名字和地址 ##此处用户名和密码为amoeba与主从服务器连接用
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.9.150</property>
##51行54行分别设置从服务器名字和地址
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.9.210</property>
##56行下额外添加一个从服务器配置
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.9.120</property>
</factoryConfig>
</dbServer>
##64行设置服务器池名称
<dbServer name="slaves" virtual="true">
##70行定义两个服务器地址
<property name="poolNames">slave1,slave2</property>
cd /usr/local/amoeba/conf/
cp dbServers.xml{,.bak}
vim dbServers.xml
cd /usr/local/amoeba/bin
./amoeba start & //后台运行amoeba
netstat -lntp | grep 8066
[root@l4 bin]# netstat -lntp | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 66180/java
测试
使用navicat
关闭从库进行验证
测试1
stop slave; #关闭两个从库
测试2
当两台从服务器重新开启时