公号:码农充电站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 文件列表