ホームページ  >  記事  >  データベース  >  MySQL 高可用性ソリューション MMM の詳細説明

MySQL 高可用性ソリューション MMM の詳細説明

黄舟
黄舟オリジナル
2017-10-04 09:26:271912ブラウズ

MySQL 自体はレプリケーション フェイルオーバー ソリューションを提供しません。MMM ソリューションを通じてサーバー フェイルオーバーを実現できるため、mysql の高可用性を実現できます。 MMM はフローティング IP の機能を提供するだけでなく、現在のマスター サーバーがハングアップした場合、同期構成を手動で変更することなく、同期レプリケーションのためにバックエンド スレーブ サーバーを自動的に新しいマスター サーバーに転送します。 MMM:

MMM は、MySQL 用のマルチマスター レプリケーション マネージャーです。Perl 実装に基づく、mysql マルチマスター レプリケーション マネージャー、mysql マスター/マスター レプリケーション構成の監視、フェイルオーバー、および管理のためのスケーラブルなスクリプト スイート (どのノードでも 1 つだけ) MMM はスレーブ サーバー上で読み取りロード バランシングを実行することもできるため、レプリケーションに使用されるサーバーのグループ上で仮想 IP を開始するために使用することもできます。さらに、ノード間のデータ バックアップと再起動も実行できます。同期機能用。 MySQL 自体はレプリケーション フェイルオーバー ソリューションを提供しません。MMM ソリューションを通じてサーバー フェイルオーバーを実現できるため、MySQL の高可用性を実現できます。 MMM はフローティング IP の機能を提供するだけでなく、現在のマスター サーバーがハングアップした場合、バックエンド スレーブ サーバーは同期レプリケーションのために新しいマスター サーバーに自動的に転送され、同期構成を手動で変更する必要はありません。このソリューションは現在、比較的成熟したソリューションです。詳細については、公式 Web サイトを参照してください: http://mysql-mmm.org

利点

: 高可用性、優れた拡張性、障害時の自動切り替え、マスター間同期、データベース書き込みは 1 回のみ操作も同時に提供され、データの一貫性が保証されます。マスター サーバーがハングアップすると、別のマスターがすぐに引き継ぎ、他のスレーブ サーバーは手動介入なしで自動的に切り替わります。

短所

: モニター ノードは単一ポイントですが、これを keepalived または haertbeat と組み合わせて高可用性を実現することもできます。少なくとも 3 つのノードが必要であり、読み取りと書き込みの分離を実現する必要があります。リーダーはフロントエンドで作成する必要があります。分離プログラムを作成します。読み書きが多い業務システムではパフォーマンスがあまり安定せず、レプリケーションの遅延や切り替え失敗などの問題が発生する可能性があります。 MMM ソリューションは、高いデータ セキュリティ要件があり、読み取りと書き込みが忙しい環境にはあまり適していません。

適用可能なシナリオ:

MMM は、データベース アクセスが大きく、読み取りと書き込みを分離できるシナリオに適しています。 Mmm の主な機能は、次の 3 つのスクリプトによって提供されます:

mmm_mond は、すべての監視作業を担当する監視デーモン プロセスであり、ノードの削除を決定します (mmm_mond プロセスは定期的なハートビート検出を行い、失敗した場合は、書き込み IP がフロートされます)

mmm_agentd は、mysql サーバー上で実行されるエージェント デーモンであり、単純なリモート サービス セットを通じて監視ノードに提供されます。Mmm_control は、監視プロセス全体を通じて、コマンド ラインを通じて mmm_mond プロセスを管理します。許可されたユーザーには mmm_monitor ユーザーと mmm_agent ユーザーが含まれます。mmm のバックアップ ツールを使用する場合は、mmm_tools ユーザーも追加する必要があります。


2. デプロイと実装

1. 環境の紹介

OS: centos7.2 (64-bit) データベースシステム: mysql5.7.13

selinuxを閉じる

ntpの設定、時刻の同期

役割192.168。 31.319 2.168.31.4192.168.31.5
IP

ホスト名

サーバーID

vipを書き込む

vipを読む

Master1
192.168.31.83

マスター1

1

192.168.31.2


マスター2(バックアップ)
192.168.31.141

マスター2

2


スレーブ1
192.168.31.250

スレーブ1

3


スレーブ2
192.168.31.225

スレーブ2

4


モニター
19 2.168.31.106

monitor1

なし


2. すべてのホストで /etc/hosts ファイルを設定し、次の内容を追加します:

192.168.31.83 master1
192.168.31.141 master2
192.168.31.250 SLAVE1
192.168.31.225 SLAVE2
192.168すべての.31.1 06 モニター1

hosts perl をインストール、perl-develperl-CPAN libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64 パッケージ
#yum -y install perl-* libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64

注: を使用しますos7オンラインおいしいソースのインストール

Perl 関連ライブラリのインストール

#cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl Mail::Send Net::Ping Proc::Daemon Time: :HiRes Params::Validate Net::ARP

3. mysql5.7 をインストールし、マスター 1、マスター 2、スレーブ 1、スレーブ 2 ホストにレプリケーションを設定します

マスター 1 とマスター 2 は互いのマスターとスレーブであり、スレーブ 1 とスレーブ 2 はマスター 1 のスレーブです。
各 mysql 設定ファイル /etc/my.cnf に次の内容を追加します。server_id は重複できないことに注意してください。

master1 host:


log-bin = mysql-bin
binlog_format = mixed
server-id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
master2主机:
log-bin = mysql-bin
binlog_format = mixed
server-id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
slave1主机:
server-id = 3
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only  = 1
slave2主机:
server-id = 4
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only  = 1

my.cnf への変更が完了したら、systemctl restart mysqld を使用して mysql サービスを再起動します

4 つのデータベース ホストのファイアウォールを有効にしたい場合は、ファイアウォールをオフにする必要があります。または、アクセス ルールを作成します:

firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
マスター/スレーブ構成 (マスター 1 とマスター 2 はマスターとして構成され、スレーブ 1 とスレーブ 2 はスレーブとして構成されます)マスター 1 の):
マスター 1 の承認:

mysql> grant replication slave on *.* to rep@'192.168.31.%' identified by '123456';


マスター 2 の承認:

mysql> grant replication slave on *.* to rep@'192.168.31.%' identified by '123456';


マスター 2、スレーブ 1、およびスレーブ 2 をマスター 1 のスレーブ ライブラリとして設定します:
マスター 1 で show master status を実行し、binlog ファイルと位置ポイントを取得します。 master2、slave1、slave2 の

mysql> show master status;
+------------------+----------+--------------+------------------+--------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+---------------------------------------------------+
| mysql-bin.000001 | 452 | | | |
+------------------+----------+--------------+------------------+-----------------------------------------------------+

が実行されます

mysql> change master to master_host='192.168.31.83',master_port=3306,master_user='rep',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=452;
mysql>slave start;

マスターとスレーブのレプリケーションを確認します:
master2 host:

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.83
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 452
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

slave1 host:

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.83
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 452
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

slave2 host:

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.83
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 452
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

If S lave_IO_Running と Slave_SQL_Running は両方とも Yes 、マスターとスレーブはすでにOKです
マスター1をマスター2のスレーブライブラリとして設定します:
マスター2でshow master statusを実行して、binlogファイルと位置ポイントを取得します

mysql> show master status;
+------------------+----------+--------------+------------------+--------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+---------------------------------------------------+
| mysql-bin.000001 | 452 | | | |
+------------------+----------+--------------+------------------+----------------------------------------------------+

マスター1で実行します:

mysql> change master to master_host='192.168.31.141',master_port=3306,master_user='rep',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=452;
mysql> start slave;

マスターを確認します-slave replication:
master1 host:

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.141
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 452
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Slave_IO_Running と Slave_SQL_Running が両方とも Yes の場合、マスター/スレーブ構成は OK です
4. mysql-mmm 構成:
4 つの mysql ノードにユーザーを作成します
エージェント アカウントを作成します:

mysql> grant super,replicationclient,process on *.* to 'mmm_agent'@'192.168.31.%' identified by '123456';


監視アカウントの作成:

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.31.%' identified by '123456';


注1: 前回のマスター/スレーブレプリケーションとマスター/スレーブはすでにOKなので、master1サーバーで実行したところ、OKでした。
マスター 2、スレーブ 1、およびスレーブ 2 の DB にモニタリング アカウントとエージェント アカウントが存在するかどうかを確認します

mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');
+-------------+----------------------------+
| user | host |
+-------------+----------------------------+
| mmm_agent | 192.168.31.% |
| mmm_monitor | 192.168.31.% |
+-------------+------------------------------+

または

mysql> show grants for 'mmm_agent'@'192.168.31.%';
+-----------------------------------------------------------------------------------------------------------------------------+
| Grants for mmm_agent@192.168.31.% |
+-----------------------------------------------------------------------------------------------------------------------------+
| GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'mmm_agent'@'192.168.31.%' |
+-----------------------------------------------------------------------------------------------------------------------------+
mysql> show grants for 'mmm_monitor'@'192.168.31.%';
+-----------------------------------------------------------------------------------------------------------------------------+
| Grants for mmm_monitor@192.168.31.% |
+-----------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.31.%' |

注 2:
mmm_monitor ユーザー: mmm モニタリングは、mysql サーバー プロセスの健全性をチェックするために使用されます
mmm_agent ユーザー: mmmエージェント 読み取り専用モード、複製されたマスターサーバーなどの変更に使用されます。
5. Mysql-mmm のインストール
監視ホスト (192.168.31.106) に監視プログラムをインストールします

cd /tmp
wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -zxf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install

データベースサーバー (master1、master2、スレーブ1、スレーブ2) エージェント

cd /tmp
wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -zxf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install

6. mmmを設定します

設定ファイルを書き込みます。5つのホストは一貫している必要があります:
インストールが完了すると、すべての設定ファイルは/etc/mysql-mmm/に配置されます。管理サーバーとデータベース サーバーには、共通ファイル mmm_common.conf が含まれている必要があります。その内容は次のとおりです:
active_master_rolewriter#アクティブなマスター ロール インジケーター、すべての DB サーバーは read_only パラメーターをオンにする必要があり、ライター サーバー監視エージェントは自動的にread_only 属性。

<host default>
cluster_interfaceeno16777736#群集的网络接口
pid_path /var/run/mmm_agentd.pid#pid路径
bin_path /usr/lib/mysql-mmm/#可执行文件路径
replication_user rep#复制用户
replication_password 123456#复制用户密码
agent_usermmm_agent#代理用户
agent_password 123456#代理用户密码
</host>
<host master1>#master1的host名
ip 192.168.31.83#master1的ip
mode master#角色属性,master代表是主
peer master2#与master1对等的服务器的host名,也就是master2的服务器host名
</host>
<host master2>#和master的概念一样
ip 192.168.31.141
mode master
peer master1
</host>
<host slave1>#从库的host名,如果存在多个从库可以重复一样的配置
ip 192.168.31.250#从的ip
mode slave#slave的角色属性代表当前host是从
</host>
<host slave2>#和slave的概念一样
ip 192.168.31.225
mode slave
</host>
<role writer>#writer角色配置

hosts master1,master2#能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。
ips 192.168.31.2#对外提供的写操作的虚拟IP
mode exclusive#exclusive代表只允许存在一个主,也就是只能提供一个写的IP
adb36db4876d5ae8ea335a15e6246fd6
53f263d2cc20f60e093642c0c2da6c77#read角色配置
hosts master2,slave1,slave2#对外提供读操作的服务器的host名,当然这里也可以把master加进来
ips 192.168.31.3, 192.168.31.4, 192.168.31.5#对外提供读操作的虚拟ip,这三个ip和host不是一一对应的,并且ips也hosts的数目也可以不相同,如果这样配置的话其中一个hosts会分配两个ip
mode balanced#balanced代表负载均衡
adb36db4876d5ae8ea335a15e6246fd6
同时将这个文件拷贝到其它的服务器,配置不变
#for host in master1 master2 slave1 slave2 ; do scp /etc/mysql-mmm/mmm_common.conf $host:/etc/mysql-mmm/ ; done
代理文件配置
编辑 4台mysql节点机上的/etc/mysql-mmm/mmm_agent.conf
在数据库服务器上,还有一个mmm_agent.conf需要修改,其内容是:
includemmm_common.conf
this master1
注意:这个配置只配置db服务器,监控服务器不需要配置,this后面的host名改成当前服务器的主机名。
启动代理进程
在 /etc/init.d/mysql-mmm-agent的脚本文件的#!/bin/sh下面,加入如下内容
source /root/.bash_profile
添加成系统服务并设置为自启动

#chkconfig --add mysql-mmm-agent
#chkconfigmysql-mmm-agent on
#/etc/init.d/mysql-mmm-agent start

注:添加source /root/.bash_profile目的是为了mysql-mmm-agent服务能启机自启。
自动启动和手动启动的唯一区别,就是激活一个console 。那么说明在作为服务启动的时候,可能是由于缺少环境变量
服务启动失败,报错信息如下:

Daemon bin: &#39;/usr/sbin/mmm_agentd&#39;
Daemon pid: &#39;/var/run/mmm_agentd.pid&#39;
Starting MMM Agent daemon... Can&#39;t locate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_agentd line 7.
BEGIN failed--compilation aborted at /usr/sbin/mmm_agentd line 7.
failed

解决方法:

# cpanProc::Daemon
# cpan Log::Log4perl
# /etc/init.d/mysql-mmm-agent start
Daemon bin: &#39;/usr/sbin/mmm_agentd&#39;
Daemon pid: &#39;/var/run/mmm_agentd.pid&#39;
Starting MMM Agent daemon... Ok
# netstat -antp | grep mmm_agentd
tcp 0 0 192.168.31.83:9989 0.0.0.0:* LISTEN 9693/mmm_agentd
配置防火墙
firewall-cmd --permanent --add-port=9989/tcp
firewall-cmd --reload
编辑 monitor主机上的/etc/mysql-mmm/mmm_mon.conf 
includemmm_common.conf
<monitor>
ip 127.0.0.1##为了安全性,设置只在本机监听,mmm_mond默认监听9988
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
status_path/var/lib/misc/mmm_mond.status
ping_ips192.168.31.83,192.168.31.141,192.168.31.250,192.168.31.225#用于测试网络可用性 IP 地址列表,只要其中有一个地址 ping 通,就代表网络正常,这里不要写入本机地址
auto_set_online 0#设置自动online的时间,默认是超过60s就将它设置为online,默认是60s,这里将其设为0就是立即online
</monitor>
<check default>
check_period 5
trap_period 10
timeout 2
#restart_after 10000
max_backlog 86400
</check>
check_period

描述:检查周期默认为5s
默认值:5s
trap_period
描述:一个节点被检测不成功的时间持续trap_period秒,就慎重的认为这个节点失败了。
默认值:10s
timeout
描述:检查超时的时间
默认值:2s
restart_after
描述:在完成restart_after次检查后,重启checker进程
默认值:10000
max_backlog
描述:记录检查rep_backlog日志的最大次数
默认值:60

<host default>
monitor_usermmm_monitor#监控db服务器的用户
monitor_password 123456#监控db服务器的密码
</host>
debug 0#debug 0正常模式,1为debug模式
启动监控进程:
在 /etc/init.d/mysql-mmm-agent的脚本文件的#!/bin/sh下面,加入如下内容 
source /root/.bash_profile 
添加成系统服务并设置为自启动
#chkconfig --add mysql-mmm-monitor
#chkconfigmysql-mmm-monitor on
#/etc/init.d/mysql-mmm-monitor start

启动报错:

Starting MMM Monitor daemon: Can not locate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_mond line 11.
BEGIN failed--compilation aborted at /usr/sbin/mmm_mond line 11.
failed

解决方法:安装下列perl的库

#cpanProc::Daemon
#cpan Log::Log4perl
[root@monitor1 ~]# /etc/init.d/mysql-mmm-monitor start
Daemon bin: &#39;/usr/sbin/mmm_mond&#39;
Daemon pid: &#39;/var/run/mmm_mond.pid&#39;
Starting MMM Monitor daemon: Ok
[root@monitor1 ~]# netstat -anpt | grep 9988
tcp 0 0 127.0.0.1:9988 0.0.0.0:* LISTEN 8546/mmm_mond

注1:无论是在db端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。
注2:MMM启动顺序:先启动monitor,再启动 agent

检查集群状态:

[root@monitor1 ~]# mmm_control show
master1(192.168.31.83) master/ONLINE. Roles: writer(192.168.31.2)
master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)
slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)

如果服务器状态不是ONLINE,可以用如下命令将服务器上线,例如:

#mmm_controlset_online主机名

例如:[root@monitor1 ~]#mmm_controlset_onlinemaster1
从上面的显示可以看到,写请求的VIP在master1上,所有从节点也都把master1当做主节点。
查看是否启用vip

[root@master1 ~]# ipaddr show dev eno16777736
eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdiscpfifo_fast state UP qlen 1000
link/ether 00:0c:29:6d:2f:82 brdff:ff:ff:ff:ff:ff
inet 192.168.31.83/24 brd 192.168.31.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.31.2/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe6d:2f82/64 scope link
valid_lft forever preferred_lft forever
[root@master2 ~]# ipaddr show dev eno16777736
eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdiscpfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:1a:9c brdff:ff:ff:ff:ff:ff
inet 192.168.31.141/24 brd 192.168.31.255 scope global dynamic eno16777736
valid_lft 35850sec preferred_lft 35850sec
inet 192.168.31.5/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe75:1a9c/64 scope link
valid_lft forever preferred_lft forever
[root@slave1 ~]# ipaddr show dev eno16777736
eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdiscpfifo_fast state UP qlen 1000
link/ether 00:0c:29:02:21:19 brdff:ff:ff:ff:ff:ff
inet 192.168.31.250/24 brd 192.168.31.255 scope global dynamic eno16777736
valid_lft 35719sec preferred_lft 35719sec
inet 192.168.31.4/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe02:2119/64 scope link
valid_lft forever preferred_lft forever
[root@slave2 ~]# ipaddr show dev eno16777736
eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdiscpfifo_fast state UP qlen 1000
link/ether 00:0c:29:e2:c7:fa brdff:ff:ff:ff:ff:ff
inet 192.168.31.225/24 brd 192.168.31.255 scope global dynamic eno16777736
valid_lft 35930sec preferred_lft 35930sec
inet 192.168.31.3/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee2:c7fa/64 scope link
valid_lft forever preferred_lft forever
在master2,slave1,slave2主机上查看主mysql的指向
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.83
Master_User: rep
Master_Port: 3306
Connect_Retry: 60

MMM高可用性测试:

服务器读写采有VIP地址进行读写,出现故障时VIP会漂移到其它节点,由其它节点提供服务。
首先查看整个集群的状态,可以看到整个集群状态正常

[root@monitor1 ~]# mmm_control show
master1(192.168.31.83) master/ONLINE. Roles: writer(192.168.31.2)
master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)
slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)

模拟master1宕机,手动停止mysql服务,观察monitor日志,master1的日志如下:

[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2017/01/09 22:02:55 WARN Check &#39;rep_threads&#39; on &#39;master1&#39; is in unknown state! Message: UNKNOWN: Connect error (host = 192.168.31.83:3306, user = mmm_monitor)! Can&#39;t connect to MySQL server on &#39;192.168.31.83&#39; (111)
2017/01/09 22:02:55 WARN Check &#39;rep_backlog&#39; on &#39;master1&#39; is in unknown state! Message: UNKNOWN: Connect error (host = 192.168.31.83:3306, user = mmm_monitor)! Can&#39;t connect to MySQL server on &#39;192.168.31.83&#39; (111)
2017/01/09 22:03:05 ERROR Check &#39;mysql&#39; on &#39;master1&#39; has failed for 10 seconds! Message: ERROR: Connect error (host = 192.168.31.83:3306, user = mmm_monitor)! Can&#39;t connect to MySQL server on &#39;192.168.31.83&#39; (111)
2017/01/09 22:03:07 FATAL State of host &#39;master1&#39; changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
2017/01/09 22:03:07 INFO Removing all roles from host &#39;master1&#39;:
2017/01/09 22:03:07 INFO Removed role &#39;writer(192.168.31.2)&#39; from host &#39;master1&#39;
2017/01/09 22:03:07 INFO Orphaned role &#39;writer(192.168.31.2)&#39; has been assigned to &#39;master2&#39;

查看群集的最新状态

[root@monitor1 ~]# mmm_control show
master1(192.168.31.83) master/HARD_OFFLINE. Roles:
master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5), writer(192.168.31.2)
slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)

从显示结果可以看出master1的状态有ONLINE转换为HARD_OFFLINE,写VIP转移到了master2主机上。
检查所有的db服务器群集状态

[root@monitor1 ~]# mmm_control checks all
master1 ping [last change: 2017/01/09 21:31:47] OK
master1 mysql [last change: 2017/01/09 22:03:07] ERROR: Connect error (host = 192.168.31.83:3306, user = mmm_monitor)! Can&#39;t connect to MySQL server on &#39;192.168.31.83&#39; (111)
master1 rep_threads [last change: 2017/01/09 21:31:47] OK
master1 rep_backlog [last change: 2017/01/09 21:31:47] OK: Backlog is null
slave1 ping [last change: 2017/01/09 21:31:47] OK
slave1mysql [last change: 2017/01/09 21:31:47] OK
slave1 rep_threads [last change: 2017/01/09 21:31:47] OK
slave1 rep_backlog [last change: 2017/01/09 21:31:47] OK: Backlog is null
master2 ping [last change: 2017/01/09 21:31:47] OK
master2 mysql [last change: 2017/01/09 21:57:32] OK
master2 rep_threads [last change: 2017/01/09 21:31:47] OK
master2 rep_backlog [last change: 2017/01/09 21:31:47] OK: Backlog is null
slave2 ping [last change: 2017/01/09 21:31:47] OK
slave2mysql [last change: 2017/01/09 21:31:47] OK
slave2 rep_threads [last change: 2017/01/09 21:31:47] OK
slave2 rep_backlog [last change: 2017/01/09 21:31:47] OK: Backlog is null

从上面可以看到master1能ping通,说明只是服务死掉了。

查看master2主机的ip地址:

[root@master2 ~]# ipaddr show dev eno16777736
eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdiscpfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:1a:9c brdff:ff:ff:ff:ff:ff
inet 192.168.31.141/24 brd 192.168.31.255 scope global dynamic eno16777736
valid_lft 35519sec preferred_lft 35519sec
inet 192.168.31.5/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.31.2/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe75:1a9c/64 scope link
valid_lft forever preferred_lft forever

slave1主机:

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.141
Master_User: rep
Master_Port: 3306

slave2主机:

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.141
Master_User: rep
Master_Port: 3306

启动master1主机的mysql服务,观察monitor日志,master1的日志如下:

[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2017/01/09 22:16:56 INFO Check &#39;mysql&#39; on &#39;master1&#39; is ok!
2017/01/09 22:16:56 INFO Check &#39;rep_backlog&#39; on &#39;master1&#39; is ok!
2017/01/09 22:16:56 INFO Check &#39;rep_threads&#39; on &#39;master1&#39; is ok!
2017/01/09 22:16:59 FATAL State of host &#39;master1&#39; changed from HARD_OFFLINE to AWAITING_RECOVERY

从上面可以看到master1的状态由hard_offline改变为awaiting_recovery状态
用如下命令将服务器上线:

[root@monitor1 ~]#mmm_controlset_onlinemaster1


查看群集最新状态

[root@monitor1 ~]# mmm_control show
master1(192.168.31.83) master/ONLINE. Roles:
master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5), writer(192.168.31.2)
slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)

可以看到主库启动不会接管主,只到现有的主再次宕机。
总结
(1)master2备选主节点宕机不影响集群的状态,就是移除了master2备选节点的读状态。
(2)master1主节点宕机,由master2备选主节点接管写角色,slave1,slave2指向新master2主库进行复制,slave1,slave2会自动change master到master2.
(3)如果master1主库宕机,master2复制应用又落后于master1时就变成了主可写状态,这时的数据主无法保证一致性。
如果master2,slave1,slave2延迟于master1主,这个时master1宕机,slave1,slave2将会等待数据追上db1后,再重新指向新的主node2进行复制操作,这时的数据也无法保证同步的一致性。
(4)如果采用MMM高可用架构,主,主备选节点机器配置一样,而且开启半同步进一步提高安全性或采用MariaDB/mysql5.7进行多线程从复制,提高复制的性能。

附:

1、日志文件:
日志文件往往是分析错误的关键,所以要善于利用日志文件进行问题分析。
db端:/var/log/mysql-mmm/mmm_agentd.log
监控端:/var/log/mysql-mmm/mmm_mond.log
2、命令文件:
mmm_agentd:db代理进程的启动文件
mmm_mond:监控进程的启动文件
mmm_backup:备份文件
mmm_restore:还原文件
mmm_control:监控操作命令文件
db服务器端只有mmm_agentd程序,其它的都是在monitor服务器端。
3、mmm_control用法
mmm_control程序可以用于监控群集状态、切换writer、设置online\offline操作等。
Valid commands are:
help - show this message #帮助信息
ping - ping monitor #ping当前的群集是否正常
show - show status #群集在线状态检查
checks [f7e6dec31ab1a0471d06c55afaca8d77|all [268cfb9ae487ce9877c28672167a818c|all]] - show checks status#执行监控检查操作
set_onlinef7e6dec31ab1a0471d06c55afaca8d77 - set host f7e6dec31ab1a0471d06c55afaca8d77 online #将host设置为online
set_offlinef7e6dec31ab1a0471d06c55afaca8d77 - set host f7e6dec31ab1a0471d06c55afaca8d77 offline #将host设置为offline
mode - print current mode. #打印输出当前的mode
set_active - switch into active mode.

set_manual - switch into manual mode.
set_passive - switch into passive mode.
move_role [--force] 3b3677fa5ae28346828080dc6d333550f7e6dec31ab1a0471d06c55afaca8d77 - move exclusive role 3b3677fa5ae28346828080dc6d333550 to host f7e6dec31ab1a0471d06c55afaca8d77 #移除writer服务器为指定的host服务器(Only use --force if you know what you are doing!)
set_ipfb7c3ed00d0ce5f01877a916db4eae14f7e6dec31ab1a0471d06c55afaca8d77 - set role with ipfb7c3ed00d0ce5f01877a916db4eae14 to host f7e6dec31ab1a0471d06c55afaca8d77
检查所有的db服务器群集状态:
[root@monitor1 ~]# mmm_control checks all
检查项包括:ping、mysql是否正常运行、复制线程是否正常等
检查群集环境在线状况:
[root@monitor1 ~]# mmm_control show
对指定的host执行offline操作:
[root@monitor1 ~]# mmm_controlset_offline slave2
对指定的host执行onine操作:
[root@monitor1 ~]# mmm_controlset_online slave2
执行write切换(手动切换):
查看当前的slave对应的master
[root@slave2 ~]# mysql -uroot -p123456 -e 'show slave status\G;'
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.141
writer切换,要确保mmm_common.conf文件中的writer属性有配置对应的host,否则无法切换
[root@monitor1 ~]# mmm_controlmove_role writer master1
OK: Role 'writer' has been moved from 'master2' to 'master1'. Now you can wait some time and check new roles info!
[root@monitor1 ~]# mmm_control show
master1(192.168.31.83) master/ONLINE. Roles: writer(192.168.31.2)
master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)
slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)
save从库自动切换到了新的master
[root@slave2 ~]# mysql -uroot -p123456 -e 'show slave status\G;'
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.83

4、其它处理问题

ライターがマスターからバックアップに切り替わらないようにする場合 (書き込み VIP の切り替えを引き起こすマスターとスレーブの遅延を含む)、/etc/mysql-mmm を構成するときに 3612df8997eca9306e1f789dddf71f78 を削除できます。 /mmm_common.conf バックアップ
183e4f27670b59663f1bd40417008de6#ライター ロールの設定
hosts master1 #ここで設定されるホストは 1 つだけです
ips 192.168.31.2#外部書き込み操作用の仮想 IP
mode exclusive #exclusive は、マスターが 1 つだけ許可されることを意味しますつまり、書き込み IP を指定します
adb36db4876d5ae8ea335a15e6246fd6
この場合、master1 に障害が発生しても、書き込み操作は master2 サーバーに切り替わらず、スレーブも切り替わりません。この時点で、現在の MMM は以前に外部書き込みサービスを提供していました。

5. 概要

1. 外部からの読み書きを提供する仮想IPは監視プログラムによって制御されます。モニターが開始されていない場合、DB サーバーには仮想 IP が割り当てられません。ただし、仮想 IP が割り当てられている場合、モニター プログラムが最初に割り当てられていた仮想 IP を閉じても、外部プログラムはすぐには閉じられず、外部 IP が割り当てられます。 (ネットワークが再起動されない限り) プログラムは引き続き接続してアクセスできます。この利点は、モニターの信頼性要件が低くなることです。ただし、この時点で DB サーバーの 1 つが障害を起こしても、信頼性は低下しません。つまり、元の仮想 IP は変更されず、障害が発生した DB はその仮想 IP にアクセスできなくなります。

2. エージェントプログラムはモニタープログラムによって制御され、書き込み切り替えやスレーブライブラリ切り替えなどの操作を処理します。監視プロセスが終了すると、エージェント プロセスは何の役割も果たさず、単独で障害を処理できなくなります。

3. モニター プログラムは、Mysql データベースを含む DB サーバーのステータス、サーバーが実行されているかどうか、レプリケーション スレッドが正常かどうか、マスターとスレーブの遅延などを監視する役割を果たします。障害を処理するエージェント プログラム。

4. モニターは DB サーバーのステータスを数秒ごとに監視します。DB サーバーが障害から正常に変化した場合、モニターは 60 秒後に自動的にオンライン状態に設定します (デフォルトは 60 秒です)。他の値)、監視側の構成ファイルパラメータ「auto_set_online」によって決定されます。クラスターサーバーには、HARD_OFFLINE→AWAITING_RECOVERY→online
5 の 3 つのステータスがあります。デフォルトでは、モニターは書き込み DB サーバーを読み取り専用に変更するように mmm_agent を制御します。を OFF に変更し、他の DB サーバーの read_only を ON に変更するため、厳密を期すために、モニターによって制御されるすべてのサーバーの my.cnf ファイルに read_only=1 を追加して、ライターと読み取りを制御できます。ユーザーとレプリケーション ユーザーは read_only パラメータの影響を受けません。

以上がMySQL 高可用性ソリューション MMM の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。