東京都立産業技術大学院大学(AIIT)に合格しました
東京都立産業技術大学院大学(AIIT) に合格しました。
2023年4月から、情報アーキテクチャコースで学ぶ予定です。
スペック
- 地方国立大学の文系卒で、国際政治学を専攻していた。
- 卒業後、開発エンジニアとして3年、現在はインフラエンジニアとして7年目になり、IT全般について一通りの知識、実務経験がある。
- Atcoderは、茶色コーダー。
- 自社の公用語が英語なので、英会話含めて、英語には抵抗が無い。
きっかけ
- ITの知識を業務の必要に応じて、身につけてきたため、歯抜けになっている不足分を補いたい、整理したい気持ちがある。
- 専門分野の学位が無いと海外企業の選考の土俵にすら立てないのではないかという危機感がある。
- 情報学位への憧れがある。
なぜAIITなのか
学問を突き詰めるというよりも学んだ内容を実務にも役立てたいというモチベーションが根本にある。 そこで、以下の特色があるAIITを選んだ。
- 講義や演習が実践寄りで、PBLでプロジェクトのマネジメント能力が身に付く。
- グローバルPBLを通して、海外籍の学生と合同でプロジェクトを進めることでグローバルで活躍できる実践力が身に付く。
他にも、
- 地理的に通いやすい。
- 社会人でも受講しやすいように録画授業がある。
- 東京都が運営しているので、学費もそこまで高くないが、専門実践教育訓練給付金を活用すると金銭的な負担をさらに減らせる。
などなど、他より自分の希望、条件にあっているため。
スケジュール
今年になってから、AIITを知ったので、最後の第四期入試に滑り込みで出願する形になりました。
2023年 1月
- 公式サイト、Youtube、学生が書いたブログなどから情報収集
- 第四期入試で出願
2023年 2月
- 入試担当の方にメールして、小論文の過去問を入手
- 小論文の書き方を学習
- 小論文提出
- 面接
- 結果発表
という流れ。
4月から、二足の草鞋で頑張りたいと思います。
HAProxyで、MariaDBの負荷分散
サーバの中に、mysqld_multiを使い擬似的なMaste/Slave構成を用意する。
この構成に対して、HAProxyを使った負荷分散の動作を確認する。
検証サーバのOSは、CentOS7系を使用する。
MariaDBのインストール
# yum update # yum install -y mariadb mariadb-server
mysqld_multiの設定
mysqld_multiで、MariaDBを3プロセス起動する。
DBデータ用のディレクトリを作成し、システムテーブルを初期化する。
# mysql_install_db --user=mysql --datadir=/var/lib/mysql1 # mysql_install_db --user=mysql --datadir=/var/lib/mysql2 # mysql_install_db --user=mysql --datadir=/var/lib/mysql3 # chgrp -R mysql /var/lib/mysql[123]
/etc/my.cnfを以下の様に変更する。
レプリケーションで、mysqld1は、Master、mysqld2とmysqld3はSlaveの役割を持つ。
# /etc/my.cnf [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass # master [mysqld1] server-id = 1 log-bin=mysql-bin socket = /tmp/mysql.sock1 port = 3307 pid-file = /var/lib/mysql1/hostname.pid1 datadir = /var/lib/mysql1 log-error = /var/log/mariadb/mariadb1.log # slave [mysqld2] server-id = 2 socket = /tmp/mysql.sock2 port = 3308 pid-file = /var/lib/mysql2/hostname.pid2 datadir = /var/lib/mysql2 log-error = /var/log/mariadb/mariadb2.log # slave [mysqld3] server-id = 3 socket = /tmp/mysql.sock3 port = 3309 pid-file = /var/lib/mysql3/hostname.pid3 datadir = /var/lib/mysql3 log-error = /var/log/mariadb/mariadb3.log
MariaDBを起動する。
# mysqld_multi start # mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running
mysqld_multi stopを実行するために、SHUTDOWN権限をmulti_adminに付与する。
# echo "GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass' WITH GRANT OPTION;" | mysql -h 127.0.0.1 -P 3307 # echo "GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass' WITH GRANT OPTION;" | mysql -h 127.0.0.1 -P 3308 # echo "GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass' WITH GRANT OPTION;" | mysql -h 127.0.0.1 -P 3309
レプリケーションの設定
my.cnfの内容は、前述したものを使う。
Master
# echo "GRANT REPLICATION SLAVE ON *.* to replicator@'127.0.0.1' IDENTIFIED BY 'secret'; FLUSH PRIVILEGES; SELECT SLEEP(3); SHOW MASTER STATUS;" | mysql -h 127.0.0.1 -P 3307 SLEEP(3) 0 File Position Binlog_Do_DB Binlog_Ignore_DB mysql-bin.000002 474
Slave
# echo "CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3307,MASTER_USER='replicator',MASTER_PASSWORD='secret',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=474; START SLAVE; SELECT SLEEP(3); SHOW SLAVE STATUS;" | mysql -h 127.0.0.1 -P 3308 # echo "CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3307,MASTER_USER='replicator',MASTER_PASSWORD='secret',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=474; START SLAVE; SELECT SLEEP(3); SHOW SLAVE STATUS;" | mysql -h 127.0.0.1 -P 3309
HAProxy用のMariaDBユーザ作成
Masterにhaproxy用のユーザを作成する。Slaveにもレプリケーションされていることを確認する。
# echo "INSERT INTO mysql.user (Host,User) values ('127.0.0.1','haproxy_check'); FLUSH PRIVILEGES; GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'127.0.0.1' IDENTIFIED BY 'secret' WITH GRANT OPTION; FLUSH PRIVILEGES;" | mysql -h 127.0.0.1 -P 3307 # echo "SELECT User,Host FROM mysql.user WHERE User LIKE 'haproxy%';" | mysql -h 127.0.0.1 -P 3307 User Host haproxy_check 127.0.0.1 haproxy_root 127.0.0.1 # echo "SELECT User,Host FROM mysql.user WHERE User LIKE 'haproxy%';" | mysql -h 127.0.0.1 -P 3308 User Host haproxy_check 127.0.0.1 haproxy_root 127.0.0.1 # echo "SELECT User,Host FROM mysql.user WHERE User LIKE 'haproxy%';" | mysql -h 127.0.0.1 -P 3309 User Host haproxy_check 127.0.0.1 haproxy_root 127.0.0.1
HAProxyのインストール
# yum install haproxy
haproxyの設定
haproxy.cfgを以下のように変更する。
# /etc/haproxy/haproxy.cfg global log 127.0.0.1 local0 notice user haproxy group haproxy defaults log global retries 2 timeout connect 3000 timeout server 5000 timeout client 5000 listen mysql-cluster bind 127.0.0.1:3306 mode tcp option mysql-check user haproxy_check balance roundrobin server mysql-1 127.0.0.1:3307 check server mysql-2 127.0.0.1:3308 check server mysql-3 127.0.0.1:3309 check
HAProxyがどのポートでもバインドできるようにSELinuxの設定を変更しておき、haproxyを起動する。
# setsebool -P haproxy_connect_any=1 # systemctl start haproxy
MariaDBに、何度か接続すると異なるserver_idに振り分けられ負荷分散されることが確認できる。
# mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running # echo "SELECT @@server_id;" | mysql -h 127.0.0.1 @@server_id 2 # echo "SELECT @@server_id;" | mysql -h 127.0.0.1 @@server_id 3 # echo "SELECT @@server_id;" | mysql -h 127.0.0.1 @@server_id 1
試しにスレーブを落としてみるとマスターだけに接続されることが確認できる。
# mysqld_multi stop 2,3 # mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is not running MySQL server from group: mysqld3 is not running # echo "SELECT @@server_id;" | mysql -h 127.0.0.1 @@server_id 1 # echo "SELECT @@server_id;" | mysql -h 127.0.0.1 @@server_id 1 # echo "SELECT @@server_id;" | mysql -h 127.0.0.1 @@server_id 1
参考
MySQL :: Starting and Stopping MySQL :: 4.4 mysqld_multi — Manage Multiple MySQL Servers
MariaDB Load Balancing with HAProxy on Centos 7 - Pull Requests - Medium
Dockerコンテナでネットワーク検証環境を構築する
DockerコンテナとOpen vSwitchを組み合わせてネットワーク検証環境を用意する。
作りたいのはこれ。
各コンポーネントは、以下のようにする。
- ルータ
- vyos1
- ブリッジ
- vswitch1
- vswitch2
- サーバ
- centos1
- centos2
- centos3
- centos4
各サーバは、NATを使いインターネットに出ることができる。
Open vSwitchとDockerのインストールは省略。
Dockerイメージ作成、取得
VyOSとCentOSのDockerイメージを用意する。
VyOS
$ docker pull 2stacks/vyos:1.2.0-rc11
CentOS
$ cat Dockerfile FROM centos RUN yum update -y RUN yum install -y iproute iputils $ docker build -t togattti/centos .
仮想スイッチを作成する
# ovs-vsctl add-br vswitch1 # ovs-vsctl add-br vswitch2 # ovs-vsctl show 591945d1-a629-428b-bf23-c725386b4db0 Bridge "vswitch2" Port "vswitch2" Interface "vswitch2" type: internal Bridge "vswitch1" Port "vswitch1" Interface "vswitch1" type: internal ovs_version: "2.9.2"
VyOSを構築する
コンテナを起動する。
$ docker run -d --name vyos1 --privileged -v /lib/modules:/lib/modules 2stacks/vyos:1.2.0-rc11 /sbin/init
vyos1にインターフェイスを作成、ブリッジとつなぐ。
$ sudo ovs-docker add-port vswitch1 eth1 vyos1 --ipaddress=192.168.10.1/24 $ sudo ovs-docker add-port vswitch2 eth2 vyos1 --ipaddress=192.168.20.1/24
サーバを構築する
Dockerコンテナを起動する。
$ docker run -d --net=none --privileged --name centos1 togattti/centos /sbin/init $ docker run -d --net=none --privileged --name centos2 togattti/centos /sbin/init $ docker run -d --net=none --privileged --name centos3 togattti/centos /sbin/init $ docker run -d --net=none --privileged --name centos4 togattti/centos /sbin/init
各サーバにインターフェイスを作成、ブリッジとつなぐ。
$ sudo ovs-docker add-port vswitch1 eth0 centos1 --ipaddress=192.168.10.2/24 $ sudo ovs-docker add-port vswitch1 eth0 centos2 --ipaddress=192.168.10.3/24 $ sudo ovs-docker add-port vswitch2 eth0 centos3 --ipaddress=192.168.20.2/24 $ sudo ovs-docker add-port vswitch2 eth0 centos4 --ipaddress=192.168.20.3/24
ここまでで、インターフェイスの設定状況が次のようになる。
$ docker exec -it centos1 ip a 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 229: eth0@if230: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether be:97:47:c6:64:28 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.10.2/24 scope global eth0 valid_lft forever preferred_lft forever $ docker exec -it centos2 ip a 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 231: eth0@if232: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether ce:40:67:95:a2:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.10.3/24 scope global eth0 valid_lft forever preferred_lft forever $ docker exec -it centos3 ip a 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 233: eth0@if234: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 02:0e:68:d2:c6:59 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.20.2/24 scope global eth0 valid_lft forever preferred_lft forever $ docker exec -it centos4 ip a 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 235: eth0@if236: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether e6:6b:b2:5f:38:cc brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.20.3/24 scope global eth0 valid_lft forever preferred_lft forever
ここまでの動作確認
centos1 -> centos2は、ネットワークが同一なので接続できるが、centos1 -> centos3は、別ネットワークにあるので、接続できない。
同様に、インターネットにも出れない。
$ docker exec -it centos1 ping -c 1 192.168.10.3 PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data. 64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.097 ms --- 192.168.10.3 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.097/0.097/0.097/0.000 ms $ docker exec -it centos1 ping -c 1 192.168.20.2 connect: Network is unreachable [root@a31c1ed4247a /]# ping -c 1 8.8.8.8 connect: Network is unreachable
デフォルトゲートウェイを設定する
centos1とcentos3のような別ネットワークにあるサーバ同士を接続する場合は、 お互いのデフォルトゲートウェイをvyos1に向ける必要がある。
行きと戻りのパケットの経路が必要なので、片道の経路だけでは疎通できないことに注意する。
$ docker exec -it centos1 ip route add default via 192.168.10.1 $ docker exec -it centos2 ip route add default via 192.168.10.1 $ docker exec -it centos3 ip route add default via 192.168.20.1 $ docker exec -it centos4 ip route add default via 192.168.20.1
設定状況は、以下のようになる。
$ docker exec -it centos1 ip r default via 192.168.10.1 dev eth0 192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.2 $ docker exec -it centos2 ip r default via 192.168.10.1 dev eth0 192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.3 $ docker exec -it centos3 ip r default via 192.168.20.1 dev eth0 192.168.20.0/24 dev eth0 proto kernel scope link src 192.168.20.2 $ docker exec -it centos4 ip r default via 192.168.20.1 dev eth0 192.168.20.0/24 dev eth0 proto kernel scope link src 192.168.20.3
これで、centos1~4は、互いに疎通できる。
$ docker exec -it centos1 ping -c 1 192 .168.20.2 PING 192.168.20.2 (192.168.20.2) 56(84) bytes of data. 64 bytes from 192.168.20.2: icmp_seq=1 ttl=63 time=1.25 ms --- 192.168.20.2 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.257/1.257/1.257/0.000 ms
ただし、インターネットには出れないままなので、NATを設定する。
$ docker exec -it centos1 ping -c 1 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. --- 8.8.8.8 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms
NATを設定する
vyos1にNATの設定を追加する。
$ docker exec -it vyos1 /bin/vbash # su - minion $ configure # set interfaces loopback lo address 1.1.1.1/32 # set nat source rule 1 translation address masquerade # set nat source rule 1 source address 192.168.0.0/16 # set nat source rule 1 outbound-interface eth0 # set nat source rule 1 description 'nat global 1' # show +interfaces { + loopback lo { + address 1.1.1.1/32 + } +} +nat { + source { + rule 1 { + description "nat global 1" + outbound-interface eth0 + source { + address 192.168.0.0/16 + } + translation { + address masquerade + } + } + } +} # commit # save
これで、vyos1のeth0を通してインターネットに出れる。
$ docker exec -it centos1 ping -c 1 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=2.27 ms --- 8.8.8.8 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 2.276/2.276/2.276/0.000 ms
あとで、作成した検証環境の構成をdocker-compose.ymlにまとめる。
参考
ovs-docker: Port already attached for~のエラー
Dockerコンテナを削除した後に、再生成してポートを割り当てようとすると、下記のエラーが出る。
$ sudo ovs-docker add-port vswitch1 eth0 centos1 --ipaddress=192.168.10.2/24 ovs-docker: Port already attached for CONTAINER=centos1 and INTERFACE=eth0
これは仮想スイッチを再生成すると解消する。
$ sudo ovs-docker del-br vswitch1 $ sudo ovs-docker del-br vswitch2
LVSのDR方式の動作検証
KeepAlivedとLVSを使い負荷分散、冗長化時の動作を検証する。
はじめに
負荷分散は、ダイレクトルーティング(DR)を使う。
DR(ダイレクトルーティング)では、
という流れになる。
そのため、クライアントへの戻りのパケットは、LVSサーバを経由せず、言い換えれば、負荷をかけずにクライアントに返る。
また、LVSサーバを2台構築して、VRRPによる冗長化を行う。
後日、NAT方式も試してみたい。
構成
- LVSサーバ
- lvs1
- 192.168.1.10/24
- lvs2
- 192.168.1.20/24
- lvs1
- リアルサーバ(Nginx)
- web1
- 192.168.1.30/24
- web2
- 192.168.1.40/24
- web1
- クライアント
- 192.168.1.50/24
LVSサーバには、VIPとして、192.168.1.100をつける。
いずれも、Ubuntu 18.04.2で用意した仮想サーバ。
構成図
設定
LVSサーバ
パッケージインストール
# apt update && apt install -y ipvsadm keepalived
インストールされた以下のバージョンを使う。
# ipvsadm -v ipvsadm v1.28 2015/02/09 (compiled with popt and IPVS v1.2.1) # keepalived -v Keepalived v1.3.9 (10/21,2017) Copyright(C) 2001-2017 Alexandre Cassen, <acassen@gmail.com> Build options: PIPE2 IPV4_DEVCONF LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_NEWDST RTA_PREF RTA_VIA FRA_OIFNAME FRA_SUPPRESS_PREFIXLEN FRA_SUPPRESS_IFGROUP FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK FRA_UID_RANGE LWTUNNEL_ENCAP_MPLS LWTUNNEL_ENCAP_ILA LIBIPTC LIBIPSET_DYNAMIC LVS LIBIPVS_NETLINK IPVS_DEST_ATTR_ADDR_FAMILY IPVS_SYNCD_ATTRIBUTES IPVS_64BIT_STATS VRRP VRRP_AUTH VRRP_VMAC SOCK_NONBLOCK SOCK_CLOEXEC GLOB_BRACE OLD_CHKSUM_COMPAT FIB_ROUTING INET6_ADDR_GEN_MODE SNMP_V3_FOR_V2 SNMP SNMP_KEEPALIVED SNMP_CHECKER SNMP_RFC SNMP_RFCV2 SNMP_RFCV3 DBUS SO_MARK
iptables
新しく接続を開始する80番の入りのTCPパケットは許可する。
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT # iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
keepalivedの設定
vrrp_instance Lvsdev { state BACKUP interface ens18 garp_master_delay 5 virtual_router_id 1 priority 100 nopreempt advert_int 3 virtual_ipaddress { 192.168.1.100 dev ens18 } } virtual_server 192.168.1.100 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 192.168.1.20 80 { weight 1 inhibit_on_failure HTTP_GET { url { path /hello.html status_code 200 } connect_timeout 3 delay_before_retry 7 } } real_server 192.168.1.30 80 { weight 1 inhibit_on_failure HTTP_GET { url { path / status_code 200 } connect_timeout 3 delay_before_retry 7 } } }
keepalivedを起動する。
# systemctl start keepalived
仮想サーバテーブルを確認する。
# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP lvs:http rr -> 192.168.1.20:http Route 1 0 0 -> 192.168.1.30:http Route 1 0 0
リアルサーバ
iptables
クライアントからLVSサーバに対して行われたリクエストがリアルサーバに 転送されてきたときに、そのパケットをリアルサーバ自身のIPアドレスにリダイレクトする。
そしてクライアントに結果を返す時は、リアルサーバのルーティングテーブルを参照して、 LVSサーバ自身のIPアドレスから返しているように見せかけることでDRを実現する。
ここでは、LVSサーバには、パケットは戻らない。
iptablesを使うと
# iptables -t nat -A PREROUTING -d 192.168.1.100/32 -j REDIRECT # iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT all -- anywhere 192.168.1.100 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
これで、LVSサーバ宛てのパケットをリアルサーバ自身にリダイレクトすることができる。
nginxのコンテンツ変更
web1
# echo hello web1 > /var/www/html/hello.html
web2
# echo hello web2 > /var/www/html/hello.html
動作検証
LVS間の冗長化
VIPが設定されているか確認する。
lvs1
$ ip -f inet addr show ens18 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.1.20/24 brd 192.168.1.255 scope global ens18 valid_lft forever preferred_lft forever inet 192.168.1.100/32 scope global ens18 valid_lft forever preferred_lft forever
lvs2
$ ip -f inet addr show ens18 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.1.30/24 brd 192.168.1.255 scope global ens18 valid_lft forever preferred_lft forever
VIPをlvs1側だけが持っていることがわかる。
この状態で、lvs1で障害が発生したと想定してkeepalivedを落とすと、
lvs1
# systemctl stop keepalived $ ip -f inet addr show ens18 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.1.20/24 brd 192.168.1.255 scope global ens18 valid_lft forever preferred_lft forever
lv2
$ ip -f inet addr show ens18 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.1.30/24 brd 192.168.1.255 scope global ens18 valid_lft forever preferred_lft forever inet 192.168.1.100/32 scope global ens18 valid_lft forever preferred_lft forever
VIPがlvs2側に設定されたので、冗長化できている。
リアルサーバ間の負荷分散
lvs1で仮想サーバテーブルを確認する。
# ipvsadm -l IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP lvs1:http rr -> 192.168.1.20:http Route 1 0 0 -> 192.168.1.30:http Route 1 0 0
クライアントから、VIPにアクセスする。
$ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web1 $ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web2 $ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web1 $ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web2
ラウンドロビンできてる。
web1のnginx落としてから、仮想サーバテーブルを確認すると 重みが0になり、振り分けの対象から除外されていることがわかる。
# ipvsadm -l IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP lvs1:http rr -> 192.168.1.20:http Route 0 0 0 -> 192.168.1.30:http Route 1 0 0
VIPにアクセスする。
$ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web2 $ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web2 $ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web2 $ curl -s --connect-timeout 3 http://192.168.1.100/hello.html hello web2
冗長化もできてる。
参考
2.5. パケット転送をオンにする - Red Hat Customer Portal