月別アーカイブ: 4月 2008

SQL Express で TCP port を固定にする作業 の動画

ネットワークセグメントの異なるマシンから SQL Express (というよりも名前付きインスタンス) にアクセスする際には、名前付きインスタンスが利用しているポート番号をどのように取得するかが問題となる。SQL Browser サービスを利用するという方法もあるが、ここでは自分でポート番号を指定している。

ちなみにポート番号としては、11433 を利用することが多い。

またこの動画では以下のような状況も現わしている。

  • x64環境の場合、別名の設定が 32bit/64bit の両方にあって面倒
  • 別名の追加の時に、Alt+A のキーボードショートカットを使うと余分なエントリが追加されてしまう

SQL Server bcp コマンドで出力を utf-8 にする

bcpのオプションとして -c -C65001 を指定する。65001は utf-8 のコードページ。

参考:SQL ServerのBCPコマンドについて

ちなみに -w オプションはunicodeとなっているが、具体的には UTF-16LE で出力される。サロゲートペアの扱いについては調査していないので、厳密には UTF-16LE でないかもしれない。

UTF-8で出力したかったのは、マスターデータを Subversion リポジトリにいれて管理したかったため。差分を表示するのに中身が UTF-8 でないと面倒になる。

…ただ出力することは出来るのだが、これを逆に bcp を利用して直接インポートするためのオプションがない。難儀だ…

(追記)利用している文字データが ShiftJIS で表現できる範囲であれば、コードページ932 で生活した方がよさそうである。

iKnow 3月のDictationトップスコアラー

トップスコアラーの人の日記 Dvorak 使いの高校生のようだ。

私の Dvorak + 無変換キーにCTRL割り当て は音声再生のショートカットもいい感じなので小指がつることもない。

大体1ターン(10例文)あたり2:30~3:30、4ミスぐらいでこなしている。ミスについては前置詞 on/in/at/of あたりで迷ったり(文字数同じだし)、過去形と現在形を間違えたりが多かったけど、以前よりは聞き取れるようになって減ってきたように思う。単純なタイプミスもあるのでノーミスはなかなか出せない。

しゃべりの練習については、適度な緊張感がもてるよう録音したのを公開しちゃうというのを考えている。(俺と特定できるようにするかどうかは別として)手間を考えたら ustream.tv に乗っけちゃうのが楽かなあ。

Windows Server 2008 の NLB (Network Load Balancing) による負荷分散実験

VirtualServer 2005 R2 の同一ホストマシン上に、2台の仮想マシンに Windows Server 2008 Web Edition を入れて実験した。

この状況の場合、物理的なインターフェースは1つであるため Ethernet Switch の制限によってパケットが届かないという事態は起こらない。Ethernet Switch の設定ではまらずに済むという点で最初の実験としては適切だろう。(もちろん本番に展開する際には Ethernet Switch との戦い方もマスターしておく必要はある)

実験にあたってはHTTPプロトコルのみを対象とする。まずIIS7を利用できる状態にしておく。

「ネットワーク負荷分散」機能を追加する。コマンドラインで行う場合は serverManagerCMD -i NLB コマンド。

あとは管理ツールの中にある《ネットワーク負荷分散マネージャ》を利用し、「クラスタの新規作成」「ホストの追加」などを行う。ここらの手順は省略。

ここで仮想マシン構成で特有かもしれないが、複数のホストに分散させるようにするためには、アフィニティをなし にする必要があった。

具体的には標準状態の「アフィニティ 単一」の場合は、片方と通信されるようになるとクラスタとしてのサービスが止まらない限りその片方と常に通信してしまう。

 

一方で、「アフィニティなし」にすると、通信が分散して行われるようになった。

ただし、アフィニティなし を選択できるのは TCP プロトコルの場合のみである。UDPに対するNLB設定においてどのような挙動となるかは確認していない。

マシンの意図しない停止時の挙動

NLBサービスが停止したマシンを識別するまでに届いたパケットについては、停止したマシンが受け取ったものとシステム全体は判別している。そのためクライアント側は SYN_SENT 状態のままタイムアウトを待って再度通信を開始しようとする、という流れになる。

正確には計測していないがこの停止判別するまでの時間は1分以内程度のように思われた。

ちなみに個別のサービスを監視しているわけではないので、sc stop W3SVC などIISサービスだけを止めた場合は停止と識別されず、パケットは振り分けられ続ける。

マルチキャストモードにおけるIGMPの扱いについて

NLBの当初の実装ではマルチキャストモードの場合に、NLB構成のサーバに向かって外からのパケットを届けるための Ethernet Switch の構成は、スイッチ側で個別に行う必要があったが、最近の NLB のマルチキャストモードでは IGMP マルチキャスト を選択することができる。

マルチキャスト パラメータを調整するインターネット グループ管理プロトコル (IGMP) のサポートを有効にする に解説がある。まだ実験をしていないが、 仮想IPアドレスとして classD を利用する必要があるようだ。引用:

インターネット グループ管理プロトコル (IGMP) サポートを有効にすると、許可されるマルチキャスト IP アドレスは、標準のクラス D の範囲、つまり 224.0.0.0 から 239.255.255.255 に制限されます。

RFCで決まった世界でのIPマルチキャスト通信をするのだから当然ではある。このような場合に、途中のルータにおいて外部のユニキャストアドレスとマルチキャストアドレスの間でNATを設定できるかが肝になりそう。IGMPの設定も含め、Windowsの設定ではなくネットワークインフラ側で考慮すべき点が多い。

実験しようとしてみたが、少なくとも現在の Windows Server 2008 の仮想IPアドレスの追加ダイアログでは、ClassD アドレスを入力することができなかったためどういう状況なのか分からなかった。ただしClassCアドレスを入れた状態で IGMP マルチキャストモードを選択すると、割り当てられたMACアドレスが 01-00-5E だったので、MACアドレスの世界でだけIGMPを有効にしたマルチキャスト通信なのかもしれない。

ちなみにIGMPでないマルチキャストモードの場合、仮想IPアドレスとして 192.168.14.13 を利用した場合のMACアドレスは 03:bf:c0:a8:0e:0d となる。最初の2オクテットは03:bfで固定で、残りの4オクテットにIPアドレスが埋まった形式になっている。また、この最初の2オクテットのうち、最初の1オクテット目の最下位ビットが1となっているものがEthernetフレームにおけるマルチキャストアドレスである。(参考:基礎技術をきちんと押さえる TCP/IP理解できていますか?)IGMPによる制御が行われていない場合、Ethernetフレームにおけるマルチキャストアドレスは結局のところブロードキャストと同様に全体に送信し、受信側でフィルターされる。このためフィルタリングがネットワークコントローラで行われない場合、NLBに参加していないマシンに余分なCPU負荷がかかることになる。

よくある構成の場合、Webサーバの表セグメントにはWebサーバとルータのみが接続され、それとは別に裏ネットワークに接続されるという構成を取るのでIGMPを有効にする必要はあまりない。Webサーバでなくパフォーマンスに問題が発生しそうなマシンが存在するのであれば、ルータでブロードキャストドメインを分離する設計を行う。またスイッチによってはunicast IP address – multicast MAC address をARPにより結びつけられないことがあるそうだ。(CISCOの例がググるとひっかかる)この場合 static ARP エントリをスイッチに設定する必要がある。

(追記)少し古いスイッチだが ProCurve Networking Switch 3400cl で unicast IP address – multicast MAC address をARPにより結びつけられることを確認した。

IPv6 について

仮想IPアドレスに IPv6 アドレスを付与したらそれで普通に通信できるようになった。実IPv6アドレスは自動付与されたもののまま。IPv6だとアドレス空間が広いのでサービス専用にアドレスをばんばん割り当てられて設計が楽になる。

SQL Server 2008 マルチ サーバー クエリ

Multiple Server Query Execution in SQL Server 2008 より、SQL Server 2008 SSMS のクエリエディタの機能として、複数サーバに対してまとめてクエリを投げて結果を1つのグリッドに表示してくれる。

  • 複数のサーバに個別にクエリを投げるだけなので、1つのトランザクションとして行われるわけではない(DTCは関係なし)
  • SSMS の機能であって、SQLServer Engine の機能ではない。プログラム内からSQLクエリを行った時に透過的に複数サーバに問い合わせるわけではない

日本語のステップバイステップ評価ガイドでは、Engineの機能なのかSSMSの機能なのかについて明示的に書いておらず、当初Engineの機能かと思って期待してしまった。

複数サーバを管理するには便利だとは思う。特にDMVクエリを投げてサーバー間でのパフォーマンスバランス調整する時には便利そうだ。

Exchange 2007 の SMTP送信で常に Quoted-Printable 送信される問題の SP1 による対処

How to change the method for transfer encoding after you apply Exchange 2007 SP1 to the Exchange 2007-based server that is running the Hub Transport role より。

EdgeTransport.exe.config ファイル内に <add key="ByteEncoderTypeFor7BitCharsets" value="2" /> を記載することにより常に Base64 を選択できるようになる。

…しかし「Subject は Base64エンコーディング、plain text コンテンツは ISO-2022-JP でQPもBase64もしない」という日本のインターネットメール文化に適合するかどうかはかなり怪しい雰囲気。.NET Framework 2.0 SP1 で対応した System.Net.Mail に対する修正もエンコーディングは自力でやる必要あったし。この文化ってRFCになっているという訳ではないよな。なかなかに難儀である。

Exchange 2003 メールボックスストアの制限

2 GB またはメールボックスまたはメールボックス ストアに大規模に Exchange 2003 または Exchange 2000 格納域の制限を設定しようとすると、エラー メッセージを表示します。 といった問題がある。ここで増やす例として出てくるのは3GBのため、4GBを超えられるのかどうかはわからない。

現在1ユーザーあたり5GBの容量を見込んでいるシステムを設計しているが、やはり Exchange 2007 にするのがよさそう。

Windows Vista での画面キャプチャ (範囲指定あり)

Windows Vista の Snipping Tool は画面の一部を切り取り、さらに上にメモを書き込むのに便利なツール。

俺はこれを「クイック起動」の3番目に登録して、Windows+3 のショートカットで起動している。Windows+数値 によるショートカットはVista の中でもかなりお気に入り。

Flash動画作成は、ついに Camtasia Studio を購入した。これぐらいのペースで動画作成していれば元は十分に取れるだろう。(今までは評価モードを数台のマシンを乗り継ぎつつ作業していた) しゃべりが上手くなれば、Jing で一発録りという選択もあるのかもしれないけど。

IIS6 on Windows Server 2003 R2 x64 におけるSSL証明書署名依頼 (CSR) で16bit幅の文字列が埋まる

以前も一度あったのだが、何度やっても再現したので動画に記録しておいた。

この手順で作成された certreq.txt の中身のうち Subject を OpenSSL コマンドを使って調査したのが以下。

% openssl req -in x64.req -noout -subject
subject=/C=JP/ST=Tokyo/L=Chiyoda/O=\x00*\x00.\x00e\x00x\x00a\x00m\x00p\x00l\x00e\x00.\x00c\x00o\x00m/OU=wildcard/CN=\x00*\x00.\x00e\x00x\x00a\x00m\x00p\x00l\x00e\x00.\x00c\x00o\x00m

CN(CommonName, 一般名) に "*.example.com" を指定したところ、この部分の文字列について各文字について前に \x00 文字(バイトコードで0)が追加されている、すなわち16bit幅で埋まっていることがわかる。

想像では、特定の文字コード以外が含まれた場合にUCS2で埋めるとかそういう判断が内部に入っているものと思われる。

SQL Server 2005 でデータベース上のテーブルすべてについて制約を一時的に無効にする

MSDN Magazine 2007 Apr 制約およびトリガを無効にする に大体のコードは掲載されているが、以下の2点について改善した。

  • Firuge 1 の内容がキャプションと異なり トリガー を対象にしていたのを修正
  • 制約を有効にした後に、DBCC CHECKCONSTRAINTS によりチェックを実行する

ストアドプロシージャを作成する SQL statements:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pr_Disable_Or_Enable_All_Constraints]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[pr_Disable_Or_Enable_All_Constraints]
GO
CREATE PROCEDURE pr_Disable_Or_Enable_All_Constraints
    @disable BIT = 1
AS
    DECLARE
        @sql VARCHAR(500),
        @tableName VARCHAR(128),
        @tableSchema VARCHAR(128)

    -- List of all tables
    DECLARE triggerCursor CURSOR
        FOR
    SELECT
        t.TABLE_NAME AS TableName,
        t.TABLE_SCHEMA AS TableSchema
    FROM
        INFORMATION_SCHEMA.TABLES t
    WHERE
	t.TABLE_TYPE='BASE TABLE'
    ORDER BY
        t.TABLE_NAME,
        t.TABLE_SCHEMA 

    OPEN triggerCursor

    FETCH NEXT FROM triggerCursor 
    INTO @tableName, @tableSchema

    WHILE ( @@FETCH_STATUS = 0 )
        BEGIN
            IF @disable = 1 
                SET @sql = 'ALTER TABLE ' + @tableSchema 
                    + '.[' + @tableName + '] NOCHECK CONSTRAINT ALL'
            ELSE 
                SET @sql = 'ALTER TABLE ' + @tableSchema 
                    + '.[' + @tableName + '] CHECK CONSTRAINT ALL'

            PRINT 'Executing Statement - ' + @sql

            EXECUTE ( @sql )
            FETCH NEXT FROM triggerCursor
            INTO @tableName, @tableSchema
        END

    CLOSE triggerCursor
    DEALLOCATE triggerCursor

    IF @disable = 0 DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS