2014年6月30日月曜日

仮想マシンとしてのドメインコントローラーとディスクキャッシュ

Windows Serverをドメインコントローラーにした場合、Active Directoryデータベースの整合性を維持するため、書き込みキャッシュを無効にします。

仮想マシンをドメインコントローラーとして構成した場合、物理マシンのキャッシュが無効になるため、性能が低下するらしいが本当ですか。

という質問をいただきました。

最終的な答えはNOですが、いくつか微妙な問題があったのでまとめておきます。なお、以下の文書はすべてWindows Server 2008ベースのものですが、Windows Server 2012 R2でも状況は同じだと思われます。

サポート技術情報888794「仮想ホスト環境で Active Directory ドメイン コントローラーをホストする場合の考慮事項」には以下のことが記載されています。

仮想ホスト環境のソフトウェアで、Force Unit Access (FUA) をサポートする SCSI エミュレーション モードが正しくサポートされている場合、この環境で Active Directory が実行するバッファーなし書き込みはホスト オペレーティング システムに渡されます。

FUA がサポートされていない場合は、Active Directory データベース、ログ、およびチェックポイント ファイルをホストするゲスト オペレーティング システム上のすべてのボリュームにおいて、書き込みキャッシュを無効にする必要があります。

後半は自動的に設定されるため、特に意識する必要はありません。

FUAは、キャッシュ制御をするためのSCSIコマンドです。このコマンドが、仮想マシンから物理マシンに正しく送られる場合、キャッシュを無視してアクセスを行えるようです。

つまり、キャッシュを無効にしなくても、仮想マシンDCからのI/O要求に関してはキャッシュを使わずにディスクをアクセスします。

もちろんSCSIコマンドを発行するのは、仮想マシンの仮想ディスクに対してですから、仮想マシンには仮想SCSIディスクが必要です。また、最終的にSCSIコマンドを受け取るのは物理ディスクですから、物理ディスクもSCSIディスクでなければいけません。

物理ディスクがSCSIでない(IDE/ATA)の場合は、VHD(VHDX)ファイルが破損しないように、キャッシュを手動で無効にする必要があります。

なお、仮想ディスクは、ドメインコントローラーの既定の動作によりSCSIであろうとなかろうと書き込みキャッシュを無効にします。

Microsoft TechNetのドキュメント「仮想化ドメイン コントローラーの展開に関する考慮事項」には以下の記述があります。

Active Directory のデータが壊れる可能性を減らすため、SCSI コントローラーを使用するか、ATA ドライブまたは IDE ドライブで書き込みキャッシュを無効にしてください。

仮想ドメイン コントローラーをホストする Hyper-V サーバーでは、IDE ドライブや ATA ドライブではなく SCSI 物理ドライブを使用してください。SCSI ドライブを使用できない場合は、仮想ドメイン コントローラーをホストする ATA ドライブまたは IDE ドライブで書き込みキャッシュを必ず無効にしてください。詳細については、「Event ID 1539 – Database Integrity (イベント ID 1539 - データベースの整合性に関するページ)」を参照してください。

ドメイン コントローラーとして実行するすべての仮想マシンで、仮想 SCSI コントローラーを使用してください。仮想 SCSI コントローラーを使用できない場合は、ドメイン コントローラーとして実行する仮想マシンの仮想 IDE ドライブで書き込みキャッシュを必ず無効にしてください。インストールされているディスク コントローラーの種類は Virtual Machine Manager の設定ダイアログ ボックスで確認できます。詳細については、「仮想マシンを構成する」を参照してください。

まとめると、以下の通りです。

  • 物理ディスクがATAの場合
    • 物理ディスク…手動でキャッシュ無効化
    • 仮想ディスク…自動的にキャッシュ無効化
  • 物理ディスクがSCSIの場合で仮想ディスクがATAの場合
    • 物理ディスク…手動でキャッシュ無効化
    • 仮想ディスク…自動的にキャッシュ無効化
  • 物理ディスクも仮想ディスクもSCSIの場合
    • 物理ディスク…FUAによる自動制御
    • 仮想ディスク…自動的にキャッシュ無効化

より詳細な内容は、以下のドキュメントをダウンロードしてください(英語です)。

Hyper-V でのドメイン コントローラーの実行に関するページ (ダウンロード可能な Word 文書)

2014年6月29日日曜日

Hyper-V 仮想化環境での時刻同期

時刻同期は今ではサーバーの非常に重要な要件となりました。時刻が同期されていないと、各種のログの照合が難しくなるだけでなく、認証プロトコルが失敗することさえあります。

Hyper-Vを含め、多くの仮想化環境では、仮想マシンの時刻が遅れる傾向にあります。

昔「任天堂ゲームウォッチ」という携帯ゲームがありました。単機能なので、学校でゲーム機本体の交換を行った経験のある人もいるでしょう。ゲームウォッチは、名前の通り本来は時計なのですが、内蔵されたCPUでソフトウェア的に時刻情報を管理していたようです。頻繁にゲームを行うと、CPU割り込みが増え、表示時刻が遅れるという問題がありました。仮想環境でもこれと似たような問題が発生します。

ちなみにゲームウォッチの発売は1980年なので、このたとえ話は40歳代以上にしか分からないと思います。何しろファミリーコンピューター(ファミコン)以前の話です。

●Hyper-V統合サービスでの時刻同期

閑話休題、そこでHyper-Vでは「統合サービス」を仮想マシン上で動作させることで、時刻の遅れを防ぎます。

マイクロソフトのWebサイト「ヒント: Hyper-V 仮想化環境におけるゲスト OS の時刻同期について」によると、時刻同期は以下のように行われます(Windows Server 2008/2008 R2での記載ですが、2012でも同じだと思われます)。

  • ゲストOSの時刻が、ホストOSより遅れている場合(5秒以上)
    強制的に時刻同期を行う
  • ゲストOSの時刻とホストOSの時刻のずれが5 秒未満の場合
    時刻同期を行うかどうかは NTP (w32timeサービス) に委任
    統合サービスの時刻同期 はVM IC Time Synchronization Provider という名前の NTP Time Providerとして提供
  • ゲストOSの時刻が、ホストOSの時刻より進んでいる場合(5秒以上)
    時刻同期しないので、必要に応じてNTPなど、他の時刻同期機構を利用

また、統合サービスの "時刻の同期" は、他の時刻ソース(他の NTP サーバー)の参照環境と共存可能なように実装されているそうです。

その他に、ゲストOSの起動時に同期します。ゲストOSの時刻はシャットダウンまたは保存時に停止するため、次に起動したときは必ず遅れています。つまり、メカニズムとしては「5秒以上遅れている場合」と同じです。

 

●NTPの構成

NTPのパラメータ調整はW32TMコマンドを使います。仮想マシンンに依存しない時刻同期については、私と同じDirectory ServicesのMicrosoft MVPである小鮒道成さんが書いた記事が参考になります。

Windowsネットワーク時刻同期の基礎とノウハウ

万一時刻がずれてしまったらどうするかということも問題になります。時刻変更の影響が予測できる場合で、許容できる程度のリスクであれば、一気に同期させるのもひとつの方法です。

時計を進めることは、遅らせることに比べてリスクが少ないと考えられます。通常、仮想マシンンは時刻が遅れるので、多くの場合は問題が出ません。

しかし、時刻変更の影響が予測できない場合や、リスクが大きい場合はどうすればいいでしょう。NTPのパラメータで調整できるならそうしてください。そうでなければ、人間が少しずつ時刻差を縮めていくしかありません。

 

●【追記】ドメインコントローラーの構成

仮想マシンドメインコントローラーでは特別な注意があります。

Microsoft TechNetのドキュメント「仮想化ドメイン コントローラーの展開に関する考慮事項」から引用します(太字は私の注釈)。

ドメイン コントローラーとして構成された仮想マシンでは、統合サービスを通じてホストとの時間の同期を無効にしてください。代わりに、既定の Windows タイム サービス (W32time) ドメイン階層時間の同期を使用してください。

ホスト時間の同期では、ゲスト オペレーティング システムは各自のシステム クロックをホスト オペレーティング システムのシステム クロックに同期させることができます。ドメイン コントローラーはそれぞれ独自の時間同期メカニズムを持っているので、ドメイン コントローラーとして構成された仮想マシンではホスト時間の同期を無効にする必要があります。ドメイン コントローラーが各自のソースから時間を同期させると同時にホストからも時間を同期させた場合、ドメイン コントローラーの時間が頻繁に変化する可能性があります。ドメイン コントローラーのタスクの多くはシステム時間に関連付けられているので、システム時間が突然変化した場合、それが原因で残留オブジェクトがディレクトリに残り、レプリケーションが停止する可能性があります。

Hyper-V マネージャーの [統合サービス] セクションにある仮想マシンの設定で [コンピューターの時計の同期] チェック ボックスをオフにすることで、ホスト時間の同期を無効にすることができます。

2014年6月13日金曜日

Microsoft Azureのアフィニティグループと課金

Microsoft Azureに限らず、クラウドサービスの研修で怖いのは、ある日突然管理ツールが変わってしまうことです。

クラウドの基本は、「IT機器ではなく、ITサービスを使う」ということなので、これはやむを得ません。

提供されるサービスが同じなら、使い勝手が変わってもある程度は仕方ないでしょう。たとえば、京都市のバス料金はかつて

    • 均一区間は乗車時に支払う
    • 均一区間外は降車時に支払う
      (
      乗車時に整理券を取り、整理券の記号に従った価格を支払う)

でした。複数のルールを使い分けるのが面倒なことから、現在では以下に統一されています。

    • 降車時に支払う
    • 均一区間外を走るバスは乗車時に整理券を取る
      (均一区間を走るバスは整理券が出ない)

ユーザーインターフェースが変わるので、最初は戸惑う人も多かったのですが、サービスを受ける側としては受け入れるしかありません。

先日、グローバルナレッジとしては初めてMicrosoft Azureの研修を実施しました。そこで、2つほど保留した質問と、アンケートに記載されていた質問について、この場を借りてお答えします。

●アフィニティグループの作成

  1. 複数の仮想マシンを同じ場所(大ざっぱに言うと同じラック)に配置するための機能「アフィニティグループ」は、事前に作成しておきます。
  2. Microsoft Azureの管理ポータルWebサイトにアクセス
  3. [設定]をクリックし、[アフィニティグループ]タブを選択
  4. [追加]をクリックし、サブスクリプションとリージョンを指定

これで、特定のリージョンに結びついたアフィニティグループができました。

次に、仮想マシンの入れ物である「クラウドサービス」を作成します。この時、リージョンの代わりにアフィニティグループを指定します。

●課金

Microsoft Azureの仮想マシンは、管理ツールからシャットダウンすると[割り当て解除]となり、課金対象になりません。

Azureは料金改定が頻繁に行われますが、単なる停止で課金対象から外れるという発表は今の所ありません。これからも割り当て解除が必要です。

なお、ストレージの使用分には課金されますので、ご注意ください。

●料金シミュレーター

Microsoft Azureの料金シミュレーターが公開されています。あまり詳細なパラメーター指定はできませんが、参考にしてください。

image
▲マイクロソフトが配布しているアイコンから「Affinity Group」
単なる点線枠にしか見えません。

2014年6月10日火曜日

Windows Azure改めMicrosoft Azureはじめました

今日、ある会社向けにMicrosoft Azure (IaaS) の演習付き体験セミナーをします。

Microsoft Azureの演習を行う場合、アカウントをどうするかという問題があって、いまだに定期開催コースが提供できていません。

私個人としては

  • 各自アカウントを取ってきてもらう
  • アカウントを持っていない人はその場で取ってもらう
  • それが無理なら演習ができない

ということでいいと思うのですが、反対意見も根強く難しいようです。

事前に注意事項を配布しても、読まない受講者が一定数いらっしゃいますし、申し込んだ方と受講者が違う場合は連絡が伝わらない場合もあります。会社や個人の事情でアカウントが取れない人もいらっしゃるかもしれません。

会社としてサービスを提供する場合、こうした可能性をすべて考える必要があります。

ところで、本日の受講者に対しては記念品を渡すことになりました。「マイクロソフトのMicrosoft Azure公式キャラクター『クラウディア窓辺』さんのコスプレ写真集ありますよ」、と言ったら「もっといいものあげましょうよ」って言われました。

昨年末に作って、コミックマーケット(コミケ)で売ったのですが、私のサークル「まぐにゃむフォト」は動物ジャンル(猫写真)なので、見事に売れませんでした。

もっとも、コンスタントに売れるはずの既刊猫写真集も売り上げが激減していたので、何か別の原因があるかもしれません。

夏のコミケも出展するので、もうちょっと売りたいところです。完売してもモデル代とスタジオ代は出ないのですが、印刷費くらいは回収したいところです。

スライド0
▲表紙と裏表紙

【追記】

Windows AzureをMicrosoft Azureに修正しました。

ちなみにAmazonさんのAWS無料講習会は、アカウントを事前作成するのが宿題でした。また開始30分前に「アカウント作成無料セッション」が開催されていました。

グローバルナレッジのAWS講習会はRemote Labと呼ばれるエミュレーション環境を使います。

2014年5月22日木曜日

フェールオーバー用の DHCP の構成 (Windows Server 2012)

公式コラムでは「Windows移行特集」が始まりました。第1回は「Windowsのマイグレーションと言えば」というタイトルで私が書いています。

英語の「migration」は、ごく一般的な言葉で「人や動物が移動する」ことを意味します。たとえば、アフリカ大陸で見られる「ヌー(Gnu)の大移動」は「The Great Migration」と呼ばれるそうです。UNIXからLinuxに移行することではありません。

GnuプロジェクトのツールがUNIXからLinuxにどんどん移植され、最近ではLinuxが中心になっていることに引っかけてみたんですが、社内では誰も突っ込んでくれませんでした(Gnuプロジェクトの創設者R. M. Stallmanは「Gnu Linuxと呼べ」と言っているので、最初は「WindowsからLinuxへの移行」と書いたのですが、「UNIXからLinusの方が面白い」と社外の方に指摘されて修正しました)。

さて今日の本題です。

Windows Server 2012から、DHCPサーバーの冗長構成(DHCPフェールオーバー)が可能になりました。もう高価で面倒なフェールオーバークラスターを構築する必要はありません。

DHCPフェールオーバーは、DHCPスコープあたり2台のサーバーで構成します。フェールオーバー後の動作を実際に試してみました。いずれも「ホットスタンバイモード」の場合です。

 

●正常時の動作

プライマリDHCPサーバーがIPアドレスをリースします。この情報はスタンバイDHCPサーバーのDHCPスコープに複製されます。

 

●フェールオーバー後の動作

プライマリDHCPが停止すると、一定時間後にスタンパイDHCPがスコープの制御を取得します。

ただし、この情報はDHCPクライアントには伝わりません。そのため、DHCPクライアントからのIPアドレス更新要求は常に自分がIPアドレスを取得したDHCPサーバー(プライマリDHCPサーバー)に対して行われます。

しかし、プライマリDHCPサーバーは停止しているため、更新要求は失敗します。

DHCPクライアントは、IPアドレスの有効期限直前になると、プライマリDHCPサーバーからの更新をあきらめ、新たにIPアドレスのリースをブロードキャストで要求します。

この時、スタンバイDHCPが応答しますが、スタンバイDHCPには既存のDHCPスコープ情報が複製されているため、DHCP要求に含まれるMACアドレスに対して、以前払い出したIPアドレスが再割り当てされます。

結果として、DHCPサーバーは変わりますが、IPアドレスその他のパラメータは以前と同じ情報が配布されます。これによりTCP/IP構成の連続性が保証されます。

 

●フェールバック時の動作

プライマリDHCPサーバーが復旧した場合、一定時間後にスコープの制御がプライマリDHCPサーバーに戻ります。もちろんスコープ情報もすべて複製されます。

スタンバイDHCPサーバーは待機状態になり、IPアドレスの更新要求に答えなくなります。その後はフェールオーバー時と同様の動作で、プライマリDHCPサーバーからIPアドレスを新たに(でも同じIPアドレスで)入手します。

 

●注意

DHCPサーバーがフェールオーバーしているときに、コマンド「ipconfig /renew」を実行すると、IPアドレスが更新できずエラーとなります。

手動でIPアドレスを更新する場合は、「ipconfig /release」を実行し、明示的にIPアドレスを解放してから「ipconfig /renew」を実行してください。

2014年5月11日日曜日

メリー・ポピンズと「ウォルト・ディズニーの約束」

メアリー・ポピンズとCommon Lisp」の続きです。今度こそ技術的な話は登場しませんが、続きなのでこちらに書きます。

ところで私、ずっと「メアリー・ポピンズ」と書いてきましたが、ディズニー映画(ジュリー・アンドリュース主演)の邦題は「メリー・ポピンズ」だということを先月知りました(40年くらい間違って覚えてました)。

お一人様で「ウォルト・ディズニーの約束」を見ました。

「ウォルト・ディズニーの約束」原題は「Saving MR. BANKS」で、「メリー・ポピンズは子供たちではなく、バンクスさんを助けきた」という話と、Saving Account(貯蓄口座、バンクスさんは銀行員です)をかけたのだと思います。

こっちの方がよく出来たタイトルですが、「Mr. BANKS」でメリー・ポピンズを思い出せる人は日本では少数派らしいです。

原作者のP.L.トラバースの少女時代と、ディズニーとの映画化交渉権をめぐる話が交互に進みます。
ディズニーは、多くの作品をめちゃめちゃに、いえ、独自の演出を加えていますから、P.L.トラバースの心配はよく分かります。

プーさんのぬいぐるみを見ながら「A.A.ミルンも可愛そうに」とつぶやくシーンは笑いました(が、他に笑ってる人がいないのはなぜ?)。

「ディズニーは単なる金儲けのために映画を作るのではない」ということで、最後に譲歩するんですが、ここはちょっと物足りなかったように思います。

ウォルト・ディズニー本人が「(駆け出しの頃)『ねずみ』の権利を購入したいという申し出があったが断った」という話をしていますが、もうちょっと聞きたかったところです。

もっとも、映画の本題はP.L.トラバースと父親の話なので、あえて踏み込まなかったのでしょう。

終盤「バンクスさん(メリー・ポピンズがいる家のお父さん)は悪人ではない」ということで、2ペンス(タペンス)で材料を買って、凧の修理をします。2ペンスは、「Feed the Birds」の曲でおなじみ「鳥の餌、1袋2ペンス」です。

「ウォルト・ディズニーの約束」ではここまでしか描かれていないのですが、映画「メリー・ポピンズ」の終盤はこうです。

父を訪ねて銀行に行った子供は、持っている2ペンスを、(鳥の餌を買うのではなく)銀行に預金しろと、銀行員に取り上げられます。

バンクスさんだったか、銀行員だったか忘れました。バンクスさんは、前半、お金に厳しい人に描かれていたので、バンクスさん自身が息子のお金を取り上げたのだったような気もします。

すると、子供は「ぼくの2ペンスを返して」と叫びだし、周囲の人は「2ペンスも返せない銀行か」と誤解して取り付け騒ぎが起き、バンクスさんがクビになるという話だったと思います。

バンクスさんが、責任を問われている会議中、バンクスさんが開き直って、銀行よりも子供の方が大事だと「スーパーカリフラディリステクエクスピアリドーシャス」と歌い出し、なんとなく円満に終わるという話だったような違ったような。
(映画見たの40年くらい前なんで、よく覚えてない)

「ウォルト・ディズニーの約束」では「新しいエンディングを用意した」としか言ってないのですが、これがその「新しいエンディング」です。

P.L.トラバースが、映画化に譲歩したのは、凧ではなく、このエンディングのおかげでしょう。

かなり感動的なシーンなので、詳細は忘れていても、米国人なら当然知っているエピソードなんだそうです(というのは岡田斗司夫さんのお話)。

ということで、だらだら書いてしまいましたが、いいお話でした。

そういえば、同じジュリー・アンドリュース主演の「サウンド・オブ・ミュージック」も、厳格なお父さんが変わっていく話ですね。

2014年4月19日土曜日

メアリー・ポピンズとCommon Lisp

分室のブログとどちらに書こうか迷ったのですが、技術的な話もあるのでこちらに書きます。

評論家の岡田斗司夫さんが、自身の無料メルマガ「岡田斗司夫の毎日メルマガ~力尽きるまで」で、映画「ディズニーの約束」のことを書いていらっしゃいました。YouTubeに音声が上がっています

ディズニーの映画「メアリー・ポピンズ」の制作裏話です。

メアリー・ポピンズは、バンクスさんの家に、子供たちの住み込み家庭教師として雇われます。

この映画、前半は原作の雰囲気そのままに進むのですが、後半になって銀行員であるバンクスさんの話に変わっていきます。堅物だったお父さんが、どうなるのかはぜひ映画を見てください。そして、なぜそうなったのかが「ディズニーの約束」で描かれているそうです。なかなか面白そうなので見たいと思います。

さて、この「メアリー・ポピンズ」、米国では誰もが見ている作品のようです。だから「ディズニーの約束」もメアリー・ポピンズを見ていることを前提に話が進むそうで、多くの日本人にとってはちょっと分かりにくいみたいです。

そこで本題。

Common Lispというプログラミング言語があります。Lispという言語は、1950年代に設計され、1960年頃には広く使われていた非常に古い言語です。

ところが、主に人工知能研究に使われており、産業界では普及しなかったせいでしょうか、多くの方言があります。

自然科学の研究が、仮説→実験→検証→再仮説、というサイクルを回すように、人工知能の研究は、仮説→コーディング(プログラム作成)→検証(実験)→再仮説というサイクルを回します。実験と同じくらいプログラムを書くので、同じプログラムを使い続けることはほとんどありません(部分的な再利用はあります)。だから標準化して、他の人のプログラムをそのまま使えるようにする必要もなかったのでしょう。

プログラムは、事前に手順が決まっているから「実験」というのは奇異な感じがするかもしれません。自然科学だとこうなります。

  1. Aという3つの現象がある
  2. Aを満たすモデルMAを考える
  3. Bという現象が見つかった
  4. MAのある部分を修正すればBも説明できるし、Aも説明できる
  5. 修正MAは、より確からしいモデルである

人工知能も同じように考えて、適用範囲が広がり、整合性がとれるようにプログラムを拡張していきます。

Lispには、主な系列でもMIT(マサチューセッツ工科大学)のMacLisp、ゼロックス社のパロアルト研究所(PARC)やスタンフォード大学で広く使われていたInterlispがあります。東海岸と西海岸ですね。

Common Lispは、1980年代の人工知能ブームに乗ってきた産業界の要請に応える形で、Lispの集大成として計画され、従来のLispにScheme(スキーム)という、Lispベースの言語のエッセンスを取り入れて作られたプログラム言語です(Schemeをベースに、の方が近いかもしれません)。

「どうせなら、良いアイデアをたくさん取り入れよう」ということで、Common Lispは既存のLispとはどれとも違うものになりました。多くの人が集まって規格を決めるとこうなります。

内容はともかく、この時の仕様書の名前が凝っています。仕様書を作ったのは、G. L. Steele Jr.、有名なコンピュータ科学者です。

  • 1981年: Swss Cheese...スイスチーズには穴が空いているところから「穴だらけ」(「トムとジェリー」によく出てくるチーズです)。
  • 1982年: Flat Iron...古い(電気式でない)アイロンの意味で「シワが残る」そうです。
  • 1982年: Colander...水切りざるの意味です。「穴は増えたが前より小さい」そうです。
  • 1982年: Laser...コヒーレントでありますように。「コヒーレント」とは、「首尾一貫した」という意味ですが、光学分野では「位相がそろった」という意味を持ちます。コヒーレントな光のことを「レーザー」と呼ぶのでLaser Editionと名付けられました。
  • 1983年: Excelsior...荷造りのための詰め物だそうです。仕様が確定し、明確なバグ以外は受け付けないということになったので「(荷物を)固定する」という意味なのでしょう。
  • 1983年: Mary Poppins...「Practically Perfect In Every Way(あらゆる意味でほとんど完璧)」という、映画のメアリー・ポピンズの台詞に由来します。

私の知る限り、小説版のメアリー・ポピンズには...「Practically Perfect In Every Way」という台詞はありません。映画では、自己紹介でメアリー・ポピンズが自分のことをこう言います。

Mary Poppinsと言うだけでPerfectと結びつくのは、ディズニーの映画がいかに広く知られているかということですね。

すみません。あんまり技術は関係ありませんでした。