重新安装MySQL并加入MGR集群

前言

所谓的MGR, 全称: MySQL Group Replication, 是一种MySQL的主从架构。
因为之前的MySQL已经没有办法恢复起来, 实在没办法, 采取的方法是完全删除, 并重新安装、加入MGR

首先完整删除之前的MySQL

1

2

3

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 并将原来的数据目录复制到新的目录之中

运行命令:

1

2

3

4

5

6

7

8

9

10

11

# 暂停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. 配置文件修改数据目录

1

2

3

4

5

6

# 编辑文件

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

 

# 新增或者修改配置项:

datadir=/data/mysql

 

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

3. 修改AppArmor

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

1

2

3

4

5

6

7

8

9

# 编辑对应的文件

sudo vim /etc/apparmor.d/tunables/alias

 

# 添加相应的记录

alias /var/lib/mysql/ -> /data/mysql/,  # 结尾的逗号不能少

 

# 重启AppArmor, 让改动生效

sudo systemctl restart apparmor

 

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

MySQL有一个启动检查脚本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# /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

 

. . .

 

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

1

2

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

 

最终: 启动MySQL

1

2

3

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

带解说版本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#为每个节点设定唯一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,认为制造脑裂的场景。

 

实际配置的版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

[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用户

执行下面的脚本即可:

1

2

3

4

5

6

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插件

1

2

3

4

5

6

7

8

9

10

11

12

13

# 安装

$ INSTALL PLUGIN group_replication SONAME 'group_replication.so'

 

# 查看

$ show plugins;

 

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

| Name                       | Status   | Type               | Library              | License |

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

| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |

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

 

 

 

加入集群

注意:

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

1

2

3

4

SET GLOBAL group_replication_bootstrap_group=ON;

START GROUP_REPLICATION;

SET GLOBAL group_replication_bootstrap_group=OFF;

 

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

 

 

1

2

START GROUP_REPLICATION;

 

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

1

2

3

4

5

6

7

8

9

10

11

# 首先设置bootstrap group 为OFF  

# 从命名上看, bootstrap 也就是集群启动的时候才叫bootstrap

SET GLOBAL group_replication_bootstrap_group=OFF;

 

# 其次, 关闭GROUP_REPLICATION

# 这个过程可能要等一会

STOP GROUP_REPLICATION;

 

# 再次启动GROUP_REPLICATION

START GROUP_REPLICATION;

 

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

至此, 全流程完成


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值