26 slave写入数据解决与GTIDS主从复制搭建

上午

1、web01与web02服务器搭建

ip:10.0.0.11

systemctl stop filewalld

systemctl disable firewalld

setenforce 0

vim /etc/selinux/config

SELINUX=disabled

yum -y install nginx

echo "web----------01" > /usr/share/nginx/html/index.html

nginx

ip:10.0.0.12

systemctl stop filewalld

systemctl disable firewalld

setenforce 0

vim /etc/selinux/config

SELINUX=disabled

yum -y install nginx

echo "web----------02" > /usr/share/nginx/html/index.html

nginx

2、nat服务器搭建

两个网卡ip:10.0.0.10(内网ip)、10.0.0.23(外网ip)

systemctl stop filewalld

systemctl disable firewalld

setenforce 0

vim /etc/selinux/config

SELINUX=disabled

3、dns服务器搭建

ip:10.0.0.3

yum -y install bind

vim /etc/named.conf

listen-on port 53 { 127.0.0.1;any; };

......

allow-query { localhost;any; };

vim /etc/named.rfc1912.zones

zone "abc.com" IN {

type master;

file "abc.com.zone";

allow-update { none; };

};

cp -p /var/named/named.localhost /var/named/abc.com.zone

vim /var/named/abc.com.zone

web01 A 10.0.0.11

web02 A 10.0.0.12

nat A 10.0.0.10

ds A 10.0.0.23

systemctl start named

下午

1、时间服务器搭建

ntp服务器搭建在nat服务器上(ip地址为10.0.0.10)

[root@ntp ~]# yum -y install ntpdate

[root@ntp ~]# ntpdate cn.ntp.org.cn

[root@ntp ~]# yum -y install ntp

[root@ntp ~]# vim /etc/ntp.conf

15行加入 restrict 10.0.0.0 mask 255.255.255.0 //允许10.0.0.0网段的主机访问

[root@ntp ~]# which ntpdate

[root@ntp ~]# crontab -e

* 2 * * * /usr/sbin/ntpdate cn.ntp.org.cn

[root@ntp ~]# systemctl start ntpd

[root@ntp ~]# systemctl enable ntpd

其余内网主机

yum -y install ntpdate

crontab -e //定时与ntp服务器同步时间

30 * * * * /usr/sbin/ntpdate 10.0.0.10

date

date -s "2014-1-1 14:00:00"

date

ntpdate 10.0.0.10

2、规划表

主机名 ip地址 功能

web01 10.0.0.11 realserver

web02 10.0.0.12 realserver

nat 10.0.0.10(内)/10.0.0.23(外) directorserver,ntp

dns 10.0.0.3 dns

3、ipvsadm

ipvsadm.x86_64 通常是指用于 x86_64 架构的 IP 虚拟服务器管理工具(IP Virtual Server Administration)。

IPVS(IP Virtual Server)是 Linux 内核中的一种负载均衡技术。ipvsadm 工具用于配置和管理 IPVS 规则。

例如,您可以使用 ipvsadm 来设置负载均衡的算法(如轮询、加权轮询等)、定义真实服务器(Real Server)、添加服务(Service)等。

[root@nat ~]# yum -y install ipvsadm.x86_64

[root@nat ~]# ipvsadm -h # 显示 ipvsadm 工具的帮助信息

[root@nat ~]# ipvsadm -C # 清空当前的 IPVS 规则设置。

[root@nat ~]# ipvsadm -L # 用于列出当前系统中已配置的 IPVS 规则和相关信息

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

[root@nat ~]# ipvsadm -L -n # 用于以数字形式列出当前系统中已配置的 IPVS 规则和相关信息

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

[root@nat ~]# ipvsadm -A -t 10.0.0.23:80 -s rr

(失败)

4、mysql补充 (slave服务器不⼩⼼写⼊数据的解决⽅案)

1、正常情况下,master既可以读,也可以写,但是slave从服务器 只能读取操作,⼀旦我们在slave从服务器中写⼊数据,主从结 构会失败。

2、show slave status\G

3、如果数据⽐较少,可以通过跳过当前语句的⽅式解决,但是如果 从服务器写⼊的数据⽐较多,架构必须重新搭建

4、可通过变量sql_slave_skip_counter临时跳过事务进⾏处理

mysql> set GLOBAL sql_slave_skip_counter=N # n代表跳过的n个事务

mysql> stop slave;

mysql> start slave;

5、跳过事务应该在slave上运⾏

6、传统的ab复制⽅式可以使⽤,基于GTIDs的⽅式不⽀持

5、mysql补充(基于gtids的主从复制搭建)

主从同步太过频繁,浪费资源。添加gtid,只添加提交的事务。

1、什么是GTIDs

1、Global transaction identifiers 全局事务标识符,是mysql5.6 新加⼊的技术

2、使⽤GTIDs时,每⼀个事务都可以被识别和跟踪

3、添加的新的slave或者发⽣故障时,需要将master身份或者⻆⾊迁移到slave上时,都需要考虑哪⼀个⼆进制⽇志以及哪个position值,极⼤简化了相关操作。

4、GTIDs是完全基于事务的,因此不⽀持MYISAM存储引擎

5、GTIDs由source_id 和transaction组成:

source_id来源于server.uuid可以在auto.cnf中看到

tansaction_id 是⼀个序列数字,⾃动⽣成

2、限制条件

1、不⽀持⾮事务引擎(MyISAM)因为可能会导致多个gtid分布给同⼀个事务

2、create table select语句不⽀持(主库语法报错)

3、create、drop temprary table语法不⽀持

4、必须使⽤enforce-gtid-consistency参数

5、sql-slave-skip-counter不⽀持

6、gtid复制环境中必须统⼀开启gtid或者关闭gtid

7、在5.7之前使⽤mysql upgrade命令也会出现问题

3、环境介绍

replication是基于传统的⽅式部署,并且已经在运⾏,利⽤已经存在的环境升级⾄基于GTIDs的replication。

4、实践步骤

修改配置⽂件,⽀持GTIDs(主从)

重启数据库(主从)

为了保证数据⼀直,master和slave都设置为只读

从服务器上重新配置同步

  1. 修改配置⽂件⽀持GTIDs

master中

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

port=3306

log-error=/usr/local/mysql/data/db01-

master.err

log-bin=/usr/local/mysql/data/binlog

server-id=10

character_set_server=utf8mb4

gtid-mode=on

GTID(Global Transaction Identifier,全局事务标识符)模式开启。GTID 是 MySQL 用于在主从复制环境中唯一标识每个事务的标识符。开启此模式可以更方便地进行主从切换、故障恢复以及数据迁移等操作。例如,当需要将从库提升为主库时,通过 GTID 可以更准确和高效地确定需要应用的事务。

log-slave-updates=1

这个参数表示从服务器将接收到的更新操作记录到其自身的二进制日志中。这对于构建多层级的复制拓扑结构非常有用。比如,如果有一个主库,多个从库,其中一个从库又作为另一个从库的主库时,就需要开启这个参数,以便将更新传递下去。

enforce-gtid-consistency

强制 GTID 的一致性。这有助于确保在复制环境中,所有的事务都符合 GTID 的规则和要求,避免出现不一致或错误的情况。比如说,如果有事务违反了 GTID 的某些约束,如重复的 GTID 或不连续的 GTID 序列,系统会进行相应的处理或报错。

slave中

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

port=3310

log-error=/usr/local/mysql/data/db01-

slave.err

relay-log=/usr/local/mysql/data/relaylog

server-id=11

character_set_server=utf8mb4

log-bin=/usr/local/mysql/data/binlog

指定了二进制日志的存储路径为 /usr/local/mysql/data/binlog 。二进制日志用于记录数据库的更改操作,对于数据备份、恢复、主从复制等操作至关重要。例如,在进行数据恢复时,可以通过读取二进制日志中的操作来还原到特定的时间点。

gtid-mode=on

开启 GTID 模式,使得事务在整个复制拓扑中有唯一且全局的标识符。这为复制的管理和故障转移提供了更便利和可靠的方式。比如,在主从切换时,可以基于 GTID 快速确定需要同步的事务,而无需依赖传统的基于二进制日志文件和位置的方式。

log-slave-updates=1

允许从服务器将从主服务器接收到的更新操作记录到自身的二进制日志中。这对于构建多层级的复制架构非常有用。假设您有一个主库 A,从库 B,而从库 B 又作为从库 C 的主库,那么 B 就需要开启此参数,将从 A 接收到的更新传递给 C 。

enforce-gtid-consistency

强制保证 GTID 的一致性,确保所有的事务都遵循 GTID 的规则和要求,防止出现不一致或错误的情况。例如,如果有事务试图违反 GTID 的唯一性或连续性等规则,系统会进行阻止或报错,以维护数据库的一致性和可靠性。

skip-slave-start

这个参数会使得在服务器启动时不会自动启动从库复制进程。这通常在需要手动配置或检查从库的初始状态,或者在特定情况下需要暂时停止从库复制时使用。比如说,在对从库进行一些重大的配置更改或数据修复之前,可能会先使用此参数来防止从库自动启动复制,以免造成不可预期的结果。

2、重启启动mysql服务

[root@mysql-zhu ~]# service mysql8 restart

Shutting down MySQL.......... SUCCESS!

Starting MySQL.. SUCCESS!

[root@mysql-slave ~]# service mysql8 restart

Shutting down MySQL.. SUCCESS!

Starting MySQL... SUCCESS!

3、主从配置只读模式

mysql> set @@global.read_only=ON;

mysql> set @@global.read_only=ON;

4、slave重新配置change master to

mysql> stop slave;

mysql> change master to

-> master_host='10.0.0.51',

-> master_user='slave',

-> master_password='123',

-> master_port=3306,

-> master_auto_position=1;

Query OK, 0 rows affected, 8 warnings (0.01

sec)

mysql> start slave;

mysql> show slave status\G;

5、关闭主从服务器的只读模式

mysql> set @@global.read_only=OFF;

mysql> set @@global.read_only=OFF;

6、获得公钥

[root@slave ~]# mysql -uslave -p123 -h 10.0.0.51 -P3306 --get-server-public-key

mysql> quit

Bye

相关推荐
小码的头发丝、24 分钟前
Django中ListView 和 DetailView类的区别
数据库·python·django
孤客网络科技工作室1 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
Chef_Chen1 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空2 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
颇有几分姿色2 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁2 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev2 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
AndyFrank2 小时前
mac crontab 不能使用问题简记
linux·运维·macos