1. ホーム
  2. マイスル

Centos7 インストール mysql+keepalived 高可用性環境

2022-02-21 19:40:40

ディレクトリ

I. 環境整備

II. mysqlのダウンロードとインストール

三、keepalivedのダウンロードとインストール

mysqlデュアルホスト+keepalived高可用性環境の構築

V. 遭遇した問題とその解決方法


I. 環境整備

1. ノード情報

<テーブル ノードIP ノード名 システム ソフトウェアとバージョン 192.168.51.187 ノード187 CentOS 7

キープアライブ-1.3.5

mysql-5.7.24

192.168.51.226 ノード226 CentOS 7

2. バーチャルVIP

<テーブル バーチャルVIP 192.168.51.170

3. 両ノードの初期化、共通ツールのインストール

yum install gcc gcc-c++ vim-enhanced glibc make unzip openssl openssl-devel openssh-server openssh-clients wget -y

II. mysqlのダウンロードとインストール

* 特定とマークされたものを除き、すべての手順は両ノードで行われ、両ノードにmysqlをインストールします。

1. ウェブサイトからダウンロード

リンク https://downloads.mysql.com/archives/community/

バージョン選択とダウンロード

2. mysqlが既にインストールされているか、システムに付属しているMariadbをアンインストールするか確認し、インストールされている場合は、インストールされているものを先にアンインストールします

[root@node187 ~]# rpm -qa | grep mysql
[root@node187 ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.64-1.el7.x86_64
[root@node187 ~]# yum -y remove mariadb-libs-5.5.64-1.el7.x86_64

3. インストーラーをサーバーに転送し、解凍します。

[root@node187 home]# tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
Rename the mysql installation directory
[root@node187 home]# mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql

4. 新しいユーザーグループとユーザーの作成

[root@node187 home]# groupadd mysql
Disable mysql login
[root@node187 home]# useradd -s /sbin/nologin mysql 

5. mysqlの下にdataディレクトリとlogディレクトリを新規に作成します。

[root@node187 home]# cd mysql
[root@node187 mysql]# mkdir data
[root@node187 mysql]# mkdir log

 6. mysqlフォルダの所有者権限をmysqlユーザに変更する。

[root@node187 mysql]# chown -R mysql:mysql . /

7. データベースを初期化し、初期化パスワードを記憶させる。

[root@node187 mysql]# . /bin/mysqld --user=mysql --basedir=/home/mysql --datadir=/home/mysql/data --initialize

<イグ

8. 8. my.cnf 設定ファイルを作成し、以下の設定を追加します。

ノード1の設定ファイルを変更します

[root@node187 mysql]# vim /etc/my.cnf
[mysql]
default-character-set=utf8
[mysqld]
skip-name-resolve
port = 3306
basedir=/home/mysql
datadir=/home/mysql/data
socket=/home/mysql/mysql.sock
max_connections=1000
# The default character set used by the server is the 8-bit encoded latin1 character set
character-set-server=utf8
# The default storage engine to be used when creating new tables
default-storage-engine=INNODB
lower_case_table_names=1 # case-insensitive
max_allowed_packet=100M

# Enable ip binding
bind-address = 0.0.0.0
server-id = 1         
log-bin = mysql-bin     
# sync_binlog = 1
# binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2     
auto-increment-offset = 1 

[mysqld_safe]
log-error = /home/mysql/log/mysqld.log
pid-file=/home/mysql/data/mysqld.pid
# Specify the path of the socket communication file when the client connects to mysql
[client]
socket=/home/mysql/mysql.sock
default-character-set=utf8

ノード2の設定ファイルを変更する

[root@node226 mysql]# vim /etc/my.cnf
[mysql]
default-character-set=utf8
[mysqld]
skip-name-resolve
port = 3306
basedir=/home/mysql
datadir=/home/mysql/data
socket=/home/mysql/mysql.sock
max_connections=1000
# The default character set used by the server is the 8-bit encoded latin1 character set
character-set-server=utf8
# The default storage engine to be used when creating new tables
default-storage-engine=INNODB
lower_case_table_names=1 # case-insensitive
max_allowed_packet=100M

# Enable ip binding
bind-address = 0.0.0.0
server-id = 2        
log-bin = mysql-bin    
# sync_binlog = 1
# binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2     
auto-increment-offset = 2    
slave-skip-errors = all

[mysqld_safe]
log-error = /home/mysql/log/mysqld.log
pid-file=/home/mysql/data/mysqld.pid
# Specify the path of the socket communication file when the client connects to mysql
[client]
socket=/home/mysql/mysql.sock
default-character-set=utf8

9. ブートにmysqlを追加する

[root@node187 mysql]# cp . /support-files/mysql.server /etc/init.d/mysqld

mysqldの以下のコードセクションを修正します。

[root@node187 mysql]# vim /etc/init.d/mysqld 
Modify the following
basedir=/home/mysql
datadir=/home/mysql/data

<イグ

 起動の設定

[root@node187 mysql]# chkconfig --add mysqld

10. 環境変数の追加

[root@node187 mysql]# vim /etc/profile
Add the following
export PATH=$PATH:/home/mysql/bin
to make the profile take effect immediately
[root@node187 mysql]# source /etc/profile


11. サービスの開始

[root@node187 mysql]# service mysqld start

<イグ

12. 上記手順7の赤枠の初期パスワードでmysqlにログインします。

[root@node187 mysql]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor. commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
Other names may be trademarks of their respective owners.
Other names may be trademarks of their respective owners.

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

mysql> 

13. 必要に応じて、mysqlデータベースのrootユーザーのパスワードを変更します。この場合、パスワードはrootです。

mysql> alter user 'root'@'localhost' identified by 'root';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

データベース接続ツールを使ってデータベースに接続するためには、次の設定が必要です。

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set user.Host='%' where user.User='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


<イグ

接続を正しくテストして、データベースのインストールが完了しました 

15. mysqlメインマスタの設定

configure node one mysql master マスターを設定します。

[root@node187 mysql]# systemctl stop mysqld
[root@node187 mysql]# systemctl start mysqld
Log in to mysql and create a synchronized user
[root@node187 mysql]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor. commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.24-log MySQL Community Server (GPL)

mysql> grant replication slave,replication client on *. * to repl@'192.168.51.%' identified by 'root';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

#lock tables, view binlog node 
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 622 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> 

Record mysql-bin.000001 and 622

configure node two mysql master マスターを設定します。

[root@node226 mysql]# systemctl stop mysqld
[root@node226 mysql]# systemctl start mysqld
Log in to mysql and create a synchronized user
[root@node226 data]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor. commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.24-log MySQL Community Server (GPL)

mysql> grant replication slave,replication client on *. * to repl@'192.168.51.%' identified by 'root';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

#lock tables, view binlog node 
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 622 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> 

Record mysql-bin.000001 and 622

16. 同期をオンにする

ノード1をオンにする

#Unlock
mysql> unlock tables; 
Query OK, 0 rows affected (0.00 sec)

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.51.226',master_user='repl',master_password='root',master_log_file='mysql-bin.000001', master_log_pos=622;
Query OK, 0 rows affected, 2 warnings (0.08 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

#The following two Yeses indicate that the master and slave are up and running
mysql> show slave status \G;


<イグ

ノード2を開く

#Unlock
mysql> unlock tables; 
Query OK, 0 rows affected (0.00 sec)

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.51.187',master_user='repl',master_password='root',master_log_file='mysql-bin.000001', master_log_pos=622;
Query OK, 0 rows affected, 2 warnings (0.07 sec)

mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

#The following two Yeses indicate that the master and slave are up and running
mysql> show slave status \G;

<イグ

17. テスト

この時点で、mysql のマスターとマスターの同期が達成され、両方のデータベースにテーブルを作成し、互いの同期を確認することができます。

ノード1にテーブルを作成する

ノード 2 のテーブルを表示

III. keepalivedのダウンロードとインストール

 1. keepalivedの紹介

公式サイトのアドレスです。  https://www.keepalived.org/

インストール時の参考にしてください。  https://www.keepalived.org/doc/installing_keepalived.html

2. keepalivedのダウンロードとインストール(両ノードにkeepalivedをインストールします。)

[root@node187 ~]# yum install -y openssl-devel
[root@node187 ~]# cd /home
[root@node187 home]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
[root@node187 home]# tar -zvxf keepalived-1.3.5.tar.gz
[root@node187 home]# cd keepalived-1.3.5
[root@node187 keepalived-1.3.5]# . /configure --prefix=/usr/local/keepalived
[root@node187 keepalived-1.3.5]# make && make install
     
[root@node187 keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
[root@node187 keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@node187 keepalived-1.3.5]# mkdir /etc/keepalived/
[root@node187 keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@node187 keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@node187 keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local
 
Change the PIDFile address, otherwise the startup will report an error
[root@node187 keepalived-1.3.5]#vi /lib/systemd/system/keepalived.service
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target
 
[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
 
[Install]
WantedBy=multi-user.target

IV. mysqlデュアルホスト+keepalived高可用性環境の構築

1. ノード1 keepalived.confの設定 ホストIPを変更し、バーチャルIPを設定し、keepalivedを起動します。

[root@node187 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@node187 local]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
       
global_defs {
notification_email {
[email protected] #email random, no email is configured here
}
       
notification_email_from [email protected]
smtp_server 127.0.0.1 
smtp_connect_timeout 30
router_id MASTER-HA
}
       
vrrp_script chk_mysql_port { # Detect if mysql service is running. There are many ways to do this, such as processes, using scripts, etc
    script "/opt/chk_mysql.sh" # Monitor by script here
    interval 2 # script execution interval, detected every 2s
    weight -5 #priority change due to script result, priority -5 if detection fails (script returns non-zero)
    fall 2 # detect 2 consecutive failures to determine a true failure. Will use weight to reduce priority (between 1-255)
    rise 1 # detect 1 success to be considered a success. But do not modify the priority
}
       
vrrp_instance VI_1 {
# state MASTER        
    state BACKUP     
    nopreempt # Non-preempt mode
    interface enp0s3 # Specify the interface of the virtual IP card, check ifconfig to be sure
    mcast_src_ip 192.168.51.187 
    virtual_router_id 51 # router identification, MASTER and BACKUP must be the same
    priority 101 # define the priority, the higher the number, the higher the priority, in the same vrrp_instance, MASTER priority must be greater than the BACKUP priority 
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        192.168.51.170
    }
      
track_script {               
   chk_mysql_port             
}
}
 
# write heartbeat detection script
[root@node187 ~]# vim /opt/chk_mysql.sh
#! /bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    /etc/init.d/keepalived stop
fi
 
[root@node187 ~]# chmod 755 /opt/chk_mysql.sh
     
Start the keepalived service
[root@node187 ~]# /etc/init.d/keepalived start
Starting keepalived: [OK]


2. Node 2 keepalived.confの設定 ホストIPの変更とバーチャルIPの設定、keepalivedの開始

[root@node226 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@node226 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
       
global_defs {
notification_email {
[email protected]
}
       
notification_email_from [email protected]
smtp_server 127.0.0.1 
smtp_connect_timeout 30
router_id MASTER-HA
}
       
vrrp_script chk_mysql_port {
    script "/opt/chk_mysql.sh"
    interval 2            
    weight -5                 
    fall 2                 
    rise 1               
rise 1}
       
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface enp0s3
    mcast_src_ip 192.168.51.226
    virtual_router_id 51    
    priority 99          
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    authentication}
    virtual_ipaddress {    
        192.168.51.170
    }
      
track_script {               
   chk_mysql_port             
}
}
# write heartbeat detection script
[root@node226 ~]# vim /opt/chk_mysql.sh
#! /bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    /etc/init.d/keepalived stop
fi
 
[root@node226 ~]# chmod 755 /opt/chk_mysql.sh
     
Start the keepalived service
[root@node226 ~]# /etc/init.d/keepalived start
Starting keepalived: [OK]

3. テスト

(1) VIPで接続し、接続が成功するか確認する。クライアントとNavicat、およびプロジェクト内の設定により接続が成功する。

mysql -uroot -proot -h192.168.51.170

<イグ

(2) vipがあるマシンのmysqlサービスを停止し、vipが転送されるのを見守る

コマンドからわかるように、現在のVIPはノード1上にあります

Node One
[root@node187 keepalived-1.3.5]# ip addr | grep 192.168
    inet 192.168.51.187/24 brd 192.168.51.255 scope global noprefixroute dynamic enp0s3
    inet 192.168.51.170/32 scope global enp0s3
[root@node187 keepalived-1.3.5]# 

Node 2
[root@node226 keepalived-1.3.5]# ip addr | grep 192.168
    inet 192.168.51.226/24 brd 192.168.51.255 scope global noprefixroute dynamic enp0s3
[root@node226 keepalived-1.3.5]# 

<イグ

ノード1のmysqlサービスを停止します。コンフィギュレーションのスクリプトによると、mysqlサービスを停止するとkeepalivedも停止するため、vipリソースはノード2に切り替わります。(mysqlサービスが立ち上がっていないときは、keepalivedサービスもスムーズに立ち上がりません!)

Node 1
[root@node187 opt]# systemctl stop mysqld
[root@node187 opt]# netstat -na|grep "LISTEN"|grep "3306"|wc -l
0
[root@node187 opt]# ps -ef|grep mysql
root 1783 29952 0 10:49 pts/0 00:00:00 grep --color=auto mysql
[root@node187 opt]# ps -ef|grep keepalived
root 1647 29952 0 10:40 pts/0 00:00:00 grep --color=auto keepalived
[root@node187 opt]# ip addr | grep 192.168
    inet 192.168.51.187/24 brd 192.168.51.255 scope global noprefixroute dynamic enp0s3

Node 2
[root@node226 ~]# ip addr | grep 192.168
    inet 192.168.51.226/24 brd 192.168.51.255 scope global noprefixroute dynamic enp0s3
    inet 192.168.51.170/32 scope global enp0s3
[root@node226 ~]# ps -ef|grep keepalived
root 18963 1 0 10:36 ?        00:00:00 /usr/local/keepalived/sbin/keepalived -D
root 18964 18963 0 10:36 ?        00:00:00 /usr/local/keepalived/sbin/keepalived -D
root 18965 18963 0 10:36 ?        00:00:00 /usr/local/keepalived/sbin/keepalived -D
root 20988 17221 0 10:44 pts/0 00:00:00 grep --color=auto keepalived
[root@node226 ~]# ps -ef|grep mysql
root 18594 1 0 10:36 ?        00:00:00 /bin/sh /home/mysql/bin/mysqld_safe --datadir=/home/mysql/data --pid-file=/home/mysql/data/node226.pid
mysql 18917 18594 0 10:36 ?        00:00:00 /home/mysql/bin/mysqld --basedir=/home/mysql --datadir=/home/mysql/data --plugin-dir=/home/mysql/lib/plugin --user=mysql --log- error=/home/mysql/log/mysqld.log --pid-file=/home/mysql/data/node226.pid --socket=/home/mysql/mysql.sock --port=3306
root 21004 17221 0 10:44 pts/0 00:00:00 grep --color=auto mysql

<イグ

(3) mysqlとkeepalivedを再有効化する keepalivedをスムーズに起動させるために、まずmysqlを有効にする必要があります。

V. 遭遇した問題とその解決方法

1. 説明 パスがなく、権限もないため、このパスを作成し、mysqlユーザーに権限を付与します。

[root@node226 mysql]# service mysqld start
Starting MySQL.2020-12-17T08:53:50.054618Z mysqld_safe error: log-error set to '/home/mysql/log/mysqld.log', however file don't exist. create writable for user 'mysql'.
 The server quit without updating PID file (/home/mysql/data/node226.pid).


解決方法 ログディレクトリを作成し、それを認証する

mkdir log

chown -R mysql:mysql /home/mysql

2. エラーの報告

[root@node187 mysql]# systemctl status mysqld.service
● mysqld.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since 5 2020-12-18 12:29:39 CST; 50min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 19580 ExecStop=/etc/rc.d/init.d/mysqld stop (code=exited, status=0/SUCCESS)
  Process: 21732 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)

Dec 18 12:27:56 node187 systemd[1]: Starting LSB: start and stop MySQL...
Dec 18 12:28:29 node187 mysqld[21732]: Starting MySQL................................. /etc/rc.d/init.d/mysqld: line 146: 22117 killed sleep 1
Dec 18 12:29:39 node187 systemd[1]: mysqld.service: control process exited, code=exited status=1
Dec 18 12:29:39 node187 mysqld[21732]: ..................................................................... The server quit without updating the PID file (/home/mysql/d...mysqld.mysqld.service). .mysqld.pid).
Dec 18 12:29:39 node187 systemd[1]: Failed to start LSB: start and stop MySQL.
Dec 18 12:29:39 node187 systemd[1]: Unit mysqld.service entered failed state.
Dec 18 12:29:39 node187 systemd[1]: mysqld.service failed.
Hint: Some lines were ellipsized, use -l to show in full.


回避策


Add the configuration
[mysqld_safe]
log-error=/home/mysql/log/mysqld.log
pid-file=/home/mysql/data/mysqld.pid

3. 説明:keepalived のインストール時のエラー

configure: error: 
  !!! OpenSSL is not properly installed on your system.!!!
  !!!! Can not include OpenSSL headers files.!!!
[root@node226 keepalived-1.3.5]# make && make install
make: *** No target specified and makefile not found. Stop.

回避策:openssl-devel をインストールします。

yum -y install openssl-devel

4. 説明 VIP経由でmysqlサービスにアクセスできない

[root@node226 keepalived-1.3.5]# mysql -uroot -proot -h192.168.51.170
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.51.170' (113)

解決策 トラブルシューティングの結果、NICタイプの設定が間違っていることがわかり、ifconfigでNICタイプを確認し、keepalived設定ファイルのNICタイプを修正し、修正後にアクセスを再開したところ、正常にアクセスできるようになりました。