MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建

提示:这里的主库 和 从库 ip 一定要更具自己的ip来,我这里的搭建环境不都是在一个环境下搭建的,请看好自己的主从ip


主从复制实战

主库

my.cnf文件配置  路径/etc/mysql
vim /etc/mysql/my.cnf (docker)
vim /etc/my.cnf       (linux)

[mysqld]
log_bin=mysql-bin
server-id=1
sync-binlog=1
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-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的密码为2418870649
flush privileges;

SELECT DISTINCT User FROM mysql.user;                                    # 显示所有的用户(不重复)

show master status;  # File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第1张图片

从库

my.cnf文件配置  路径/etc/mysql
vim /etc/mysql/my.cnf (docker)
vim /etc/my.cnf       (linux)

[mysqld]
server-id=2  # 保证不冲突即可
relay_log=mysql-relay-bin
read_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      # 重启mysql

systemctl restart mysqld;   # 重启mysql(这个不用进入目录)



show slave status \G;     # 查询主从同步状态,这里查看时确认一下是否以前做过主从复制

change master to master_host='8.140.2.59', #主库ip
master_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 竖起来看) #查询主从同步状态

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第2张图片

Slave_IO_Running 和 Slave_SQL_Running 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第3张图片

主从服务从某一个时间点同步的,之前的数据是没有的

mysqldump --all-databases > mysql_backup_all.sql -uroot -p2418870649       # 使用mysqldump工具备份所有库

半同步复制实战

主库

select @@have_dynamic_loading;         # 是否有动态加载

下图显示支持

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第4张图片

show plugins;  # 查看是否有rpl_semi_sync_master插件

install plugin rpl_semi_sync_master soname 'semisync_master.so';   # 安装rpl_semi_sync_master插件  自定义名字为semisync_master.so

uninstall plugin rpl_semi_sync_master   # 卸载插件 
下图显示安装成功

在这里插入图片描述

show variables like '%semi%';

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第5张图片

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.cnf

rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000


重启mysql
systemctl restart mysqld;
停止
systemctl stop mysqld;
启动
systemctl start mysqld;

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第6张图片

从库

select @@have_dynamic_loading;         # 是否有动态加载

下图显示支持

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第7张图片

show plugins;  # 查看是否有rpl_semi_sync_slave插件

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';   # 安装rpl_semi_sync_slave插件  自定义名字为semisync_master.so


uninstall plugin rpl_semi_sync_slave   # 卸载插件

下图显示安装成功

在这里插入图片描述

show variables like '%semi%';

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第8张图片

set global rpl_semi_sync_slave_enabled=1;
或
vim /etc/mysql/my.cnf  (docker)
vim /etc/my.cnf
rpl_semi_sync_slave_enabled=1


重启mysql
systemctl restart mysqld
停止
systemctl stop mysqld
启动
systemctl start mysqld

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第9张图片

stop slave;   # 停止从库

start slave;  # 重启从库


主库
cat /var/log/mysqld.log
set global log_error_verbosity=3;
                1 -- Errors Only
                2 -- Errors and warnings
                3 -- Errors, warnings, and notes

并行复制

主库

show variables like '%binlog_group%';

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第10张图片

set global binlog_group_commit_sync_delay=1000;

set global binlog_group_commit_sync_no_delay_count=100;

show variables like '%binlog_group%';

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第11张图片

从库

show variables like '%slave%';

DATABASE(默认值,基于库的并行复制方式)、LOGICAL_CLOCK(基于组提交的并行复制方式)。

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第12张图片

stop slave;  //停止slave

set global slave_parallel_type='LOGICAL_CLOCK';
set global slave_parallel_workers=8;


show variables like '%relay_log%';

MySQL8.0.16主从复制、半同步复制、并行复制、读写分离mycat(docker)、MHA搭建_第13张图片

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=TABLE
master_info_repository=TABLE
relay_log_recovery=1   
重启mysql服务

关闭mysql服务
systemctl status mysqld
启动mysql服务
systemctl start mysqld
mysql服务状态
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.gz
tar -xzvf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz


wget https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/mycat/Dockerfile
docker 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.6


docker 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.72
ssh 106.75.105.192
ssh 106.75.15.99


三台MySQL服务器需要    安装node
MHAManager服务器需要   安装node 和manager

MHA node安装
yum install perl-DBD-MySQL -y
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm



MHA manager安装
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

wget 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 -y

wget 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.log
vim /etc/masterha_default.cnf

[server default]
user=root
password=2418870649
port=3306
#ssh登录账号 
ssh_user=root
#从库复制账号和密码 
repl_user=root
repl_password=2418870649
port=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.72



mkdir -p /etc/mha
vim /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.192
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server2]
hostname=106.75.15.99
candidate_master=1
master_binlog_dir="/usr/local/mysql/data"
[server3]
hostname=106.75.13.72
candidate_master=1
master_binlog_dir="/usr/local/mysql/data"
----------------------------------------------------------第二种配置(一个配置文件)--------------------------------------------------------

mkdir -p /etc/mha
vim /etc/mha/app1.cnf

[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
password=2418870649
ping_interval=1
repl_password=2418870649
repl_user=root
secondary_check_script=masterha_secondary_check -s 106.75.105.192 -s 106.75.15.99 -s 106.75.13.72
ssh_user=root
user=root


[server1]
candidate_master=1
check_repl_delay=0                     
hostname=106.75.105.192
master_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.99
master_binlog_dir="/usr/local/mysql/data"  #在master上生成binlog的绝对路径
port=3306

[server3]
hostname=106.75.13.72
master_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.cnf


MHA Manager启动
在MHA Manager服务器上执行:
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -- ignore_last_failover < /dev/null > /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;

这样就把以前的主库变成了从库
只有下一次再次宕机才会切换回去

你可能感兴趣的:(MySql,mysql,数据库,linux,centos)