上午
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