1.什么是主从同步
主:master
从:slave
一台或多台服务器作为主数据库进行读写操作,多台服务器做从服务器数据库。主数据库的数据会自动复制到从数据库。
实现流程:主数据库对数据进行修改并记录到二进制文件,从服务器根据主服务器的二进制文件来进行同步更新操作。
框架示意
+-------------+
| Master |
| (server_id=1)|
+------▲------+
║
+--------------╨--------------+
║ ║
+-----╨----+ +-----╨----+
| Slave1 | | Slave2 |
| (id=2) | | (id=3) |
+----------+ +----------+
2.配置一主多从同步
环境:debian12,1panel(v1.10.28-lts),mysql(8.0.41)
这个是1panel的默认配置文件
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
log_error_suppression_list='MY-013360'
character_set_server=utf8
lower_case_table_names=1
group_concat_max_len=1024000
log_bin_trust_function_creators=1
pid-file=/var/run/mysqld/mysqld.pid
max_connections=300
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
我将对其增加配置,内容如下:
主服务器(Master)
[mysqld]
# ======== 原有基础配置 ======== #
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
log_error_suppression_list='MY-013360'
character_set_server=utf8
lower_case_table_names=1
group_concat_max_len=1024000
log_bin_trust_function_creators=1
pid-file=/var/run/mysqld/mysqld.pid
# ======== 新增主库复制配置 ======== #
server_id = 1 # 主库唯一标识(必填,不可与其他节点重复)
log_bin = /var/lib/mysql/mysql-bin.log # 开启二进制日志(必填)
binlog_format = ROW # 行级复制(推荐)
expire_logs_days = 7 # 自动清理7天前的日志
max_binlog_size = 100M # 单个二进制日志文件大小
# GTID 配置(推荐)
gtid_mode = ON # 启用 GTID
enforce_gtid_consistency = ON # 强制 GTID 一致性
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
从服务器(Slave1)
配置如下
[mysqld]
# ======== 原有基础配置 ======== #
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
log_error_suppression_list='MY-013360'
character_set_server=utf8
lower_case_table_names=1
group_concat_max_len=1024000
log_bin_trust_function_creators=1
pid-file=/var/run/mysqld/mysqld.pid
# ======== 新增从库复制配置 ======== #
server_id = 2 # 从库唯一标识
relay_log = /var/lib/mysql/mysql-relay-bin # 中继日志路径
read_only = 1 # 从库设为只读(防止误写)
log_slave_updates = 1 # 级联复制时需启用
# GTID 配置(与主库一致)
gtid_mode = ON
enforce_gtid_consistency = ON
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
剩下的从服务器只需要修改server_id
即可,注意,此id为唯一id,不可与其他节点重复
在配置完配置之后,1panel会提醒重启mysql,如未提醒,请手动重启msyql
创建主从数据库同步账号
插曲:
1panel中如何执行sql,可以在容器界面,选择msyql进入容器,mysql的root密码可以在数据库界面的连接信息查看
mysql -u root -p 密码
此时就会就入sql的命令输入界面。
在主库执行
-- 创建复制专用账号(
CREATE USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
在每一个从库都要执行
-- 配置主库信息
CHANGE MASTER TO
MASTER_HOST = '主库IP',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'password',
MASTER_AUTO_POSITION = 1; -- 启用 GTID 自动定位
-- 启动复制
START SLAVE;
验证同步状态
输入
SHOW SLAVE STATUS\G
查看以下状态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Error:
Last_SQL_Error:
如均为yes并且无错误,即成功。
进行实操验证
通过在主库创建新数据库,在从库查看是否会出现新数据库。
1panel中要在数据库页面点击从服务器同步才能同步显示(实际上是有的,只是1panel没有显示)
3.总结
建议从新开始配置,即主从数据库均为空数据库,如果主数据库有内容,请手动备份,后期导入,不然可能会遇到某些奇怪的问题。
1panel是一个很好的面板工具,尽管容器在使用过程中需要额外操作,但瑕不掩瑜。如果在非容器中配置主从同步,只需将本文在mysql的配置文件添加的内容提取出来,放入mysql配置文件即可,其他操作正常。
*这是一则由 Google AdSense 自动推荐的广告,不代表本站立场
Comments NOTHING