3

MySQL集群搭建

 2 years ago
source link: https://codeshellme.github.io/2022/01/mysql-cluster/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

公号:码农充电站pro

主页:https://codeshellme.github.io

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 文件列表


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK