Linux搭建MySQL一主二从
1、准备3台服务器分别是
机器名称 | IP | 角色 | 权限 |
---|---|---|---|
Mysql_Master | 192.168.41.128 | 数据库Master | 读写 |
Mysql_Slave1 | 192.168.41.129 | 数据库Slave | 读 |
Mysql_Slave2 | 192.168.41.130 | 数据库Slave | 读 |
2、Mysql5.7.28安装
3、Mysql主从配置
-
Master节点
使用vi /etc/my.cnf命令修改Master配置文件
#bin_log配置 log_bin=mysql-bin server-id=1 sync-binlog=1 binlog-ignore-db=information_schema binlog-ignore-db=mysql binlog-ignore-db=performance_schema binlog-ignore-db=sys #relay_log配置 relay_log=mysql-relay-bin log_slave_updates=1 relay_log_purge=0
重启Mysql服务
service mysql restart
主库给从库授权
登录MySQL,在MySQL命令行执行如下命令(或者在Mysql库执行以下sql):
grant replication slave on *.* to root@'%' identified by '密码'; grant all privileges on *.* to root@'%' identified by '密码'; flush privileges; //查看主库状态信息,例如master_log_file='mysql-bin.000004',master_log_pos=1804 show master status;
-
Slave节点
修改Slave的MySQL配置文件my.cnf,两台Slave的server-id分别设置为2和3
#bin_log配置 log_bin=mysql-bin #服务器ID,从库1是2,从库2是3 server-id=2 sync-binlog=1 binlog-ignore-db=information_schema binlog-ignore-db=mysql binlog-ignore-db=performance_schema binlog-ignore-db=sys #relay_log配置 relay_log=mysql-relay-bin log_slave_updates=1 relay_log_purge=0 read_only=1
重启服务
service mysql restart
开启同步
登录MySQL,在两个Slave节点的MySQL命令行执行同步操作,例如下面命令(注意参数与上面show master status操作显示的参数一致):
// 指定主库 change master to master_host='192.168.41.128',master_port=3306,master_user='root',master_password ='root',master_log_file='mysql-bin.000004',master_log_pos=1804; // 开启同步 start slave; // 查看从库状态,Slave_IO_Running和Slave_SQL_Running都是Yes,表示连接成功,可以进行数据同步 show slave status
4、配置半同步复制
-
Master节点
登录MySQL,在MySQL命令行执行下面命令安装插件
install plugin rpl_semi_sync_master soname 'semisync_master.so'; show variables like '%semi%';
使用vi /etc/my.cnf,修改MySQL配置文件
# 自动开启半同步复制 rpl_semi_sync_master_enabled=ON rpl_semi_sync_master_timeout=1000
重启MySQL服务
service mysql restart
-
Slave节点
两台Slave节点都执行以下步骤。
登录MySQL,在MySQL命令行执行下面命令安装插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
使用vi /etc/my.cnf,修改MySQL配置文件
# 自动开启半同步复制 rpl_semi_sync_slave_enabled=ON
重启服务
systemctl restart mysqld
-
测试半同步状态
首先通过MySQL命令行检查参数的方式,查看半同步是否开启。
show variables like '%semi%';
可以看到Master日志中已经启动半同步信息,例如:
less -mN less -mN /usr/local/mysql/mysql-5.7.28/data/mariadb.log
5、测试脚本
建表
create TABLE position (
id int(20),
name varchar(50),
salary varchar(20),
city varchar(50)
) ENGINE=innodb charset=utf8;
插入数据
insert into position values(1, 'Java', 13000, 'shanghai');
insert into position values(2, 'DBA', 20000, 'beijing');
6、搭建过程中的异常
-
解决问题的思路
1. 找到mysql配置的这个文件/etc/my.cnf 2. 在文件中找到mysql错误异常日志文件的路径,我配置的是log-error=/usr/local/mysql/mysql-5.7.28/data/mariadb.log 3. 查看/usr/local/mysql/mysql-5.7.28/data/mariadb.log文件: less -mN less -mN /usr/local/mysql/mysql-5.7.28/data/mariadb.log 4. 查看具体异常信息
-
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
出现这个异常的原因是:由于uuid相同,而导致触发此异常
(我是用虚拟机进行搭建的,我只安装了一台linux 又克隆了两台,一主二从 , 关键点就在于我是克隆的,mysql 有个uuid , 然而uuid 是唯一标识的,所以我克隆过来的uuid是一样的,只需要修改一下uuid 就ok了)
解决方案:
查询命令找此auto.cnf修改uuid即可:
find -name auto.cnf
这个文件一般是在配置的data目录下
/usr/local/mysql/mysql-5.7.28/data
重启MySQL
service myqld restart