1、环境

节点 主机名 ip地址 操作系统版本
节点一 mysql1 10.5.11.70 centos 7.5
节点二 mysql2 10.5.11.71 centos 7.5
节点三 mysql3 10.5.11.72 centos 7.5

1.1、主机名设置

 hostnamectl set-hostname mysql1
 hostnamectl set-hostname mysql2
 hostnamectl set-hostname mysql3

关闭终端,重新登录

2、软件安装

2.1 mysql1


rpm -e postfix
rpm -e mariadb-libs
rpm -ivh mysql-router-community-8.0.20-1.el7.x86_64.rpm
rpm -ivh mysql-shell-8.0.20-1.el7.x86_64.rpm

tar xvf mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar

rpm -ivh mysql-community-common-5.7.30-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-5.7.30-1.el7.x86_64.rpm 
rpm -ivh mysql-community-libs-compat-5.7.30-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-5.7.30-1.el7.x86_64.rpm

rpm -ivh mysql-community-server-5.7.30-1.el7.x86_64.rpm

三个节点安装步骤同上

3、节点mysql1配置

3.1、创建工作目录

mkdir -p /home/mysql/data

chown -R mysql.mysql /home/mysql

3.2、创建配置文件

vi /home/mysql/my.cnf

[mysqld]

pid-file        = /home/mysql/mysqld.pid
socket          = /home/mysql/mysqld.sock
datadir         = /home/mysql/data
log-error = /home/mysql/mysqld.log
log_bin=ON
secure-file-priv= NULL
symbolic-links=0

server_id=1
max_connections=4096
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
default_storage_engine=INNODB
innodb_buffer_pool_size=12G
innodb_log_file_size=256M
innodb_log_buffer_size=12M
innodb_flush_log_at_trx_commit=2
lower_case_table_names=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
expire_logs_days=1
skip-host-cache
skip-name-resolve

3.3、修改目录权限

chown -R mysql.mysql /home/mysql

3.4、初始化数据库

 mysqld --defaults-file=/home/mysql/my.cnf  --initialize-insecure --user=mysql

3.5 启动数据库

修改启动脚本
vi /lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/var/run/mysqld/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true


# Start main service
ExecStart=/usr/sbin/mysqld --daemonize --defaults-file=/home/mysql/my.cnf

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false
systemctl deamon-reload
systemctl enable mysqld.service
systemctl start mysqld.service

3.6 创建用户并授权

mysql -uroot -p -S /home/mysql/mysqld.socket
grant all privileges  on *.* to root@'%' identified by password;
flush privileges;
quit

4、节点mysql2配置

4.1、创建工作目录

mkdir -p /home/mysql/data

chown -R mysql.mysql /home/mysql

4.2、创建配置文件

vi /home/mysql/my.cnf

[mysqld]

pid-file        = /home/mysql/mysqld.pid
socket          = /home/mysql/mysqld.sock
datadir         = /home/mysql/data
log-error = /home/mysql/mysqld.log
log_bin=ON
secure-file-priv= NULL
symbolic-links=0

server_id=2
max_connections=4096
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
default_storage_engine=INNODB
innodb_buffer_pool_size=12G
innodb_log_file_size=256M
innodb_log_buffer_size=12M
innodb_flush_log_at_trx_commit=2
lower_case_table_names=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
expire_logs_days=1
skip-host-cache
skip-name-resolve

4.3、修改目录权限

chown -R mysql.mysql /home/mysql

4.4、初始化数据库

 mysqld --defaults-file=/home/mysql/my.cnf  --initialize-insecure --user=mysql

4.5 启动数据库

修改启动脚本
vi /lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/var/run/mysqld/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true


# Start main service
ExecStart=/usr/sbin/mysqld --daemonize --defaults-file=/home/mysql/my.cnf

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false
systemctl deamon-reload
systemctl enable mysqld.service
systemctl start mysqld.service

4.6 创建用户并授权

mysql -uroot -p -S /home/mysql/mysqld.socket
grant all privileges  on *.* to root@'%' identified by password;
flush privileges;
quit

5、节点mysql3配置

5.1、创建工作目录

mkdir -p /home/mysql/data

chown -R mysql.mysql /home/mysql

5.2、创建配置文件

vi /home/mysql/my.cnf

[mysqld]

pid-file        = /home/mysql/mysqld.pid
socket          = /home/mysql/mysqld.sock
datadir         = /home/mysql/data
log-error = /home/mysql/mysqld.log
log_bin=ON
secure-file-priv= NULL
symbolic-links=0

server_id=3
max_connections=4096
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
default_storage_engine=INNODB
innodb_buffer_pool_size=12G
innodb_log_file_size=256M
innodb_log_buffer_size=12M
innodb_flush_log_at_trx_commit=2
lower_case_table_names=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
expire_logs_days=1
skip-host-cache
skip-name-resolve

5.3、修改目录权限

chown -R mysql.mysql /home/mysql

5.4、初始化数据库

 mysqld --defaults-file=/home/mysql/my.cnf  --initialize-insecure --user=mysql

5.5 启动数据库

修改启动脚本
vi /lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/var/run/mysqld/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
PermissionsStartOnly=true


# Start main service
ExecStart=/usr/sbin/mysqld --daemonize --defaults-file=/home/mysql/my.cnf

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false
systemctl deamon-reload
systemctl enable mysqld.service
systemctl start mysqld.service

5.6 创建用户并授权

mysql -uroot -p -S /home/mysql/mysqld.socket
grant all privileges  on *.* to root@'%' identified by password;
flush privileges;
quit

6、集群配置

6.1 集群条件检查和配置

mysqlsh --uri 'root@mysql1'
dba.checkInstanceConfiguration()
dba.configLocalInstance()
mysqlsh --uri 'root@mysql2'
dba.checkInstanceConfiguration()
dba.configLocalInstance()
mysqlsh --uri 'root@mysql3'
dba.checkInstanceConfiguration()
dba.configLocalInstance()

6.2 创建集群

mysqlsh --uri 'root@mysql1'
var c = dba.createCluster('bag',{multiPrimary:true})
c.addInstance('root@mysql2')
c.addInstance('root@mysql3')

6.3 创建路由配置文件,启动路由

mysqlrouter -B 'root@mysql1' --user=mysqlrouter

systemctl enable mysqlrouter
systemctl start mysqlrouter

7、故障恢复

7.1 情形一

7.1.1 故障描述

mysql集群有三个节点,重启后节点一、节点二恢复集群,节点三无法加入集群,且数据不断往节点三写入

mysql5.7 集群节点全部重启后是不会自动启动集群,需要执行dba.rebootClusterFromCompleteOutage(),而在此之前节点三不断写入,导致节点三的状态与节点一、二不一致,最终节点一二加入集群,而节点三不能加入集群

7.1.2 恢复步骤

7.1.2.1 停止节点三的写入,将节点三的数据导出


mysqldump -uroot -p -S /home/mysql3/mysqld.sock --triggers --routines --events --databases test > test.sql

7.1.2.2 重启节点一、二,导入节点三的数据

在命令行执行

reset master

导入数据

mysql -uroot -p -S /home/mysql1/mysqld.sock < test.sql

7.1.2.3 拉起集群

[root@localhost home]# mysqlsh --uri 'root@localhost:3316'
MySQL Shell 8.0.20

Copyright (c) 2016, 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 '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost:3316'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 6
Server version: 5.7.30-log MySQL Community Server (GPL)
No default schema selected; type \use <schema> to set one.
 MySQL  localhost:3316 ssl  JS > var c  = dba.getCluster()
Dba.getCluster: This function is not available through a session to a standalone instance (metadata exists, instance belongs to that metadata, but GR is not active) (RuntimeError)
 MySQL  localhost:3316 ssl  JS > dba.rebootClusterFromCompleteOutage()
Restoring the default cluster from complete outage...

The instance 'localhost.localdomain:3326' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y/N]: y

The instance 'localhost.localdomain:3336' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y/N]: y

NOTE: Group Replication will communicate with other members using 'localhost.localdomain:33161'. Use the localAddress option to override.

WARNING: Instance 'localhost.localdomain:3316' cannot persist Group Replication configuration since MySQL version 5.7.30 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the dba.configureLocalInstance() command locally to persist the changes.
localhost.localdomain:3316 was restored.
Rejoining 'localhost.localdomain:3326' to the cluster.
NOTE: Group Replication will communicate with other members using 'localhost.localdomain:33261'. Use the localAddress option to override.

WARNING: Instance 'localhost.localdomain:3326' cannot persist Group Replication configuration since MySQL version 5.7.30 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the dba.configureLocalInstance() command locally to persist the changes.
Rejoining 'localhost.localdomain:3336' to the cluster.
NOTE: Group Replication will communicate with other members using 'localhost.localdomain:33361'. Use the localAddress option to override.

WARNING: Instance 'localhost.localdomain:3336' cannot persist Group Replication configuration since MySQL version 5.7.30 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the dba.configureLocalInstance() command locally to persist the changes.
The cluster was successfully rebooted.

<Cluster:bag>
 MySQL  localhost:3316 ssl  JS > var c  = dba.getCluster()
 MySQL  localhost:3316 ssl  JS > c.status()
{
    "clusterName": "bag", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "localhost.localdomain:3316", 
        "ssl": "DISABLED", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "localhost.localdomain:3316": {
                "address": "localhost.localdomain:3316", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "localhost.localdomain:3326": {
                "address": "localhost.localdomain:3326", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "localhost.localdomain:3336": {
                "address": "localhost.localdomain:3336", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "localhost.localdomain:3316"
}
 MySQL  localhost:3316 ssl  JS > 

7.1.2.4 恢复方法二

停止集群写入
重启全部mysqld进程
mysqlsh 登录到写入数据的实例,执行

dba.rebootClusterFromCompleteOutage()


数据库      mysql5.7 innodb cluster

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!