在大数据-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上去同步数据,这样可能会造成一定程度的同步延时;
架构的简易图如下:
编辑
- 配置ip
- 配置yum源
- 配置Hadoop
- 配置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
- 配置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)
- 完成:编写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 前,建议您先了解其对系统安全的影响,并采取其他措施来保护您的系统。
- 在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
- 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主主同步配置。
- 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)