実務経験:MySQLマスターモード+ Keepalivedが高可用性を実現

今日は何もする必要はありません。MySQLのメイン構造とKeepalivedを使用して、MySQLの高可用性アーキテクチャを構築し、統合された外部仮想IPを提供する予定です。最初に背景について説明しましょう。高可用性を実現するために、現在のプロジェクトでは単一ノードの存在を回避しています。たとえば、アプリケーションは複数のノードを展開し、負荷分散にNginxを使用しています。ノードに問題があり、アプリケーション全体には影響しません。では、データベース層はどのようにして可用性の高いアーキテクチャを構築するのでしょうか。今日は見ていきます。

全体的な構造

MySQLは主要な主要構造を採用しており、2台のマシンを使用するだけで十分です。次に、vrrpテクノロジーを使用して、IPを仮想化してこれら2台のマシンにKeepalivedをインストールします。2台のマシンは次のとおりです。

  • 192.168.73.141:MySQL(主1)、Keepalived(MASTER)
  • 192.168.73.142:MySQL(主2)、Keepalived(バックアップ)
  • 192.168.73.150:仮想IP

全体的なアーキテクチャ図は次のとおりです。

 

MySQLマスタービルド

MySQLを2台のマシンにそれぞれインストールし、yumメソッドを使用してインストールし、最初にMySQL公式Webサイトからrpmパッケージをダウンロードし、対応するシステムを選択します。ここでは、CentOS7のprmパッケージmysql80-community-release-el7-3.noarchを選択します。 rpm。次に、rpmファイルを2台のマシンにアップロードし、yumを使用してMySQLをインストールします。

192.168.73.141(メイン1)で次のコマンドを実行します。

# 使用yum安装rpm包
yum install mysql80-community-release-el7-3.noarch.rpm

# 安装MySQL社区版 时间较长 耐心等待
yum install mysql-community-server

#启动MySQL服务
service mysqld start

この時点で、MySQLがインストールされ、正常に起動します。次に、rootアカウントでMySQLにログインし、使用可能なアカウントを作成します。

# 从MySQL的日志中 找到root账号的临时密码
grep 'temporary password' /var/log/mysqld.log

# 使用root账号登录 输入临时密码 登录成功
mysql -uroot -p

# 修改root账号的密码 使用MYSQL_NATIVE_PASSWORD的加密方式 这种方式大多数客户端都可以连接
ALTER USER 'root'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'MyNewPass4!';

# 创建MySQL账号
CREATE USER 'USER'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'USER_PWD';
# 对USER账号授权
GRANT ALL ON *.* TO 'USER'@'%';
# 刷新权限
FLUSH PRIVILEGES;

さて、ここでは、MySQLが192.168.73.141に正常にインストールされ、USERアカウントが作成され、NAVICATやその他のクライアントを使用して接続できます。

192.168.73.142(マスター2)上記のコマンドを実行して、両方のマシンにMySQLをインストールします。次に、MySQLの主な構造を構成する必要があります。

まず、192.168.73.141(メイン1)のmy.cnfファイルを変更します。

vim /etc/my.cnf


datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# 配置server-id 每个MySQL实例的server-id都不能相同
server-id=1
# MySQL的日志文件的名字
log-bin=mysql_master
# 作为从库时 更新操作是否写入日志 on:写入  其他数据库以此数据库做主库时才能进行同步
log-slave-updates=on

# MySQL系统库的数据不需要同步 我们这里写了3个  更加保险
# 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user  数据还是会同步的
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
# 使用通配符忽略MySQL系统库的表  这样在create user时也不会进行同步了
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=sys.%
# MySQL系统库的日志不计入binlog 这样更加保险了
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys

また、192.168.73.142(メイン2)のmy.cnfファイルを変更します。これを直接コピーし、次のように2つだけ変更する必要があります。

# 配置server-id=2
server-id=2
# MySQL的日志文件的名字 不改名字也可以 这里主要为了区分
log-bin=mysql_slave

構成ファイルが変更されました。MySQLサービスをそれぞれ192.168.73.141(メイン1)と192.168.73.142(メイン2)で再起動します。

service mysqld restart

次に、マスタースレーブを構成します。実際、マスターマスターモードでは、2つのマスタースレーブを構成します。最初に192.168.73.141(マスター1)-> 192.168.73.142(マスター2)のマスタースレーブを構成し、次に192.168.73.142を逆に構成します。 (マスター2)-> 192.168.73.141(マスター1)マスタースレーブなので、マスターマスターモードが構成されます。

まず、192.168.73.141(マスター1)-> 192.168.73.142(マスター2)のマスタースレーブを構成しましょう。

最初に192.168.73.141(メイン1)のデータベースにログインし、次のコマンドを実行します。

# 创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密
mysql> CREATE USER 'repl_master'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'password';
# 对repl_master授予备份的权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_master'@'%';
# 刷新权限
mysql> FLUSH PRIVILEGES;

# 查看MySQL主节点的状态
mysql> SHOW MASTER STATUS;

+-------------------+---------+--------------+---------------------------------------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB                             | Executed_Gtid_Set |
+-------------------+---------+--------------+---------------------------------------------+------------------+
| mysql_master.000001 |     516 |              | information_schema,mysql,performance_schema,sys |                  |
+-------------------+---------+--------------+---------------------------------------------+------------------+
1 row in set

binlogファイルの名前(mysql_master.000001)と場所(516)を覚えておく必要があります。

次に、192.168.73.142(メイン2)のデータベースにログインし、次のコマンドを実行します。

mysql> CHANGE MASTER TO
		   # MySQL主的IP
    ->     MASTER_HOST='192.168.73.141',
           # MySQL主的端口
    ->     MASTER_PORT=3306
           # MySQL主的备份账号
    ->     MASTER_USER='repl_master',
           # MySQL主的备份账号密码
    ->     MASTER_PASSWORD='password',
           # 日志文件 通过show master status得到的
    ->     MASTER_LOG_FILE='mysql_master.000001',
           # 日志文件位置 通过show master status得到的
    ->     MASTER_LOG_POS=516;
    
# 开启从库
mysql> START SLAVE;
# 查看从库的状态
mysql> SHOW SLAVE STATUS;

このようにして、192.168.73.141(マスター1)-> 192.168.73.142(マスター2)のマスタースレーブが構築されます。次に、それを逆にして、192.168.73.142(マスター2)-> 192.168.73.141(マスター1)のマスタースレーブを作成します。

最初に192.168.73.142(メイン2)のデータベースにログインし、次のコマンドを実行します。

# 创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密
mysql> CREATE USER 'repl_slave'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'password';
# 对repl_slave授予备份的权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_slave'@'%';
# 刷新权限
mysql> FLUSH PRIVILEGES;

# 查看MySQL主节点的状态
mysql> SHOW MASTER STATUS;

+-------------------+---------+--------------+---------------------------------------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB                             | Executed_Gtid_Set |
+-------------------+---------+--------------+---------------------------------------------+------------------+
| mysql_slave.000001 |     379 |              | information_schema,mysql,performance_schema,sys |                  |
+-------------------+---------+--------------+---------------------------------------------+------------------+
1 row in set

192.168.73.141(メイン1)のデータベースにログインし、次のコマンドを実行します。

mysql> CHANGE MASTER TO
		   # MySQL主的IP
    ->     MASTER_HOST='192.168.73.142',
           # MySQL主的端口
    ->     MASTER_PORT=3306
           # MySQL主的备份账号
    ->     MASTER_USER='repl_slave',
           # MySQL主的备份账号密码
    ->     MASTER_PASSWORD='password',
           # 日志文件 通过show master status得到的
    ->     MASTER_LOG_FILE='mysql_slave.000001',
           # 日志文件位置 通过show master status得到的
    ->     MASTER_LOG_POS=379;
    
# 开启从库
mysql> START SLAVE;
# 查看从库的状态
mysql> SHOW SLAVE STATUS;

このようにして、192.168.73.142(マスター2)-> 192.168.73.141(マスター1)のマスタースレーブも設定されます。Navicatを使用してそれぞれ192.168.73.141(メイン1)と192.168.73.142(メイン2)に接続し、テーブルの作成と挿入ステートメントを実行して、マスターとマスターの同期が成功したかどうかを確認できます。ここでは説明しません。

Keepalivedの高可用性

MySQLマスター構造が構築されており、どのMySQLデータから挿入されても、別のMySQLに同期されます。MySQLの主要な構造はありますが、高い可用性を保証することはできません。たとえば、アプリケーションは192.168.73.141(メイン1)に接続されています。192.168.73.141(メイン1)のMySQLが失敗した場合、アプリケーションは失敗しません。 192.168.73.142(メイン2)に自動的に切り替えることはできず、アプリケーションも利用できません。これを行うには、Keepalivedに頼る必要があります。

Keepalivedには2つの主な機能があります。

  • 仮想IPを提供して、デュアルシステムのホットバックアップを実現します
  • LVSによる負荷分散を実現

ここではKeepalivedを使用しており、デュアルシステムのホットバックアップを実現するために仮想IPを提供する機能の1つを使用するだけで済みます。192.168.73.141(メイン1)と192.168.73.142(メイン2)の両方にKeepalivedをインストールする必要があり、次のようにコマンドを実行します。

yum install keepalived

直接yumを使用してインストールします。インストール後、keepalivedの構成ファイルを編集し、最初に192.168.73.141(メイン1)の構成ファイルを次のように編集します。

vim /etc/keepalived/keepalived.conf

# 全局配置 不用动  只需注释掉vrrp_strict
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #必须注释掉 否则报错
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 检查mysql服务是否存活的脚本
vrrp_script chk_mysql {
    script "/usr/bin/killall -0 mysqld"
}
# vrrp配置虚IP
vrrp_instance VI_1 {
    # 状态:MASTER  另外一台机器为BACKUP
    state MASTER
    # 绑定的网卡
    interface ens33
    # 虚拟路由id  两台机器需保持一致
    virtual_router_id 51
    # 优先级 MASTER的值要大于BACKUP
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP地址 两台keepalived需要一致
    virtual_ipaddress {
        192.168.73.150
    }
    # 检查脚本 vrrp_script的名字
    track_script {
        chk_mysql
    }
}

###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的  这里用不到
###

次に、192.168.73.142(メイン2)の構成ファイルを編集し、次のように状態MASTERを状態BACKUPに変更します。

state BACKUP

keepalivedの構成を通じて、192.168.73.150のIPを提供します。これは、状態がMASTERであるため、実際には192.168.73.141(マスター1)を指します。keepalivedは、192.168.73.141(プライマリ1)上のMySQLが使用できないことを検出すると、自動的に192.168.73.142(プライマリ2)に切り替わります。外部の統合使用は192.168.73.150であるため、外部ユーザーを認識しません。

検出されたスクリプト/ usr / bin / killall -0 mysqldを見てみましょう。killallコマンドはシステムに組み込まれていないため、インストールする必要があります。次のように、yumを使用してインストールします。

# 先查询一下killall
yum search killall

#找到了psmisc.x86_64
Loading mirror speeds from cached hostfile
===============Matched: killall ================================
psmisc.x86_64 : Utilities for managing processes on your system

# 安装psmisc
yum install psmisc

したがって、killallコマンドを使用できます。killall -0はプロセスを強制終了するものではありませんが、プロセスが存在するかどうかを確認するために、存在する場合は0を返し、存在しない場合は1を返します。1に戻ると、keepalivedはアクティブ状態とスタンバイ状態を切り替えます。

OK、killallも導入されました。次のように、2台のマシンでkeepalivedを開始します。

# 启动keepalived
service keepalived start

次に、次のように、IPの192.168.73.141(メイン1)に192.168.73.150があるかどうかを確認します。

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:57:8c:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.73.141/24 brd 192.168.73.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.73.150/32 scope global ens33  # 我们看到了192.168.73.150
       valid_lft forever preferred_lft forever
    inet6 fe80::720b:92b0:7f78:57ed/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

この時点で、keepalivedの設定は完了です。Navicatを介して192.168.73.150に接続し、データベースに正常に接続できます。実際には、192.168.73.141のデータベースに接続し、データベースを正常に動作させます。

次に、192.168.73.141(マスター1)でMySQLサービスを停止します。

service mysqld stop

# 再用 ip addr查看一下
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:57:8c:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.73.141/24 brd 192.168.73.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::720b:92b0:7f78:57ed/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

192.168.73.150のIPが見つかりません。192.168.73.142(メイン2)に移動して確認すると、192.168.73.150のIPが見つかります。Navicatでデータベースを運用しており、通常通りご利用いただけます。ただし、現時点では、実際の接続は192.168.73.142(メイン2)のデータベースです。私たちは気づいていません。192.168.73.141(メイン1)でmysqlサービスを再起動すると、192.168.73.150も192.168.73.141(メイン1)に切り替わります。

総括する

MySQLマスターのメイン構造とkeepalivedデュアルマシンのホットスタンバイにより、MySQLの高い可用性を実現しました。アプリケーションは仮想IPに接続できます。特定の接続に接続された実際のMySQLは、気にする必要はありません。読み取りと書き込みの分離を再度行う場合は、MySQL(マスター2)をマスターとして使用して、データベースのマスターとスレーブの関係を構成できます。このとき、仮想IPはMySQL(マスター1)に接続され、MySQL(マスター1)はデータをMySQL(マスター2)に同期し、MySQL(マスター2)はデータを他のスレーブデータベースに同期します。MySQL(マスター1)に障害が発生した場合、仮想IPはMySQL(マスター2)を指し、MySQL(マスター2)はデータを他のスレーブデータベースに同期します。

著者:牛9日目

元のリンク:https://www.cnblogs.com/boboooo/p/13891447.html

この記事が役に立ったと思われる場合は、転送してフォローしてサポートを受けることができます

おすすめ

転載: blog.csdn.net/weixin_50205273/article/details/109336396