使用起搏器来构建Redis的两个节点集群
翻译:
为了什么
-
- redisは3台以上あればredisだけで冗長化構成が組めますが諸事情により2ノードで構成したい場合の参考になれば幸いです。
-
- pacemakerの2系の記事が少ないなあと思って書きました。
- 絶賛本番運用中の構成です。
形成
-
- 2ノードで書き込み用のノード(Master)と参照用のノード(Slave)を準備する。レプリケーションさせる。
-
- 書き込み用の仮想IPを設けて障害検知時にノードの役割を交代させつつ、仮想IPを移動させる。アプリケーションから見たら常に仮想IPだけ見ていれば良い状態にする。
- とてもシンプルな図ですが以下のような構成を想定。
起搏器的准备。
- まずはpacemakerのインストールと準備です。
安装
pcs,pacemaker,fence-agents-allをインストールする。
pcsはpacemakerのクライアント。
## 多分HighAvailabilityでイケると思う。
dnf install pcs pacemaker fence-agents-all --enablerepo=HighAvailability
## リポジトリがhaで定義されてる場合もある。
dnf install pcs pacemaker fence-agents-all --enablerepo=ha
设定
- 事前チェックでfirewalldが稼働してるかチェックしておきます。
## 事前の確認
[root@redis1 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor >
Active: inactive (dead)
Docs: man:firewalld(1)
## firewalld起動
[root@redis1 ~]# systemctl start firewalld.service
## 自動起動の設定
[root@redis1 ~]# systemctl enable firewalld
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
- 対象マシンそれぞれで実行すること。
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --add-service=high-availability
如果显示出 “FirewallD is not running”,请启动 firewalld。
参考的唯一选项
执行pcsd服务的启动。
-
- pacemakerのdeamonです。
- ノードそれぞれで実行すること。
systemctl start pcsd.service
systemctl enable pcsd.service
设定pacemaker执行用户的密码。
-
- pacemakerの実行ユーザーとなるhaclusterユーザーのパスワードを設定します。
dnf(yum)でインストールした場合には自動でユーザー作成されているのでcat /etc/passwd等で確認しておく。
passwd hacluster
在集群中进行身份验证
- 設定したhaclusterユーザーを認証して相互に通信可能にします。
## クラスタサーバの認証設定 [片系(reids1)で実施]
[root@redis1 ~]# pcs host auth reids_test1 addr=192.168.111.45 redis_test2 addr=192.168.111.46
Username: hacluster
Password:
reids_test1: Authorized
reids_test2: Authorized
创建集群
- クラスターにノードを追加します。ノード追加時にIPアドレスが必要になるのでIPアドレスを確認しておきましょう。
[root@redis1 ~]# pcs cluster setup redis-cluster redis1 addr=192.168.111.45 redis2 addr=192.168.111.46
Destroying cluster on hosts: 'redis1', 'redis2'...
redis1: Successfully destroyed cluster
redis2: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'redis1', 'redis2'
redis1: successful removal of the file 'pcsd settings'
mp-cache02: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'redis1', 'redis2'
redis1: successful distribution of the file 'corosync authkey'
redis1: successful distribution of the file 'pacemaker authkey'
redis2: successful distribution of the file 'corosync authkey'
redis2: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'redis1', 'redis2'
redis1: successful distribution of the file 'corosync.conf'
redis2: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
启动集群
-
- クラスターを起動します。
- クラスター全体を起動する場合には–allオプションを付けると全ノードでクラスター起動します。
[root@redis1 ~]# pcs cluster start
Starting Cluster...
pcs configコマンドで確認すると以下のような出力が得られる(以下2ノードの場合)
[root@redis1 ~]# pcs config
Cluster Name: redis_cluster
Corosync Nodes:
reids1 redis2
Pacemaker Nodes:
redis1 reids2
Resources:
Stonith Devices:
Fencing Levels:
Location Constraints:
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:
Alerts:
No alerts defined
Resources Defaults:
No defaults set
Operations Defaults:
No defaults set
Cluster Properties:
cluster-infrastructure: corosync
cluster-name: redis_test_cluster
dc-version: 2.1.0-8.el8-7c3f660707
have-watchdog: false
Tags:
No tags defined
Quorum:
Options:
STONITH可以翻译为“断网风险探测和隔离”。
-
- ノード間で疎通取れなかった時の挙動などを決めるのに使います。
- Masterが正常だったら、フェイルオーバー時にクラスターから外れたノードは手動での調査と復旧を行う想定なので今回はstonithを無効化しておきます。
把它无效化
pcs property set stonith-enabled=false
核实corosync的设置
-
- 一応見ておきます。
/etc/corosync/corosync.confを確認
[root@redis1 ~]# cat /etc/corosync/corosync.conf
totem {
version: 2
cluster_name: redis_test_cluster
transport: knet
crypto_cipher: aes256
crypto_hash: sha256
}
nodelist {
node {
ring0_addr: 192.168.111.45
name: redis1
nodeid: 1
}
node {
ring0_addr: 192.168.111.46
name: redis2
nodeid: 2
}
}
quorum {
provider: corosync_votequorum
two_node: 1
}
logging {
to_logfile: yes
logfile: /var/log/cluster/corosync.log
to_syslog: yes
timestamp: on
}
向起搏器添加资源
-
- pacemakerがインストールされたノードでpacemakerが制御する単位をリソースと呼びます。
-
- pacemakerに何をどういう手順で管理させるのかを教える作業です。
- 仮想IPとredisのリソースを追加していきます。
添加虚拟IP
事前准备
- nicの確認をip aで確認しておく。
[n-kashimoto@redis1 ~]$ sudo 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno8303: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master nm-bond state UP group default qlen 1000
link/ether d0:8e:79:ca:60:99 brd ff:ff:ff:ff:ff:ff permaddr d0:8e:79:ca:60:98
3: eno8403: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master nm-bond state UP group default qlen 1000
link/ether d0:8e:79:ca:60:99 brd ff:ff:ff:ff:ff:ff
4: nm-bond: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d0:8e:79:ca:60:99 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.45/24 brd 192.168.111.255 scope global noprefixroute nm-bond
valid_lft forever preferred_lft forever
设定
- nicに対して仮想IPを割り当てます。
[root@redis1 ~]# pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.111.44 cidr_netmask=24 nic=nm-bond op monitor interval=10s
- 確認
我会在PCS资源配置中进行确认。
[root@redis1 ~]# pcs resource config
Resource: VirtualIP (class=ocf provider=heartbeat type=IPaddr2)
Attributes: cidr_netmask=24 ip=192.168.111.44 nic=m-bond
Operations: monitor interval=10s (VirtualIP-monitor-interval-10s)
start interval=0s timeout=20s (VirtualIP-start-interval-0s)
stop interval=0s timeout=20s (VirtualIP-stop-interval-0s)
添加Redis资源
-
- redisのインストールは割愛します。
- 起動・終了はpacemakerが制御するのでsystemdでdisableにしておくこと
设定
- リソースエージェントはocf:heartbeat:redisを使います。
pcs resource create redis-clone ocf:heartbeat:redis op start timeout=300s op monitor interval=5s op monitor role=Master interval=3s op monitor role=Slave interval=15s promotable
加以限制。
-
- 仮想IPのリソースが異なるリソースのredis-cloneと連動して動くように設定する。仮想IPがredisのmasterのノードにいないとreadonlyのslaveにつながってしまう。
- redis-cloneの昇格が終わる前に仮想IPが動くと意図しないトランザクションが流れるので困る。
# 念の為なんかあったら削除しておく
[root@redis1 ~]# pcs constraint colocation remove VirtualIP redis-clone
# ここから追加
[root@redis1 ~]# pcs constraint colocation add redis-clone with VirtualIP INFINITY
# 確認
[root@redis1 ~]# pcs constraint
Location Constraints:
Ordering Constraints:
start VirtualIP then start redis-clone (kind:Mandatory)
Colocation Constraints:
redis-clone with VirtualIP (score:INFINITY)
Ticket Constraints:
- ちゃんとMasterと同じノードに移動するように変更する。
pcs constraint colocation add VirtualIP with master redis-clone INFINITY
- 確認するとwith-rsc-role:Masterと出力されているのが分かりますね。
[root@redis1 ~]# pcs constraint
Location Constraints:
Ordering Constraints:
Colocation Constraints:
VirtualIP with redis-clone (score:INFINITY) (rsc-role:Started) (with-rsc-role:Master)
Ticket Constraints:
重新启动
- 滅多に–allは使わないのでクラスター全体を再起動する時ぐらい使う
pcs cluster stop --all
pcs cluster start --all
请使用redis-benchmark或redis-cli等工具对VirtualIP进行测试并确认其行为。