淮安j经济开发区建设局网站,深圳欧啦啦网站建设,建设网站需要注意什么手续,网站建设合同拟写一.主从同步流程关于MySQL主从复制主要同步的是binlog日志#xff0c;涉及到三个线程#xff0c;一个运行在主节点#xff08;log dump thread#xff09;#xff0c;其余两个(I/O thread, SQL thread)运行在从节点#xff0c;如下图所示:当主库数据发生变更时#xff0…一.主从同步流程关于MySQL主从复制主要同步的是binlog日志涉及到三个线程一个运行在主节点log dump thread其余两个(I/O thread, SQL thread)运行在从节点如下图所示:当主库数据发生变更时写入本地Bin Log文件从库IO线程发起dump主库Bin Log文件的请求主库IO线程推送Bin Log文件到从库中从库IO线程把Bin Log内容写入本地的Relay Log文件中从库SQL线程读取Relay Log文件内容从库SQL线程重新执行一遍SQL语句二.实现主从一致的原理主节点 binary log dump 线程当从节点连接主节点时主节点会创建一个log dump 线程用于发送binlog的内容。在读取binlog中的操作时此线程会对主节点上的binlog加锁当读取完成在发送给从节点之前锁会被释放。从节点I/O线程当从节点上执行start slave命令之后从节点会创建一个I/O线程用来连接主节点请求主库中更新的binlog。I/O线程接收到主节点binlog dump 进程发来的更新之后保存在本地relay-log中继日志中。从节点SQL线程SQL线程负责读取relay log中的内容解析成具体的操作并执行最终保证主从数据的一致性。三.MySQL 主从复制模式MySQL 主从复制默认是异步的模式。MySQL增删改操作会全部记录在binlog中当slave节点连接master时会主动从master处获取最新的bin log文件。并把bin log中的sql relay。异步模式mysql async-mode原理客户端提交 COMMIT 之后主库不需要等从库返回任何结果而是直接将结果返回给客户端这样做的好处是不会影响主库写的效率但可能会存在主库宕机(就凉了)而 Binlog 还没有同步到从库的情况也就是此时的主库和从库数据不一致。这时候从从库中选择一个作为新主那么新主则可能缺少原来主服务器中已提交的事务。所以这种复制模式下的数据一致性是最弱的。风险一旦数据只写到了主库的binlog中还没来得急同步到从库时主库挂了从库就就会被强行提升为主库就会造成数据的丢失。但高效。半同步模式(mysql semi-sync)同步模式当主库执行完客户端提交的事务后需要等到所有从库也都执行完这一事务后才返回给客户端执行成功。因为要等到所有从库都执行完执行过程中会被阻塞等待返回结果所以性能上会有很严重的影响。半同步复制模式主库在执行完客户端提交的事务后要等待至少一个从库接收到binlog并将数据写入到relay log中才返回给客户端成功结果。半同步复制模式比异步模式提高了数据的可用性但是也产生了一定的性能延迟最少要一个TCP/IP连接的往返时间。所以半同步复制最好在低延时的网络中使用。在master的dump线程去通知从库时增加了一个ACK机制也就是会确认从库是否收到事务的标志码master的dump线程不但要发送binlog到从库还有负责接收slave的ACK。当出现异常时Slave没有ACK事务出现等待超时的情况那么将自动降级为异步复制直到异常修复后再自动变为半同步复制。。风险当事务在主库提交完后等待从库ACK的过程中如果Master宕机了这个时候就会有两种情况的问题事务还没发送到Slave上若事务还没发送Slave上客户端在收到失败结果后会重新提交事务因为重新提交的事务是在新的Master上执行的所以会执行成功后面若是之前的Master恢复后会以Slave的身份加入到集群中这个时候之前的事务就会被执行两次第一次是之前此台机器作为Master的时候执行的第二次是做为Slave后从主库中同步过来的。【为什么客户端收到失败结果后会重新提交事务事务不是已经提交了吗只不过没有等到ACK。】事务已经同步到Slave上因为事务已经同步到Slave了所以当客户端收到失败结果后再次提交事务你那么此事务就会再当前Slave机器上执行两次。改进MySQL从5.7版本开始增加了一种新的半同步方式。新的半同步方式的执行过程是将“Storage Commit”这一步移动到了“Write Slave dump”后面。这样保证了只有Slave的事务ACK后才提交主库事务。【就是之前先提交commit再同步现在是先保证同步了再commit】。MySQL从5.7.2版本开始默认的半同步复制方式就是AFTER_SYNC方式但这种同步方式可能会存在slave多数据的情况。半同步模式不是mysql内置的从mysql 5.5开始集成需要master 和slave 安装插件开启半同步模式。全同步模式全同步模式是指主节点和从节点全部执行了commit并确认才会向客户端返回成功。四.docker部署mysql主从机器端口角色10.x.x.1213306主10.x.x.13306从1.linux基础环境配置# 关闭防火墙systemctl stop firewalldsystemctl disable firewalld# 关闭selinuxsed -i s/enforcing/disabled/ /etc/selinux/config # 永久setenforce 0 # 临时# 关闭swapswapoff -a # 临时sed -ri s/.*swap.*/#/ /etc/fstab # 永久# 将桥接的IPv4流量传递到iptables的链cat /etc/sysctl.d/k8s.conf EOFnet.bridge.bridge-nf-call-ip6tables 1net.bridge.bridge-nf-call-iptables 1EOFsysctl --system # 生效# 时间同步yum install ntpdate -yntpdate time.windows.com2.安装docker环境主从都要yum install -y wgetwget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repowget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repoyum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6systemctl enable docker systemctl start dockerdocker --version#配置镜像加速器sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json -EOF{ registry-mirrors: [https://afi5x6i2.mirror.aliyuncs.com]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker3.配置及映射mysql的数据目录挂载mysql配置文件容器中的位置/etc/mysql/mysql.conf.d/mysqld.cnfmysql数据文件容器中的位置/var/lib/mysql配置文件,提前编辑好我的配置文件位置/opt/docker/container/mysql/conf/主配置文件 mysqld.cnf[mysqld]
pid-file /var/run/mysqld/mysqld.pid
socket /var/run/mysqld/mysqld.sock
datadir /var/lib/mysql
#log-error /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links0init_connectSET collation_connection utf8_general_ci
init_connectSET NAMES utf8
character-set-serverutf8
collation-serverutf8_general_ci
[client]
default-character-setutf8[mysqld]
sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
## 设置server_id同一局域网中需要唯一
server_id101
## 指定不需要同步的数据库名称
binlog-ignore-dbmysql
### 开启二进制日志功能
log-binmysql-bin
### 设置二进制日志使用内存大小事务
binlog_cache_size1M
### 设置使用的二进制日志格式mixed,statement,row
binlog_formatrow
### 二进制日志过期清理时间。默认值为0表示不自动清理。
expire_logs_days7
### 跳过主从复制中遇到的所有错误或指定类型的错误避免slave端复制中断。
### 如1062错误是指一些主键重复1032错误是因为主从数据库数据不一致
slave_skip_errors1062 从配置文件 mysqld.cnf不要将client的default-character-setutf8移动位置,因为必须在server的配置文件下否则启动失败异常找不到server_id[mysqld]
pid-file /var/run/mysqld/mysqld.pid
socket /var/run/mysqld/mysqld.sock
datadir /var/lib/mysql
#log-error /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links0init_connectSET collation_connection utf8_general_ci
init_connectSET NAMES utf8
character-set-serverutf8
collation-serverutf8_general_ci#[mysqld]
sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
## 设置server_id同一局域网中需要唯一
server_id102
## 开启二进制日志功能以备Slave作为其它数据库实例的Master时使用
log-binmysql-bin
## 设置二进制日志使用内存大小事务
binlog_cache_size1M
## 设置使用的二进制日志格式mixed,statement,row
binlog_formatrow
## 二进制日志过期清理时间。默认值为0表示不自动清理。
expire_logs_days7
## 跳过主从复制中遇到的所有错误或指定类型的错误避免slave端复制中断。
## 如1062错误是指一些主键重复1032错误是因为主从数据库数据不一致
slave_skip_errors1062
## relay_log配置中继日志
relay_logmysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates1
## slave设置为只读具有super权限的用户除外
read_only1[client]
default-character-setutf84.容器启动和数据卷映射#拉取镜像
docker pull mysql:5.7#分别创建容器
docker run -id --namemysql --net host -e MYSQL_ROOT_PASSWORDmysql密码 -e TZAsia/Shanghai -v /opt/docker/container/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /opt/docker/container/mysql/data:/var/lib/mysql mysql:5.7 --port3306docker run -id --namemysql -e MYSQL_ROOT_PASSWORDmysql密码 -p 33506:3306 -e TZAsia/Shanghai -v /opt/docker/container/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /opt/docker/container/mysql/data:/var/lib/mysql mysql:5.7#进入主mysql容器并登陆
docker exec -it mysql bash
mysql -uroot -p密码#创建只读用户并且授权
CREATE USER slave% IDENTIFIED BY slave123pdy6bObCqG0g;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave%;#查看当前日志位置,记录file和Position稍后会用到
show master status;#进入从mysql容器并登陆
docker exec -it mysql bash
mysql -uroot -pmysql密码#加入主库 master_log_file和master_log_pos上面提到的稍后会用的数据master_connect_retry重试时间间隔单位s
change master to master_host10.x.x.121, master_userslave, master_passwordslave123pdy6bObCqG0g, master_port3306, master_log_filemysql-bin.000003, master_log_pos617, master_connect_retry10;#查看从库状态 #会发现Slave_IO_Running和Slave_SQL_Running都是no并没有开始同步
show slave status \G;#开始同步
start slave;#再次查看状态会发现变更为yes.