Linux下mysql主従レプリケーション+keepalived高可用性
39202 ワード
Linux下mysql主従レプリケーション+keepalived高可用性文章はCentOS 7を用いる.4バージョン、CentOS 6.Xは若干異なる 公式ダウンロードアドレス:https://dev.mysql.com/downloads/mysql/ 公式インストールドキュメント:https://dev.mysql.com/doc/refman/5.6/en/binary-installation.html 一、汎用インストールmysql 5.6バージョン 1. mysqlインストールおよび準備 2.クライアント設定 二、RPMインストールmysql 5.6バージョン 1.mysqlがインストールされているかどうかを確認します 2.mysqlサーバのインストール 3.mysqlクライアントのインストール 4.ホストログインなし 三、mysql主従複製 1.Masterデータベース構成 2.Slaverデータベース構成 3.マスタコピーテスト 四.keepalivedインストールおよび構成 1. keepalivedインストール 2. keepalived.conf構成 3.検査する.conf構成 4.keepalived高可用性テスト 五.プロセス中に遭遇したピット 1.ping不通外網 2.SELINUXクローズによりスクリプトが呼び出されない 3.keepalived.confファイルのvirtual_router_id競合 文章はCentOS 7を使っています.4バージョン、CentOS 6.Xは少し違う
公式ダウンロードアドレス:https://dev.mysql.com/downloads/mysql/
公式インストールドキュメント:https://dev.mysql.com/doc/refman/5.6/en/binary-installation.html
一、汎用インストールmysql 5.バージョン6
1.mysqlインストールおよび準備mysqlがインストールされているかどうかを確認
useradd-r(システムアカウントの確立)-g(ユーザが属するグループ)mysql(ユーザグループ)mysql(ユーザ)
2.mysqlを解凍する
3.変更/etc/profile環境変数
/etc/profile環境変数を変更すると、毎回/usr/local/mysql/bin/mysqlにアクセスしてクライアントを起動する必要はありません.
4.ソフトリンクの作成
ln-s(ソースファイルにシンボル接続を確立する)ソースファイルターゲットファイルLinuxは、1つのファイルに複数の名前を付ける機能を有し、リンクと呼ばれる.リンクされたファイルは同じディレクトリに保存できますが、ハードディスク(HDD)上で同じデータを重複バックアップすることなく、異なるファイル名が必要です.率直に言って、ファイルに新しい名前を付け直し、新しい名前にアクセスするのは古い名前と同じ効果があります.
5.mysqlユーザーとグループの変更の作成
6.mysql_の実行install_dbスクリプト
mysqlのdataディレクトリを初期化し、システムテーブルを作成します(5.7.*以上:bin/mysqld--user=mysql--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data--initialize).mysqlのインストールディレクトリが/usr/local/mysqlでない場合は、basedir(mysqlインストールディレクトリ)とdatadir(dataが存在するパス)のディレクトリパラメータも指定する必要があります.
7.コピーmy.cnfプロファイル、mysqldスクリプト
時々/etcディレクトリの下にmyがないことがあります.cnfファイルです.デフォルトのプロファイルを/etcディレクトリに手動で移動する必要があります./etc/init.d/ディレクトリの下にシステムの起動、閉じるスクリプトがあり、mysql.serverファイルを移動してmysqldと名前を変更してディレクトリの下に置くと、service mysqld start/stop/status/restartを使用してmysqlを起動/停止/ステータス/再起動できます.
2.クライアント設定
1.mysqlサービスを開始する
2.パスワードの変更
3.ホストレスログインの設定
host='%'は、すべてのホストがmysqlクライアントにログインできることを意味し、ホストのみができるわけではありません.flush privilegesは変更を有効にします.
二、RPMインストールmysql 5.バージョン6
1.mysqlがインストールされているかどうかを確認する
2.mysqlサーバのインストール
3.mysqlクライアントのインストール
4.ホストログインなし
三、mysql主従レプリケーション
1.Masterデータベース構成
2.Slaverデータベース構成
Slave_IO_Running、Slave_SQL_Runningの値はすべてYESで、構成が成功したことを示し、いずれかがYESでなければ同期に失敗したことを示します.
3.主従複製テスト
特に注意:Slave_SQL_Runningの値はすべてNoで、解決策:show slave statusGを利用してslave上の具体的なエラー情報を表示して、基本的に表が存在しないことを表示して、あるいは表が大文字の類のエラーで、具体的な問題は具体的に分析します.
大文字と小文字を区別する場合はmysql構成:vim/etc/mysql/my.cnfファイルの下でlower_を設定case_table_names=1(0は大文字と小文字を区別、1は大文字と小文字を区別せず)、mysqlの再起動を設定します
1.slaveで同期を停止する:stop slave;2.fileとpositionの値show master statusをmasterで再表示します.3.slaveで2ステップ目の2つの値をコピー:change master to master_host=‘ホストIP’,master_user=‘slave’,master_password=‘123456’,master_port=3306,master_log_file='fileの値',master_log_pos=positionの値;4.slaveで同期をオンにする:start slave;5.slaveで同期を開始し、Slave_IO_Running、Slave_SQL_Runningの値がYESの場合、成功:show slave statusG
四.keepalivedのインストールと構成
プライマリスレーブipおよび仮想ip:
master
slave
vip
ip
192.168.1.50
192.168.1.51
192.168.1.100
1.keepalivedインストール
2. keepalived.conf構成
マスター構成
slave構成
check_mysql.shスクリプト
3.検査keepalived.conf構成
maserでkeepalivedを起動すると、仮想ipはipを1つしかバインドできません.masterかslaveかです.ip addrが次の内容を表示すると、バインドに成功します.
4.keepalived高可用性テスト
1.masterノードが切断された後、mysqlサービスが再起動するかどうかをテストします.
マスターがmysqlサービスを閉じたことに気づいたら、すぐにmysqlを呼び出します.check.shスクリプト、mysqlサービスを再起動します.
2.masterノードが切断された後、vipが自動的にslaveに切り替わるかどうかをテストします.
マスターがmysqlとkeepalivedサービスを閉じたことを発見したら、すぐにslaveのmysqlを呼び出します.check.shスクリプト、ipは自動的にslaveにドリフトします.
五.過程で出会った穴
1.pingは外部ネットワークが通じない
2.SELINUXクローズによりスクリプトが呼び出されない
3.keepalived.confファイルのvirtual_router_id競合
公式ダウンロードアドレス:https://dev.mysql.com/downloads/mysql/
公式インストールドキュメント:https://dev.mysql.com/doc/refman/5.6/en/binary-installation.html
一、汎用インストールmysql 5.バージョン6
1.mysqlインストールおよび準備
[root@hadoop101 /]rpm -qa|grep mysql
[root@hadoop101 /]rpm -e --nodeps mysql****
useradd-r(システムアカウントの確立)-g(ユーザが属するグループ)mysql(ユーザグループ)mysql(ユーザ)
2.mysqlを解凍する
[root@hadoop101 /]cd /usr/local
[root@hadoop101 local]tar -zxvf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
3.変更/etc/profile環境変数
[root@hadoop101 local]vim /etc/profile
:export PATH=$PATH:/usr/local/mysql/bin
[root@hadoop101 local]source /etc/profile
/etc/profile環境変数を変更すると、毎回/usr/local/mysql/bin/mysqlにアクセスしてクライアントを起動する必要はありません.
4.ソフトリンクの作成
[root@hadoop101 local]ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql
ln-s(ソースファイルにシンボル接続を確立する)ソースファイルターゲットファイルLinuxは、1つのファイルに複数の名前を付ける機能を有し、リンクと呼ばれる.リンクされたファイルは同じディレクトリに保存できますが、ハードディスク(HDD)上で同じデータを重複バックアップすることなく、異なるファイル名が必要です.率直に言って、ファイルに新しい名前を付け直し、新しい名前にアクセスするのは古い名前と同じ効果があります.
5.mysqlユーザーとグループの変更の作成
[root@hadoop101 local]cd mysql
[root@hadoop101 mysql]groupadd mysql
[root@hadoop101 mysql]useradd -r -g mysql mysql
[root@hadoop101 mysql]chown -R mysql:mysql ./
6.mysql_の実行install_dbスクリプト
[root@hadoop101 mysql]scripts/mysql_install_db --user=mysql
mysqlのdataディレクトリを初期化し、システムテーブルを作成します(5.7.*以上:bin/mysqld--user=mysql--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data--initialize).mysqlのインストールディレクトリが/usr/local/mysqlでない場合は、basedir(mysqlインストールディレクトリ)とdatadir(dataが存在するパス)のディレクトリパラメータも指定する必要があります.
7.コピーmy.cnfプロファイル、mysqldスクリプト
[root@hadoop101 mysql]cp support-files/my-default.cnf /etc/my.cnf
[root@hadoop101 mysql]cp support-files/mysql.server /etc/init.d/mysqld
時々/etcディレクトリの下にmyがないことがあります.cnfファイルです.デフォルトのプロファイルを/etcディレクトリに手動で移動する必要があります./etc/init.d/ディレクトリの下にシステムの起動、閉じるスクリプトがあり、mysql.serverファイルを移動してmysqldと名前を変更してディレクトリの下に置くと、service mysqld start/stop/status/restartを使用してmysqlを起動/停止/ステータス/再起動できます.
2.クライアント設定
1.mysqlサービスを開始する
[root@hadoop101 mysql]service mysqld start
[root@hadoop101 mysql]ps -ef|grep mysql
2.パスワードの変更
[root@hadoop101 mysql]mysql
mysql> set password=password('123456');
mysql> quit;
3.ホストレスログインの設定
[root@hadoop101 mysql]mysql -uroot -p123456
mysql> use mysql;
mysql> update user set host='%' where host='localhost';
mysql> flush privileges;
host='%'は、すべてのホストがmysqlクライアントにログインできることを意味し、ホストのみができるわけではありません.flush privilegesは変更を有効にします.
二、RPMインストールmysql 5.バージョン6
1.mysqlがインストールされているかどうかを確認する
[root@hadoop102 /]rpm -qa|grep mysql
[root@hadoop102 /]rpm -e --nodeps mysql****
2.mysqlサーバのインストール
1. mysql
[root@hadoop102 /]# rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm
2.
[root@hadoop102 /]# cat /root/.mysql_secret
3. mysql
[root@hadoop102 /]# service mysql status
4. mysql
[root@hadoop102 /]# service mysql start
3.mysqlクライアントのインストール
1. mysql
[root@hadoop102 /]# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm
2. mysql
[root@hadoop102 /]# mysql -uroot -p
3.
mysql> set password=password('123456');
4. mysql
mysql> quit;
4.ホストログインなし
1. user , Host %
mysql> use mysql;
mysql> update user set host='%' where host='localhost';
2.
mysql> flush privileges;
三、mysql主従レプリケーション
1.Masterデータベース構成
1. /etc/my.cnf, :
#
log-bin=mysql-bin
# id
server-id =1
# ,
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=test
# ( slave ),
binlog-do-db=metastore
binlog-do-db=rdd
2. Master :
[root@hadoop103 /]service mysql restart
3. mysql , ,File Position :
------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
[root@hadoop103 /]mysql -uroot -p
mysql> show master status;
4. Slave :
mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';
2.Slaverデータベース構成
1. /etc/my.cnf, :
#
log-bin=mysql-bin
# id
server-id =2
# ,
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=test
# ( slave ),
binlog-do-db=metastore
binlog-do-db=rdd
2. Slave :
[root@hadoop104 /]service mysql restart
3. SQL :
[root@hadoop104 /]mysql -uroot -p123456
mysql> change master to master_host=' IP',master_user='slave',master_password='123456',master_port=3306,master_log_file='file ',master_log_pos=position ;
4. SQL :
mysql> start slave;
mysq> show slave status\G
Slave_IO_Running、Slave_SQL_Runningの値はすべてYESで、構成が成功したことを示し、いずれかがYESでなければ同期に失敗したことを示します.
3.主従複製テスト
1. test001 。
mysql> create database test001;
2. test001, 。
mysql> show databases;
特に注意:Slave_SQL_Runningの値はすべてNoで、解決策:show slave statusGを利用してslave上の具体的なエラー情報を表示して、基本的に表が存在しないことを表示して、あるいは表が大文字の類のエラーで、具体的な問題は具体的に分析します.
大文字と小文字を区別する場合はmysql構成:vim/etc/mysql/my.cnfファイルの下でlower_を設定case_table_names=1(0は大文字と小文字を区別、1は大文字と小文字を区別せず)、mysqlの再起動を設定します
1.slaveで同期を停止する:stop slave;2.fileとpositionの値show master statusをmasterで再表示します.3.slaveで2ステップ目の2つの値をコピー:change master to master_host=‘ホストIP’,master_user=‘slave’,master_password=‘123456’,master_port=3306,master_log_file='fileの値',master_log_pos=positionの値;4.slaveで同期をオンにする:start slave;5.slaveで同期を開始し、Slave_IO_Running、Slave_SQL_Runningの値がYESの場合、成功:show slave statusG
四.keepalivedのインストールと構成
プライマリスレーブipおよび仮想ip:
master
slave
vip
ip
192.168.1.50
192.168.1.51
192.168.1.100
1.keepalivedインストール
yum : yum install -y keepalived
. . . : systemctl start/stop/status/restart keepalived.service
: systemctl enable keepalived.service
: systemctl disable keepalived.service
2. keepalived.conf構成
マスター構成
#master
global_defs {
smtp_server 192.168.1.50 #
smtp_connect_timeout 30
router_id MYSQL-HA # keepalived
}
vrrp_script check_mysql {
script "/usr/local/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP # BACKUP, BACKUP
interface eth0 #
virtual_router_id 66 # , ( 0-255 ) slave , , 。
priority 100 # master ,( 0-255 ), slave 90
advert_int 1 # master ( )
nopreempt # , priority master
authentication {
auth_type PASS #
auth_pass 1111
}
track_script {
check_mysql # ,check_mysql
}
virtual_ipaddress {
192.168.1.100 # ip, master , ip slave
}
}
slave構成
#slave
global_defs {
smtp_server 192.168.1.51 #
smtp_connect_timeout 30
router_id MYSQL-HA # keepalived
}
vrrp_script check_mysql {
script "/usr/local/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP # BACKUP, BACKUP
interface eth0 #
virtual_router_id 66 # , ( 0-255 ) master , , 。
priority 90 # master ,( 0-255 ), master 100
advert_int 1 # master ( )
nopreempt # , priority master
authentication {
auth_type PASS #
auth_pass 1111
}
track_script {
check_mysql # ,check_mysql
}
virtual_ipaddress {
192.168.1.100 # ip
}
}
check_mysql.shスクリプト
#!/bin/bash
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
service mysqld restart
fi
sleep 2
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
systemctl stop keepalived.service
fi
3.検査keepalived.conf構成
keepalived: systemctl start keepalived.service
: systemctl enable keepalived.service
keepalived : ps -ef|grep keepalived
masterip : ip addr
maserでkeepalivedを起動すると、仮想ipはipを1つしかバインドできません.masterかslaveかです.ip addrが次の内容を表示すると、バインドに成功します.
eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.51/24 brd 172.16.4.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.100/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9cf2:98b1:9790:e3da/64 scope link
valid_lft forever preferred_lft forever
4.keepalived高可用性テスト
1.masterノードが切断された後、mysqlサービスが再起動するかどうかをテストします.
master:
service mysqld stop
ps -ef|grep mysql
root 22868 2250 0 15:06 pts/0 00:00:00 grep mysql
vip:
mysql> show variables like 'server_id';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: *** NONE ***
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.03 sec)
ps -ef|grep mysql
root 29127 23269 0 15:01 pts/1 00:00:00 grep --color=auto mysql
root 97486 93113 0 11:43 pts/0 00:00:00 mysql -uroot -px xxxxxxxxxxx
root 120328 1 0 12:42 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
mysql 120687 120328 0 12:42 ? 00:00:44 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/localhost.localdomain.err --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/var/lib/mysql/mysql.sock --port=3306
マスターがmysqlサービスを閉じたことに気づいたら、すぐにmysqlを呼び出します.check.shスクリプト、mysqlサービスを再起動します.
2.masterノードが切断された後、vipが自動的にslaveに切り替わるかどうかをテストします.
master:
systemctl stop keepalived.service
ps -ef|grep keepalived
root 22891 2250 0 15:11 pts/0 00:00:00 grep keepalived
service mysqld stop
ps -ef|grep mysql
root 22868 2250 0 15:06 pts/0 00:00:00 grep mysql
vip:
mysql> show variables like 'server_id';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: *** NONE ***
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.03 sec)
slave:
ip addr
eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.52/24 brd 172.16.4.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.100/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9cf2:98b1:9790:e3da/64 scope link
valid_lft forever preferred_lft forever
マスターがmysqlとkeepalivedサービスを閉じたことを発見したら、すぐにslaveのmysqlを呼び出します.check.shスクリプト、ipは自動的にslaveにドリフトします.
五.過程で出会った穴
1.pingは外部ネットワークが通じない
vi /etc/resolv.conf
(ipconfig/all dns), , Google DNS ,
:
nameserver 8.8.8.8
nameserver 8.8.4.4
2.SELINUXクローズによりスクリプトが呼び出されない
SELINUX
1. :
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
2. :
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing SELINUX=disabled
reboot
3.keepalived.confファイルのvirtual_router_id競合
keepalived : tail -f /var/log/message
virtual_router_id , , keepalived