主库执行完一个事务后,立即将更新数据发送给从库,并不关心从库是否接收。
优点:减少部分资源消耗
缺点:无法确认从库是否复制成功
半同步模式
相当于异步复制的改良版,主库执行完事务后,至少一个从库接收并写入到relay log中才返回给客户端。
优点:确保从库复制成功
缺点:这个过程需要花费一部分时间
MySQL架构方案
一主一从
提升负载均衡
一主多从
提升负载均衡,可用于高可用和读写分离,但主节点I/O压力较大。
多主一从
适用于写操作较为频繁的环境。
互为主从
也叫做双主互备,用于读写操作都较为频繁的环境。
注:有人说这个架构可以提供负载均衡,我个人认为对的,但是每当有一个库数据更新,另一个库都需要消耗一部分资源来进行同步数据,架构还不如使用一主一从。但可以双向写入的特点,在写操作较为频繁的场合还是很适用的。
联机复制
将一台从库作为中继,减轻主库的I/O压力。
更改二进制日志格式
对于二进制日志的保存操作,默认的ROW格式并不是一个很好的选择,其会产生大量的日志数据,对后续的主从复制效率不高。
查看binlog格式
mysql> show variables like "binlog\_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
其实不管是主从架构,还是单纯的保存binlog日志,ROW格式都不是最好的选择,建议使用MIXED格式,其结合STATEMENT模式和ROW模式保存数据,即能减少日志的大小,又能确保数据的完整。
直接编辑/etc/my.cnf配置文件,在其中指定binlog日志格式即可。
binlog-format=MIXED
随后重启数据库,刷新配置。
/etc/init.d/mysql.server restart
再次进入到数据库中查看binlog日志格式
mysql> show variables like "binlog\_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
已成功更改为MIXED模式。
MySQL主从复制部署
以一主一从为例,列举了MySQL架构的搭建过程。
环境准备
系统版本/MySQL版本 | 主机名 | IP地址 | 角色 | 准备 |
---|---|---|---|---|
CentOS7.7/MySQL8.0.13 | linux.node1 | 192.168.1.123 | master | 关闭防火墙,selinux |
CentOS7.7/MySQL8.0.13 | linux.node2 | 192.168.1.123 | slave | 关闭防火墙,selinux |
一主一从架构部署
1)搭建时间同步服务
对于数据的实时同步,若两台服务器的时间都对不上,又谈何而来的实时同步呢?
主节点安装NTP服务
yum install -y ntp
修改ntp服务的配置文件,路径位于 /etc/ntp.conf ,并添加以下两项
server 127.127.1.0 #权威NTP不可用时,本机时间作为时间服务
fudge 127.127.1.0 stratum 8 #NTP服务的阶级层数,同步上层服务器的stratum 大小不能超过或等于16。
开启服务
systemctl start ntpd
查看端口
netstat -anpu | grep ntpd
udp 0 0 192.168.122.1:123 0.0.0.0:\* 2726/ntpd
udp 0 0 192.168.1.123:123 0.0.0.0:\* 2726/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:\* 2726/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:\* 2726/ntpd
udp6 0 0 fe80::8c62:89:ad82::123 :::\* 2726/ntpd
udp6 0 0 ::1:123 :::\* 2726/ntpd
udp6 0 0 :::123 :::\* 2726/ntpd
从节点安装ntp客户端
yum install -y ntpdate
与主节点同步时间
ntpdate 192.168.1.123
19 Jun 16:31:27 ntpdate[61266]: adjust time server 192.168.1.123 offset 0.459178 sec
显示将时间偏移了0.459178秒,时间同步成功。
注:以下为主节点配置
2)创建测试数据
mysql> create database replication;
mysql> use replication;
mysql> create table test(id int,name varchar(233));
mysql> insert into test values(1,'一主一从');
3)创建主从复制授权用户
mysql> create user 'slave'@'192.168.1.%' identified by '123456';
mysql> grant replication slave on \*.\* to 'slave'@'192.168.1.%';
mysql> flush privileges;
4)修改my.cnf文件
以下为添加配置项
server-id=1
binlog-format=MIXED
log-bin=/data/mysql/log/mysql-bin-master
binlog-do-db=replication
#binlog-ignore-db=mysql
server-id: mysql的同步的数据中是包含server-id的,用于标识该语句最初是从哪个server写入,不同节点的server-id不能相同。
binlog-format:binlog日志格式
log-bin:binlog日志存放路径
binlog-do-db:指定binlog日志保存哪个库的数据记录,不添加为全库。
binlog-ignore-db:指定binlog日志不保存哪个库的数据记录,不添加为全部不保存。(若有binlog-do-db配置项,则只保存其指定的库)
重启数据库,刷新配置
/etc/init.d/mysql.server restart
5)查看生成的二进制日志
ls /data/mysql/log/
mysql-bin-master.000001 mysql-bin-master.index mysqld.log
数据库中查看
mysql> show master status\G
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 1. row \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
File: mysql-bin-master.000001
Position: 155
Binlog_Do_DB: replication
Binlog_Ignore_DB: mysql
Executed_Gtid_Set:
6)将主库的数据传入从库
mysqldump -uroot replication > db.sql
scp db.sql root@192.168.1.124:~
The authenticity of host '192.168.1.124 (192.168.1.124)' can't be established.
ECDSA key fingerprint is SHA256:dt6xhgOGH0g33XrYjk1qPbtD4C2hg62DlqfRMoUSK88.
ECDSA key fingerprint is MD5:9b:ef:79:5b:01:9e:63:0d:75:a7:c7:3e:62:a7:6a:04.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.124' (ECDSA) to the list of known hosts.
root@192.168.1.124's password:
db.sql 100% 1817 2.3MB/s 00:00
注:以下为从节点配置
7)从库将SQL脚本导入库中
mysql -uroot -e "create database replication;"
mysql replication < db.sql
查看数据是否导入成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| replication |
| sys |
+--------------------+
8)修改my.cnf文件
在原有基础上添加以下配置项
server-id=2
relay-log=/data/mysql/log/relay-log-bin
relay-log-index=/data/mysql/log/slave-relay-bin.index
#replicate_do_db=replication
server-id:服务器ID号
relay-log:relay-log日志存放路径
relay-log-index:relay-log日志的索引文件存放路径
replicate_do_db:指定从库复制的数据库
重启服务,刷新配置
/etc/init.d/mysql.server restart
9)测试授权用户是否可以登录主库
mysql -uslave -h192.168.1.123 -p123456
登录进去后,查看其中的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
因为只有主从复制权限,其他权限没有开放,所以是看不到其他库的,但不影响查看数据库的命令执行。
10)从库使用授权用户连接主库
这里的授权用户是由主库创建的,本案例中的为slave。
数据库默认是开启主从复制的,先关闭
mysql> stop slave;
连接主库,具体参数根据实际情况指定
mysql> change master to master_host='192.168.1.123',master_user='slave',master_password='123456',master_log_file='mysql-bin-master.000001',master_log_pos=155;
以下为此案例中主库的binlog日志文件,用于理解命令
mysql> show master status\G
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 1. row \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
File: mysql-bin-master.000001
Position: 155
Binlog_Do_DB: replication
Binlog_Ignore_DB: mysql
Executed_Gtid_Set:
解读:
master_host:主库IP地址
master_user:主库授权用户
master_password:主库授权用户密码
master_log_file:主库binlog日志文件名称
master_log_pos:主库binlog日志文件位置
开启主从复制功能
mysql> start slave;
11)分别在主库和从库中查看主从复制状态
从库中查看
mysql> show slave status\G
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 1. row \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.123
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000001
Read_Master_Log_Pos: 155
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 329
Relay_Master_Log_File: mysql-bin-master.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: replication
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 155
Relay_Log_Space: 535
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 1b3423c4-b047-11ea-bfaa-000c29bbe2d8
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
其中 Slave_IO_Running和Slave_SQL_Running线程为YES,表示主库连接成功,也就是说主从复制搭建成功了。有一个为Connecting,都表示主从复制没有搭建成功。
结语
小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。
我们选择的这个行业就一直要持续的学习,又很吃青春饭。
虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。
送给每一位想学习Java小伙伴,用来提升自己。
本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!
aster_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
其中 Slave\_IO\_Running和Slave\_SQL\_Running线程为YES,表示主库连接成功,也就是说主从复制搭建成功了。有一个为Connecting,都表示主从复制没有搭建成功。
## 结语
小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。
我们选择的这个行业就一直要持续的学习,又很吃青春饭。
虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。
送给每一位想学习Java小伙伴,用来提升自己。
[外链图片转存中...(img-cFFTron4-1718712255093)]
> 本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!