MySQL集群搭建
目录
公号:码农充电站pro
1,MySQL 主从架构
1,MySQL 主从复制原理
2,一主多从架构
说明:
- 主库:负责写操作,包括
Insert、Update、Delete
- 如果主库挂掉,集群将不再支持写操作,但不影响读操作
- 从库:负责读操作,包括
Select
3,双主双从架构
说明:
- 两个主库:负责写数据
- 如果其中一个主库挂掉,不影响集群的写操作
- 两个从库:负责读数据
2,集群部署
1,配置多实例
在一台 Linux 机器上部署 MySQL 集群(4 个MySQL 实例),用端口号来区分。
先创建四个目录用于存放数据:
- /data/3307
- /data/3308
- /data/3309
- /data/3310
初始化 MySQL :
mysqld --initialize-insecure(无密码) --basedir=/usr/local/mysql目录 --datadir=/data/3307 --user=mysql
mysqld --initialize-insecure(无密码) --basedir=/usr/local/mysql目录 --datadir=/data/3308 --user=mysql
mysqld --initialize-insecure(无密码) --basedir=/usr/local/mysql目录 --datadir=/data/3309 --user=mysql
mysqld --initialize-insecure(无密码) --basedir=/usr/local/mysql目录 --datadir=/data/3310 --user=mysql
配置文件 my.cnf
放在 /data/3307
等四个目录下,注意配置文件中要修改相应的端口号:
[client]
port = 3307
socket = /data/3307/mysql.sock
default-character-set = utf8
[mysqld]
port = 3307
socket = /data/3307/mysql.sock
datadir = /data/3307
log-error = /data/3307/error.log
pif-file = /data/3307/mysql.pid
default-character-set = utf8
lower_case_table_names = 1
autocommit = 1
启动多实例:
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
mysqld_safe --defaults-file=/data/3310/my.cnf &
关闭数据库的方式:
mysqladmin -uroot -p -P3307 -h127.0.0.1 shutdown
登录 MySQL 并修改密码(每个实例都进行同样的操作):
mysql -uroot -p -P3307 -h127.0.0.1(无密码)
> alter user 'root'@'localhost' identified by '123456'; # 修改密码
> grant all privileges on *.* to root@'%' identified by '123456'; # 授权远程访问
2,配置一主多从
配置一主多从集群(配置之前要先关闭数据库),这里配置的架构是一主三从:
- 3307 为主
- 其它为从
1,修改配置文件
增加如下配置:
3307:
log-bin=mysql-bin (log-bin日志文件的前缀)
server-id=3307 (server 编号,要唯一)
3308:
server-id=3308
3309:
server-id=3309
3310:
server-id=3310
配置完成后,重新启动多实例:
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
mysqld_safe --defaults-file=/data/3310/my.cnf &
2,配置主从关系
在主库 3307 中:
# 查看偏移量 154
> show master status;
# 在主库中添加一个用户 copy,用于复制数据
> grant replication slave on *.* 'copy'@'%' identified by '123456';
# 再次 show master status,偏移量为 437,为了清除便宜量(不使之同步到从库)
# 重置 master
> reset master;
# 再次查看偏移量为 154
> show master status;
登录从库,给从库配置主库(三个从库都要执行):
# 查看从库状态
> show slave status;
# 给从库配置主库
> change master to master_host='ip的地址',master_port=3307,master_user='copy',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
# 启动从节点
> start slave;
# 查看从库状态
> show slave status \G;
# 其中两个重要的信息:
# Slave_IO_Running: Yes (必须是Yes,否则说明主库有问题,连接不上)
# Slave_SQL_Running: Yes(必须是Yes,用于在从库中做日志回放,否则表明日志回放有问题,例如数据冲突,需要解决相应的冲突,删数据)
# 下面命令可查看 bin-log 日志的内容
> show binlog events in 'mysql-bin.000001'\G
到此为止,数据库集群配置并启动完成,一个一主三从的 MySQL 集群:
- 主库:用于读写数据,如果主库挂掉,集群将不能再写数据(可使用双主双从集群架构)
- 从库:只能用于读数据,不能用于写数据
- 否则会导致从库 Slave_SQL_Running 变为 No,说明造成了数据冲突,从库已无法回放从主库得到的日志
- 修改冲突后要重启 slave:
stop slave
(先停止)start slave
(再启动)
3,配置双主双从
双主双从架构:
- 双主:3307,3308,其实这两个互为主从
- 双从:3309,3310
1,修改配置文件
增加如下配置:
3307:
log-bin=mysql-bin # log-bin日志文件的前缀
server-id=3307 # server 编号,要唯一
auto_increment_increment=2 # 主键自增步长
auto_increment_offset=1 # 主键自增起始
log-slave-update # 从主库同步过来的数据要记录到 bin-log 日志,使之可以同步到其 slave 库中
sync_binlog=1
3308:
log-bin=mysql-bin
server-id=3308
auto_increment_increment=2
auto_increment_offset=2 # 与 3307 不同,防止数据冲突
log-slave-update
sync_binlog=1
3309:
server-id=3309
3310:
server-id=3310
重新启动多实例:
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
mysqld_safe --defaults-file=/data/3310/my.cnf &
2,配置主从关系
3307:
# 在主库中添加一个用户,用于复制数据(如果做过了就不用再做)
> grant replication slave on *.* 'copy'@'%' identified by '123456';
> reset master;
# 查看偏移量为 154
> show master status;
# 配置主从关系
> change master to master_host='ip的地址',master_port=3308,master_user='copy',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
> start slave; # 启动从库
> show slave status; # 查看从库状态
3308:
# 在主库中添加一个用户,用于复制数据
> grant replication slave on *.* 'copy'@'%' identified by '123456';
> reset master;
> show master status; # 查看偏移量为 154
> stop slave; # 如果之前是别人的从库,则需要重置
> reset slave;
# 配置主从关系
> change master to master_host='ip的地址',master_port=3307,master_user='copy',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
> start slave; # 启动从库
> show slave status; # 查看从库状态
3309:
> stop slave; # 如果之前是别人的从库,则需要重置
> reset slave;
# 配置主从关系
> change master to master_host='ip的地址',master_port=3307,master_user='copy',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
> start slave; # 启动从库
> show slave status; # 查看从库状态
3310:
> stop slave; # 如果之前是别人的从库,则需要重置
> reset slave;
# 配置主从关系
> change master to master_host='ip的地址',master_port=3308,master_user='copy',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
> start slave; # 启动从库
> show slave status; # 查看从库状态
到此为止数据库集群配置并启动完成,是一个双主双从的MySQL 集群:
-
两个主 3307,3308 均可读写数据,其中一个挂掉,不影响集群的写操作
-
两个从 3309,3310 只能读数据,不能写数据
> show binary logs;
命令用于查看 binlog 文件列表
文章作者 @码农加油站
上次更改 2022-01-28