Nextcloudは、オープンソースのファイル同期および共有アプリケーションであり、無料で安全で簡単にアクセスできるクラウドファイルストレージと、その機能セットを拡張する多数のツールを提供します。人気のDropbox、iCloud、Googleドライブと非常に似ていますが、Dropboxとは異なり、Nextcloudはオフプレミスのファイルストレージホスティングを提供していません。
このブログ投稿では、高可用性セットアップをデプロイしますNextcloud、GlusterFS、Percona XtraDB Cluster(MySQL Galera Cluster)、データベースとロードバランサー層を管理および監視するための自動化ツールとしてClusterControlを備えたProxySQLを使用するプライベート「Dropbox」インフラストラクチャ用。
注:MariaDB Clusterを使用することもできます。これは、PerconaXtraDBClusterと同じ基盤となるレプリケーションライブラリを使用します。ロードバランサーの観点からは、ProxySQLはSQLトラフィックを理解でき、トラフィックのルーティング方法をきめ細かく制御できるという点でMaxScaleと同様に動作します。
Nexcloudのデータベースアーキテクチャ
このブログ投稿では、合計6つのノードを使用しました。
- 2台のプロキシサーバー
- 3xデータベース+アプリケーションサーバー
- 1 xコントローラーサーバー(ClusterControl)
次の図は、最終的なセットアップを示しています。
Percona XtraDBクラスターの場合、ソリッドには最低3つのノードが必要です。マルチマスターレプリケーション。 Nextcloudアプリケーションはデータベースサーバー内に同じ場所に配置されているため、それらのホストでもGlusterFSを構成する必要があります。
ロードバランサー層は、冗長性を確保するために2つのノードで構成されています。 ClusterControlを使用して、データベース層とロードバランサー層をデプロイします。すべてのサーバーはCentOS7で実行されており、すべてのノードで次の/ etc/hosts定義があります。
192.168.0.21 nextcloud1 db1
192.168.0.22 nextcloud2 db2
192.168.0.23 nextcloud3 db3
192.168.0.10 vip db
192.168.0.11 proxy1 lb1 proxysql1
192.168.0.12 proxy2 lb2 proxysql2
GlusterFSとMySQLは非常に集中的なプロセスであることに注意してください。この設定に従っている場合(GlusterFSとMySQLが単一のサーバーに存在する場合)、サーバーに適切なハードウェア仕様があることを確認してください。
ClusterControlを使用した3ノードのPerconaXtraDBクラスターのデータベース展開から始めます。 ClusterControlをインストールしてから、ClusterControlによって管理されるすべてのノード(3つのPXC + 2つのプロキシ)にパスワードなしのSSHを設定します。 ClusterControlノードで、次の手順を実行します。
$ whoami
root
$ ssh-copy-id 192.168.0.11
$ ssh-copy-id 192.168.0.12
$ ssh-copy-id 192.168.0.21
$ ssh-copy-id 192.168.0.22
$ ssh-copy-id 192.168.0.23
**プロンプトが表示されたら、それぞれのホストのルートパスワードを入力します。
Webブラウザーを開き、https:// {ClusterControl-IP-address} / clustercontrolにアクセスして、スーパーユーザーを作成します。次に、[デプロイ]->[MySQLGalera]に移動します。それに応じて、展開ウィザードに従います。第2段階の「MySQLサーバーの定義」で、Percona XtraDB 5.7を選択し、すべてのデータベースノードのIPアドレスを指定します。以下に示すように、データベースノードの詳細を入力した後、緑色のチェックマークが付いていることを確認してください。
[展開]をクリックして展開を開始します。データベースクラスターは15〜20分で準備が整います。展開の進行状況は、[アクティビティ]->[ジョブ]->[クラスターの作成]->[完全なジョブの詳細]で確認できます。デプロイされると、クラスターはデータベースクラスターダッシュボードの下に一覧表示されます。
これで、データベースロードバランサーの展開に進むことができます。
Nextcloudは、書き込みが一度に1つのマスターによって処理され、読み取りを他のノードに分散できるシングルライターセットアップで実行することをお勧めします。 ProxySQL 2.0を使用すると、書き込みクエリを単一のマスターにルーティングできるため、この構成を実現できます。
ProxySQLをデプロイするには、[クラスターアクション]>[ロードバランサーの追加]>[ProxySQL]>[ProxySQLのデプロイ]をクリックします。赤い矢印で強調表示されている必要な情報を入力します:
上記の矢印で強調表示されているように、必要なすべての詳細を入力します。サーバーアドレスはlb1サーバー、192.168.0.11です。さらに下に、ProxySQL管理者と監視ユーザーのパスワードを指定します。次に、すべてのMySQLサーバーを負荷分散セットに含め、[暗黙のトランザクション]セクションで[いいえ]を選択します。 [ProxySQLのデプロイ]をクリックしてデプロイを開始します。
セカンダリロードバランサーlb2について上記と同じ手順を繰り返します(ただし、「サーバーアドレス」をlb2のIPアドレスに変更します)。そうしないと、このレイヤーに冗長性がなくなります。
これで、ProxySQLノードがインストールされ、GaleraClusterの2つのホストグループで構成されました。 1つはシングルマスターグループ(ホストグループ10)で、すべての接続が1つのGaleraノードに転送され(これはマルチマスターのデッドロックを防ぐのに役立ちます)、マルチマスターグループ(ホストグループ20)はすべての読み取り専用ワークロードに転送されます。すべてのバックエンドMySQLサーバーに対してバランスが取られます。
次に、仮想IPアドレスをデプロイして、ProxySQLノードに単一のエンドポイントを提供する必要があります。これにより、アプリケーションで2つの異なるProxySQLホストを定義する必要がなくなります。これにより、プライマリProxySQLノードに問題が発生した場合に、仮想IPアドレスがバックアップProxySQLノードに引き継がれるため、自動フェイルオーバー機能も提供されます。
ClusterControl->管理->ロードバランサー->キープアライブ->キープアライブのデプロイに移動します。ロードバランサータイプとして「ProxySQL」を選択し、ドロップダウンから2つの異なるProxySQLサーバーを選択します。次に、次の例に示すように、仮想IPアドレスとそれがリッスンするネットワークインターフェイスを指定します。
展開が完了すると、クラスターの概要バーに次の詳細が表示されます。
最後に、ClusterControl-> Manage-> Schemas and Users-> Create Databaseに移動し、「nextcloud」を指定して、アプリケーションの新しいデータベースを作成します。 ClusterControlは、すべてのGaleraノードにこのデータベースを作成します。これでロードバランサー層が完成しました。
Nextcloud用のGlusterFSデプロイメント
特に指定がない限り、次の手順はnextcloud1、nextcloud2、nextcloud3で実行する必要があります。
ステップ1
GlusterFSストレージ用にこれを別に用意することをお勧めします。そのため、/ dev / sdbの下にディスクを追加し、新しいパーティションを作成します。
$ fdisk /dev/sdb
次のキーを押して、fdiskパーティション作成ウィザードに従います。
n > p > Enter > Enter > Enter > w
ステップ2
/ dev / sdb1が作成されているかどうかを確認します:
$ fdisk -l /dev/sdb1
Disk /dev/sdb1: 8588 MB, 8588886016 bytes, 16775168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
ステップ3
$ mkfs.xfs /dev/sdb1
ステップ4
$ mkdir /glusterfs
$ mount /dev/sdb1 /glusterfs
すべてのノードのレイアウトが次のとおりであることを確認します。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
└─sda1 8:1 0 40G 0 part /
sdb 8:16 0 8G 0 disk
└─sdb1 8:17 0 8G 0 part /glusterfs
ステップ5
/glusterfsの下にbrickというサブディレクトリを作成します:
$ mkdir /glusterfs/brick
ステップ6
アプリケーションの冗長性のために、ホスト間のファイルレプリケーションにGlusterFSを使用できます。まず、CentOS用のGlusterFSリポジトリをインストールします:
$ yum install centos-release-gluster -y
$ yum install epel-release -y
ステップ7
GlusterFSサーバーをインストールする
$ yum install glusterfs-server -y
ステップ8
glusterデーモンを有効にして起動します:
$ systemctl enable glusterd
$ systemctl start glusterd
ステップナイン
nextcloud1で、他のノードをプローブします:
(nextcloud1)$ gluster peer probe 192.168.0.22
(nextcloud1)$ gluster peer probe 192.168.0.23
次のコマンドを使用して、ピアのステータスを確認できます。
(nextcloud1)$ gluster peer status
Number of Peers: 2
Hostname: 192.168.0.22
Uuid: f9d2928a-6b64-455a-9e0e-654a1ebbc320
State: Peer in Cluster (Connected)
Hostname: 192.168.0.23
Uuid: 100b7778-459d-4c48-9ea8-bb8fe33d9493
State: Peer in Cluster (Connected)
ステップ10
nextcloud1で、プローブされたノードにレプリケートされたボリュームを作成します:
(nextcloud1)$ gluster volume create rep-volume replica 3 192.168.0.21:/glusterfs/brick 192.168.0.22:/glusterfs/brick 192.168.0.23:/glusterfs/brick
volume create: rep-volume: success: please start the volume to access data
ステップイレブン
(nextcloud1)$ gluster volume start rep-volume
volume start: rep-volume: success
複製されたボリュームとプロセスがオンラインであることを確認します:
$ gluster volume status
Status of volume: rep-volume
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick 192.168.0.21:/glusterfs/brick 49152 0 Y 32570
Brick 192.168.0.22:/glusterfs/brick 49152 0 Y 27175
Brick 192.168.0.23:/glusterfs/brick 49152 0 Y 25799
Self-heal Daemon on localhost N/A N/A Y 32591
Self-heal Daemon on 192.168.0.22 N/A N/A Y 27196
Self-heal Daemon on 192.168.0.23 N/A N/A Y 25820
Task Status of Volume rep-volume
------------------------------------------------------------------------------
There are no active volume tasks
ステップ12
$ mkdir -p /var/www/html
ステップ13
13)自動マウントを許可するには、/ etc/fstabに次の行を追加します。
/dev/sdb1 /glusterfs xfs defaults,defaults 0 0
localhost:/rep-volume /var/www/html glusterfs defaults,_netdev 0 0
ステップ14
GlusterFSを/var/ www / htmlにマウントします:
$ mount -a
そして、次のように確認します:
$ mount | grep gluster
/dev/sdb1 on /glusterfs type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
localhost:/rep-volume on /var/www/html type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)
これで、複製されたボリュームの準備が整い、すべてのノードにマウントされます。これで、アプリケーションのデプロイに進むことができます。
特に指定がない限り、次の手順はnextcloud1、nextcloud2、およびnextcloud3で実行する必要があります。
NextcloudにはPHP7.2以降が必要です。CentOSディストリビューションでは、インストールプロセスを簡素化するために、EPELやRemiなどの多くのリポジトリを有効にする必要があります。
ステップ1
SELinuxが有効になっている場合は、最初に無効にします:
$ setenforce 0
$ sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
このガイドに従って、SELinuxを有効にしてNextcloudを実行することもできます。
ステップ2
Nextcloud要件をインストールし、PHP 7.2のRemiリポジトリを有効にします:
$ yum install -y epel-release yum-utils unzip curl wget bash-completion policycoreutils-python mlocate bzip2
$ yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ yum-config-manager --enable remi-php72
ステップ3
Nextcloudの依存関係、主にApacheおよびPHP 7.2関連のパッケージをインストールします:
$ yum install -y httpd php72-php php72-php-gd php72-php-intl php72-php-mbstring php72-php-mysqlnd php72-php-opcache php72-php-pecl-redis php72-php-pecl-apcu php72-php-pecl-imagick php72-php-xml php72-php-pecl-zip
Apacheを有効にして起動します:
$ systemctl enable httpd.service
$ systemctl start httpd.service
PHPがPHP7.2バイナリを使用するためのシンボリックリンクを作成します。
$ ln -sf /bin/php72 /bin/php
nextcloud1で、ここからNextcloud Serverをダウンロードし、解凍します:
$ wget https://download.nextcloud.com/server/releases/nextcloud-17.0.0.zip
$ unzip nextcloud*
nextcloud1で、ディレクトリを/ var / www / htmlにコピーし、正しい所有権を割り当てます。
$ cp -Rf nextcloud /var/www/html
$ chown -Rf apache:apache /var/www/html
** GlusterFSボリュームのレプリケーションのため、/ var / www/htmlへのコピープロセスには時間がかかることに注意してください。
インストールウィザードを開く前に、pxc_strict_mode変数を「ENFORCING」(デフォルト値)以外に無効にする必要があります。これは、Nextcloudデータベースのインポートに主キーが定義されていないテーブルが多数あるため、GaleraClusterでの実行は推奨されていません。これについては、さらに下のチューニングセクションで詳しく説明されています。
ClusterControlを使用して構成を変更するには、[管理]->[構成]->[パラメーターの変更/設定]に移動します。
リストからすべてのデータベースインスタンスを選択し、次のように入力します。
- グループ:MYSQLD
- パラメータ:pxc_strict_mode
- 新しい価値:PERMISSIVE
ClusterControlは、すべてのデータベースノードで必要な変更を自動的に実行します。実行時に値を変更できる場合は、すぐに有効になります。 ClusterControlは、永続性のためにMySQL構成ファイル内の値も構成します。次の結果が表示されます。
ステップナイン
これで、Nextcloudのインストールを構成する準備が整いました。ブラウザを開き、http://192.168.0.21/nextcloud/にあるnextcloud1のHTTPサーバーに移動すると、次の構成ウィザードが表示されます。
「ストレージとデータベース」セクションを次の値で構成します:
- データフォルダー:/ var / www / html / nextcloud / data
- データベースの構成:MySQL / MariaDB
- ユーザー名:nextcloud
- パスワード:(ユーザーnextcloudのパスワード)
- データベース:nextcloud
- ホスト:192.168.0.10:6603(ProxySQLポートを使用する仮想IPアドレス)
「セットアップの完了」をクリックして、構成プロセスを開始します。それが終了するまで待ち、ユーザー「admin」のNextcloudダッシュボードにリダイレクトされます。これでインストールは完了です。次のセクションでは、GaleraClusterで効率的に実行するためのチューニングのヒントをいくつか紹介します。
すべてのテーブルに主キーを設定することは、GaleraClusterの書き込みセットのレプリケーションに不可欠です。主キーのない比較的大きなテーブルの場合、大きな更新または削除トランザクションは、非常に長い間クラスターを完全にブロックします。癖やエッジケースを回避するには、すべてのテーブルが明示的な主キーを持つInnoDBストレージエンジンを使用していることを確認してください(一意のキーはカウントされません)。
Nextcloudのデフォルトのインストールでは、指定されたデータベースの下に一連のテーブルが作成され、それらの一部はこのルールに準拠していません。テーブルがGaleraと互換性があるかどうかを確認するには、次のステートメントを実行できます。
mysql> SELECT DISTINCT CONCAT(t.table_schema,'.',t.table_name) as tbl, t.engine, IF(ISNULL(c.constraint_name),'NOPK','') AS nopk, IF(s.index_type = 'FULLTEXT','FULLTEXT','') as ftidx, IF(s.index_type = 'SPATIAL','SPATIAL','') as gisidx FROM information_schema.tables AS t LEFT JOIN information_schema.key_column_usage AS c ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name AND c.constraint_name = 'PRIMARY') LEFT JOIN information_schema.statistics AS s ON (t.table_schema = s.table_schema AND t.table_name = s.table_name AND s.index_type IN ('FULLTEXT','SPATIAL')) WHERE t.table_schema NOT IN ('information_schema','performance_schema','mysql') AND t.table_type = 'BASE TABLE' AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL OR s.index_type IN ('FULLTEXT','SPATIAL')) ORDER BY t.table_schema,t.table_name;
+---------------------------------------+--------+------+-------+--------+
| tbl | engine | nopk | ftidx | gisidx |
+---------------------------------------+--------+------+-------+--------+
| nextcloud.oc_collres_accesscache | InnoDB | NOPK | | |
| nextcloud.oc_collres_resources | InnoDB | NOPK | | |
| nextcloud.oc_comments_read_markers | InnoDB | NOPK | | |
| nextcloud.oc_federated_reshares | InnoDB | NOPK | | |
| nextcloud.oc_filecache_extended | InnoDB | NOPK | | |
| nextcloud.oc_notifications_pushtokens | InnoDB | NOPK | | |
| nextcloud.oc_systemtag_object_mapping | InnoDB | NOPK | | |
+---------------------------------------+--------+------+-------+--------+
上記の出力は、主キーが定義されていないテーブルが7つあることを示しています。上記を修正するには、自動インクリメント列を持つ主キーを追加するだけです。データベースサーバーの1つ(nexcloud1:
など)で次のコマンドを実行します。(nextcloud1)$ mysql -uroot -p
mysql> ALTER TABLE nextcloud.oc_collres_accesscache ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;
mysql> ALTER TABLE nextcloud.oc_collres_resources ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;
mysql> ALTER TABLE nextcloud.oc_comments_read_markers ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;
mysql> ALTER TABLE nextcloud.oc_federated_reshares ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;
mysql> ALTER TABLE nextcloud.oc_filecache_extended ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;
mysql> ALTER TABLE nextcloud.oc_notifications_pushtokens ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;
mysql> ALTER TABLE nextcloud.oc_systemtag_object_mapping ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;
上記の変更を適用したら、pxc_strict_modeを推奨値「ENFORCING」に再構成できます。対応する値を使用して、「アプリケーションの導入」セクションの手順8を繰り返します。
Nextcloudがアドバイスする推奨されるトランザクション分離レベルはREAD-COMMITTEDを使用することですが、GaleraClusterはデフォルトでより厳密なREPEATABLE-READ分離レベルになっています。 READ-COMMITTEDを使用すると、高負荷のシナリオでのデータ損失を回避できます(たとえば、多くのクライアント/ユーザーと多くの並列操作で同期クライアントを使用することにより)。
トランザクションレベルを変更するには、ClusterControl->管理->構成->パラメーターの変更/設定に移動し、以下を指定します。
[続行]をクリックすると、ClusterControlは構成の変更をすぐに適用します。データベースを再起動する必要はありません。
URLにアクセスするときにnextcloud1にインストールを実行したため、このIPアドレスはNextcloud内の「trusted_domains」変数に自動的に追加されます。セカンダリサーバーhttp://192.168.0.22/nextcloudなどの他のサーバーにアクセスしようとすると、これはホストが許可されていないため、trusted_domain変数に追加する必要があるというエラーが表示されます。
したがって、以下の例のように、/ var / www / html / nextcloud / config/config.php内の「trusted_domain」配列の下にすべてのホストのIPアドレスを追加します。
'trusted_domains' =>
array (
0 => '192.168.0.21',
1 => '192.168.0.22',
2 => '192.168.0.23'
),
上記の構成により、ユーザーは次のURLを介して3つのアプリケーションサーバーすべてにアクセスできます。
- http://192.168.0.21/nextcloud(nextcloud1)
- http://192.168.0.22/nextcloud(nextcloud2)
- http://192.168.0.23/nextcloud(nextcloud3)
注:これら3つのNextcloudインスタンスの上にロードバランサー層を追加して、HAProxyやnginxなどの市場で入手可能なHTTPリバースプロキシを使用して、アプリケーション層の高可用性を実現できます。これは、このブログ投稿の範囲外です。
Nextcloudのトランザクションファイルロックメカニズムは、通常の操作中にファイルが破損しないようにファイルをロックします。トランザクションファイルロック(これはデフォルトで有効になっています)を処理するためにRedisをインストールすることをお勧めします。これにより、データベースクラスターがこの重いジョブを処理できなくなります。
Redisをインストールするには、次のようにします。
$ yum install -y redis
$ systemctl enable redis.service
$ systemctl start redis.service
/var/www/html/nextcloud/config/config.php内に次の行を追加します:
'filelocking.enabled' => true,
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => '192.168.0.21',
'port' => 6379,
'timeout' => 0.0,
),
詳細については、このドキュメント「トランザクションファイルのロック」をご覧ください。
Nextcloudは、プライベートファイル共有の要求に応えるためのスケーラブルで可用性の高いファイルホスティングサービスとして構成できます。このブログでは、Nextcloud、ファイルシステム、データベースの各レイヤーに冗長性をもたらす方法を紹介しました。