MySQL8.0.16 主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建
说明
这里的主库 和 从库 ip 一定要更具自己的ip来,我这里的搭建环境不都是在一个环境下搭建的,请看好自己的主从ip
主从复制实战
主库
my.cnf文件配置 路径/etc/mysqlvim /etc/mysql/my.cnf (docker)vim /etc/my.cnf(linux)[mysqld]log_bin=mysql-binserver-id=1sync-binlog=1binlog-ignore-db=sysbinlog-ignore-db=information_schemabinlog-ignore-db=performance_schema grant replication slae on *.* to 'root'@'%' identified by '2418870649'; # 5.7版本的mysql 可以直接使用 8.0 不能必须用下面的CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '2418870649'; # 创建用户GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';# 给用户赋予权限 grant all privileges on *.* to 'mha'@'%'; # 授权(全部数据库权限)flush privileges;# 刷新MySQL的系统权限相关表 alter user 'slave'@'%' identified WITH mysql_native_password by '2418870649'; #修改slave的密码为2418870649flush privileges;SELECT DISTINCT User FROM mysql.user; # 显示所有的用户(不重复)show master status; # File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
从库
my.cnf文件配置 路径/etc/mysqlvim /etc/mysql/my.cnf (docker)vim /etc/my.cnf(linux)[mysqld]server-id=2 # 保证不冲突即可relay_log=mysql-relay-binread_only=1 # 设置只读,根据需求进行配置port = 3306 #设置3306端口cd /usr/local/mysql/mysql-8.0.16-el7-x86_64/support-files./mysql.server stop# 停止mysql./mysql.server start # 重启mysqlsystemctl restart mysqld; # 重启mysql(这个不用进入目录)show slave status \G; # 查询主从同步状态,这里查看时确认一下是否以前做过主从复制change master to master_host='8.140.2.59', #主库ipmaster_port=3306, # Master的端口号,指的是容器的端口号master_user='slave',# 用于数据同步的用户master_password='2418870649', # 用于数据同步的用户密码master_log_file='mysql-bin.000001', # 主库show master status查库来的 File 字段master_log_pos=802; # 主库show master status查库来的 Position 字段master_connect_retry=30 # 如果连接失败,重试的时间间隔,单位是秒,默认是60秒change master to master_host='106.75.105.192',master_port=3306,master_user='slave',master_password='2418870649',master_log_file='mysql-bin.000003',master_log_pos=155;start slave; # 开启主从复制过程如果 start slave; 报ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository执行 reset slave; 在执行 start slave;
show slave status \G;(加 \G 竖起来看) #查询主从同步状态
Slave_IO_Running 和 Slave_SQL_Running 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
主从服务从某一个时间点同步的,之前的数据是没有的mysqldump --all-databases > mysql_backup_all.sql -uroot -p2418870649# 使用mysqldump工具备份所有库
半同步复制实战
主库
select @@have_dynamic_loading; # 是否有动态加载下图显示支持
show plugins; # 查看是否有rpl_semi_sync_master插件install plugin rpl_semi_sync_master soname 'semisync_master.so'; # 安装rpl_semi_sync_master插件 自定义名字为semisync_master.souninstall plugin rpl_semi_sync_master # 卸载插件 下图显示安装成功
show variables like '%semi%';
set global rpl_semi_sync_master_enabled=1;set global rpl_semi_sync_master_timeout=1000;或者vim /etc/mysql/my.cnf (docker)vim /etc/my.cnfrpl_semi_sync_master_enabled=1rpl_semi_sync_master_timeout=1000重启mysqlsystemctl restart mysqld;停止systemctl stop mysqld;启动systemctl start mysqld;
从库
select @@have_dynamic_loading; # 是否有动态加载下图显示支持
show plugins; # 查看是否有rpl_semi_sync_slave插件install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; # 安装rpl_semi_sync_slave插件 自定义名字为semisync_master.souninstall plugin rpl_semi_sync_slave # 卸载插件下图显示安装成功
show variables like '%semi%';
set global rpl_semi_sync_slave_enabled=1;或vim /etc/mysql/my.cnf (docker)vim /etc/my.cnfrpl_semi_sync_slave_enabled=1重启mysqlsystemctl restart mysqld停止systemctl stop mysqld启动systemctl start mysqld
stop slave; # 停止从库start slave; # 重启从库主库cat /var/log/mysqld.logset global log_error_verbosity=3; 1 -- Errors Only 2 -- Errors and warnings 3 -- Errors, warnings, and notes
并行复制
主库
show variables like '%binlog_group%';
set global binlog_group_commit_sync_delay=1000;set global binlog_group_commit_sync_no_delay_count=100;show variables like '%binlog_group%';
从库
show variables like '%slave%';DATABASE(默认值,基于库的并行复制方式)、LOGICAL_CLOCK(基于组提交的并行复制方式)。
stop slave; //停止slaveset global slave_parallel_type='LOGICAL_CLOCK';set global slave_parallel_workers=8;show variables like '%relay_log%';
set global relay_log_recovery=1 set global relay_log_info_repository='TABLE';set global master_info_repository=TABLE # 进入 vim /etc/mysql/my.cnf 添加配置这里为了将以前的配置添加进来为了是,以后重启不用在重新设置slave-parallel-type='LOGICAL_CLOCK'slave-parallel-workers=8;relay_log_info_repository=TABLEmaster_info_repository=TABLErelay_log_recovery=1 重启mysql服务关闭mysql服务systemctl status mysqld启动mysql服务systemctl start mysqldmysql服务状态systemctl status mysqld
读写分离实战mycat(docker安装方式)
安装方式可以去参考官方的
wget http://dl.mycat.org.cn/1.6.7.6/20210730131311/Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gztar -xzvf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gzwget https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/mycat/Dockerfiledocker build -t mycat:1.6.7.6 .这里 /docker/mycat/conf 是将本地解压的mycat/conf文件夹 全部挂载到docker中(我这里我的mycat解压的到了/docker下面,/docker这个文件自己创建)docker run --privileged=true -p 8066:8066 -p 9066:9066 --name mycat -v /docker/mycat/conf:/usr/local/mycat/conf -v /docker/mycat/logs:/usr/local/mycat/logs --network=adnc_net --ip 172.20.0.16 -d mycat:1.6.7.6docker run --privileged=true -p 8066:8066 -p9066:9066 --name mycat -v /docker/mycat/conf:/usr/local/mycat/conf -v /docker/mycat/logs:/usr/local/mycat/logs -d mycat:1.6.7.6#运行容器并挂载配置文件目录与日志目录#-v /docker/mycat/conf:/usr/local/mycat/conf 挂载配置文件目录#-v /docker/mycat/logs:/usr/local/mycat/logs 挂载日志目录# --network=adnc_net --ip 172.20.0.16 adnc_net是自建的bridge网络,如果使用docker默认网络,不需要这段docker cp /docker/mycat/lib/mysql-connector-java-8.0.16.jar 9dc84036f7c5:/usr/local/mycat/lib
MHA搭建
在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)ssh-keygen -t rsa在三台MySQL服务器分别执行下面命令,密码输入系统密码,将公钥拷到MHA Manager服务器上ssh-copy-id 8.140.25.1之后可以在MHA Manager服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥cat /root/.ssh/authorized_keys执行下面命令,将MHA Manager的公钥添加到authorized_keys文件中(此时应该包含4个公钥)cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys从MHA Manager服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。scp /root/.ssh/authorized_keys root@106.75.13.72:/root/.ssh/authorized_keys scp /root/.ssh/authorized_keys root@106.75.105.192:/root/.ssh/authorized_keys scp /root/.ssh/authorized_keys root@106.75.15.99:/root/.ssh/authorized_keys检测ssh 106.75.13.72ssh 106.75.105.192ssh 106.75.15.99三台MySQL服务器需要 安装nodeMHAManager服务器需要 安装node 和managerMHA node安装yum install perl-DBD-MySQL -ywget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpmrpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpmMHA manager安装wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpmrpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpmwget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -ivh epel-release-latest-7.noarch.rpm yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -ywget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm#目录说明 #/var/log (CentOS目录) # /mha (MHA监控根目录) # /app1 (MHA监控实例根目录) # /manager.log (MHA监控实例日志文件) -------------------------------------------------------------第一种配置(拆分成两个配置文件)--------------------------------------------------mkdir -p /var/log/mha/app1 touch /var/log/mha/app1/manager.logvim /etc/masterha_default.cnf[server default]user=rootpassword=2418870649port=3306#ssh登录账号 ssh_user=root#从库复制账号和密码 repl_user=rootrepl_password=2418870649port=3306#ping次数 ping_interval=1#二次检查的主机 secondary_check_script=masterha_secondary_check -s 106.75.105.192 -s 106.75.15.99 -s 106.75.13.72mkdir -p /etc/mhavim /etc/mha/app1.cnf[server default]#MHA监控实例根目录 manager_workdir=/var/log/mha/app1#MHA监控实例日志文件 manager_log=/var/log/mha/app1/manager.log[server1]hostname=106.75.105.192candidate_master=1master_binlog_dir="/var/lib/mysql"[server2]hostname=106.75.15.99candidate_master=1master_binlog_dir="/usr/local/mysql/data"[server3]hostname=106.75.13.72candidate_master=1master_binlog_dir="/usr/local/mysql/data"----------------------------------------------------------第二种配置(一个配置文件)--------------------------------------------------------mkdir -p /etc/mhavim /etc/mha/app1.cnf[server default]manager_log=/var/log/mha/app1/manager.logmanager_workdir=/var/log/mha/app1password=2418870649ping_interval=1repl_password=2418870649repl_user=rootsecondary_check_script=masterha_secondary_check -s 106.75.105.192 -s 106.75.15.99 -s 106.75.13.72ssh_user=rootuser=root[server1]candidate_master=1check_repl_delay=0hostname=106.75.105.192master_binlog_dir="/var/lib/mysql"port=3306[server2]candidate_master=1 #候选master 这个参数只是提升了优先级,并不是说指定了这个参数就一定会成为新主库 check_repl_delay=0 #默认如果从库落后主库100M的relay logs,MHA不会选择这个从库作为新主库,因为它会增加恢复的时间设置这个参数为0,MHA在选择新主库的时候,则忽略复制延迟,这个选项用在你使用candidate_master=1 明确指定需要哪个从库作为新主库的时候使用hostname=106.75.15.99master_binlog_dir="/usr/local/mysql/data" #在master上生成binlog的绝对路径port=3306[server3]hostname=106.75.13.72master_binlog_dir="/usr/local/mysql/data"no_master=1 #通过在目标服务器的配置段落设置no_master=1,它永远也不会变为新主库port=3306------------------------------------------------------------------------------------------------------------------------------------执行ssh通信检测在MHA Manager服务器上执行:masterha_check_ssh --conf=/etc/mha/app1.cnf检测MySQL主从复制在MHA Manager服务器上执行:masterha_check_repl --conf=/etc/mha/app1.cnfMHA Manager启动在MHA Manager服务器上执行:nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -- ignore_last_failover /var/log/mha/app1/manager.log 2>&1 &查看监控状态命令如下:masterha_check_status --conf=/etc/mha/app1.cnf查看监控日志命令如下:tail -f /var/log/mha/app1/manager.log测试MHA故障转移在MHA Manager服务器执行打开日志命令:tail -200f /var/log/mha/app1/manager.log关闭Master MySQL服务器服务,模拟主节点崩溃systemctl stop mysqld查看MHA日志,可以看到哪台slave切换成了master
报错1解决方法Can't exec "mysqlbinlog": No such file or directory at /usr/share/perl5/vendor_perl/MHA/BinlogManager.pm line 106所有节点执行 ln -s binlog软链接[root@mysql57-m ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog[root@mysql57-m ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql [root@mysql-slave01 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog[root@mysql-slave01 ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql [root@mysql-slave02 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog[root@mysql-slave02 ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql报错2解决方法Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'来到从服务器的mysql;stop slave;change master to master_log_file='mysql-bin.000012',master_log_pos=154;//这里的file和pos都是上面主服务器master显示的。start slave;//这时候就应可以了show slave status \G;//结果如下:
MHA故障转移恢复主库 从库1(这个配置按遇到故障时切回主库)从库2(这里配置直接配置不会被接换成主库)主库宕机后MHA Manager服务器执行 masterha_stop --conf=/etc/mha/app1.cnf # 关闭MHA修改 vim /etc/mha/app1.cnf 因为宕机后会把宕机的主库配置删除掉,要把原来的添加回来新的主库(从库1)(因为这个以前是从库 ,可能还需要执行 stop slave; 停掉以前的同步,可以先不停掉,报错了在执行,没有特意去试一试这个)show master status;然后把宕机的主库当从库配置连接新的主库(从库1)change master to master_host='106.75.105.192',master_port=3306,master_user='slave',master_password='2418870649',master_log_file='mysql-bin.000001',master_log_pos=2245;start slave;这样就把以前的主库变成了从库只有下一次再次宕机才会切换回去