配置MySQL主从,配置MySQL主主 +keeplive高可用

在大数据-Hadoop体系中

配置MySQL主主+keeplive高可用

注意:这个是我两年前的word文档,可以当作参考文档有个思路参考一下,但是里面可能有些地方有误

另外 :关于一些企业级实战技术可以参考这篇mysql 物理备份 MySQL 全量备份 增量备份 差异备份 日志备份万字长文 1.3万字-CSDN博客文章浏览阅读899次,点赞26次,收藏25次。版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明注意,通常 完备增备,日志(binlog)备,结合使用 差异则根据具体情况选用。此备份过程属于公司 常用的单个数据库备份技术中的mysql 物理备份 MySQL 全量备份 增量备份 差异备份 日志备份至于单个数据库备份技术中的逻辑备份和混合数据库及其备份技术,本人会另外开文章再进行说明https://blog.csdn.net/qq_61414097/article/details/141228466

另外,我当年参考了这几位老哥的文档

1,Mysql—主从、主主、主备模式 - 掘金 (juejin.cn)

https://juejin.cn/post/7205007227560509497

2,mysql配置主从数据库(超简单)

https://juejin.cn/post/7205007227560509497

MySQL主主数据同步_mysql主主同步-CSDN博客

3.

史上最简单keepalived安装教程(亲测可用并实际应用于生产)_yum keepalived_Elon的随笔的博客-CSDN博客

前言

高可用性和故障转移的方式?

采用哪些不同的方法来实现高可用性和故障转移?

以下是实现高可用性和故障转移的常见方法:

1. 主从复制:使用一个主服务器和多个从服务器来复制数据并提供冗余功能。如果主服务器发生故障,一个从服务器可以成为新的主服务器,并继续提供服务。

2. 负载均衡器:使用专用硬件设备或软件来平衡负载并确保故障转移。这些设备可以检测服务器状态,并在需要时将请求路由到其他可用服务器上。

3. 集群:使用多个服务器来提供同一应用程序,并且在其中任何一个节点发生故障时,应用程序可以继续运行。集群包括多种类型,例如高可用性集群、负载均衡集群和容器编排集群等。

4. DNS轮询: 使用DNS服务器返回不同的IP地址来平衡负载。如果其中一个服务器发生故障,DNS服务器可以将请求路由到另一个服务器上。

5. 容器编排:使用像Kubernetes、Docker Swarm或Apache Mesos等容器编排和管理工具来处理应用程序容器的高可用性和故障转移。这些工具可以自动检测故障并重新启动容器,并在需要时将它们迁移到其他节点上。

需要注意的是,以上方法都有自己的优点和限制,因此您需要根据您的应用程序需求和基础架构环境选择最适合您的解决方案。同时,在使用任何一种方法之前,请务必备份所有相关数据,并小心地测试和验证您的配置以确保它们可靠和稳定。

采用MySQL主主+keeplived并配置DNS轮询和负载均衡来实现高可用性和故障转移

由于我的应用程序需要使用多个IP地址依赖于其他网络资源(例如DNS记录网络数据,云数据存储等等),则可能需要采用不同的方法来实现高可用性和故障转移

因此,我在Hadoop集群中配置有关keepalived的DNS轮询和负载均衡除此之外,我还采用了MySQL主主+keeplived的方式完成实现高可用性和故障转移。

原理:Mysql—单点、主主、主备主从模式原理

1,图示:MySQL单点、双主(主主) 、主备、主从架构方案思路

2,思路:文字MySQL双主(主主)架构方案思路是:

1.两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;
2.masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;
3.两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务);
4.所有提供服务的从服务器与masterB进行主从同步(双主多从);
5.建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式);

这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;

但是也有几个不足的地方:

1.masterB可能会一直处于空闲状态(可以用它当从库,负责部分查询);
2.主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,这样可能会造成一定程度的同步延时;

架构的简易图如下:

​编辑

  1. 配置ip
  2. 配置yum源
  3. 配置Hadoop
  4. 配置MySQL

一、添加 yum 源

1.1 下载 MySQL 5.7 的 rpm 包:

wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

1.2 安装 rpm 包:

sudo rpm -ivh mysql57-community-release-el7-9.noarch.rpm

安装完毕后,会在 /etc/yum.repos.d/ 目录下生成两个 Repo 文件:

mysql-community.repo

mysql-community-source.repo

二、安装 MySQL

2.1 执行 yum 安装命令:

sudo yum install mysql-server

在安装过程中,会有提示确认信息,一般一路输入 y 即可。

如果出现以下错误,意味着在安装 MySQL 5.7 时,缺少公钥文件。

请尝试使用以下命令导入 MySQL 的 GPG 密钥,并重新执行安装命令:

sudo rpm --import http://repo.mysql.com/RPM-GPG-KEY-mysql-2022

这将为您导入 MySQL 的 GPG 密钥,作为验证 MySQL 资源的一种方式。

如果看到以下输出,则表明安装成功:

Complete!

三、启动 MySQL

3.1 启动 MySQL:

systemctl start mysqld

3.2 查看 MySQL 状态:

systemctl status mysqld

3.3 重启 MySQL:

systemctl restart mysqld

3.4 停止 MySQL:

systemctl stop mysqld

3.5 设置开机启动:

systemctl enable mysqld

systemctl daemon-reload

四、登录 MySQL

4.1 获取 root 用户在首次登录时生成的临时密码:

grep 'temporary password' /var/log/mysqld.log

命令的输出会显示 root 用户在首次登录时生成的临时密码。例如:

[Note] A temporary password is generated for root@localhost: eKgLclnYq1;K

其中 eKgLclnYq1;K 就是临时密码。

4.2 登录 MySQL:

mysql -u root -p

通过上述命令登录 MySQL 后,需要修改 root 用户的临时密码,否则会在执行部分命令时提示错误,例如执行 show databases 命令,会出现以下错误信息:

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

4.3 修改 root 用户密码:Password123$ 或 P@ssword123

ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssword123';

其中,新密码 是您设置的新密码。请注意,MySQL 密码策略要求密码长度大于 8 个字符,包含大小写字母、数字及其它字符(如标点符号)。

注意:mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements错误,如下图所示:

通过msyql环境变量可以查看密码策略的相关信息:

mysql> show variables like '%password%';

注意:mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements错误,如下图所示:

通过msyql环境变量可以查看密码策略的相关信息:

mysql> show variables like '%password%';

4.4 查询 及修改禁用MySQL 密码策略:

SHOW VARIABLES LIKE 'validate_password%';

命令的输出将会显示 MySQL 密码策略规则,包括密码长度、大小写字母、数字及其它字符的要求等。例如:

validate_password_policy:密码策略,默认为MEDIUM策略
validate_password_dictionary_file:密码策略文件,策略为STRONG才需要
validate_password_length:密码最少长度
validate_password_mixed_case_count:大小写字符长度,至少1个
validate_password_number_count :数字至少1个
validate_password_special_char_count:特殊字符至少1个
上述参数是默认策略MEDIUM的密码检查规则。

这意味着,密码长度必须大于 8 个字符,且密码中必须包含大小写字母、数字及至少一个特殊字符,如 !@#$ 等。请根据实际情况设置新密码。

修改密码策略

在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略

# 选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件

validate_password_policy=0

如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:

validate_password = off

重新启动mysql服务使配置生效:

systemctl restart mysqld

4.5 检查mysql源是否安装成功

yum repolist enabled | grep "mysql.*-community.*"

表示安装成功

4.6如果MySQL5.7无法远程连接

则,添加远程登录用户以便于远程MySQL,,若还是无法连接,可能CentOS7还要开启MySQL远程访问

默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接

我们需要增加root允许其他主机进行连接,执行下面这段语句:123456为连接密码,%为任意主机,就是任意主机可以通过用户名root + 密码12345 进行连接,你也可以指定只允许某IP的主机进行连接。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'P@ssword123';

 执行完上面的语句之后还不会立即生效,还需要让mysql重新加载用户权限:

flush privileges;

或者添加一个允许远程连接的帐户,为了安全起见,我添加一个新的帐户:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'yangxin'@'%' IDENTIFIED BY 'Yangxin0917!' WITH GRANT OPTION;

flush privileges;

可以用任意一台电脑的navicat进行连接了,如果还是无法连接,检查是否防火墙屏蔽了mysql端口的远程访问权限

如果是

CentOS7开启MySQL远程访问

CentOS7这个版本的防火墙默认使用的是firewall,与之前的版本使用iptables不一样。按如下方便配置防火墙:

1、关闭防火墙:sudo systemctl stop firewalld.service

2、关闭开机启动:sudo systemctl disable firewalld.service

3、安装iptables防火墙

执行以下命令安装iptables防火墙:sudo yum install iptables-services

  1. 配置iptables防火墙,打开指定端口

(和CentOS6一样开放MySQL访问端口3306)

修改防火墙配置文件

vi /etc/sysconfig/iptables 

加入端口配置     

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

重新加载规则

service iptables restart  

5、设置iptables防火墙开机启动:sudo systemctl enable iptables

6、之后的和CentOS6一样修改mysql库里的host

登录mysql;mysql -uroot -p

use mysql;

update user set host='%' where user='root' and host='localhost';

记得一定还得修改密码,因为这时密码已失效,虽然本地还可以原密码登录,可远程改了host后还是没法访问

UPDATE user SET password=password("root") WHERE user='root'; 

flush privileges;

重启mysql,远程就可以访问了

service mysqld restart;

完整的 MySQL 5.7 安装和登录教程到此结束。

mysql主从复制简

1,slave1和slave2安装mysql数据库已完成

1、主从服务器分别作以下操作:

  1.1、版本一致

  1.2、初始化表,并在后台启动mysql

  1.3、修改root的密码

2、修改主服务器master:

   #vi /etc/my.cnf

       [mysqld]

       log-bin=mysql-bin   //[必须]启用二进制日志

       server-id=222      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

3、修改从服务器slave:

   #vi /etc/my.cnf

       [mysqld]

       log-bin=mysql-bin   //[不是必须]启用二进制日志

       server-id=226      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

2-3详细版配置

 #vi /etc/my.cnf

# mysqld.cnf

 [client]

# 客户端设置编码字符集为UTF8mb4

default_character_set=utf8mb4

[mysqld]

# 服务端设置编码

default-storage-engine=INNODB

character-set-server=utf8mb4

collation-server=utf8mb4_general_ci

# 服务唯一ID

server-id=9000

# 配置bin-log信息

# 日志文件名

log-bin=master-bin log_bin_index = master-bin.index

# 日志格式

binlog_format=row

# 日志保存天数

expire-logs-days=7

# 需要同步的数据库

#binlog-do-db=cm_sync

# 不需要同步的库

binlog-ignore-db=mysql

binlog-ignore-db=sys

binlog-ignore-db=information_schema binlog-ignore-db=performance_schema

主从配置除了id(server-id以外其余一样

4、重启两台服务器的mysql

   /etc/init.d/mysql restart

5、在主服务器上建立帐户并授权slave:

   #/usr/local/mysql/bin/mysql -uroot -pmttang  

   mysql>GRANT REPLICATI ON SLAVE ON *.* to 'mysync'@'%' identified by 'q123456'; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

6、登录主服务器的mysql,查询master的状态

   mysql>show master status;

   +------------------+----------+--------------+------------------+

   | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

   +------------------+----------+--------------+------------------+

   | mysql-bin.000004 |      308 |              |                  |

   +------------------+----------+--------------+------------------+

   1 row in set (0.00 sec)

   注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

7、配置从服务器Slave:

  

mysql>change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',

         master_log_file='mysql-bin.000004',master_log_pos=308;   //注意不要断开,308数字前后无单引号。

   Mysql>start slave;    //启动从服务器复制功能

8、检查从服务器复制功能状态:

   mysql> show slave status\G

   *************************** 1. row ***************************

              Slave_IO_State: Waiting for master to send event

              Master_Host: 192.168.2.222  //主服务器地址

              Master_User: mysync   //授权帐户名,尽量避免使用root

              Master_Port: 3306    //数据库端口,部分版本没有此行

              Connect_Retry: 60

              Master_Log_File: mysql-bin.000004

              Read_Master_Log_Pos: 600     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos

              Relay_Log_File: ddte-relay-bin.000003

              Relay_Log_Pos: 251

              Relay_Master_Log_File: mysql-bin.000004

              Slave_IO_Running: Yes    //此状态必须YES

              Slave_SQL_Running: Yes     //此状态必须YES

                    ......

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

以上操作过程,主从服务器配置完成。

9、主从服务器测试:

主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

  mysql> create database hi_db;

  Query OK, 1 row affected (0.00 sec)

  mysql> use hi_db;

  Database changed

  mysql>  create table hi_tb(id int(3),name char(10));

  Query OK, 0 rows affected (0.00 sec)

  mysql> insert into hi_tb values(001,'bobu');

  Query OK, 1 row affected (0.00 sec)

  mysql> show databases;

   +--------------------+

   | Database           |

   +--------------------+

   | information_schema |

   | hi_db                |

   | mysql                |

   | test                 |

   +--------------------+

   4 rows in set (0.00 sec)

从服务器Mysql查询:

   mysql> show databases;

   +--------------------+

   | Database               |

   +--------------------+

   | information_schema |

   | hi_db                 |       //I'M here,大家看到了吧

   | mysql                 |

   | test          |

   +--------------------+

   4 rows in set (0.00 sec)

   mysql> use hi_db

   Database changed

   mysql> select * from hi_tb;           //查看主服务器上新增的具体数据

   +------+------+

   | id   | name |

   +------+------+

   |    1 | bobu |

   +------+------+

   1 row in set (0.00 sec)

  1. 完成编写shell脚本,用nagios监控slave的两个yes Slave_IO及Slave_SQL进程

用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。

mysql主

要在Hadoop集群中实现MySQL主主复制,您可以遵循以下步骤:

1. 在Hadoop集群中安装两个以上相同版本的MySQL数据库,确保两个MySQL服务器都正常运行。

2. 配置MySQL的主主复制。这需要在每个MySQL服务器上进行以下配置更改:

   - 在my.cnf(或my.ini)文件中启用二进制日志记录(binlog),并且给它一个唯一的名称。

vi /etc/my.cnf

     ```

     server-id=1

     log-bin=mysql-bin

     ```

   - 确保每个MySQL服务器都已正确配置了replication用户名和密码。

     ```

     grant replication slave on *.* to 'repl'@'%' identified by 'password';

     ```

Repl 用户名可修改为自己的, password密码可修改为自己的

3. 记下第一个MySQL服务器的IP地址,并使用该地址在第二个MySQL服务器上设置主服务器。

   ```

   CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=xxxx;

   ```

   其中`MASTER_LOG_FILE`和`MASTER_LOG_POS`参数应设置为第一个MySQL服务器上的binlog文件名和位置。

4. 现在,在两个MySQL服务器上都启用复制。

   ```

   start slave;

   ```

5. 测试MySQL主主复制是否正常工作。您可以执行一些插入、更新或删除操作,并确保它们在两个MySQL服务器之间同步。

请注意,以上步骤仅提供了一个简单的概述。在实践中,您可能会遇到其他问题和挑战,例如网络延迟、数据冲突等。因此,在进行任何更改之前,请务必备份所有相关数据,并仔细测试您的MySQL主主复制配置

mysql主主详细

## 配置MySQL主主同步

0配置防火墙以允许MySQL服务器之间的通信。

您需要开放MySQL服务器使用的TCP端口(默认为3306),并且最好只允许从其他MySQL服务器的IP地址访问该端口。

安装iptables防火墙:

sudo yum install iptables-services

配置iptables防火墙,打开指定端口

修改防火墙配置文件

vim /etc/sysconfig/iptables 

加入端口配置     

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

重新加载规则(centos7命令)

systemctl stop iptables.service  开启服务

[root@slave2 ~]# systemctl start iptables.service   关闭服务

[root@slave2 ~]# systemctl restart iptables.service  刷新重启服务

 关闭防火墙

service iptables stop

设置iptables防火墙开机启动:

sudo systemctl enable iptables

查看iptables防火墙状态

systemctl status iptables.service

0.1配置selinux

永久关闭selinux

shell> vi /etc/selinux/config

SELINUX=disabled

临时关闭selinux

运行以下命令来检查当前Selinux状态:

sestatus

如果当前正在运行Selinux,则可以使用以下命令暂时禁用它:

setenforce 0

您可以再次使用sestatus命令来验证Selinux状态是否已更改为“Permissive”。

sestatus

输出应显示为:

SELinux status:                 disabled

或者

SELinux status:                 permissive

请注意,这种方法只会临时禁用Selinux,重启后将重新启动。如果您需要永久禁用Selinux,则必须修改配置文件并重新启动系统以使更改生效。在永久禁用 Selinux 前,建议您先了解其对系统安全的影响,并采取其他措施来保护您的系统。

  1. 在Hadoop集群中安装两个以上相同版本的MySQL数据库,确保两个MySQL服务器都正常运行。

注意: 

主从服务器操作系统版本如centos7.6和位数要保持一致

多个数据库的版本要保持一致

多个数据库中的数据要保持一致

多个数据库中的server-id=242或243不要要保持一致

2. 配置MySQL的主主复制。这需要在每个MySQL服务器上进行以下配置更改:

 在my.cnf(或my.ini)文件中启用二进制日志记录(binlog),并且给它一个唯一的名称。

vi /etc/my.cnf

     ```

     server-id=1

     log-bin=mysql-bin

     ```

 在`my.cnf`文件中启用二进制日志记录(binlog)和GTID功能。

   ```

   server-id = 1

   log_bin = /var/log/mysql/mysql-bin.log

   binlog_format = ROW

   gtid_mode = ON

   enforce_gtid_consistency = ON

   ```

   这将启用MySQL的全局事务标识符(GTID)功能,并确保在主服务器之间进行复制时不会出现数据冲突。

   - 确保每个MySQL服务器都已正确配置了replication用户名和密码。

     ```

     grant replication slave on *.* to 'repl'@'%' identified by 'password';

     ```

Repl 用户名可修改为自己的, password密码可修改为自己的

#vi /etc/my.cnf

# mysqld.cnf

 [client]

# 客户端设置编码字符集为UTF8mb4

default_character_set=utf8mb4

[mysqld]

# 服务端设置编码

default-storage-engine=INNODB

character-set-server=utf8mb4

collation-server=utf8mb4_general_ci

# 服务唯一ID

server-id=9000 

# 配置bin-log信息,开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)

log-bin=master-bin

# 日志文件名

log_bin_index = master-bin.index

# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存 

binlog_cache_size=8M

# 日志格式

# 主从复制的格式(mixed,statement,row,默认格式是 statement) 

binlog_format=row

# 日志保存天数   过期自动删除,默认值为 0,表示不自动删除 

expire-logs-days=30 

#下面很关键

# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。

# 如:1062错误是指一些主键重复,1032 错误是因为主从数据库数据不一致

slave_skip_errors=1062

# 作为从服务器时的中继日志 

relay_log=edu-mysql-relay-bin

# log_slave_updates 表示 slave 将复制事件写进自己的二进制日志

log_slave_updates=1

# 主键自增规则如下两个,避免主从同步ID重复的问题

# 自增因子(每次加2)

auto_increment_increment=2  

# 自增偏移(从1开始),单数

auto_increment_offset=1

# 启用MySQL的全局事务标识符(GTID)功能,

# 并确保在主服务器之间进行复制时不会出现数据冲突。

gtid_mode = ON

enforce_gtid_consistency = ON

# 需要同步的数据库

#binlog-do-db=cm_sync

# 不需要同步的库 复制过滤:不需要备份的数据库(MySQL库一般不同步)

binlog-ignore-db=mysql

binlog-ignore-db=sys

binlog-ignore-db=information_schema binlog-ignore-db=performance_schema 

  1. Mysql主主快捷操作

参考文档MySQL主主数据同步_mysql主主同步_xyang0917的博客-CSDN博客https://blog.csdn.net/xyang81/article/details/52562571

Mysql1服务器和Mysql2服务器均进行

# 先重启一下服务

shell> service mysqld restart

# 分别登录到mysql1 和2

shell> mysql -uroot -p

P@ssword123

 # 创建数据库同步用户,并授予相应的权限 只允许repl用户从192.168.xxx.xxx上登录)

# 只允许repl用户从192.168.148.130上登录, 此主机ip为192.168.148.129

Mysql1> grant replication slave, replication client on *.* to 'repl'@'192.168.148.130' identified

by 'P@ssword123';

# 只允许repl用户从192.168.148.129 上登录, 此主机ip为192.168.148.130 

# 也可使用'repl'@'192.168.148.%' 只允许repl用户从192.168.148.xxx上登录

Mysql2> grant replication slave, replication client on *.* to 'repl'@'192.168.148.129' identified

by 'P@ssword123';

# 刷新授权表信息

Mysql1> flush privileges;

Mysql2> flush privileges;

# 只在从节点数据库中执行如下命令进行同步,host为Master节点地址,file和pos为上一步中主节点查看show master status的Master的信息( 主要查看binlog文件的position(偏移)和File(日志文件)的值 比如 ....003和311)

# 执行完成后通过start slave;启动mysql1为主MySQL2为从的同步

Mysql1> show master status;

Mysql2>change master to master_host='192.168.148.130',master_user='repl', master_password='P@ssword123', master_port=3306, master_log_file='edu-mysql-bin.000003',master_log_pos=311, master_connect_retry=30;

# 启动从节点,开始工作接收主节点发送事件(数据库数据变更的所有事件) 

Mysql2> start slave;

# 此时再查看slave节点的状态

Mysql2> show slave status\G

Mysql2> stop slave;

# 只在从节点数据库中执行如下命令进行同步,host为Master节点地址,file和pos为上一步中主节点查看show master status的Master的信息,( 主要查看binlog文件的position(偏移)和File(日志文件)的值 比如 ....003和311)

# 执行完成后通过start slave;启动mysql2为主mysql1为从的同步。

Mysql2> show master status;

Mysql1>change master to master_host='192.168.148.129',master_user='repl', master_password='P@ssword123', master_port=3306, master_log_file='edu-mysql-bin.000002',master_log_pos=317, master_connect_retry=30;

# 启动从节点,开始工作接收主节点发送事件(数据库数据变更的所有事件) 

Mysql1> start slave;

# 此时再查看slave节点的状态

Mysql1> show slave status\G

Mysql1> stop slave;

slave启动失败问题总结:

从服务器配置的结果一定是:Slave_IO_Running 与 Slave_SQL_Running 状态都要为Yes
1:Change master to
如果从库的Slave未启动,Slave_IO_Running为NO。
可能是主库是的master的信息有变化,
查看主库show master status;
记录下File,Position字段,假设为‘mysql-bin.000004’,98;
在从库执行:

mysql>stop slave;
mysql>change master to master_log_file='mysql-bin.000004',master_log_pos=669;
mysql>start slave;
2:SET global sql_slave_skip_counter=n;
如果从库的slave_sql_running为NO。
Err文件中记录:
Slave:Error "Duplicate entry '1' for key 1" on query.....
可能是master未向slave同步成功,但slave中已经有了记录。造成的冲突可以在从库上执行
set global sql_slave_skip_counter=n;
跳过几步。再restart slave就可以了。
3:发现mysql slave服务器经常因为一些特殊字符或者符号产生的更新语句报错,整个同步也会因此而卡在那,最初的办法只是手动去出错的机器执行下面三条SQL语句,跳过错误即可

mysql>slave stop;
mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql>slave start;

通过slave stop,slave start即可解决。

slave start启动后又会自动停掉,这时使用 change master重设主数据库信息的方式解决问题

#不细看仅参考#3.记下第一个MySQL服务器的IP地址,并使用该地址在第二个MySQL服务器上设置主服务器。

Master配置

# 先重启一下服务

shell> service mysqld restart  

# 登录到mysql

shell> mysql -uroot -p

# 创建数据库同步用户,并授予相应的权限

mysql> grant replication slave, replication client on *.* to 'repl'@'192.168.1.206' identified by 'root123456';

# 刷新授权表信息

mysql> flush privileges;

# 查看binlog文件的position(偏移)和File(日志文件)的值,从机上需要用到mysql> show master status;

  

##master_user和master_password:在206上执行grant replication slave...创建的用户和密码 

# master_log_file和master_log_pos:在206上运行show master status;命令执行结果对应File和Position字段的值

mysql> change master to master_host='192.168.1.206',master_user='repl', master_password='root123456', master_port=3306, master_log_file='edu-mysql-bin.000001', master_log_pos=439, master_connect_retry=30;

 ```

   CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=xxxx;

   ```

   其中`MASTER_LOG_FILE`和`MASTER_LOG_POS`参数应设置为第一个MySQL服务器上的binlog文件名和位置。

# 启动从节点,开始工作接收主节点发送事件(数据库数据变更的所有事件) mysql> start slave; # 此时再查看slave节点的状态 mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.206 Master_User: repl Master_Port: 3306 Connect_Retry: 30 Master_Log_File: edu-mysql-bin.000001 Read_Master_Log_Pos: 439 Relay_Log_File: edu-mysql-relay-bin.000002 Relay_Log_Pos: 287 Relay_Master_Log_File: edu-mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

4. 在两个MySQL服务器上都启用复制。

   ```

   start slave;

5. 测试MySQL主主同步是否正常工作。

您可以在两个MySQL服务器之间执行一些插入、更新或删除操作,并检查它们是否在另一个服务器上得到了正确的重复。

请注意,以上步骤仅提供了一个简单的概述。在实践中,您可能会遇到其他问题和挑战,例如网络延迟、数据冲突等。因此,在进行任何更改之前,请务必备份所有相关数据,并仔细测试您的keepalived和MySQL主主同步配置。

  1. Keepalived安装部署配置

1.1安装依赖 keepalived软件依赖

1需要准备的系统依赖包可能版本号会更新,不是问题,主要要有依赖包

gcc

libnl-1.1.4-2.el6.x86_64

libnl-devel-1.1.4-2.el6.x86_64

libnfnetlink-1.0.0-1.el6.x86_64

libnfnetlink-devel-1.0.0-1.el6.x86_64

openssl-devel-1.0.1e-58.el6_10.x86_64

配置好yum源,使用yum install安装对应的包。

另外需要 安装mysql5.7 jdk1.8

yum install gcc libnl libnl-devel libnfnetlink libnfnetlink-devel openssl-devel

2报错

postfix-2.10.1-6.el7.x86_64 有缺少的需求 libmysqlclient.so.18()(64bit)

我的mysql5.7依赖包是  usr/lib64/libmysqlclient.so.20

由于我安装的是 libmysqlclient.so.20,而 Postfix 需要的是 libmysqlclient.so.18,因此需要创建符号链接以使Postfix可以找到正确的库文件。

以下是一些可能的解决方法:

确认已经安装了MySQL客户端库包:运行以下命令来检查包是否已安装:

rpm -qa | grep mysql

如果没有输出,则表示未安装MySQL客户端库包。可以使用以下命令安装它:

sudo yum install mysql-devel

创建符号链接:使用以下命令创建符号链接:

sudo ln -s /usr/lib64/mysql/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.18

该命令将创建一个名为 libmysqlclient.so.18 的符号链接,指向实际存在的 libmysqlclient.so.20 文件。

如果已经安装了MySQL客户端库包并且创建了符号链接,但yum仍无法找到 libmysqlclient.so.18 文件,则可能需要将库文件的路径添加到系统环境变量中。

以下是一些可能的解决方法:

打开 /etc/ld.so.conf 文件:

sudo nano /etc/ld.so.conf

在文件末尾添加以下行:

include /usr/lib64/mysql/

按 CTRL+X 然后输入 Y 和 ENTER 来保存并退出文件。

更新共享库缓存:

sudo ldconfig

现在,应该可以使用yum命令成功安装Postfix以及其他依赖于 libmysqlclient.so.18 的软件包。

若还是不行

确认您已经安装了MySQL客户端库包:运行以下命令来检查包是否已安装

rpm -qa | grep mysql

如果没有输出,则表示未安装MySQL客户端库包。

如果输出四个包名,安装则采用remove +包名卸载四个包

然后使用以下命令安装mysql客户端:

sudo yum install mysql-devel

3.yum安装keepalived

11yum安装keepalived

yum install -y keepalived

12查看版本

rpm -qa|grep keepalived

[root@master ~]# rpm -qa|grep keepalived

keepalived-1.3.5-19.el7.x86_64

13查看安装后目录

rpm -qc keepalived

[root@master ~]# rpm -qc keepalived

/etc/keepalived/keepalived.conf

/etc/sysconfig/keepalived

14配置非抢占式有抢占式)

vim   /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id wiilead11 #标识 (可自定义)

}

vrrp_instance VI_1 {

    state BACKUP #从节点

    interface eno16777736  #绑定虚拟IP的网络接口(可通过ifconfig命令查看)

    virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组

    priority 150 # 非抢占式 两节点优先级一致 公平竞争

    nopreempt #非抢占式标识

    advert_int 1 #心跳间隔时间 两个节点设置必须一样

    authentication { #设置验证信息,两个节点必须一致 默认就行 可以不用更改

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.148.128 #虚拟ip 两个节点保持一致

    }

注:以上内容分别配置到两台服务器
router_id、interface、virtual_ipaddress 可自定义
其余配置可直接使用

15keepalived启动与检查

启动keepalived
systemctl start keepalived.service
设置开机启动
systemctl enable keepalived.service
查看开机自启列表
systemctl list-unit-files|grep enabled
查看启动状态
systemctl status keepalived.service

[root@master ~]# systemctl status keepalived.service

● keepalived.service - LVS and VRRP High Availability Monitor

   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)

   Active: active (running) since 二 2023-05-30 02:22:50 CST; 24s ago

  Process: 4172 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)

 Main PID: 4175 (keepalived)

1.2 编译安装keepalived
解压及配置:

tar -xvf keepalived-2.0.20.tar.gz

mv keepalived-2.0.20 /usr/local/src/

cd /usr/local/src/keepalived-2.0.20

./configure --prefix=/usr/local/keepalived

编译安装:

make&&make install

1.3 配置keepalived服务

1.配置服务文件

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin

cp /usr/local/src/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/keepalived

2.加keepalived服务

chkconfig --list |grep keepalived

chkconfig --add keepalived

chkconfig keepalived on

3.配置keepalived日志

keepalived的日志默认是输出到/var/log/messages中,这样不便于查看。如何自定义keepalived的日志输出文件呢?
如果是用service启动的,修改/etc/sysconfig/keepalived文件
vi /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -d -S 0"

如果不是,则启动的时候指定以上参数,如:

/usr/local/keepalived/sbin/keepalived -d -D -S 0

修改/etc/syslog.conf(RHEL6.8以后配置/etc/rsyslog.conf)

# keepalived -S 0

local0.*     /var/log/keepalived.log

重启syslog:

# RHEL 5&6:

service syslog restart# RHEL 7:

service rsyslog restart

注:RHEL6.8也是按照RHEL7的方法来操作centos7实际上和rhel7一样配置

4.配置keepalived的MySQL故障转移
master1(121)机器上的keepalived.conf配置:
注:下面配置中没有使用lvs的负载均衡功能,所以不需要配置虚拟服务器virtual server

cd /etc/keepalived/

mv keepalived.conf keepalived.conf.bak

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

vrrp_script chk_mysql_port {

    script "/etc/keepalived/check_mysql.sh"

    interval 2

    weight -5

    fall 2

    rise 1

}

       

vrrp_instance VI_1 {

    state MASTER    

    interface eth0 #指定虚拟ip的网卡接口

    mcast_src_ip 192.168.1.121 #指定本服务器物理ip地址

    virtual_router_id 130 #路由器标识,MASTER和BACKUP必须是一致的,取值1-255,注意同一内网中不应有相同virtual_router_id的集群,可以考虑使用vip的最后一位进行标示。

    priority 101

    advert_int 1         

    authentication {   

        auth_type PASS

        auth_pass 888888   

    }

    virtual_ipaddress {    

        192.168.1.130 #指定虚拟ip地址

    }

      

track_script {               

   chk_mysql_port             

}

}

编辑 /etc/keepalived/check_mysql.sh
vi /etc/keepalived/check_mysql.sh

#!/bin/bash

counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)

if [ "${counter}" -eq 0 ]; then

    /etc/init.d/keepalived stop

fi

# 修改chk_mysql.sh权限

chmod 755 /etc/keepalived/check_mysql.sh

# 启动keepalived# service keepalived start

Starting keepalived: [ OK ]

master2(122)机器上的keepalived.conf配置:

cd /etc/keepalived/

mv keepalived.conf keepalived.conf.bak

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

vrrp_script chk_mysql_port {

    script "/etc/keepalived/check_mysql.sh"

    interval 2            

    weight -5                 

    fall 2                 

    rise 1               

}

       

vrrp_instance VI_1 {

    state BACKUP

    interface eth0    

    mcast_src_ip 192.168.1.122

    virtual_router_id 130  

    priority 99          

    advert_int 1         

    authentication {   

        auth_type PASS

        auth_pass 888888    

    }

    virtual_ipaddress {    

        192.168.1.130

    }

      

track_script {               

   chk_mysql_port             

}

}

编辑check_mysql.sh

vi /etc/keepalived/check_mysql.sh

#!/bin/bash

counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)

if [ "${counter}" -eq 0 ]; then

    /etc/init.d/keepalived stop

fi

chmod 755 /etc/keepalived/check_mysql.sh

启动keepalived:

# service keepalived start

Starting keepalived: [ OK ]

2.其他补充

2.1 查看keepalived日志:

tail -200f /var/log/keepalived.log

2.2 创建数据库、用户并赋权

--创建业务数据库:create database demo;

--创建业务用户:create user 'jingyu'@'%' identified by 'jingyu';

--赋予业务用户权限(默认):grant insert,update,delete,select,alter,create,index,SHOW VIEW on demo.* to 'jingyu'@'%';

此时应用侧已经可以使用命令mysql -ujingyu -p -h192.168.1.130或者客户端连接工具,登录到demo数据库进行相关操作了。

[root@test01 ~]# mysql -ujingyu -p -h192.168.1.130

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 27

Server version: 5.7.29-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

jingyu@mysqldb 00:00:  [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| demo               |

+--------------------+

2 rows in set (0.01 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402427.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux_vi vim的使用

目录 vi和vim的基本介绍 vi和vim常用的三种模式 案例演示 vim的快捷键 快捷键使用练习 vi和vim的基本介绍 linux系统内会内置vi文本编译器。vim可以简单认为是vi的增强版本。 vi和vim常用的三种模式 有正常模式,移动光标,删除字符等。插入模式可以进…

Flask 线上高并发部署方案实现

目录 1、Flask默认多线程执行 2、使用gevent.pywsgi实现 3、是用uWSGI服务器实现 1、Flask默认多线程执行 前言:在Flask的较早版本中,默认并不支持多线程模式。然而,从Flask 0.9版本开始,引入了多线程模式的支持,并…

【自动驾驶】ROS中的TF坐标变换(一):静态坐标变换

目录 引子ros中的右手坐标系补充:欧拉角及四元数理解旋转平移操作复合操作 运行坐标变换的例子坐标转换 静态坐标变换-发布坐标系信息创建功能包 静态坐标变换-订阅坐标系信息添加cpp订阅者主文件修改cmakelist文件编译报错的解决方案运行程序进行测试 引子 机器人…

【MySQL数据库】单机、集群、分布式的区别

单机、集群和分布式是计算机系统中三种不同的架构模型,它们在资源管理、任务执行和性能优化方面有显著区别。 图片来源 1. 单机(Standalone) 单机指的是单一计算机系统,即所有的计算任务和数据都在一台计算机上处理。单机系统的特点包括: 硬件限制:受限于单台机器的计…

Visual Studio 2022 无法打开源文件atlimage.h

最近在搞tcp socket 通信demo,网上抄了一下源码(代码参考:C中的Socket编程使用协议发送图片_快速传输 照片 c-CSDN博客),还没开始编译就提示 无法打开源文件atlimage.h,全局搜了一下没有这个文件&#xff0…

JSON Web Token (JWT): 理解与应用

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。JWT通常用于身份验证和授权目的,因为它可以使用JSON对象在各方…

Unity开发抖音小游戏广告部分接入

Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容,因为要接入广告,所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…

Linux网络编程—socket、bind

一、socket创建套接字 socket是用来创建网络通信或本地通信的套接字&#xff0c;跟文件有关&#xff1a;告诉系统&#xff0c;PCB&#xff08;进程控制块&#xff09;控制的数据应该向哪个套接字写入、或读取&#xff1b;这个套接字是在TCP/IP协议下运行的 #include <sys/t…

选择排序(附动图)

1.思路 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 1.1双向选择排序&#xff08;升序&#xff09; 头尾指针&#xff08;索引&#xf…

初识C++

一、C的由来 C的起源可以追溯到1979年&#xff0c;当时Bjarne Stroustrup(本贾尼斯特劳斯特卢普&#xff0c;这个翻译的名字不同的地方可能有差异)在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务&#xff0c;特别是模拟和操作系统的开发⼯作&…

涉案财物管理系统DW-S405|实现人员随身物品智能化管理

涉案财物管理系统DW-S405系统基于物联网技术规范涉案财物管理流程&#xff0c;确保涉案财物的安全性、完整性和合法性&#xff1b;可以提高办案效率&#xff0c;减少办案成本&#xff0c;实现资源共享。 财物管理 管理员可通过个人账号和指纹验证两种登录方式进入财物管理系统…

1. 数据结构——顺序表的主要操作

1. 内容 顺序表的初始化、插入、删除、按值查找、输出以及其时间复杂度的计算。 2.代码 #include<stdio.h> #include<stdlib.h> //函数结果状态代码 #define OK 1 #define OVERFLOW -2 #define ERROR 0 #define MAXSIZE 100typedef int ElemType; //顺序表每个…

使用Nexus搭建Maven私服仓库

一、私服仓库简介 在Java的世界中&#xff0c;我们通常使用Maven的依赖体系来管理构件&#xff08;artifact&#xff0c;又称为二方库或三方库&#xff09;的依赖&#xff0c;Maven仓库用于存储这些构件。一般的远程仓库&#xff08;比如Maven Central&#xff09;只提供下载功…

OpenCV Python 图像处理入门

OpenCV入门 OpenCV&#xff1a;轻量、高效、开源。最广泛使用的计算机视觉工具。 下面涉及图片的读取&#xff0c;RGB彩色通道&#xff0c;区域裁剪&#xff0c;绘制图形和文字&#xff0c;均值滤波&#xff0c;特征提取&#xff0c;模板匹配&#xff0c;梯度算法&#xff0c…

获奖方案|趋动科技:资源池化释放AI算力价值

“据统计&#xff0c;GPU的平均利用率不超过30%&#xff0c;会产生巨大的算力资源浪费。我们用软件定义的方式通常可以把用户GPU的利用率提升3-8倍&#xff0c;甚至可以到10倍。” 这是算力池化软件公司趋动科技援引行业报告数据并结合自身企业最佳实践经验给出的最新数据。通…

在 SOCKS 和 HTTP 代理之间如何选择?

在 SOCKS 和 HTTP 代理之间进行选择需要彻底了解每种代理的工作原理以及它们传达的配置。只有这样&#xff0c;您才能轻松地在不同类型的代理之间进行选择。 本文概述了 HTTP 和 SOCKS 代理是什么、它们如何运作以及它们各自带来的好处。此外&#xff0c;我们将比较这两种代理类…

Java算法解析一:二分算法及其衍生出来的问题

这个算法的前提是&#xff0c;数组是升序排列的 算法描述&#xff1a; i和j是指针可以表示查找范围 m为中间值 当目标值targat比m大时&#xff0c;设置查找范围在m右边&#xff1a;i m-1 当目标值targat比m小时&#xff0c;设置查找范围在m左边&#xff1a;j m1 当targat的…

数据结构第一天

数据结构基础知识 1.1 什么是数据结构 数据结构就是数据的逻辑结构以及存储操作 (类似数据的运算) 数据结构就教会你一件事&#xff1a;如何更有效的存储数据 1.2 数据 数据&#xff1a;不再是单纯的数字&#xff0c;而是类似于集合的概念。 数据元素&#xff1a;是数据的基本单…

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

优先级队列的实现

什么是优先级队列 优先级队列是一种特殊的数据结构&#xff0c;它类似于队列或栈&#xff0c;但是每个元素都关联有一个优先级或权重。在优先级队列中&#xff0c;元素的出队顺序不是简单地按照它们进入队列的先后顺序&#xff08;先进先出&#xff0c;FIFO&#xff09;&#…