lvs + keepalived + mysqlデュアルマスターレプリケーションにより、負荷分散と高可用性を実現
Keepalived + lvs + mysqlマスターレプリケーションは、一般的に使用されるMysql高可用性ソリューションであり、lvsは読み取り負荷分散を提供し、Keepalivedは仮想VIPドリフトによる自動フェイルオーバーを実現します。Mysqlはマスターレプリケーションとして構成されますが、通常はシングルポイントで採用されます。データの一貫性を確保するために書き込みます。
ホスト | IP | 特徴 |
---|---|---|
VIP | 192.168.30.250 | |
キープマスター | 192.168.30.243 | lvs + keepalived(主) |
奴隷制を維持する | 192.168.30.244 | lvs + keepalived(これ) |
マスターマスター | 192.168.30.245 | mysql(マスター) |
マスタースレーブ | 1929.168.30.246 | mysql(マスター) |
mysqlデュアルマスター
mysqlデュアルマスターとマスタースレーブの構成は似ていますが、次の手順が追加されています
[root@mysql-master ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
log_slave_updates = 1 ##双主需要开启log_slave_updates功能
server-id = 10 ##不能相同
log-bin = mysql_bin ##双主两个都是log-bin
auto_increment_offset = 1 ##表示自增长字段从1开始,他的取值范围是1 .. 65535
auto_increment_increment = 2 ##表示自增长字段每次递增2,取值范围是2 .. 65535
サービスを再起動し
ますマスターホストで許可されたアカウントを作成し、スレーブ(192.168.30.246)ホストでの接続を許可します
mysql> grant replication slave on *.* to 'repl'@'192.168.30.246' identified by 'repl';
Query OK, 0 rows affected, 1 warning (0.00 sec)
マスターの現在のbinlogステータス情報を表示する
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 | 455 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
マスターをスレーブサーバー上の独自のマスターサーバーとして設定し、スレーブ機能を有効にします
mysql> change master to
-> master_host = '192.168.30.245',
-> master_user = 'repl',
-> master_password = 'repl',
-> master_log_file = 'mysql_bin.000001',
-> master_log_pos = 455 ;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ライブラリから構成ファイルを変更します
[root@mysql-slave ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
log_slave_updates = 1 ##双主需要开启log_slave_updates功能
server-id = 20 ##不能相同
log-bin = mysql_bin ##双主两个都是log-bin
auto_increment_offset = 1 ##表示自增长字段从1开始,他的取值范围是1 .. 65535
auto_increment_increment = 2 ##表示自增长字段每次递增2,取值范围是2 .. 65535
スレーブホストで許可されたアカウントを作成し、マスター(192.168.30.246)ホストでの接続を許可します
mysql> grant replication slave on *.* to 'repl'@'192.168.30.245' identified by 'repl';
Query OK, 0 rows affected, 1 warning (0.00 sec)
スレーブの現在のbinlogステータス情報を表示する
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
スレーブをマスターサーバー上の独自のマスターサーバーとして設定し、スレーブ機能を有効にします
mysql> change master to
-> master_host = '192.168.30.246',
-> master_user = 'repl',
-> master_password = 'repl',
-> master_log_file = 'mysql_bin.000001',
-> master_log_pos = 154 ;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
キープアライブ
私はyumを使用して
メインのキープアライブをインストールします
[root@keep-master ~]# yum -y install keepalived ipvsadm
[root@keep-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 20
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass zyy
}
virtual_ipaddress {
192.168.30.250 ##VIP
}
}
virtual_server 192.168.30.250 3306 { # 定义虚拟服务器,地址与上面的virtual_ipaddress相同
delay_loop 3 # 健康检查时间间隔,3秒
lb_algo rr # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc
lb_kind DR # 负载均衡转发规则:NAT|DR|TUN
# persistence_timeout 5 # 会话保持时间5秒,动态服务建议开启
protocol TCP # 转发协议protocol,一般有tcp和udp两种
#后端真实服务器,有几台就设置几个
real_server 192.168.30.245 3306 {
weight 1
TCP_CHECK {
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.30.246 3306 {
weight 1
TCP_CHECK {
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
ライブラリと同じように、優先度を変更し、プリエンプションなしで設定します。
[root@keep-slave ~]# yum -y install keepalived ipvsadm
[root@keep-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP ##BACKUP
interface ens33
virtual_router_id 20
priority 80 ##优先级要比master小
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass zyy
}
virtual_ipaddress {
192.168.30.250
}
}
virtual_server 192.168.30.250 3306 {
delay_loop 3
lb_algo rr
lb_kind DR
# persistence_timeout 5
protocol TCP
real_server 192.168.30.245 3306 {
weight 1
TCP_CHECK {
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.30.246 3306 {
weight 1
TCP_CHECK {
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
キープアライブサービスを開きます
[root@keep-master ~]# systemctl start keepalived
[root@keep-slave ~]# systemctl start keepalived
VIPを見る
この時点でLVSクラスターのステータスを確認すると、クラスターの下に2つのRealServer、スケジューリングアルゴリズム、重み、およびその他の情報があることがわかります。ActiveConnは、現在のRealServerのアクティブな接続の数を表します。
[root@keep-master ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.30.250:3306 rr
-> 192.168.30.245:3306 Route 1 0 0
-> 192.168.30.246:3306 Route 1 0 0
RealServerネットワーク構成スクリプトを
記述します。192.168.30.245と192.168.30.246は同じものを記述します。これがデモです。
[root@mysql-master ~]# cat /etc/init.d/realserver
#!/bin/bash
VIP=192.168.30.250
. /etc/rc.d/init.d/functions
case "$1" in
# 禁用本地的ARP请求、绑定本地回环地址
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/sbin/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up # 在回环地址上绑定VIP,设定掩码,与Direct Server上自身的IP保持通信
/sbin/route add -host $VIP dev lo:0
echo "LVS-DR real server starts successfully.\n"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "LVS-DR real server stopped.\n"
;;
status)
isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
[root@mysql-master ~]# chmod 755 realserver
[root@mysql-master ~]# service realserver start
[root@mysql-slave ~]# chmod 755 realserver
[root@mysql-slave ~]# service realserver start
起動時に開始するように設定
echo "/etc/init.d/realserver" >> /etc/rc.d/rc.local
テスト
テストユーザーを追加する
mysql> grant all on *.* to 'zyy'@'%' identified by 'zyy' ;
Query OK, 0 rows affected, 1 warning (0.00 sec)
1.LVSロードバランシング転送戦略を確認します
MySQL客户端使用VIP连接数据库,并查看所连接的数据库服务器ID。可以看到,每次执行依次连接到192.168.30.246和192.168.30.245的MySQL,证明是轮询策略产生的结果。
2.lvsのマスター障害をシミュレートします
マスター側でキープアライブを停止します
[root@keep-master ~]# systemctl stop keepalived
VIPがドリフトしたことがわかります
この時点でMySQLに接続すると、負荷分散は影響を受けません。
3.データベースの1つがダウンしていることをシミュレートします
スレーブのデータベースを閉じます
[root@mysql-slave ~]# service mysqld stop
Shutting down MySQL............ SUCCESS!
[root@mysql-slave ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 128 :::22 :::*
現時点では、mysql-masterデータベースのみが機能していますが、ビジネスが中断されないようにすることができます。