MySQL主从架构说明及配置_mysql数据库不参与选举吗

主库执行完一个事务后,立即将更新数据发送给从库,并不关心从库是否接收。

优点:减少部分资源消耗
缺点:无法确认从库是否复制成功

半同步模式
相当于异步复制的改良版,主库执行完事务后,至少一个从库接收并写入到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.13linux.node1192.168.1.123master关闭防火墙,selinux
CentOS7.7/MySQL8.0.13linux.node2192.168.1.123slave关闭防火墙,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)]

> 本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!
  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现MySQL主从自动切换的关键是要在从库服务器上实现主从监控和自动切换功能。有多种方式可以实现从库自动切换,以下是其中一种基于MHA(MySQL High Availability)的实现方案,可以只通过配置文件实现主挂了从机自动升格为主机。 MHA是一种开源的MySQL高可用性解决方案,它可以在MySQL主从架构中实现自动故障检测、自动故障转移和自动主备切换等功能。MHA的主要组成部分包括MHA Node和MHA Manager,其中MHA Node是运行在每个MySQL从库服务器上的守护进程,用于监控MySQL主库的运行状态;MHA Manager是运行在独立服务器上的管理工具,用于协调MHA Node之间的工作和处理主从切换的逻辑。 以下是基于MHA的MySQL主从自动切换方案的具体步骤: 1. 在主库和从库服务器上分别安装MySQL和MHA Node,并保证版本一致。 2. 在主库中启用二进制日志(binlog),并在从库中配置主从复制。具体配置方式可以参考我在上一个回答中的说明。 3. 在独立服务器上安装MHA Manager,并在配置文件中设置主库信息、从库信息和自动切换规则等参数。可以在配置文件中添加如下配置: ``` [server default] manager_log=/var/log/mha.log manager_workdir=/etc/mha remote_workdir=/var/lib/mysql ssh_user=root user=myuser password=mypassword [server1] hostname=192.168.1.1 candidate_master=1 [server2] hostname=192.168.1.2 no_master=1 [server3] hostname=192.168.1.3 no_master=1 ``` 这里的配置项中,manager_log和manager_workdir用于设置MHA Manager的日志和工作目录,remote_workdir用于设置从库的数据目录,ssh_user用于设置SSH连接的用户名,user和password用于设置从库复制的用户和密码。server1、server2和server3分别对应MySQL主库和从库的IP地址或主机名,candidate_master表示该服务器可以被选举为新的主库,no_master表示该服务器不会被选举为新的主库。 4. 启动MHA Manager,并在管理服务器上执行如下命令,开始监控MySQL主库的运行状态: ``` masterha_manager --conf=/etc/masterha.conf --remove_dead_master_conf --ignore_last_failover ``` 这里的--remove_dead_master_conf选项表示如果发现主库已经宕机,则从MHA配置文件中删除该主库配置信息,--ignore_last_failover选项表示忽略上一次故障转移的信息。 5. 当主库出现故障时,MHA Node会自动检测到主库的宕机状态,并将该信息发送给MHA Manager。MHA Manager会根据预定义的自动切换规则,选择一个从库作为新的主库,并将该信息发送给MHA Node。MHA Node会自动停止从库复制进程,并将新的主库配置信息写入my.cnf配置文件中,然后重启MySQL服务,使其成为新的主库。 以上就是基于MHA的MySQL主从自动切换方案的实现步骤。该方案可以通过配置文件实现主挂了从机自动升格为主机,而无需手动干预,提高了MySQL主从架构的可用性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值