当前位置: 首页 > article >正文

MySQL源码编译部署主从及MHA高可用集群实战

一.Mysql的源码编译1.下载安装包wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz2.源码编译# 安装编译依赖的软件包包括C/C编译器(如gcc/gcc-c)、构建工具(如cmake, git, bison)和开发库(如openssl-devel, ncurses-devel) [rootmysql-node1 ~]# dnf install cmake3 gcc git bison openssl-devel ncurses-devel systemd-devel rpcgen.x86_64 libtirpc-devel-1.3.3-9.el9.x86_64.rpm gcc-toolset-12-gcc gcc-toolset-12-gcc-c gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc -y # 解压下载的MySQL源码压缩包 [rootmysql-node1 ~]# tar zxf mysql-boost-8.3.0.tar.gz # 进入解压后的源码目录并创建独立的编译构建目录 [rootmysql-node1 mysql-8.3.0]# mkdir build [rootmysql-node1 mysql-8.3.0]# cd build/ # 使用CMake配置MySQL的编译选项例如指定安装路径、数据目录、字符集、存储引擎等 [rootmysql-node1 build]# cmake3 .. -DCMAKE_INSTALL_PREFIX/usr/local/mysql -DMYSQL_DATADIR/data/mysql -DMYSQL_UNIX_ADDR/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE1 -DWITH_EXTRA_CHARSETSall -DDEFAULT_CHARSETutf8mb4 -DDEFAULT_COLLATIONutf8mb4_unicode_ci -DWITH_BOOSTbundled -DWITH_SSLsystem -DWITH_DEBUGOFF # 执行编译此过程耗时较长 [rootmysql-node1 build]# make3.部署mysql# 将编译好的MySQL二进制文件、库和脚本等安装到指定的/usr/local/mysql目录 [rootmysql-node1 build]# make install [rootmysql-node1 build]# cd /usr/local/mysql/ # 编辑当前用户的bash配置文件将MySQL的可执行文件路径添加到系统环境变量PATH中 [rootmysql-node1 mysql]# vim ~/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs export PATH$PATH:/usr/local/mysql/bin #设置mysql运行环境的环境变量 # 使环境变量配置立即生效 [rootmysql-node1 mysql]# source ~/.bash_profile # 创建一个名为mysql的系统用户用于运行MySQL服务进程 [rootmysql-node1 mysql]# useradd -r -s /sbin/nologin -M mysql # 创建MySQL的数据存储目录并将其所有者改为mysql用户 [rootmysql-node1 mysql]# mkdir -p /data/mysql [rootmysql-node1 mysql]# chown mysql.mysql /data/mysql/ # 创建并编辑MySQL的主配置文件设置数据目录和socket文件路径 [rootmysql-node1 ~]# vim /etc/my.cnf [mysqld] datadir/data/mysql socket/data/mysql/mysql.sock4.mysql数据结构初始化# 初始化MySQL数据目录创建系统数据库如mysql, sys等和表此步骤会生成root用户的初始随机密码 [rootmysql-node1 ~]# mysqld --initialize --usermysql5.启动mysql# 安装MySQL服务启动脚本所需的基础依赖包 [rootmysql-node1 support-files]# dnf install initscripts-10.11.8-4.el9.x86_64 -y # 将MySQL自带的启动脚本复制到系统的init.d目录以支持service/chkconfig命令管理 [rootmysql-node1 support-files]# cd /usr/local/mysql/support-files/ [rootmysql-node1 support-files]# cp -p mysql.server /etc/init.d/mysqld # 启动MySQL服务 [rootmysql-node1 support-files]# /etc/init.d/mysqld start Starting MySQL.Logging to /data/mysql/mysql-node1.err. . SUCCESS! # 设置MySQL服务在运行级别3和5下开机自动启动 [rootmysql-node1 support-files]# chkconfig --level 35 mysqld on6.mysql的安全初始化# 运行安全增强脚本以交互式方式设置root密码、移除匿名用户、禁止root远程登录、移除测试数据库等 [rootmysql-node1 ~]# mysql_secure_installation Securing the MySQL server deployment. Enter password for user root: The existing password for the user account root has expired. Please set a new password. New password: Re-enter new password: VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? Press y|Y for Yes, any other key for No: no Using existing password for root. Change the password for root ? ((Press y|Y for Yes, any other key for No) : no Remove anonymous users? (Press y|Y for Yes, any other key for No) : y Success. Normally, root should only be allowed to connect from localhost. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y Success. By default, MySQL comes with a database named test that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y - Dropping test database... Success. - Removing privileges on test database... Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done!二.Mysql集群实战--主从复制1.编写my.cnf 主配置文件# 在主服务器mysql-node1上编辑配置文件设置server-id为10并开启二进制日志 [rootmysql-node1 ~]# vim /etc/my.cnf [mysqld] datadir/data/mysql socket/data/mysql/mysql.sock symbolic-links0 server-id10 log-binmysql-bin # 在第一个从服务器mysql-node2上编辑配置文件设置唯一的server-id为20并开启二进制日志 [rootmysql-node2 ~]# vim /etc/my.cnf [mysqld] datadir/data/mysql socket/data/mysql/mysql.sock symbolic-links0 server-id20 log-binmysql-bin # 在第二个从服务器mysql-node3上编辑配置文件设置唯一的server-id为30并开启二进制日志 [rootmysql-node3 ~]# vim /etc/my.cnf [mysqld] datadir/data/mysql socket/data/mysql/mysql.sock symbolic-links0 server-id30 log-binmysql-bin # 在三台主机上重启MySQL服务以使新的配置文件生效 [rootmysql-node1~3 ~]# /etc/init.d/mysqld restart2.建立同步时需要用到的数据库账号# 在主服务器上登录MySQL查看默认身份验证插件 [rootmysql-node1 ~]# mysql -uroot -ptest ... mysql SHOW VARIABLES LIKE default_authentication_plugin; ------------------------------------------------------ | Variable_name | Value | ------------------------------------------------------ | default_authentication_plugin | caching_sha2_password | ------------------------------------------------------ 1 row in set (0.00 sec) # 创建一个名为‘test’的用户使用mysql_native_password插件进行身份验证以便于主从复制 mysql create user test% identified with mysql_native_password by test; #建立用户 Query OK, 0 rows affected (0.04 sec) mysql select User from mysql.user; ------------------ | User | ------------------ | test | | mysql.infoschema | | mysql.session | | mysql.sys | | root | ------------------ 5 rows in set (0.00 sec) # 授予‘test’用户复制相关的权限 mysql GRANT replication slave ON *.* to test%; #给用户授权 Query OK, 0 rows affected (0.00 sec) mysql SHOW GRANTS FOR test%; --------------------------------------------- | Grants for test% | --------------------------------------------- | GRANT REPLICATION SLAVE ON *.* TO test%| --------------------------------------------- 1 row in set (0.00 sec) # 在从服务器上测试使用新创建的‘test’用户能否成功连接到主服务器 [rootmysql-node2 ~]# mysql -utest -ptest -h172.25.254.10 ... mysql quit3.配置数据库一主一从#在主服务器上查看当前的二进制日志文件状态记录文件名File和位置Position供从服务器连接时使用 mysql SHOW MASTER STATUS; ------------------------------------------------------------------------------- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | ------------------------------------------------------------------------------- | mysql-bin.000001 | 659 | | | | ------------------------------------------------------------------------------- # 在第一个从服务器mysql-node2上配置主从复制 [rootmysql-node2 ~]# mysql -uroot -ptest ... # 执行CHANGE MASTER TO命令指定主服务器的IP、用户、密码以及要开始复制的二进制日志位置 mysql CHANGE MASTER TO MASTER_HOST172.25.254.10,MASTER_USERtest,MASTER_PASSWORDtest,MASTER_LOG_FILEmysql-bin.000001,MASTER_LOG_POS659; Query OK, 0 rows affected, 8 warnings (0.03 sec) # 启动从服务器上的复制线程 mysql start slave; Query OK, 0 rows affected, 1 warning (0.03 sec) # 查看从服务器的复制状态 mysql show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 172.25.254.10 Master_User: test Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 659 Relay_Log_File: mysql-node2-relay-bin.000002 Relay_Log_Pos: 328 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes #I/O线程运行中表示正在从主服务器接收二进制日志 Slave_SQL_Running: Yes #SQL线程运行中表示正在执行中继日志中的事件4.测试# 在主服务器上创建一个新的数据库test [rootmysql-node1 ~]# mysql -uroot -ptest mysql show databases; ... mysql create database test; Query OK, 1 row affected (0.00 sec) mysql SHOW DATABASES; -------------------- | Database | -------------------- | information_schema | | mysql | | performance_schema | | sys | | test | -------------------- 5 rows in set (0.00 sec) # 在从服务器上检查是否已同步创建了test数据库 [rootmysql-node2 ~]# mysql -uroot -ptest mysql show databases; -------------------- | Database | -------------------- | information_schema | | mysql | | performance_schema | | sys | | test | -------------------- 5 rows in set (0.00 sec)5.向当前一主一从中加入新的数据库# 在主服务器上模拟在主从复制已运行一段时间后在主库创建一个表并插入数据 [rootmysql-node1 ~]# mysql -uroot -ptest mysql CREATE TABLE test.userlist ( - name VARCHAR(10) not null, - pass VARCHAR(50) not null - ); Query OK, 0 rows affected (0.01 sec) mysql INSERT INTO test.userlist values (user1,123); Query OK, 1 row affected (0.00 sec) mysql SELECT * FROM test.userlist; ------------- | name | pass | ------------- | user1 | 123 | ------------- 1 row in set (0.01 sec) # 准备将新的从服务器mysql-node3加入集群需要先手动同步现有数据 # 使用mysqldump导出主服务器上test数据库的数据 [rootmysql-node1 ~]# mysqldump -uroot -p test test.sql # 将导出的数据文件传输到新的从服务器 [rootmysql-node1 ~]# scp test.sql root172.25.254.30:/root/ # 在新的从服务器上先创建同名数据库然后导入数据 [rootmysql-node3 ~]# mysql -uroot -ptest -e create database test; [rootmysql-node3 ~]# mysql -uroot -ptest test test.sql # 验证数据已成功导入新的从服务器 [rootmysql-node3 ~]# mysql -uroot -ptest mysql select * from test.userlist; ------------- | name | pass | ------------- | user1 | 123 | ------------- 1 row in set (0.00 sec)6.将新库加入主从结构中# 在主服务器上再次查看当前二进制日志位置作为新从服务器开始复制的起点 mysql SHOW MASTER STATUS; ------------------------------------------------------------------------------- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | ------------------------------------------------------------------------------- | mysql-bin.000001 | 1415 | | | | ------------------------------------------------------------------------------- # 在新的从服务器mysql-node3上配置主从复制使用上面查询到的日志文件和位置 [rootmysql-node3 ~]# mysql -uroot -ptest mysql CHANGE MASTER TO MASTER_HOST172.25.254.10,MASTER_USERtest,MASTER_PASSWORDtest,MASTER_LOG_FILEmysql-bin.000001,MASTER_LOG_POS1415; mysql start slave; Query OK, 0 rows affected, 1 warning (0.04 sec) # 验证新从服务器的复制状态 mysql show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 172.25.254.10 Master_User: test Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 1415 Relay_Log_File: mysql-node3-relay-bin.000002 Relay_Log_Pos: 328 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes7.测试一主两从# 在主服务器上插入新的数据 mysql INSERT INTO timinglee.userlist values (user2,123); # 在**新的**从服务器上查看数据确认复制成功 mysql select * from timinglee.userlist; ------------- | name | pass | ------------- | user1 | 123 | | user2 | 123 | ------------- 2 rows in set (0.00 sec)三.MySQL MHA 高可用集群环境配置与操作1.MySQL-MHA 高可用集群环境配置准备工作 - 保证数据一致性所有MySQL节点此步骤的目的是清空现有数据并重新初始化一个全新的、数据同步的主从复制环境为MHA的搭建准备干净的环境。# 在主节点(mysql-node1)上停止MySQL服务清空数据目录并重新初始化数据库 [rootmysql-node1 ~]# /etc/init.d/mysqld stop [rootmysql-node1 ~]# rm -fr /data/mysql/* [rootmysql-node1 ~]# mysqld --initialize --user mysql # 启动MySQL服务并运行安全初始化向导 [rootmysql-node1 ~]# /etc/init.d/mysqld start Starting MySQL.Logging to /data/mysql/mysql-node1.err. SUCCESS! [rootmysql-node1 ~]# mysql_secure_installation # 创建用于主从复制的专用用户test [rootmysql-node1 ~]# mysql -uroot -ptest -e create user test% identified with mysql_native_password by test; # 授予该用户复制权限 [rootmysql-node1 ~]# mysql -uroot -ptest -e GRANT replication slave ON *.* to test%; # 查看主库状态记录File和Position或GTID用于配置从库 [rootmysql-node1 ~]# mysql -uroot -ptest -e show master status; # 在从库节点mysql-node2, mysql-node3上配置主从复制 # 指向主库IP (172.25.254.10)并使用上面创建的复制用户 [rootmysql-node2~3 ~]# mysql -uroot -ptest -e CHANGE MASTER TO MASTER_HOST172.25.254.10, MASTER_USERtest, MASTER_PASSWORDtest, MASTER_AUTO_POSITION1; # 启动从库复制线程 [rootmysql-node2~3 ~]# mysql -uroot -ptest -e start slave; # 检查从库复制状态 [rootmysql-node2~3 ~]# mysql -uroot -ptest -e show slave status\G;1.1 在所有主机中安装MHA相应软件在MHA管理节点(mha)上安装MHA Manager和Node软件包并在所有MySQL节点上安装Node软件包。Manager负责监控和故障转移Node运行在每个MySQL服务器上用于状态上报和指令执行。# 在MHA管理节点上解压软件包并安装Perl依赖 [rootmha ~]# unzip MHA-7.zip [rootmha ~]# cd MHA-7/ [rootmha MHA-7]# dnf install perl perl-DBD-MySQL perl-CPAN -y # 进入CPAN交互式环境安装MHA所需的Perl模块 [rootmha MHA-7]# cpan cpan[1] install Config::Tiny cpan[2] install Log::Dispatch cpan[3] install Mail::Sender cpan[4] install Parallel::ForkManager cpan[5] exit # 验证Perl模块是否安装成功 [rootmha ~]# perl -MConfig::Tiny -e print OK\n [rootmha ~]# perl -MLog::Dispatch -e print OK\n [rootmha ~]# perl -MMail::Sender -e print OK\n [rootmha ~]# perl -MParallel::ForkManager -e print OK\n # 在MHA管理节点上安装Manager和Node的RPM包 [rootmha MHA-7]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps # 在所有MySQL节点上仅安装Node的RPM包 [rootmha MHA-7]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps1.2 在所有MySQL节点从库中分发并安装Node软件从MHA管理节点将Node软件包远程复制到各个MySQL节点并安装实现批量部署。# 通过循环将Node包scp到各个MySQL节点172.25.254.10, .20, .30并远程执行安装 [rootmha MHA-7]# for i in 10 20 30 do scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root172.25.254.$i:/mnt ssh -l root 172.25.254.$i rpm -ivh /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps done1.3 修改MHA-Manager中的检测代码注释: 修改Perl模块文件以适配特定MySQL版本格式解决可能出现的版本解析问题。[rootmha MHA-7]# vim /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm # 找到并修改 parse_mysql_major_version 函数确保版本号解析正确 # 原始代码 (第199-203行) 被注释或修改 # 修改后的函数如下 sub parse_mysql_major_version($) { my $str shift; my nums $str ~ m/(\d)/g; my $result sprintf( %03d%03d, $nums[0]//0, $nums[1]//0); return $result; }1.4 为MHA建立远程登录用户在Master数据库上创建一个具有完全权限的root用户允许任意主机连接供MHA Manager在故障切换时管理数据库。# 在主库172.25.254.10的MySQL中执行 mysql create user root% identified with mysql_native_password by test; mysql GRANT ALL ON *.* TO root% ;5. 生成MHA-manager的配置文件模板创建MHA的配置文件目录并将示例配置文件合并生成一个默认的配置文件模板。[rootmha mha4mysql-manager-0.58]# mkdir /etc/masterha/ -p [rootmha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz [rootmha MHA-7]# cd mha4mysql-manager-0.58 [rootmha mha4mysql-manager-0.58]# cat samples/conf/masterha_default.cnf samples/conf/app1.cnf /etc/masterha/app1.cnf6. 修改配置文件编辑生成的配置文件定义集群名称、数据库访问凭据、服务器列表、角色和监控参数。[rootmha mha4mysql-manager-0.58]# vim /etc/masterha/app1.cnf # 配置文件内容如下 [server default] userroot # MySQL管理用户 passwordtest # 对应用户密码 ssh_userroot # SSH登录用户用于节点间通信 repl_usertest # 主从复制用户 repl_passwordtest # 主从复制用户密码 master_binlog_dir /data/mysql # Master的binlog目录 remote_workdir/tmp # 远程节点工作目录 secondary_check_script masterha_secondary_check -s 172.25.254.10 -s 172.25.254.20 # 二次检查脚本 ping_interval3 # ping检测间隔秒 # 以下为可选的脚本配置用于VIP漂移、关机、报告等此处被注释 # master_ip_failover_script /script/masterha/master_ip_failover # shutdown_script /script/masterha/power_manager # report_script /script/masterha/send_report # master_ip_online_change_script /script/masterha/master_ip_online_change manager_workdir/etc/masterha # Manager工作目录 manager_log/etc/masterha/mha.log # Manager日志文件 # 定义集群中的MySQL服务器 [server1] hostname172.25.254.10 # 主库IP candidate_master1 # 是候选主库故障时可提升为主 check_repl_delay0 # 忽略复制延迟检查 [server2] hostname172.25.254.20 # 从库1 IP candidate_master1 # 是候选主库 check_repl_delay0 [server3] hostname172.25.254.30 # 从库2 IP no_master1 # 不能作为主库例如用于备份或特定用途7. 检测环境在启动MHA Manager之前必须进行两个关键检查确保SSH免密登录和MySQL主从复制状态正常。# 1. 检查MHA管理节点到所有MySQL节点之间的SSH无密码连接 [rootmha mha4mysql-manager-0.58]# masterha_check_ssh --conf/etc/masterha/app1.cnf # ... 输出应显示 All SSH connection tests passed successfully. # 2. 检查MySQL主从复制集群的配置和运行状态 [rootmha mha4mysql-manager-0.58]# masterha_check_repl --conf/etc/masterha/app1.cnf # ... 输出应显示 MySQL Replication Health is OK. # 并展示出当前的拓扑结构172.25.254.10 (Master) - 172.25.254.20, 172.25.254.30 (Slaves)8. 在所有MySQL节点上安装MHA-Node软件依赖每个运行MHA-Node的MySQL服务器也需要安装与Manager节点相同的Perl模块以确保Node脚本能正常运行。# 在所有的数据库主机mysql-node1~3上安装Perl依赖 [rootmysql-node1~3 ~]# dnf install perl perl-DBD-MySQL perl-CPAN -y # 解压CPAN模块包如果存在离线包 [rootmysql-node1~3 ~]# tar zxf cpan_plugin.tar.gz # 进入CPAN安装所需的Perl模块步骤同Manager节点 [rootmysql-node1~3 ~]# cpan # ... 安装 Config::Tiny, Log::Dispatch, Mail::Sender, Parallel::ForkManager # 同样进行模块安装成功验证 [rootmysql-node1~3 ~]# perl -MConfig::Tiny -e print OK\n ...2.集群切换操作2.1手动切换Master无故障切换在线切换在主库运行正常时手动将其角色切换到另一台候选主库如172.25.254.20原主库降级为新主库的从库。适用于计划内维护。# 切换前的初始状态20和30都是从库复制来自10 [rootmysql-node2 ~]# mysql -uroot -ptest -e show slave status\G; | head -n 10 # Master_Host: 172.25.254.10 # 执行在线切换命令将主库从10切换到20并将原主库10设置为20的从库(--orig_master_is_new_slave) [rootmha ~]# masterha_master_switch \ --conf/etc/masterha/app1.cnf \ --master_statealive \ --new_master_host172.25.254.20 \ --new_master_port3306 \ --orig_master_is_new_slave \ --running_updates_limit10000 # 命令执行过程中会进行交互式确认并显示详细的切换步骤和状态。 # 切换后验证10和30都应指向20作为主库 [rootmysql-node1 ~]# mysql -uroot -ptest -e show slave status\G; | head -n 15 # Master_Host: 172.25.254.20 [rootmysql-node3 ~]# mysql -uroot -ptest -e show slave status\G; | head -n 15 # Master_Host: 172.25.254.20Master故障后切换故障转移在主库172.25.254.10发生故障宕机后手动触发故障转移流程将备选主172.25.254.20提升为新的主库。# 模拟主库故障后执行故障转移命令 [rootmha ~]# masterha_master_switch \ --master_statedead \ --conf/etc/masterha/app1.cnf \ --dead_master_host172.25.254.10 \ --dead_master_port3306 \ --new_master_host172.25.254.20 \ --new_master_port3306 \ --ignore_last_failover # 命令会检测到10已宕机并提示用户确认是否继续。确认后MHA将20提升为主库并尝试让30去复制20。 # 查看切换结果 [rootmysql-node3 ~]# mysql -uroot -ptest -e show slave status\G; | head -n 15 # Master_Host: 172.25.254.20 # 故障恢复后处理 # 1. 移除MHA为防止脑裂产生的锁文件 [rootmha ~]# ls /etc/masterha/ # 会看到 app1.failover.complete 文件 [rootmha ~]# rm -fr /etc/masterha/app1.failover.complete # 2. 修复原主库10并重新加入集群作为20的从库 [rootmysql-node1 ~]# /etc/init.d/mysqld start [rootmysql-node1 ~]# mysql -uroot -ptest -e CHANGE MASTER TO MASTER_HOST172.25.254.20, MASTER_USERtest, MASTER_PASSWORDtest, MASTER_AUTO_POSITION1; [rootmysql-node1 ~]# mysql -uroot -ptest -e start slave; [rootmysql-node1 ~]# mysql -uroot -ptest -e show slave status\G; | head -n 15 # Master_Host: 172.25.254.202. 自动切换启动MHA Manager监控进程当检测到主库故障时自动执行故障转移无需人工干预。# 为了方便观察日志可以先清空旧日志并实时查看 [rootmha ~]# /etc/masterha/*.log [rootmha ~]# watch -n 1 cat /etc/masterha/mha.log # 打开另一个终端执行 # 在第一个终端以后台进程方式启动MHA Manager监控 [rootmha ~]# masterha_manager --conf/etc/masterha/app1.cnf [1] 运行中 masterha_manager --conf/etc/masterha/app1.cnf # 模拟主库故障观察自动切换过程 [rootmysql-node1 ~]# /etc/init.d/mysqld stop # 此时在 watch 终端可以看到MHA检测到主库宕机并自动开始执行故障转移流程最终将20提升为新主库。

相关文章:

MySQL源码编译部署主从及MHA高可用集群实战

一.Mysql的源码编译1.下载安装包wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz2.源码编译# 安装编译依赖的软件包,包括C/C编译器(如gcc/gcc-c)、构建工具(如cmake, git, bison)和开发库(如openssl-devel, ncurses-devel) [roo…...

ArcGIS Pro像素编辑器实战:5种高效影像处理技巧(附真实案例)

ArcGIS Pro像素编辑器实战:5种高效影像处理技巧(附真实案例) 遥感影像处理是GIS工程师日常工作中的重要环节,而ArcGIS Pro的像素编辑器就像一把精准的手术刀,能帮助我们对影像数据进行精细化处理。不同于传统的批量处理…...

别再只调PID了!聊聊机器人控制里‘运动控制’和‘动态控制’到底有啥区别(附结构图解析)

机器人控制进阶:运动控制与动态控制的本质差异与工程选择 刚接触机器人控制的工程师们,常常会被各种控制理论绕得晕头转向。记得我第一次调试机械臂时,导师只丢下一句"先调PID参数试试",结果整整三天都在和震荡、超调搏…...

Axure实战:用IFrame+JS搞定父子页面菜单联动(附完整代码)

Axure高级交互设计:基于IFrame与JavaScript的菜单联动技术解析 在原型设计工具中实现父子页面间的动态交互一直是用户体验设计师面临的挑战。Axure作为行业领先的原型设计工具,虽然提供了丰富的内置交互功能,但在处理复杂场景时往往需要借助外…...

League Akari:英雄联盟终极智能助手完整使用指南

League Akari:英雄联盟终极智能助手完整使用指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否厌倦了在英雄联…...

xshell连接VMware虚拟机

一、准备工作 确保虚拟机网络配置正确 在 VMware 中,选择虚拟机 -> 设置 -> 网络适配器。推荐使用 NAT 模式(默认)或 桥接模式,确保虚拟机可访问外部网络。 启动虚拟机并获取 IP 地址 启动虚拟机(如 CentOS、Ubu…...

解锁3D打印新境界:Blender 3MF插件全面指南 [特殊字符]

解锁3D打印新境界:Blender 3MF插件全面指南 🚀 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在当今的3D打印工作流中,选择合适的文件…...

linux-系统函数

Linux 系统函数详解 Linux 系统函数是用户程序与内核交互的底层接口&#xff0c;通过系统调用&#xff08;syscall&#xff09;实现。以下是核心分类及典型函数&#xff1a; 1. 文件操作函数 #include <fcntl.h> int open(const char *pathname, int flags, mode_t mode)…...

Blender3mfFormat插件:3MF文件处理全攻略

Blender3mfFormat插件&#xff1a;3MF文件处理全攻略 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 一、项目核心价值解析 Blender3mfFormat作为Blender的专业级3MF文件…...

单片机电源电路设计:从3.3V到5V系统详解

1. 单片机电源电路设计基础 作为一名电子工程师&#xff0c;我深知电源电路设计在单片机系统中的重要性。电源就像人体的心脏&#xff0c;为整个系统提供稳定可靠的能量供应。在多年的项目实践中&#xff0c;我发现很多初学者往往忽视了电源设计的重要性&#xff0c;导致系统不…...

计算机毕业设计springboot智能汽车租赁系统 基于SpringBoot的智慧出行车辆共享服务平台设计与实现 SpringBoot框架下城市智能租车与车辆调度管理系统开发

计算机毕业设计springboot智能汽车租赁系统 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着城市化进程加速推进和共享经济模式蓬勃发展&#xff0c;传统汽车租赁行业面临运营…...

当BFD不可用时:用华为NQA+静态路由实现低成本链路监测(含ICMP测试例详解)

华为NQA静态路由&#xff1a;低成本链路监测的实战指南 在传统企业网络中&#xff0c;静态路由因其配置简单、资源消耗低的特点&#xff0c;常被用于小型网络或边缘设备互联。但静态路由最大的痛点在于缺乏自动检测机制——当链路出现故障时&#xff0c;管理员往往要等到用户投…...

3步解放双手:崩坏星穹铁道自动化工具让资源收集效率提升200%

3步解放双手&#xff1a;崩坏星穹铁道自动化工具让资源收集效率提升200% 【免费下载链接】StarRailAssistant 崩坏&#xff1a;星穹铁道自动化 | 崩坏&#xff1a;星穹铁道自动锄大地 | 崩坏&#xff1a;星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: https://gitco…...

ILI9341 TFT驱动库:裸机SPI显示驱动设计与优化

1. SPI_TFT_ILI9341 库概述SPI_TFT_ILI9341 是一个面向嵌入式平台的轻量级图形驱动库&#xff0c;专为基于 ILI9341 显示控制器的 2.4 英寸、240320 分辨率 SPI 接口 TFT-LCD 模块设计。该库不依赖操作系统&#xff0c;可直接运行于裸机环境&#xff08;Bare Metal&#xff09;…...

Duix.Avatar本地部署实战:从零搭建AI数字人视频生成平台

Duix.Avatar本地部署实战&#xff1a;从零搭建AI数字人视频生成平台 【免费下载链接】Duix-Avatar 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar 你是否希望在自己的电脑上拥有一个专属的AI数字人助手&#xff1f;Duix.Avatar作为硅基智能推出的开源…...

OpenClaw开源贡献:Qwen3.5-4B-Claude技能PR提交流程

OpenClaw开源贡献&#xff1a;Qwen3.5-4B-Claude技能PR提交流程 1. 为什么要为OpenClaw贡献技能 去年冬天&#xff0c;我在尝试用OpenClaw自动化处理技术文档时&#xff0c;发现现有的技能库缺少对结构化推理任务的支持。当时我偶然在GitHub上看到了Qwen3.5-4B-Claude这个专门…...

Logisim实战:8位可控加减法电路设计与溢出检测

1. 从零开始理解8位可控加减法电路 第一次接触数字电路设计的朋友可能会觉得"8位可控加减法电路"听起来很高深&#xff0c;其实它的核心原理就像我们小时候用的算盘。想象一下&#xff0c;你有一个8档的算盘&#xff0c;每档只能表示0或1&#xff08;对应算珠的上或下…...

计算机基础:从半导体到CPU指令执行全解析

1. 从半导体到逻辑门&#xff1a;计算机的物理基础 计算机的核心部件CPU本质上是由无数微小开关组成的精密电路&#xff0c;而这些开关的物理基础就是半导体材料。半导体之所以被称为"半导体"&#xff0c;是因为它的导电性介于导体和绝缘体之间。这种特性使得我们可以…...

foobar2000 DUI界面深度解析:foobox-cn技术架构与实战配置完整指南

foobar2000 DUI界面深度解析&#xff1a;foobox-cn技术架构与实战配置完整指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobox-cn是针对foobar2000播放器开发的现代化DUI&#xff08;默认用户…...

如何永久保存微信聊天记录?WeChatMsg完整备份方案详解

如何永久保存微信聊天记录&#xff1f;WeChatMsg完整备份方案详解 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

ROS2时间处理避坑指南:从rclcpp::Time到header.stamp的5种转换方法

ROS2时间处理避坑指南&#xff1a;从rclcpp::Time到header.stamp的5种转换方法 在ROS2开发中&#xff0c;时间戳处理看似简单却暗藏玄机。许多开发者在将rclcpp::Time转换为header.stamp时踩过坑——从版本兼容性问题到精度丢失&#xff0c;再到线程安全陷阱。本文将带您深入理…...

HarmonyOS6 半年磨一剑 - RcCheckbox 实战下篇:问卷调查表单与参数使用指南

文章目录前言一、场景&#xff1a;问卷调查表单1.1 需求分析1.2 数据结构设计1.3 表单校验联动1.4 第三题&#xff1a;计数器与数量限制的配合1.5 结果页与状态重置1.6 三道题的样式差异化对比1.7 完整代码二、参数使用频率参考2.1 高频参数&#xff08;必须掌握&#xff09;2.…...

HarmonyOS6 半年磨一剑 - RcCheckbox 组件事件体系与交互逻辑

文章目录前言一、点击处理链1.1 核心点击处理函数1.2 两个点击入口二、三事件分层设计2.1 三个事件的对比2.2 事件使用示例三、labelDisabled 局部禁止机制3.1 设计意图3.2 适用场景四、RcCheckboxGroup 的数量限制拦截4.1 min/max 拦截机制4.2 数量限制示例总结前言 一个看似…...

AI绘画辅助:OpenClaw+ollama-QwQ-32B批量处理Stable Diffusion提示词

AI绘画辅助&#xff1a;OpenClawollama-QwQ-32B批量处理Stable Diffusion提示词 1. 为什么需要AI绘画工作流优化 作为一个经常使用Stable Diffusion进行创作的数字艺术家&#xff0c;我一直在寻找提升工作效率的方法。最让我头疼的不是模型本身&#xff0c;而是如何将脑海中的…...

别再只用DoDragDrop了!手把手教你用WPF实现一个能拖拽合并数据的自定义控件(附完整源码)

WPF高级拖拽交互实战&#xff1a;从原生API局限到自定义控件设计 在构建现代桌面应用时&#xff0c;流畅自然的拖拽交互往往能极大提升用户体验。WPF虽然提供了基础的DoDragDrop API&#xff0c;但当我们需要实现复杂场景如卡片合并、动态数据交换时&#xff0c;原生方案就显得…...

ESP32 RMT实现MilesTag 2激光对抗协议

1. milesTag库概述&#xff1a;基于ESP32 RMT外设的MilesTag 2协议激光对抗系统实现milesTag是一个专为Arduino平台设计的轻量级嵌入式库&#xff0c;其核心目标是为开发者提供一套可复用、高精度、低CPU开销的MilesTag 2协议实现方案&#xff0c;用于构建高性能激光对抗&#…...

突破B站字幕壁垒:BiliBiliCCSubtitle全流程解决方案

突破B站字幕壁垒&#xff1a;BiliBiliCCSubtitle全流程解决方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 副标题&#xff1a;解决跨平台字幕迁移难题 - 本地…...

ESP8266轻量级按钮状态MQTT同步库

1. 项目概述BartOS-button-online是为 BartOS 物联网操作系统设计的轻量级按钮状态在线同步库&#xff0c;专用于资源受限的 ESP8266 平台&#xff08;如 ESP-01、NodeMCU&#xff09;&#xff0c;并兼容 Arduino Core for ESP8266 开发环境。该库不提供独立的 UI 或 Web 服务&…...

Sentinel-1 SAR数据预处理后,如何在QGIS里做地表变化监测?一个完整案例

Sentinel-1 SAR数据在QGIS中的地表变化监测实战指南 当你在SNAP中完成了Sentinel-1 SAR数据的预处理&#xff0c;获得了地理编码后的后向散射系数图&#xff0c;这只是整个分析流程的开始。真正的挑战在于如何将这些数据转化为可操作的地表变化信息。本文将带你深入探索从预处理…...

西门子1200水处理程序全解析

西门子1200水处理程序 包含1200PLC通讯点表&#xff0c;CAD原理图&#xff0c;操作说明。 触摸屏包含了组态画面&#xff0c;操作画面&#xff0c;参数设置画面&#xff0c;报警记录等。 V16以上可以打开最近在搞西门子1200的水处理程序项目&#xff0c;今天来和大家分享一下其…...