培训第二十六天(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、实践步骤
  1. 修改配置⽂件,⽀持GTIDs(主从)

  2. 重启数据库(主从)

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

  4. 从服务器上重新配置同步

复制代码
 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 分钟前
维护在线重做日志(二)
数据库·oracle
qq_433099402 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz2 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺3 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i5 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl5 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502775 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空6 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
Oak Zhang6 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存