安装mysql: redhat7.5
##mysql安装包:官网上可以下到
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
##安装:
yum install -y *.rpm
初始化:
systemctl start mysqld //开启mysql
cat /var/log/mysqld.log | grep password //查看初始化密码
mysql_secure_installation //使用初始化密码登陆进行初始化
一、异步复制
环境:
serevr1 | 172.25.60.1 | mysql:master(主) |
---|---|---|
server2 | 172.25.60.2 | mysql:slave(从) |
1.基于二进制文件的复制
(1)server1/2修改配置文件:/etc/my.cnf
##添加下面的内容
log-bin=mysql-bin //主需要这个参数,从不需要
server-id=1 //主为1,从设为2
systemctl restart mysqld
(2)登陆主数据库(server1),做以下设定:
mysql -uroot -p
CREATE USER 'repl'@'172.25.60.%' IDENTIFIED BY 'YLZ123+a'; //创建新用户,并指定密码
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.60.%'; //授予此用户复制所需的权限
flush privileges; //刷新授权表
show master status; //查看当前的二进制日志文件名称和位置
(3)登陆从数据库(server2),做以下设定:
mysql -uroot -p
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.25.60.1',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='YLZ123+a',
-> MASTER_LOG_FILE='mysql-bin.000002',
-> MASTER_LOG_POS=1011;
start slave; //开启复制
show slave status\G //查看slave信息
(4)测试:
create database westos; //建立库
use westos; //使用(进入)库
mysql> create table usertb (
-> username varchar(10) not null,
-> password varchar(20) not null); //创建表
desc usertb; //查看表的结构
insert into usertb values ('user1','123'); //插入数据
select * from usertb; //查看数据
在server1(master)上创建库,创建表,插入数据,都可以在server2(slave)查看到。
2.基于gtid的复制
(1)server1/2修改配置文件:/etc/my.cnf
##添加下面的内容
gtid_mode=ON
enforce-gtid-consistency=true
systemctl restart mysqld
(2)上面基于二进制的复制已经做好了主从,接下来只需要修改server2(slave)复制模式即可。
stop slave //停止复制再修改
change master to master_host='172.25.60.1',master_user='repl',master_password='YLZ123+a',master_auto_position=1;
start slave //打开
show slave status\G //查看--两个yes
注: 如果是全新的环境,做上面基于二进制文件的(2)(3)步即可。
(3)测试:
在server1(master)创建一个用户表,插入数据,然后在server2(slave)上查看。
注: 复制完成之后,可以看到记录。
show slave status\G
产生新数据前:空;复制后:如下(gtid号)
还可以查看gtid号:
select * from mysql.gtid_executed;
二、半同步
做完基于gtid的复制之后,只需要做以下修改即可
(1)server1:
##下载master端插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
##查看插件
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
##设置自启动
SET GLOBAL rpl_semi_sync_master_enabled=1;
##查看:
show variables like 'rpl_semi_sync%';
show status like '%rpl%';
(2)server2:
##下载slave端插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
##查看插件
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
##自启动
SET GLOBAL rpl_semi_sync_slave_enabled=1;
##关闭线程,重新开启
STOP slave IO_THREAD;
START slave IO_THREAD;
##查看
show variables like 'rpl_semi_sync%';
(3)测试:
和前面一样,server1生成数据,server2查看即可。
注: 与异步不同的在于下面
slave–>stop后,master无法半同步,默认等待10秒后,会自动转化为异步,下一次就不会等待了。当再次开启slave后,数据会接着之前的同步,也会再次恢复半同步。
servre2关闭复制:
stop slave
server1:
三、全同步
环境: 开启三台虚拟机,都安装mysql
server1 | 172.25.60.1 |
---|---|
server2 | 172.25.60.2 |
server3 | 172.25.60.3 |
(1).配置三台虚拟机mysql环境
a. 全新环境(刚装上mysql,没做过实验的):安全初始化即可(server3)
b. 之前做过mysql实验的,做以下设定即可:
systemctl stop mysqld //关闭mysql
cd /var/lib/mysql //进入mysql的数据目录
rm -fr * //删除所有数据
systemctl start mysqld //开启mysql
##从新设置超户密码即可(也可从新初始化)
cat /var/log/mysqld.log | grep password
mysql -uroot -p
alter user root@localhost identified by 'YLZ123+a';
(2)修改server1/2/3的配置文件,两处不同我在下面已经说明了。
server_id=1 //server1=1,server2=2...
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="98979348-b04a-11e9-aab5-525400356eac"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.60.1:33061" //本地ip,是什么就写什么
loose-group_replication_group_seeds= "172.25.60.1:33061,172.25.60.2:33061,172.25.60.3:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.60.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF
重启mysql
systemctl restart mysqld
(3)配置server1/2/3的mysql数据库:
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'YLZ123+a'; //创建复制用户
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; //给复制权限
FLUSH PRIVILEGES; //刷新授权表
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='YLZ123+a' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so'; //下载组复制插件
SHOW PLUGINS; //查看
##三台mysql只需要有一台(server1)发起组复制即可,其他两台只需要开启组复制即可!!
SET GLOBAL group_replication_bootstrap_group=ON; //允许发起组复制(server2/3不需要)
START GROUP_REPLICATION; //开启组复制
SET GLOBAL group_replication_bootstrap_group=OFF; //关闭(server2/3不需要)
(3)测试: 组复制设置ok的现象,使用下面的命令查看
SELECT * FROM performance_schema.replication_group_members;
总结: 正常情况做完上面的步骤就可以了,但由于环境问题,也会出现报错。下面是我遇到的报错,以及我的解决办法。
(1)报错一: server2/3加入组复制是报错,解决办法如下
set global group_replication_allow_local_disjoint_gtids_join=on;
(2)报错二: 加入后状态不对(不是ONLINE,而是RECOVERING)
解决办法:
cd /var/lib/mysql //备份server1(发起组复制端)的数据
mysqldump --all-databases --single-transaction --routines --events \
--host=127.0.0.1 --port=3306 --user=root --password=YLZ123+a > dbdump.db
##发送给server2/3
scp dbdump.db 172.25.60.2:/root
scp dbdump.db 172.25.60.3:/root
##server2/3
mysql -p < dbdump.db //导入数据库,如果出错,请阅读报错三
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='YLZ123+a' \
FOR CHANNEL 'group_replication_recovery';
start group_replication;
SELECT * FROM performance_schema.replication_group_members;
(3)报错三: 导入数据时报错
a. ERROR 1290 (HY000) at line 31: The MySQL server is running with the --super-read-only option so it cannot execute this statement.
(MySQL服务器使用–super-read-only选项运行,因此无法执行此语句) 解决办法:关闭mysql再开启就ok
b. ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty. (@@
GLOBAL.GTID_PURGED只能在@@ GLOBAL.GTID_EXECUTED为空时设置。)
解决办法:登陆数据库,执行reset master
即可