在Mac环境下进行搭建MySQL主从 MySQL版本为5.7
正文开始
1.下载解压 https://downloads.mysql.com/archives/community/
2.下载解压并复制一份
3.准备就绪如图 mysql-5.7.31 为主库 3306 端口 mysql-5.7.31-slave 为从库 端口3305
4.准备两个配置文件
mysql-5.7.31 根目录下新建 my.cnf 配置内容
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
server_id=1
log-bin=/usr/local/develop/mysql-5.7.31/log/mysql-bin.log
#设置mysql的安装目录
basedir = /usr/local/develop/mysql-5.7.31
#设置mysql的数据存放目录
datadir = /usr/local/develop/mysql-5.7.31/data
socket=/tmp/mysql.sock
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
character-set-server=utf8mb4
max_allowed_packet = 524288000
connect_timeout = 5000
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
在mysql-5.7.31-slave 根目录下新建my.cnf 配置内容
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
server_id=2
log-bin=/usr/local/develop/mysql-5.7.31-slave/log/mysql-bin.log
#设置mysql的安装目录
basedir = /usr/local/develop/mysql-5.7.31-slave
#设置mysql的数据存放目录
datadir = /usr/local/develop/mysql-5.7.31-slave/data
socket=/tmp/mysql2.sock
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
character-set-server=utf8mb4
max_allowed_packet = 524288000
connect_timeout = 5000
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3305
default-character-set=utf8mb4
5.给两个mysql目录下的my.cnf文件授予可读写权限
chmod 644 ./my.cnf
6.首先初始化主节点 在mysql-5.7.31 根目录进行初始化
./mysqld --defaults-file=/usr/local/develop/mysql-5.7.31/my.cnf --initialize --console
7.初始化完成会生成一个临时密码记录下来 如果忘了 重新清空data目录在进行初始化
8.启动MySQL服务 在根目录下进行启动
./mysqld --defaults-file=/usr/local/develop/mysql-5.7.31-slave/my.cnf --user=root
9.在根目录进行连接
mysql -uroot -p
10.输入临时密码 登入MySQL
11.首次登录会让你修改密码 这里将root密码更新为root 且 host为任何地址
alter user 'root'@'%' identified by 'root';
12.重复6-11步操作进行初始化并进行连接mysql-5.7.31-slave
13.连接到MySQL主节点 也就是端口3306的数据库
14.查看master 状态
15.在主库上,创建一个复制使用的账户,并授予 REPLICATION SLAVE权限
grant replication slave on *.* to 'slave'@'%' identified by 'slave';
FLUSH PRIVILEGES;
16.在从库上做相应设置,指定复制使用的用户,主数据库服务器的IP、端口
CHANGE MASTER TO MASTER_HOST = '127.0.0.1',
MASTER_PORT = 3306,
MASTER_USER = 'slave',
MASTER_PASSWORD = 'slave';
17.在从库查询下从节点状态
#查询slave状态
show slave status;
18.在从库上 开启slave
start slave;
19.在次查询slave状态
已经在等待主节点发送事件了
搭建成功
接下来进行测试一波
在主库上新建test1数据库 同时新建表 user user表字段随意 ,在从库上建area表,发现主库上没有area,由此可以发现主从模式搭建完成。
稍等片刻即可看到 从库也出来新的数据库 test1 同时出来了 和主库上一摸一样的表 user
从库上存在的area表 但是主库上没有
到此MySQL5.7主从完成搭建
---------------------------------------------------------------------------------------------------------------------------------
正文结束
----------------------------------------------------------升级版操作------------------------------------------------------
半同步复制
在 MySQL5.5之前, MySQL的复制是异步操作,主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写人一个事务并提交成功,而从库尚未得到主库推送的 Binlog日志时,主库宕机了,例如主库可能因磁盘损坏、内存故障等造成主库上该事务 Binlog丢失,此时从库就可能损失这个事务,从而造成主从不一致。而半同步复制,是等待其中一个从库也接收到Binlog事务并成功写入Relay Log之后,才返回Commit操作成功给客户端;如此半同步就保证了事务成功提交后至少有两份日志记录,一份在主库Binlog上,另一份在从库的Relay Log上,从而进一步保证数据完整性;半同步复制很大程度取决于主从网络RTT(往返时延),以插件semisync_master/semisync_slave 形式存在。
1.首先,查看 MySQL服务器是否支持动态增加插件:
主库上执行 select @@have_dynamic_loading;
2.确认支持动态增加插件后,检查 MySQL的安装目录下是否存在插件:
3.进行安装插件 MySQL官网说明 https://dev.mysql.com/doc/refman/5.7/en/install-plugin.html
安装插件语法
INSTALL PLUGIN plugin_name SONAME 'shared_library_name'
在主库上安装插件semisync_master.so:
install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
从库上则安装 semisync_slave.so插件:
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
安装完成后,从 plugin表中能够看到刚才安装的插件
select * from mysql.plugin;
主库上
从库
4.需要分别在主库和从库上配置参数打开半同步semi-sync,默认半同步设置是不打开的,主库上配置全局参数:
set global rpl_semi_sync_master_enabled=1; set global rpl_semi_sync_master_timeout=30000;
进行查看配置的值 执行 show variables like '%rpl_semi%';
从库上执行 set global rpl_semi_sync_slave_enabled=1;
进行查看配置的参数 执行 show variables like '%rpl_semi%';
注意,由于之前配置的复制是异步复制,所以要重启一下从库上的I/O线程(如果是全新配置的半同步复制则不需要):
stop slave io_thread;
start slave io_thread;
5.至此半同步配置完毕,下面可以来验证一下。主库上通过show status命令能够看到当前半同步复制的一些状态值:
show status like '%semi_sync%';
着重关注以下3个状态值:
Rpl_semi_sync_master_status:值为ON,表示半同步复制目前处于打开状态。
Rpl_semi_sync_master_yes_tx:值为0,表示主库当前尚未有任何一个事务时通过半同步复制到从库。
Rpl_semi_sync_master_no_tx: 值为0,表示当前有0个事务不是通过半同步模式下从库及时响应的(记住只给值,后面有对比)。
6.执行一个事务,再检查一下:
此时会发现Rpl_semi_sync_master_yes_tx值变为2,即刚才的drop database 和 insert事务通过半同步复制到从库上了
Rpl_semi_sync_master_yes_tx 基数增加到2,到从库上确认一下:
从库端口为3305 连接的时候指定一下即可
7.再尝试一下网络异常的场景下,主库等待rpl_semi_sync_master_timeout毫秒超时后,自动转成异步复制的场景。
8.首先,在主库上确认半同步会等待30秒超时;
9.停掉从库服务
10.在主库上执行一个事务并提交(默认提交即可),主库上的提交操作会被阻塞30秒:
delete from test where id = 1;
11: 检查半同步的状态值
主库 执行 show status like '%semi_sync%';
Rpl_semi_sync_master_status | OFF 半同步复制目前处于关闭状态。
Rpl_semi_sync_master_yes_tx | 2 刚才并没有通过半同步复制完成,所以半同步并没有累加
Rpl_semi_sync_master_no_tx | 1 当前有1个事务不是通过半同步模式下从库及时响应的
12:再执行一条sql:
insert into values(2,'2');
此时执行时间很快,说明网络异常的场景下,主库等待rpl_semi_sync_master_timeout毫秒超时后,自动转成异步复制的场景。
13:再次检查半同步的状态值
Rpl_semi_sync_master_status | OFF 半同步复制目前处于关闭状态。
Rpl_semi_sync_master_yes_tx | 2 刚才并没有通过半同步复制完成,所以半同步并没有累加
Rpl_semi_sync_master_no_tx | 2 当前有2个事务不是通过半同步模式下从库及时响应的
14:恢复从库,确认是否会自动切换回半同步复制模式。
show slave status;
从库恢复需要注意:需要启动slave线程,开启半同步
start slave;
set global rpl_semi_sync_slave_enabled=1;
注意启动顺序
如果先执行开启半同步,则需要重新启动I/O线程
stop slave io_thread;
start slave io_thread;
如果没有开启半同步,在向主库插入数据,从库仍然可以同步到数据,说明此时并非是半同步模式,而是异步模式
15.检查主库半同步复制状态值
show status like '%semi_sync%';
Rpl_semi_sync_master_status 值自动由OFF变为 | ON ,说明主库检测到正常以后主库到从库的复制方式自动切换为半同步方式
16.在主库上做个测试
insert into test(id,name) values(3,'3');
提交一个事务后,Rpl_semi_sync_master_yes_tx 由2变为3,确认刚才事务是半同步复制。
----------------------------------------------------------end-------------------------------------------------------------