2014年8月28日木曜日

MariaDB, MySQLの冗長化、負荷分散の構成を考える

mariadb_mysql_replicationWordPressのデータベースを複数サーバーで冗長化して、負荷分散しながら管理しやすく、将来的にも拡張しやすい構成を考えたときの覚書。

調査した関連技術

MariaDB Server スタンドアローン版。
他のサーバーとはレプリケーション機能で冗長化する。
10.0からは並列レプリケーションが実装されて同期スピードが速くなったらしい。
更新はマスターに。参照はスレーブからというのが一般的。
MariaDB Galera Cluster 複数のサーバーでお互いを監視して同期してくれる。
マスター、スレイブの概念がない。
全てのノードに対して更新/参照が可能で、一つのノードへの更新が全てに伝搬される。
ノードの追加・削除は自動でやってくれる。
負荷分散(ロードバランス)の仕組みは別途用意しないといけない。
MySQL Cluster 管理ノード、データノード、SQLノードでクラスタを実現する。
データノードがデータの一部を持ち合うこと(シャーディング)で負荷分散になる。その分ネットワークがボトルネックになりやすい。
MySQL Cluster 構築・運用バイブル」が分かりやすい
Spider Storage Engine 複数サーバー間でデータを分散させるシャーディングを実現可能なストレージエンジン。
分散されたデータの管理はSpiderが行うため、使う側は通常のテーブルと同じように扱える。
MariaDB 10.0.4からバンドルされている。
MySQL Proxy MySQL専用のロードバランサー。
MariaDBとの組み合わせで動作するのかな?
参考:漢(オトコ)のコンピュータ道: MySQL Clusterへの接続方法
PHP mysqlnd_ms mysqlnd(MySQL Native Driver)のプラグイン。
設定に従いロードバランスしてくれる。情報少ない。
参考:PHP: mysqlndプラグイン と MySQL Proxyの比較 - Manual
参考:PHP: mysqlnd_ms - Manual
Linux Vertual Server
(LVS)
Linuxの負荷分散ソリューションの仕組み。
LinuxカーネルにはIPVSというロードバランスソフトウェアが組み込まれているので、管理ツール「ipvsadm」から設定することで簡単にロードバランサになれる。
特定のポートを監視すればMySQLのロードバランサーになる。
ただ死活監視は別途「Keepalived」が必要。
参考:「Linux Virtual Server」と「Keepalived」で作る冗長化ロードバランサ - さくらのナレッジ
Keepalived 複数のサーバーを監視してLVSの設定を動的に変更するソフトウェア。
HAProxy LinuxカーネルのIPVSに頼らずにロードバランスと死活監視をするソフトウェア。

MySQL Clusterをやってみたいけど、「MySQL Cluster 構築・運用バイブル」を読むと

「仮想化の環境でMySQL Clusterを構築するのは、公道でレーシングカーを走らせるようなものだ」

とあるので激しく迷う。

少ないサーバー資源から始めれて、将来的な拡張性、管理運用のコストなどを考慮すると、総合的に「MariaDB Galera Cluster + HAProxy」がいい気がしてきた。

 

< Related Posts >

2014年8月22日金曜日

CentOS6にRedmine2.5をInstallして2.4から移行

centos6_redmine新しいサーバーにRedmineをインストールしてデータ移行したときの覚書。

環境: CentOS 6.5, Ruby 2.1.2, Redmine 2.5.2, MariaDB 10.0.13

 

目次

  1. バックアップ
  2. Rubyのインストール
  3. Redmineのインストール
  4. Redmineの初期設定とデータベースのテーブル作成
  5. Railsサーバー「unicorn」のインストール
  6. nginxにリバースプロキシの設定を記述
  7. データを移行

 


1.バックアップ

phpMyAdminでエクスポートしとく

 


2.Rubyのインストール

公式サイトのドキュメントを参考に。

ビルドに必要なパッケージをインストール。
# yum install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel

# yum install ImageMagick ImageMagick-devel

Ruby 2.1にも対応したらしいので最新のRuby 2.1.2をダウンロードしてインストールする。

# wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz
# tar xzvf ruby-2.1.2.tar.gz
# cd ruby-2.1.2
# ./configure --disable-install-doc
# make
# make install

bundlerのインストール。
# gem install bundler --no-rdoc --no-ri

 


3.Redmineのインストール

phpMyAdminでRedmine用のデータベースを作っておく。文字コードは「utf8mb4」にした。redmine専用のユーザーも作成。

Redmineをダウンロードして設置。

# cd ..
# wget http://www.redmine.org/releases/redmine-2.5.2.tar.gz
# tar xzvf redmine-2.5.2.tar.gz
# mv redmine-2.5.2 /opt/redmine
# cd /opt/redmine/

データベース接続設定
# vi config/database.yml

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: pass
  encoding: utf8mb4

Gemfileに記載してあるパッケージ郡をインストール。

の前に、mysql-develをインストールして、環境変数PKG_CONFIG_PATHを設定しておかないと怒られる。

# yum install mysql-devel
# vi ~/.bash_profile

# for Redmine
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

# source ~/.bash_profile
# echo $PKG_CONFIG_PATH

Gemパッケージをインストール。
# bundle install --without development test

 


4.Redmineの初期設定とデータベースのテーブル作成

シークレットトークン作成
# bundle exec rake generate_secret_token

データベースのテーブル作成
# RAILS_ENV=production bundle exec rake db:migrate

すると前の記事と同じようにutf8mb4にした弊害が出たので対応。

# vi /etc/my.cnf.d/server.cnf

# for Redmine
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

# vi config/initializers/adapt_utf8mb.rb

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters

    class AbstractMysqlAdapter
      def create_table_with_innodb_row_format(table_name, options = {})
        table_options = options.reverse_merge(:options => 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
        create_table_without_innodb_row_format(table_name, table_options) do |td|
          yield td if block_given?
        end
      end
      alias_method_chain :create_table, :innodb_row_format
    end

  end
end

再度テーブル作成
# RAILS_ENV=production bundle exec rake db:migrate

 


5.Railsサーバー「unicorn」のインストール

この辺は前の記事と一緒。

インストール
# gem install unicorn

設定
# vi config/unicorn.rb

起動スクリプト。起動スクリプト内で指定する。
# vi /etc/rc.d/init.d/redmine

# chmod 755 /etc/rc.d/init.d/redmine

Gemfileに記述しないとエラーになる。
# vi Gemfile

gem "unicorn"

起動して、自動起動するようにしておく。
# /etc/rc.d/init.d/redmine start
# chkconfig --add redmine
# chkconfig redmine on

 


6.nginxにリバースプロキシの設定を記述

HTTPのアクセスをunicornに渡すように設定

# vi /etc/nginx/conf.d/05_redmine.conf

server {
    listen       80;
    server_name  redmine.hoge.com;

    access_log /var/log/nginx/redmine.access.log;
    error_log /var/log/nginx/redmine.error.log;

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }

    ### Reverse Proxy for Redmine on Unicorn
    location / {
        rewrite ^/(.*)$ /$1 break;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:5001;
    }
}

# /etc/rc.d/init.d/nginx configtest
# /etc/rc.d/init.d/nginx reload

ブラウザでアクセスしてredmineの画面が表示出来るか確認。

 


7.データを移行

これも前の記事と同じ。

一度テーブルを全削除して、「1.バックアップ」で作成した移行元のテーブルをインポートする。phpMyAdminで実行したので省略。

# cd /opt/redmine/
# rake db:migrate RAILS_ENV="production"

アップロードしたファイルはfilesの下にあるので必要であるならコピーする。

キャッシュとセッションファイルのクリア

# rake tmp:cache:clear
# rake tmp:sessions:clear

configuration.ymlをコピーする。
# scp root@10.111.22.3:/opt/redmine/config/configuration.yml config/

サーバの再起動
# /etc/rc.d/init.d/redmine restart

 

 

< Related Posts >

2014年8月11日月曜日

【CentOS】さくらVPSサーバーの初期設定

sakura-vps_settingsさくらVPSの初期設定を覚書。

環境: CentOS6.5 x86_64, Tera Term 4.83

目次

  1. SSHの鍵認証設定
  2. Firewall設定
  3. 起動サービス設定
  4. ホスト名変更

 


1.SSHの鍵認証設定

初期のパスワード認証から鍵認証に切り替える。

まずは鍵を生成。Tera Termで簡単に作れる。

Tera Termのメニューの Setup → SSH KeyGenerator...

RSAを選択して「Generate」。

image

「パスフレーズ」を入力してpublic keyとprivate keyを保存。

生成した公開鍵をサーバーに設定する。

# cd
# mkdir .ssh
# vi .ssh/authorized_keys

公開鍵をエディタで開いてコピペする。

他のユーザーが閲覧出来ないように権限変更
# chmod 600 .ssh/authorized_keys

SSHの設定を開いて、鍵認証を「有効」、パスワード認証を「無効」にする。
# vi /etc/ssh/sshd_config

PubkeyAuthentication yes
PasswordAuthentication no

再起動。今の接続は切断されないから大丈夫。
# /etc/rc.d/init.d/sshd restart

別コンソールから今までのパスワード認証で接続できないのを確認。

今度は秘密鍵とパスフレーズを設定して接続できることを確認。下記のようなエラーが出るときは大抵パスフレーズを指定してないとき。

read error SSH2 private key file
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

TeraTerm Menuの場合はパスワードの欄にパスフレーズを入力する。

 

< 2014/09/18 Modified >
SSHで日本語表示すると文字化けするので、システム言語をUTF8対応にする。
# vi /etc/sysconfig/i18n

LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

 


2.Firewallの設定

ファイヤーウォール(iptables)の設定はツールを使う。とりあえずSSHだけ有効に。
# system-config-firewall-tui

確認
# /etc/rc.d/init.d/iptables status

SELinuxが無効になっているか確認。
# less /etc/selinux/config

 


3.起動サービス設定

起動サービスの確認
# chkconfig --list | grep :on

メール送信する予定がないのはpostfixを止める
# /etc/rc.d/init.d/postfix stop
# chkconfig postfix off

時刻同期(ntp)するのに使っているサーバーを確認
# less /etc/ntp.conf

 


4.ホスト名変更

ホスト名を変更して、複数コンソールを開いているときでも分かりやすいようにする。
# vi /etc/sysconfig/network

HOSTNAME=lv01.hoge.com

hostsファイルも変更
# vi /etc/hosts

127.0.0.1   localhost lv01.hoge.com
::1         localhost lv01.hoge.com

名前解決するときの検索ドメインも変更しとく
# vi /etc/resolv.conf

search hoge.com

ここで再起動して確認。
# reboot
# hostname

 

あとはサーバーの役割に合わせて順次設定する。

 

< Related Posts >

2014年8月8日金曜日

さくらVPSを複数台借りてローカルIPを割り振る

local-networkさくらVPSでサーバーを複数台借りたあと、ローカルネットワークを設定したときの覚書。

環境: CentOS 6.5 x86_64

さくらVPSは同じリージョン内のサーバー同士を無料でローカルネットワーク化できる。スイッチの追加、設定方法は公式ドキュメントを参考に。

スイッチをeth1に追加したあとOSに認識させる必要がある。

# cd /etc/sysconfig/network-scripts/
# cp ifcfg-eth0 ifcfg-eth1
# vi ifcfg-eth1

DEVICE="eth1"
IPADDR="192.168.0.1"
NETMASK="255.255.255.0"
ONBOOT="yes"
TYPE="Ethernet"
IPV6INIT="no"
IPV6_ROUTER="no"

ネットワーク再起動
# /etc/rc.d/init.d/network restart

確認
# ifconfig

他のサーバーも同様にIPADDRだけ変えて設定。

それぞれローカルIPで接続出来るか確認する。
# ping 192.168.0.1

 

< Related Posts >

2014年8月4日月曜日

[Titanium]AndroidでTextFieldのhintTextの色を設定

textfield_hinttextTextFieldのhintTextの色を設定したくて調べたときの覚書。Androidは色が濃いので入力してあるのか判断しづらい。

環境:Titanium SDK 3.3.0.GA, Android

前にカーソル(キャレット)の色を変えたときと同じ方法で出来た。

カスタムスタイルを定義するXMLファイルを用意して色を指定する。

$ vi platform/android/res/values/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
        <item name="android:textColorHint">#ccc</item>
    </style>
</resources>

Android公式ドキュメントも参考に。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives