重新安装MySQL并加入MGR集群

栏目: 数据库 · 发布时间: 6年前

内容简介:所谓的MGR, 全称:因为之前的MySQL已经没有办法恢复起来, 实在没办法, 采取的方法是完全删除, 并重新安装、加入MGR参考文章

前言

所谓的MGR, 全称: MySQL Group Replication , 是一种 MySQL 的主从架构。

因为之前的MySQL已经没有办法恢复起来, 实在没办法, 采取的方法是完全删除, 并重新安装、加入MGR

首先完整删除之前的MySQL

sudo apt-get remove mysql-*
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
 

然后安装完整版的MySQL

参考文章 Ubuntu 16.04安装MySQL官方最新“非阉割”版

注意:如果安装的不是完整版的, 在最后安装MGR插件就会遇到绕不过去的坑。

主要步骤:

  1. 到 MySQL官方的 Download MySQL APT Repository 页面下载
    mysql-apt-config_*_all.deb
  2. 运行命令:

  • 运行deb包: sudo dpkg -i mysql-apt-config*

    注意: 在这一步, 最好安装跟原来MySQL 一致的版本。 默认是8.0, 可以在弹出的对话框之中选择5.7

  • 更新 sudo apt-get update

  • APT安装MySQL

    sudo apt-get install mysql-server mysql-client

修改配置文件 – 数据目录

主要参考文章: DigitalOcean: How To Move a MySQL Data Directory to a New Location on Ubuntu 16.04

MySQL的数据目录默认位置: /var/lib/mysql/

注意: 在这里步骤还是比较麻烦的, 一不小心, 启动的时候就会报错:

 Job for mysql.service failed because the control process  exited with error code. See “systemctl status mysql.service”  and “journalctl -xe” for details. 

步骤:

1. 暂停MySQL 并将原来的数据目录复制到新的目录之中

运行命令:

# 暂停MySQL
sudo systemctl stop mysql   
 
# 复制目录, -a 可以保持原来的权限, -v 就是verbose
# 我们的目标目录完整路径:/data/mysql, 而不是 /data
# 执行下面命令的时候,【不能】带最后的斜杠
sudo rsync -av /var/lib/mysql /data
 
# 最后备份一下
sudo mv /var/lib/mysql /var/lib/mysql.bak
 

2. 配置文件修改数据目录

# 编辑文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
 
# 新增或者修改配置项:
datadir=/data/mysql
 

注意: 这个时候还不能启动

3. 修改AppArmor

我也是第一次知道还有 AppArmor 这个东西存在

# 编辑对应的文件
sudo vim /etc/apparmor.d/tunables/alias
 
# 添加相应的记录
alias /var/lib/mysql/ -> /data/mysql/,  # 结尾的逗号不能少
 
# 重启AppArmor, 让改动生效
sudo systemctl restart apparmor
 

4. 创建空间文件, 绕过启动检查

MySQL有一个启动检查脚本

# /usr/share/mysql/mysql-systemd-start
. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
 exit 1
fi
 
if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
 echo "MySQL system database not found. Please run mysql_install_db tool."
 exit 1
fi
 
. . .
 

解决方案: 创建空文件夹即可:

sudo mkdir /var/lib/mysql/mysql -p
 

最终: 启动MySQL

 sudo systemctl start mysql
 sudo systemctl status mysql
 

修改配置文件 – 加入MGR的配置

参考网址: https://blog.skyaid-service.org/2017/10/29/mgr_haproxy/

配置文件还是上面提到的 : /etc/mysql/mysql.conf.d/mysqld.cnf

带解说版本:

#为每个节点设定唯一id
server_id=1
#开启全局事务id
gtid_mode=ON 
enforce_gtid_consistency=ON
#将复制的元数据存到系统表中,而不是文件中
master_info_repository=TABLE
relay_log_info_repository=TABLE
#打开binlog,行复制并且disable binlog checksum
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
 
#对每个事务获取write set,并且用XXHASH64算法获取hash值
transaction_write_set_extraction=XXHASH64
#group的唯一名字
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#节点启动的时候不要自动启动组复制
loose-group_replication_start_on_boot=off
#本节点的IP地址和端口,注意该端口是组内成员之间通信的端口,而不是MySQL对外提供服务的端口
loose-group_replication_local_address= "127.0.0.1:24901"
#种子节点的IP和端口号,新成员加入到集群的时候需要联系种子节点,启动集群的节点不使用该选项。
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
#是否启动集群
loose-group_replication_bootstrap_group= off
注意:该选项任何时候只能用于一个节点,通常情况下是启动集群的时候使用,启动之后需要关闭该选项。否则使用该选项启动多个节点,就会造成同名的多个Group,认为制造脑裂的场景。
 

实际配置的版本

[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
datadir     = /data/mysql
log-error   = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address    = 0.0.0.0 
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
 
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "this_machine_ip:33061"
loose-group_replication_group_seeds= "seeds_ip:33061"
loose-group_replication_bootstrap_group= off
 

上面的配置完成之后, 就可以重启MySQL了

其他操作

1. 创建MGR用户

执行下面的脚本即可:

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
 

2. 安装MGR插件

# 安装
$ INSTALL PLUGIN group_replication SONAME 'group_replication.so'
 
# 查看
$ show plugins;
 
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
 
 

加入集群

注意:

如果是集群刚开始启动, 需要执行的命令如下:

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
 

但是现在是加入原来有的集群, 所以只能执行下面这个命令:

START GROUP_REPLICATION;
 

补救: 如果不小心也把上面3个命令都执行了一次, 补救措施:

# 首先设置bootstrap group 为OFF  
# 从命名上看, bootstrap 也就是集群启动的时候才叫bootstrap
SET GLOBAL group_replication_bootstrap_group=OFF;
 
# 其次, 关闭GROUP_REPLICATION
# 这个过程可能要等一会
STOP GROUP_REPLICATION;
 
# 再次启动GROUP_REPLICATION
START GROUP_REPLICATION;
 

此时如果再来看集群的状态, 可以看到, 已经处于 Recovering 的状态了

重新安装MySQL并加入MGR集群

至此, 全流程完成

本文站在了前人的肩膀之上, 所参考的文章都已经列出出处。

各位转载的也请注明本博客的地址: https://www.flyml.net


以上所述就是小编给大家介绍的《重新安装MySQL并加入MGR集群》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Programming in Java

Introduction to Programming in Java

Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00

By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具