平面设计有什么网站,营销策略4p,错题网站开发,微信网页版是什么文章目录 [toc]啰嗦一下mysql 的 AB 复制和 gtid 复制的优缺点AB 复制#xff08;Asynchronous Replication#xff09;GTID 复制#xff08;Global Transaction Identifier Replication#xff09; mysql gtid 并行复制和半同步复制的优缺点并行复制#xff08;Parallel … 文章目录 [toc]啰嗦一下mysql 的 AB 复制和 gtid 复制的优缺点AB 复制Asynchronous ReplicationGTID 复制Global Transaction Identifier Replication mysql gtid 并行复制和半同步复制的优缺点并行复制Parallel Replication半同步复制Semi-Synchronous Replication 好戏开场部署 mysql创建 mysql 启动的用户创建 mysql 安装包存放路径创建主库 mysql 配置文件创建从库 mysql 配置文件mysql 初始化创建 systemcl 管理修改 root 用户密码 配置互为主从从库配置主从关系主库配置互为主从关系 验证主从复制模拟主库故障
麒麟镜像可以去下面的地方下载需要自己注册一个账号 麒麟软件生态 Mysql 二进制文件下载地址
啰嗦一下
老生常谈的问题这些问题都会影响部署的排查 关掉 firewalld关掉 selinux 银河麒麟默认会关闭 selinux 我下载的海光 x86 版本的麒麟 NAMEKylin Linux Advanced Server
VERSIONV10 (Lance)
IDkylin
VERSION_IDV10
PRETTY_NAMEKylin Linux Advanced Server V10 (Lance)
ANSI_COLOR0;31mysql 的 AB 复制和 gtid 复制的优缺点 抄自 opengpt 3.5 在 MySQL 中有两种常见的复制方式AB 复制Asynchronous Replication和 GTID 复制Global Transaction Identifier Replication。
AB 复制Asynchronous Replication
优点
简单易用AB 复制是 MySQL 复制的最基本形式设置相对简单适合初学者或简单复制场景。性能因为是异步复制主数据库不需要等待从数据库的确认所以主库的写操作可以更快地完成提高了主库的性能。容错在出现网络故障或从库延迟时主库不会受到影响继续提供服务。
缺点
数据延迟因为是异步复制从库的数据可能会有一定的延迟这意味着在主库上提交的事务不会立即在从库上可见。数据一致性由于延迟主从之间的数据可能会出现不一致的情况这需要开发者自行处理。单点故障如果主库故障需要手动切换到备库造成一定的停机时间。
GTID 复制Global Transaction Identifier Replication
优点
数据一致性使用 GTID每个事务都有全局唯一的标识符确保主从之间的数据一致性避免数据冲突。简化拓扑结构GTID 复制使得添加或删除节点更加容易不需要像传统复制那样配置复杂的 master-host 和 master-log-position。自动故障转移GTID 复制可以更容易地实现自动故障转移当主库发生故障时可以自动切换到从库。
缺点
性能由于 GTID 需要维护全局唯一标识符可能会对性能产生一定的影响尤其在高负载的情况下。配置复杂性相比 AB 复制GTID 复制的配置较为复杂特别是在现有的非 GTID 复制架构迁移到 GTID 复制时需要谨慎处理。兼容性GTID 复制要求 MySQL 版本在 5.6 以上如果要使用较旧的 MySQL 版本可能不支持 GTID。
综合考虑 AB 复制适合简单的数据复制和备份需求对数据一致性和高可用性要求不高的场景。GTID 复制适合对数据一致性和高可用性要求较高的复制架构尤其在复杂的拓扑结构和自动故障转移场景中更加有优势。选择哪种复制方式取决于应用程序的需求和系统的复杂性。
mysql gtid 并行复制和半同步复制的优缺点
在 MySQL GTID 主从复制中还有两种复制模式并行复制和半同步复制。这两种模式可以进一步提高复制的性能和数据一致性。让我们来看一下它们的优缺点和利弊
并行复制Parallel Replication
优点
提高复制性能并行复制允许在从库上同时执行多个线程来处理不同的事务从而提高了复制的性能和吞吐量。减少延迟通过并行执行事务从库可以更快地赶上主库从而减少数据复制的延迟。多核利用现代服务器通常有多个核心使用并行复制可以更好地利用这些多核心加快数据复制。
缺点
复杂性增加并行复制的配置和管理相对复杂可能需要更多的系统资源和监控不适合所有环境。并发控制并行复制可能导致数据在不同线程之间的冲突和竞争需要开发者正确处理并发控制问题。
半同步复制Semi-Synchronous Replication
优点
数据安全性半同步复制确保至少一个从库已经确认接收并写入主库的事务从而提高数据的安全性和一致性。高可用性在主库发生故障时由于至少有一个从库已经复制了主库的数据可以更快地将从库提升为新的主库减少停机时间。监控机制半同步复制提供了可以监控从库复制进度的机制使得管理员可以更好地了解复制的状态和延迟情况。
缺点
性能影响由于需要等待至少一个从库确认写入半同步复制可能对主库的性能产生一定的影响特别是在写入负载较高的情况下。单点故障如果配置了多个从库并且至少一个从库确认写入的要求那么当所有从库都不可用时主库的写入将会受阻。
综合考虑 并行复制适用于高负载环境可以显著提高复制性能和减少复制延迟但配置和管理相对较复杂。半同步复制适用于对数据安全性和高可用性要求较高的场景但可能会对主库的性能产生一定的影响。选择哪种模式取决于具体的应用需求和系统性能情况。 准备两台虚拟机我们启航 好戏开场
部署 mysql 下面的操作都是使用的 root 用户但是 mysql 使用的是普通用户部署 mysql 是两台虚拟机都需要安排的 创建 mysql 启动的用户 创建的 mysql 用户就分配一个 nologin 的 shell不给登录机器的 useradd mysql -s /sbin/nologin创建 mysql 安装包存放路径
mkdir -p /data/software/mysql上传或者下载 mysql 二进制文件到 /data/software/mysql 下后进行解压这里就不体现步骤了 下面的命令给 mysql 二进制文件修改用户权限让 mysql 用户有权限可以读取 chown -R mysql /data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64创建主库 mysql 配置文件 我这边就用了 GTID 的半同步模式 创建对应的目录 [两台机器都需要创建]
mkdir -p /data/mysql/{mysql_data,logs,config}在 mysql 主库上创建配置文件
cat EOF /data/mysql/config/my.cnf
[mysqld]
pid-file/data/mysql/mysqld.pid
socket/data/mysql/mysqld.sock
datadir/data/mysql/mysql_data
log-error/data/mysql/logs/error.log
port13306
# MySQL 在运行时需要 errmsg.sys 文件来显示和报告错误消息
lc-messages-dir/data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64/share# GTID
## 每个 mysql 的 server_id 不能重复
server_id135
# 新事务和复制事务都必须是 GTID 事务
gtid_modeon
# 不允许任何事务违反 GTID 一致性
enforce_gtid_consistencyon# MySQL 在启动时会跳过启动从服务器的复制线程从而暂时禁止从服务器执行复制任务
skip_slave_start1# binlog
# binlog 文件的名称
log_binmysql-bin
# 设置每个二进制日志文件的最大大小
max_binlog_size100m
# 设置用于缓存二进制日志事件的缓冲区大小
binlog_cache_size4m
# 设置 binlog 缓存的最大大小
max_binlog_cache_size512m
# binlog 类型
binlog_formatROW
# binlog 过期时间
expire_logs_days7
# binlog 记录忽略的数据库
binlog-ignore-dbsys,mysql,performance_schema,information_schema
# 从服务器将主服务器的更新记录到自己的 binlog 里面
log-slave-updatesON
# 每次提交事务时等待将日志写入磁盘并返回成功后才继续执行
sync_binlog1# 配置半同步复制使用的插件
plugin-loadrpl_semi_sync_mastersemisync_master.so
plugin-loadrpl_semi_sync_slavesemisync_slave.so
# 开启半同步复制
rpl_semi_sync_slave_enabledONbind-address0.0.0.0
# 是否允许在数据库目录下使用符号链接
## symbolic-links0表示不允许使用符号链接。如果设置为 0MySQL 服务器在启动时将不会使用数据库目录下的符号链接并且可能会在符号链接存在时报错。
## symbolic-links1表示允许使用符号链接。如果设置为 1MySQL 服务器在启动时将允许使用数据库目录下的符号链接但仅限于特定目录或文件根据权限设置。
## symbolic-links2表示允许使用符号链接且没有限制。如果设置为 2MySQL 服务器在启动时将允许使用数据库目录下的任意符号链接包括对任意文件或目录的链接。
symbolic-links0
# mysql 最大连接数
max_connections1000
# 默认存储引擎
default_storage_engineinnodb
# 禁用外部锁定MySQL 将使用内部锁定来代替外部锁定
skip_external_locking
# 0表名存储为原始大小写区分大小写
# 1表名存储为小写不区分大小写
# 2表名存储为小写但会在文件系统上进行名称比较因此会区分大小写。
lower_case_table_names1
# 禁用主机缓存每次都要重新解析域名
skip_host_cache
# 开启主机名解析
skip_name_resolve
# 设置服务器的默认字符集
character_set_serverutf8
# 客户端与服务器之间允许的最大数据包大小
max_allowed_packet12M
# 控制 SQL 的执行模式
## STRICT_TRANS_TABLES启用严格模式对于事务表如果有非法数据插入或更新将会引发错误
## NO_ZERO_IN_DATE禁止在日期中使用 0000-00-00 这样的零值否则会被转换为 NULL 值
## ERROR_FOR_DIVISION_BY_ZERO当除零错误发生时产生错误而不是返回 NULL 值
## NO_AUTO_CREATE_USER禁止 GRANT 语句自动创建新用户必须手动创建
## NO_ENGINE_SUBSTITUTION如果指定的存储引擎不可用或不存在不要自动替换为其他可用的存储引擎而应该返回错误
sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION[client]
# 设置 MySQL 客户端连接的默认字符集
character-set-clientutf8
EOF创建从库 mysql 配置文件
在 mysql 从库上创建配置文件 注意 service_id 要和主库的不一样
cat EOF /data/mysql/config/my.cnf
[mysqld]
pid-file/data/mysql/mysqld.pid
socket/data/mysql/mysqld.sock
datadir/data/mysql/mysql_data
log-error/data/mysql/logs/error.log
port13306
lc-messages-dir/data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64/shareserver_id136
gtid_modeon
enforce_gtid_consistencyonskip_slave_start1log_binmysql-bin
max_binlog_size100m
binlog_cache_size4m
max_binlog_cache_size512m
binlog_formatROW
expire_logs_days7
binlog-ignore-dbsys,mysql,performance_schema,information_schema
log-slave-updatesON
sync_binlog1plugin-loadrpl_semi_sync_mastersemisync_master.so
plugin-loadrpl_semi_sync_slavesemisync_slave.so
rpl_semi_sync_slave_enabledONbind-address0.0.0.0
symbolic-links0
max_connections1000
default_storage_engineinnodb
skip_external_locking
lower_case_table_names1
skip_host_cache
skip_name_resolve
character_set_serverutf8
max_allowed_packet12M
sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION[client]
character-set-clientutf8
EOF修改文件和目录的用户权限 chown -R mysql /data/mysql
chown -R mysql /data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64更新 PATH 变量 echo MYSQL_HOME/data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64 /etc/profile
echo PATH${PATH}:${MYSQL_HOME}/bin /etc/profile
source /etc/profilemysql 初始化
mysqld --initialize-insecure \
--usermysql \
--basedir/data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64 \
--datadir/data/mysql/mysql_data创建 systemcl 管理
cat EOF /usr/lib/systemd/system/mysqld.service
[Unit]
Afternetwork.target
Aftersyslog.target[Install]
WantedBymulti-user.target[Service]
Usermysql
Typeforking
TimeoutSec0
PermissionsStartOnlytrue
ExecStart/data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64/bin/mysqld \\--defaults-file/data/mysql/config/my.cnf --daemonize \\--plugin-dir/data/software/mysql/mysql-5.7.29-linux-glibc2.12-x86_64/lib/plugin
LimitNOFILE5000
Restarton-failure
RestartPreventExitStatus1
PrivateTmpfalse
EOF启动 mysql systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld进入 mysql 验证 初始化的时候没有带密码进入 mysql 不需要密码直接回车就可以了 mysql -uroot -p -S /data/mysql/mysqld.sock以下的操作没有特殊提示均在 mysql 内操作
修改 root 用户密码
SET PASSWORD FOR rootlocalhost PASSWORD (abc123);配置互为主从
从库配置主从关系 主库创建复制用户 CREATE USER rpldb% IDENTIFIED BY rpldb007;
GRANT REPLICATION SLAVE ON *.* TO rpldb%;主库查看 binlog 名称和 Position 信息 SHOW MASTER STATUS\G获取到类似如下的信息 *************************** 1. row ***************************File: mysql-bin.000001Position: 841Binlog_Do_DB:Binlog_Ignore_DB: sys,mysql,performance_schema,information_schema
Executed_Gtid_Set: c5b4fcf9-3699-11ee-845e-000c29db9ce6:1-3从库配置主从下面的 ip 和用户名密码binlog 文件名称和 Position 都要替换成自己实际的信息 CHANGE MASTER TO MASTER_HOST172.72.0.135, MASTER_PORT13306, MASTER_USERrpldb, MASTER_PASSWORDrpldb007, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS841;启动复制 START SLAVE;查看 slave 情况 SHOW SLAVE STATUS\G看到这两个都是 yes表示主从复制已经建立成功了 Slave_IO_Running: YesSlave_SQL_Running: Yes主库配置互为主从关系 从库创建复制用户 CREATE USER rpldb% IDENTIFIED BY rpldb007;
GRANT REPLICATION SLAVE ON *.* TO rpldb%;从库查看 binlog 名称和 Position 信息 SHOW MASTER STATUS\G获取到类似如下的信息 *************************** 1. row ***************************File: mysql-bin.000001Position: 841Binlog_Do_DB:Binlog_Ignore_DB: sys,mysql,performance_schema,information_schema
Executed_Gtid_Set: 1d31ccb1-369d-11ee-bff2-000c29cd48ee:1-3主库配置互为主从下面的 ip 和用户名密码binlog 文件名称和 Position 都要替换成自己实际的信息 CHANGE MASTER TO MASTER_HOST172.72.0.136, MASTER_PORT13306, MASTER_USERrpldb, MASTER_PASSWORDrpldb007, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS841;启动复制 START SLAVE;查看 slave 情况 SHOW SLAVE STATUS\G看到这两个都是 yes表示主从复制已经建立成功了 Slave_IO_Running: YesSlave_SQL_Running: Yes验证主从复制 主库创建一个测试数据 -- 建库
CREATE DATABASE replication_test;
-- 进入到库里
USE replication_test;
-- 建表
CREATE TABLE replication_test.slt(num int auto_increment primary key,name char(10),job char(10),age int,salary int,descrip char(128)not null default
)charsetutf8;
-- 插入数据
INSERT INTO replication_test.slt(name, job, age, salary,descrip) VALUES
(Tom,teacher,30,20000,level2),
(frank,teacher,31,21000,level2),
(jack,teacher,32,22000,level2),
(jhon,asistant,23,8000,level3),
(hugo,manager,45,30000,level4),
(jinhisan,teacher,26,9000,level1);主库查看一下数据 SELECT * FROM replication_test.slt WHERE nameTom;获取到如下的信息 -------------------------------------------
| num | name | job | age | salary | descrip |
-------------------------------------------
| 1 | Tom | teacher | 30 | 20000 | level2 |
-------------------------------------------可以在从库看一下同样可以获取到一样的信息 模拟主库故障 通过停止主库的服务来模拟出现故障然后在从库继续写入数据验证主库修复后是否会建立数据同步 systemctl stop mysqld在从库内看同步情况可以看到 Slave_IO_Running 变成了 Connecting 状态 在从库内继续写入数据 INSERT INTO replication_test.slt(name, job, age, salary,descrip) VALUES
(Rose,teacher,30,20000,level1),
(Maybe,manager,28,30000,level4);重新启动宕机的 mysql 服务 systemctl start mysqld启动宕机 mysql 的复制 START SLAVE;查看 slave 情况看到 Slave_IO_Running 和 Slave_SQL_Running 都是 yes 即可 SHOW SLAVE STATUS\G宕机恢复的节点进行数据查看验证数据是否同步 SELECT * from replication_test.slt WHERE nameMaybe;可以正常获取到数据证明互为主从没毛病 --------------------------------------------
| num | name | job | age | salary | descrip |
--------------------------------------------
| 8 | Maybe | manager | 28 | 30000 | level4 |
--------------------------------------------