虚拟机和安装准备
首先准备三台虚拟机,搭建一主两从架构。我这里以CentOS7为例。
服务器名分别为mysql01, mysql02, mysql03。 其中,mysql01 作为Master节点,两外两个作为Slave节点,从主节点同步数据。
首先要在三台虚拟机上安装mysql,安装过程见:CentOS7安装Mysql8全过程
配置主节点
安装完成后, 进入mysql01, 编辑配置文件 my.cnf
vi /etc/my.cnf
在配置文件中加入以下配置:
#server-id 服务节点唯一标识。需要给集群中每个服务分配一个单独的ID。每一个mysql都不能重复。值可以自己设置。
server-id=47
#开启binlog,并指定文件名
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
#设置连接端口
port=3306
#设置mysql的安装目录
basedir=/usr/local/mysql
#允许最大连接数
max_connections=200
#允许连接失败的次数
max_connect_errors=10
#服务端使用的字符集默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
配置后的文件如下:
重启MySQL服务
service mysqld restart
登录mysql
mysql -uroot -p
为root用户分配replication slave的权限
注:在实际生产环境中,通常不会直接使用root用户,而会创建一个拥有全部权限的用户来负责主从同步。
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;
通过命令show master status,可以查看master库当前正在使用的二进制日志及当前执行二进制日志位置
show master status;
File:当前日志的binlog文件
Position:binlog文件中的索引。
Binlog_Do_DB:需要进行数据同步的库
Binlog_Ignore_DB:数据同步所忽略的库
这个 File 和 Position 的值,我们需要记录下来,后续在从节点中需要使用。比如我这里的值是 “master-bin.000005” 和 “156”。
扩展
这里额外说下, 如果需要配置主节点中只有部分库的数据需要同步到从节点,那么可以在my.cnf文件中配置。
#需要同步的二进制数据库名, 我这里配置主节点中的test库中的数据,同步到从节点
binlog-do-db=test
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不备份的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys
配置完成了之后,在show master status指令中,就可以看到Binlog_Do_DB和
Binlog_Ignore_DB两个参数的作用了。
至此,主节点的配置就完成了。
配置从节点
接下来进入mysql02的虚拟机, 配置从节点。
vi /etc/my.cnf
在配置文件中加入以下配置:
#server-id 服务节点唯一标识。需要给集群中每个服务分配一个单独的ID。每一个mysql都不能重复。值可以自己设置。
server-id=48
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#打开从服务二进制日志
log-bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1
#设置3306端口
port=3306
#设置mysql的安装目录
basedir=/usr/local/mysql
#允许最大连接数
max_connections=200
#允许连接失败的次数
max_connect_errors=10
#服务端使用的字符集默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
配置后的文件如下:
扩展
如果主节点配置了只有部分库的数据同步,那么从节点配置文件中也需要做一些配置。
#如果salve库名称与master库名相同,使用本配置
replicate-do-db = test
#如果master库名[test]与salve库名[test01]不同,使用以下配置[需要做映射]
replicate-rewrite-db = test-> test01
#如果不是要全部同步[默认全部同步],则指定需要同步的表
replicate-wild-do-table=test.table1
replicate-wild-do-table=test.table2
配置完成后,登录mysql
mysql -uroot -p
登录mysql后,需要使用命令,在从节点上配置主节点的信息。这样,从节点才可以从主节点进行数据的同步。
CHANGE MASTER TO
MASTER_HOST='192.168.164.138',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000007',
MASTER_LOG_POS=718,
GET_MASTER_PUBLIC_KEY=1;
解释:
MASTER_HOST: 主节点IP地址
MASTER_PORT: 主节点端口
MASTER_USER: 用于数据同步的用户
MASTER_PASSWORD: 用于数据同步的用户的密码
MASTER_LOG_FILE: 指定Slave从哪个日志文件开始复制数据,即上文搭建Master时所记录的 File 字段的值
MASTER_LOG_POS: 指从文件的哪个位置开始读,即上文搭建Master时所记录的 Position 字段的值
GET_MASTER_PUBLIC_KEY: 用户加密Password
之所以设置GET_MASTER_PUBLIC_KEY=1,是因为开启主从复制的时候可能会报出下方的异常。原因是mysql8默认使用插件caching_sha2_password,有些client连接报这个错误,需要拿到server的public key来加密password
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
到此配置就完成了,然后start slave。
start slave;
如果在执行start slave时,报如下错误:
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
则可以先执行,reset slave, 然后再重新start slave 就可以了。
reset slave 执行的时候做了这样几件事:
删除slave_master_info ,slave_relay_log_info两个表中数据
删除所有relay log文件,并重新创建新的relay log文件;
不会改变gtid_executed 或者 gtid_purged的值
到此, 一主一从就搭建好了,另外一个从机,只需要仿照上方,mysql02的搭建方式即可。
需要注意的是,在搭建mysql03时,my.cnf配置文件中的server-id 的值需要改一下,不能与mysql02中的相同。
完成后,可以使用命令查看从节点信息。包括主节点的IP,端口,从节点当前状态等。
show slave status \G;
效果如下:
mysql>
mysql>
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.164.138 // 主节点IP
Master_User: root // 主节点用于数据同步的账号
Master_Port: 3306 // 主节点端口
Connect_Retry: 60
Master_Log_File: master-bin.000006
Read_Master_Log_Pos: 156
Relay_Log_File: slave-relay-bin.000011
Relay_Log_Pos: 325
Relay_Master_Log_File: master-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1008
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 156
Relay_Log_Space: 1341
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1008
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 47
Master_UUID: 6eddc1cf-b720-11eb-8d5e-000c29cf3dd3
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 210524 22:52:25
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: 1
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
搭建效果验证
搭建完成后,验证以下。
首先在主节点,创建一个test库。
CREATE DATABASE test;
然后在从节点mysql02和mysql03,查看有无该库。
该库存在,说明搭建成功。
如果还想进一步验证,则可以在主库中创建表并添加一些数据,在从库中进行查询。这里不在说明。
主从复制具体步骤
- 从库通过手动执行CHANGE MASTER TO 语句连接主库。语句中包含了建立连接的一切必要条件(host, port, ip, user, password 等),同时提供二进制日志的起点位置(file,position)
- 从库执行start slave启动。从节点的IO线程与主节点的dump线程建立连接
- 从节点根据上面语句中提供的file和position的值,IO线程向主库发起binlog请求
- 主节点dump线程收到从节点的请求,将本地binlog以events的方式发给从节点IO线程
- 从节点IO线程接收到binlog events,存放到本地relay-log中,传送过来的信息,会记录到master.info中
- 从节点SQL线程应用relay-log,并将应用过的记录到relay-log-info中。默认情况下,已经应用过的relay会自动被清理(purge)