目录
主从复制
在MySQL主从复制中,有两个主要角色:
-
主服务器(Master):主服务器是负责处理写操作(INSERT、UPDATE、DELETE)的MySQL服务器。当在主服务器上执行写操作时,它会记录这些变更到二进制日志(Binary Log)中。
-
从服务器(Slave):从服务器是接收主服务器变更并将其应用于自身的MySQL服务器。从服务器连接到主服务器,通过读取主服务器的二进制日志文件(Binary Log)来获取主服务器上的变更,然后将这些变更应用到自己的数据库中。
基本原理如下:
- 主服务器上的写操作会被记录到二进制日志(Binary Log)中。
- 从服务器连接到主服务器,并请求从指定的二进制日志文件和位置(Log File Position)开始进行复制。
- 主服务器将记录的变更发送给连接的从服务器。
- 从服务器接收到变更后,应用这些变更到自己的数据库中。
1、配置master服务器
修改mysql配置文件
vim /etc/my.cnf
server-id = 1
log-bin=master-bin
binlog_format = MIXED
log-slave-updates=true
-
server-id = 1
:- 这个参数指定了 MySQL 实例的唯一标识符,用来区分不同的服务器。
-
log-bin = master-bin
:- 这个参数指定了二进制日志的文件名前缀。MySQL 会把写入主服务器的操作记录到这个二进制日志文件中。
log-bin
启用二进制日志功能,并设置了二进制日志的文件名前缀为master-bin
。
-
binlog_format = MIXED
:- 这个参数指定了二进制日志的格式。
MIXED
格式允许 MySQL 根据具体的操作来选择合适的日志格式,可以是STATEMENT
、ROW
或MIXED
。 - 不同的格式有不同的优势和应用场景,
MIXED
是一种混合模式,根据具体的操作类型来选择合适的日志格式,提高复制的效率和灵活性。
- 这个参数指定了二进制日志的格式。
-
log-slave-updates = true
:- 这个参数用于控制从服务器是否记录复制事件到它自己的二进制日志中。
- 当一个从服务器接收并应用主服务器的变更时,如果这个参数被设置为
true
,该从服务器会将这些变更再次写入自己的二进制日志中,以便其他从服务器也可以从这个从服务器读取变更。
重启并登入mysql
授权从服务器并刷新
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.1.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
查看主服务器信息
show master status;
-
File
:显示当前正在使用的二进制日志文件的名称。在主服务器上记录的所有更新操作都会被写入这个文件。 -
Position
:指定了当前二进制日志文件中正在被写入的位置。从服务器会从这个位置开始读取主服务器的二进制日志并进行复制。
2、配置slave服务器(可以是多台)
server-id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery = 1
-
server-id = 2
:- 这个参数指定了 MySQL 从服务器的唯一标识符,用来区分不同的服务器。
-
relay-log = relay-log-bin
:- 这个参数指定了从服务器的中继日志(Relay Log)的文件名前缀。中继日志是用来存储从主服务器复制过来的二进制日志事件的。
- 当从服务器接收到主服务器的二进制日志事件时,这些事件会被写入中继日志中,然后从服务器会读取这些中继日志来应用到自己的数据库中。
-
relay-log-index = slave-relay-bin.index
:- 这个参数指定了从服务器的中继日志索引文件的名称。中继日志索引文件用于记录中继日志文件的信息,比如文件名和文件的起始位置。
- 这个索引文件是用来维护从服务器中继日志的文件列表的。
-
relay_log_recovery = 1
:- 这个参数用于在从服务器重新启动时自动恢复中继日志。
- 当从服务器重新启动时,如果设置了这个参数为 1,MySQL 会自动查找并恢复中继日志,避免丢失复制过程中未应用的主服务器变更。
重启后登入mysql
CHANGE master to master_host='192.168.1.22',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=602;
-
master_host='192.168.1.22'
:指定了主服务器的主机名或 IP 地址,从服务器将连接到这个地址获取主服务器的二进制日志。 -
master_user='myslave'
:指定了从服务器连接到主服务器时使用的用户名。这个用户名必须在主服务器上已经创建,并且具有复制的权限。 -
master_password='123456'
:指定了从服务器连接到主服务器时使用的密码。这个密码必须和指定的用户名对应,用于进行安全的连接认证。 -
master_log_file='master-bin.000001'
:指定了从哪个二进制日志文件开始复制数据。这个参数对应主服务器上的二进制日志文件名。 -
master_log_pos=602
:指定了从哪个二进制日志文件的哪个位置开始复制数据。这个参数对应主服务器上的二进制日志位置。
当你在从服务器上执行这个命令后,从服务器会连接到指定的主服务器,并从 master-bin.000001
的位置 602
开始复制主服务器的数据变更。
启动同步并查看slave状态
start slave;
show slave status\G;
-
Slave_IO_Running: Yes
- 这个状态表示从服务器的 I/O 线程(IO Thread)是否正在运行。I/O 线程负责从主服务器读取二进制日志事件,并写入到从服务器的中继日志中。
- 当状态为
Yes
时,表示 I/O 线程正在正常运行,从主服务器读取数据成功。
-
Slave_SQL_Running: Yes
- 这个状态表示从服务器的 SQL 线程(SQL Thread)是否正在运行。SQL 线程负责从中继日志中读取二进制日志事件,并在从服务器上执行这些事件,将主服务器的写操作应用到从服务器的数据库中。
- 当状态为
Yes
时,表示 SQL 线程正在正常运行,成功地将主服务器的写操作应用到从服务器的数据库中。
这两个状态都是在从服务器上执行 SHOW SLAVE STATUS;
命令时显示的重要指标,用于监控主从复制的运行状态。当这两个状态都为 Yes
时,表示主从复制正在正常运行。如果其中一个状态为 No
,则表示相应的线程出现了问题,需要进一步检查和解决。
读写分离
使用amoeba实现读写分离
编辑amoeba.xml配置文件
编辑dbServers.xml配置文件
启动amoeba
在另一台机器上通过amoeba代理访问mysql