关于java:阿里P7每个码农都应该知道的MySQL主从复制方法看这篇就够了

3次阅读

共计 6833 个字符,预计需要花费 18 分钟才能阅读完成。

上一篇是分享的是《OpenJDK》,这篇给大家分享《MySQL 主从复制》。

目录:

MySQL 主从复制

MySQL 主从复制过程

MySQL 多实例数据库搭建

MySQL 多实例数据库启动与敞开

MySQL 一主多从架构

MySQL 双主双从配置开启二进制日志

MySQL 一主多从环境重启及 MySQL 双主双从数据复制验证

MySQL 多实例数据库配置

MySQL 双主双从重置主从状态

MySQL 主从复制

若数据库仅有一台服务器,那么单点问题比拟容易产生,若服务器拜访响应者解体,那么服务器就不能应用了,若硬盘坏了,则整个数据就失落了,将是一个重大的安全事故。

想要防止数据的失落,最起码筹备两台或多台的服务器,经数据多分复制部署不同服务器上,若某一台呈现故障,则其余服务器提供工作。

MySQL 提供了主从复制性能以进步服务的可用性与数据的平安可靠性;

主从复制是指服务器分为主服务器和从服务器,主服务器负责读和写,从服务器只负责读,主从复制也叫 master/slave,master 是主,slave 是从;

MySQL 主从复制架构

MySQL 一主多从架构

MySQL 双主双从架构

MySQL 主从复制过程

如果探测到 master 主服务器的二进制日志产生了扭转,则开始呈现一个 I/O Thread 申请 master 二进制日志;

同时 master 主服务器为每个人 I/O Thread 启动一个 dump Thread,用于向其发送二进制日志;

slave 服务器将接管到的二进制日志保留至本人本地的中继日志文件中;

salve 从服务器将启动 SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;

最初 I/O Thread 和 SQL Thread 将进入睡眠状态,期待下一次被唤醒;

MySQL 主从复制原理图:

MySQL 多实例数据库搭建

1、在 MySQL 装置主目录下创立 /data/3307, /data/3308, /data/3309, /data/3310 四个目录;

2、执行数据库初始化,在 MySQL 的 /usr/local/mysql-5.7.18/bin 目录下执行命令:

./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3307 --user=mysql
./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3308 --user=mysql
./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3309 --user=mysql
./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3310 --user=mysql

其中 initialize-insecure 示意不生成 MySQL 数据库 root 用户的随机明码,即 root 明码为空;

3、在 /data/3307, /data/3308, /data/3309, /data/3310 四个目录下别离创立一个 my.cnf 文件;

4、配置四个 MySQL 数据库服务的 my.cnf 文件

[client]
port        = 3307
socket      = /usr/local/mysql-5.7.18/data/3307/mysql.sock
default-character-set=utf8

[mysqld]
port    = 3307
socket  = /usr/local/mysql-5.7.18/data/3307/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3307
log-error = /usr/local/mysql-5.7.18/data/3307/error.log
pid-file = /usr/local/mysql-5.7.18/data/3307/mysql.pid

character-set-server=utf8
lower_case_table_names=1
autocommit = 1

至此多数据库实例就搭建好了;

MySQL 多实例数据库启动与敞开

MySQL 多实例数据库启动

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3309/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3310/my.cnf &

其中 –defaults-file 是指定配置文件,& 合乎示意后盾启动;

MySQL 多实例数据库敞开

切换到 /usr/local/mysql-5.7.18/bin 目录下,应用 mysqladmin 命令 shutdown

形式一:

./mysqladmin -uroot -p -S /usr/local/mysql-5.7.18/data/3307/mysql.sock shutdown

形式二:

./mysqladmin -uroot -p -P3307 -h127.0.0.1 shutdown

形式三: 如果曾经进入到了 MySQL 的命令行,能够间接执行 shutdown;

退出 MySQL 命令行,执行:exit

MySQL 一主多从架构

主 (3307) 外面退出

log-bin=mysql-bin #示意启用二进制日志

server-id=3307 #示意 server 编号,编号要惟一

从 (3308) 外面退出

server-id=3308 #示意 server 编号,编号要惟一

从 (3309) 外面退出

server-id=3309 #示意 server 编号,编号要惟一

从 (3310) 外面退出

server-id=3310 #示意 server 编号,编号要惟一

MySQL 一主多从环境重启

进入 /usr/local/mysql-5.7.18/bin 目录,重启四个 MySQL 服务,启动时指定配置文件启动:

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3309/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3310/my.cnf &

MySQL 一主多从设置主从关系

1、在主服务器上创立复制数据的账号并受权:

grant replication slave on . to ‘copy’@’%’ identified by ‘123456’;

2、倡议重置一下主服务状态,执行命令:reset master;

3、在主服务器上执行命令,获取主服务器二进制 binlog 文件名及坐标(二进制文件名和坐标值在前面会用到):

show master status;

在从服务器上执行命令,设置从服务器的 master

4、重置一下从的状态:(在重置之前能够查看一下从的状态: show slave status)

stop slave;

reset slave;

5、change master to master_host=’192.168.199.128′,master_user=’copy’,

master_port=3307,master_password=’123456′,

master_log_file=’mysql-bin.000001′,master_log_pos=154;

6、再从机器上执行开始复制命令:start slave; (作用:启动 IO 线程和 SQL 线程)

MySQL 一主多从数据复制验证

查看从服务器复制性能状态

mysql> show slave status \G

Slave_IO_Running 和 Slave_SQL_Running 为 YES,就是失常状态。

在主服务器上创立数据库、表、数据,而后在从服务器上查看是否曾经复制

以上操作过程显示失常,则主从服务器配置实现;

查看主从复制 binlog 日志文件内容:show binlog events in ‘mysql-bin.000001’;

MySQL 双主双从配置开启二进制日志

主 master 3307 —> 从 slave 3309

主 master 3308 —> 从 slave 3310

3307 <—> 3308 互为主从

2 个写节点,每个写节点下又是 2 个读节点;

MySQL 双主双从配置开启二进制日志

1、配置每一台 MySQL 服务器的配置文件 my.cnf

3307

3308

3309

3310

2、与一主多从一样,所有主服务器配置文件加上 binlog 配置

3307

3308

3309

3310

log-bin=mysql-bin

server-id= 实例的端口(server-id 要惟一)

3、第一台主服务器 3307 的 my.cnf 文件减少如下配置:(Master 3307)

auto_increment_increment=2

auto_increment_offset=1

log-slave-updates

sync_binlog=1

4、第二台主服务器 3308 的 my.cnf 文件减少如下配置:(Master 3308)

auto_increment_increment=2

auto_increment_offset=2

log-slave-updates

sync_binlog=1

配置项阐明

auto_increment_increment,管制主键自增的自增步长,用于避免 Master 与 Master 之间复制呈现反复自增字段值,通常 auto_increment_increment=n,有多少台主服务器,n 就设置为多少;

auto_increment_offset= 1 设置自增起始值,这里设置为 1,这样 Master 的 auto_increment 字段产生的数值是:1, 3, 5, 7, …等奇数 ID

留神 auto_increment_offset 的设置,不同的 master 设置不应该一样,否则就容易引起主键抵触,比方 master1 的 offset=1,则 master2 的 offset=2,master3 的 offset=3

在双主模式中,log-slave-updates 配置项肯定要配置,否则在 master1(3307)上进行了更新数据,在 master2(3308)和 slave1(3309)上会更新,然而在 slave2(3310)上不会更新

sync_binlog 示意每几次事务提交,MySQL 把 binlog 缓存刷进日志文件中,默认是 0,最平安的是设置为 1;

MySQL 一主多从环境重启及 MySQL 双主双从数据复制验证

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3309/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3310/my.cnf &

MySQL 双主双从数据复制验证

查看从服务器复制性能状态,执行命令:

mysql> show slave status \G

如果 Slave_IO_Running 和 Slave_SQL_Running 的值为 Yes,即示意复制性能配置失常;

设置好双主双从复制后:

  1. 一个主呈现问题,能够切换到另外的主进行写数据,新主同步数据给它的从;
  2. 待问题旧主复原服务后,新的主会同步数据给它,它再同步数据给本人的从,这样不会呈现数据的不同步和服务的不可用。

MySQL 多实例数据库配置

其中 -p 是指定明码,如果没有明码则能够不写 -p,- S 是指定 sock 文件,mysql.sock 文件是服务器与本机客户端进行通信的 ip 与端口文件;

或者应用用端口、主机登录 ./mysql -uroot -p -P3307 -h127.0.0.1 登录进入 MySQL

2、批改 mysql 的明码,执行:

alter user ‘root’@’localhost’ identified by ‘123456’;(其中 123456 是咱们设置的明码)

3、受权近程拜访,执行命令:(这样近程客户端能力拜访)

grant all privileges on . to root@’%’ identified by ‘123456’;

其中 . 的第一个 示意所有数据库名,第二个 示意所有的数据库表;

root@’%’ 中的 root 示意用户名,% 示意 ip 地址,% 也能够指定具体的 ip 地址,比方 root@localhost,root@192.168.10.129

4、执行以下如下命令刷新权限:

flush privileges;

以上步骤一次性执行:

alter user ‘root’@’localhost’ identified by ‘123456’;

grant all privileges on . to root@’%’ identified by ‘123456’;

flush privileges;

MySQL 双主双从重置主从状态

./mysql -uroot -p -P3307 -h127.0.0.1

./mysql -uroot -p -P3308 -h127.0.0.1

在主服务器上创立复制数据的账号并受权:

grant replication slave on . to ‘copy’@’%’ identified by ‘123456’;

2、在两台主服务器上进行复制并刷新 binlog 日志,也就是重置一下服务的状态:(3307、3308)

在 MySQL 命令行执行:

stop slave; – 进行复制

reset slave; – 重置从服务器的状态,把它变成初始状态

reset master; – 重置主服务器的状态,把它变成初始状态

3307 机器执行:

reset master

3308 机器执行:

stop slave;

reset slave;

reset master;

3、在从服务器上进行复制:(3309、3310)

在 MySQL 命令行执行:

stop slave;

reset slave;

4、在主服务器上查看二进制日志文件和 Position 值:(3307、3308)

在 MySQL 命令行执行:

即在 3307 和 3308 上别离执行:show master status;

5、在从服务器 Slave 上设置 Master(相当于是 4 台都须要设置)

设置从服务器 3308、3309,他们的主均为 3307,即在 3308 和 3309 上执行如下操作:

change master to master_host='192.168.199.128',

master_user='copy',

master_password='123456',

master_port=3307,

master_log_file='mysql-bin.000001',

master_log_pos=154;

设置从服务器 3307、3310,他们的主均为 3308,即在 3307 和 3310 上执行如下操作:

change master to master_host='192.168.199.128',

master_user='copy',

master_password='123456',

master_port=3308,

master_log_file='mysql-bin.000001',

master_log_pos=154;

6、在四台 MySQL 服务器上执行:start slave; (MySQL 命令行执行)

执行后即开始进入主从复制状态

  • 以上就是《MySQL 主从复制》的分享。
  • 也欢送大家交换探讨,该文章若有不正确的中央,心愿大家多多包涵。
  • 你们的反对就是我最大的能源,如果对大家有帮忙给个赞哦~~~
正文完
 0