2015-09-02

MariaDBをAnsibleつかってインストールしたやーつ

某社に飼い殺しにされているMySQLの代替として、MariaDBをansibleを使ってインストールしたのでそのときのメモです。

info
  • 当記事が使用するバージョンは執筆時の最新である「10.0.21-MariaDB」です。

はじめに

Ansibleが必要なので動作検証したい方はpipか何かでインストールしておいてください。バージョンはとりあえず最新でいいです。

Vagrant(CentOS7)上に作りたいので以下のようにします。

Vagrantfile

VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "chef/centos-7.0" config.vm.network "private_network", ip: "192.168.33.11" config.vm.provision :ansible do |ansible| ansible.playbook = "provision.yml" ansible.inventory_path = "hosts" ansible.limit = 'all' end end

hosts

ホスト名は「maria」にします。もう名前からして可愛いですね。

[maria] 192.168.33.11

provision.yml

起点となる定義をprovision.ymlに書きます。(Vagrantfileと揃えれば名前は何でもOK)

今回のゴールはインストールして簡単な操作ができるところまでとします。なのでDBとユーザを作ります。

後で再利用しやすいようにroleで作ります。

- hosts: maria sudo: yes roles: - roles/mariadb vars: linux_dist: centos linux_dist_ver: 7 tasks: - name: create maria user mysql_user: name=maria password=mariapass priv=*.*:ALL state=present host={{item}} with_items: - '%' - 'localhost' - name: create mariadb database mysql_db: name=mariadayo state=present

アカウントは「maria/mariapass」、データベースは「mariadayo」にしました。

roles/mariadb/tasks/

main.yaml

- name: include redhat when: ansible_os_family == "RedHat" include: redhat.yml - name: copy my.cnf template: src=my.cnf.j2 dest dest=/etc/my.cnf changed_when: False notify: mysqld restart

redhat.yaml

yumを使ったインストールは本家サイトにあるのを参考にします。 Installing MariaDB with yum/dnfInstalling MariaDB with yum or dnf on RHEL, CentOS, Fedora, and similar distros.https://mariadb.com/kb/en/yum/

単純にyumのリポジトリを登録してインストールするだけですが、登録するrepoファイルによってインストールできるバージョンが異なります。

MariaDBはマイナーバージョンの古いRPMをあまり残していないようなので、バージョンを完全に固定したい人は手元にRPMを落としてきたほうがいいかもしれません。 (全くないわけじゃないけど古いやつだと消えてたりする)

今回の設定ではデフォルトで10.0を指定しました。これにより10.0.Xの最新が使われることになります。md5sumが等しいことを確認してみてください。

- name: set mariadb.repo template: src=mariadb.repo.j2 dest=/etc/yum.repos.d/mariadb.repo - name: install mariadb yum: name={{item}} state=installed with_items: - MariaDB-server - MariaDB-client # MySQL関連モジュールを使うためにインストール - name: install MySQL-python yum: name=MySQL-python state=installed - name: run mysql-server service: name=mysql state=running enabled=yes

roles/mariadb/handlers/

これはMySQLのパクリ

main.yaml

- name: mysqld restart service: name=mysqld state=restarted

roles/mariadb/templates/

mariadb.repo.j2

yumのリポジトリ設定ファイルです。「baseurl」にインストールしたいバージョンとディストリの指定があります。

# MariaDB 10.0 CentOS repository list - created 2015-07-20 15:05 UTC # http://mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/{{mariadb_ver}}/{{linux_dist}}{{linux_dist_ver}}-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1

my.cnf.j2

MariaDBでは設定ファイルを分けて記述することができるようになったようです。 「/etc/my.cnf.d」というディレクトリにある設定をincludeするように設定します。

[client-server] !includedir /etc/my.cnf.d

以下の設定ファイルが「/etc/my.cnf.d/」に配置され、読み込まれます。

server.cnf.j2

MariaDBサーバの文字コード・チューニング情報・しきい値などの設定を記述します。

設定項目についてはリファレンスを参照してください。 Server System VariablesList of system variables.https://mariadb.com/kb/en/server-system-variables/

デフォルトのserver.cnfはセクションとコメントが記述されているだけで設定項目は書かれていません。設定項目はなんとなく選びました。

[server] # this is only for the mysqld standalone daemon #hostname = {{mariadb_server_hostname}} port = {{mariadb_server_port}} # connection max-allowed-packet = {{mariadb_server_max_allowed_packet}} max-connections = {{mariadb_server_max_connections}} # other server section {{mariadb_server_section}} [mysqld] read-only = {{mariadb_server_read_only}} autocommit = {{mariadb_server_auto_commit}} default-storage-engine = {{mariadb_server_default_storage_engine}} # buffer read-buffer-size = {{mariadb_server_read_buffer_size}} sort-buffer-size = {{mariadb_server_sort_buffer_size}} bulk-insert-buffer-size = {{mariadb_server_bulk_insert_buffer_size}} join-buffer-size = {{mariadb_server_join_buffer_size}} # cache query-cache-type = {{mariadb_server_query_cache_type}} query-cache-size = {{mariadb_server_query_cache_size}} query-cache-limit = {{mariadb_server_query_cache_limit}} query-cache-min-res-unit = {{mariadb_server_query_cache_min_res_unit}} # charset character-set-server = {{mariadb_server_character_set_server}} collation-server = {{mariadb_server_collation_server}} # file datadir = {{mariadb_server_datadir}} #pid-file = {{mariadb_server_pid}} general-log = {{mariadb_server_general_log}} general-log-file = {{mariadb_server_general_log_file}} # time default-time-zone = {{mariadb_server_default_time_zone}} connect-timeout = {{mariadb_server_connect_timeout}} wait-timeout = {{mariadb_server_wait_timeout}} # other mysqld section {{mariadb_mysqld_section}} # this is only for embedded server [embedded] {{mariadb_embedded_section}} [mariadb] {{mariadb_mariadb_section}} [mariadb-{{mariadb_ver}}] {{mariadb_version_section}}

server.cnfには「server」「mysqld」「embedded」「mariadb」「mariadb-10.0」などのセクションがありますが、それぞれの設定項目をどこに記述しなければならない等のルールはなさそうです。実際にセクションを変更しても設定は適用されているようでした。

現在の設定値を確認するときは「show variables」ですね。likeも使えます。

MariaDB [mariadayo]> show variables like '%buffer%'; +-------------------------------------+----------------+ | Variable_name | Value | +-------------------------------------+----------------+ | aria_pagecache_buffer_size | 134217728 | | aria_sort_buffer_size | 268434432 | | bulk_insert_buffer_size | 838608 | | innodb_buffer_pool_dump_at_shutdown | OFF | | innodb_buffer_pool_dump_now | OFF | | innodb_buffer_pool_filename | ib_buffer_pool | | innodb_buffer_pool_instances | 8 | | innodb_buffer_pool_load_abort | OFF | | innodb_buffer_pool_load_at_startup | OFF | | innodb_buffer_pool_load_now | OFF | | innodb_buffer_pool_populate | OFF | | innodb_buffer_pool_size | 134217728 | | innodb_change_buffer_max_size | 25 | | innodb_change_buffering | all | | innodb_log_buffer_size | 8388608 | | innodb_sort_buffer_size | 1048576 | | join_buffer_size | 131072 | | join_buffer_space_limit | 2097152 | | key_buffer_size | 134217728 | | mrr_buffer_size | 262144 | | myisam_sort_buffer_size | 134216704 | | net_buffer_length | 16384 | | preload_buffer_size | 32768 | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | sort_buffer_size | 2097152 | | sql_buffer_result | OFF | +-------------------------------------+----------------+ 27 rows in set (0.00 sec)

client.cnf.j2

[client] default-character-set = {{mariadb_client_default_character_set}} {{mariadb_client_section}} [client-mariadb] {{mariadb_client_mariadb_section}}

mysql-client.cnf.j2

[mysql] {{mariadb_mysql_client_mysql_section}} [mysql_upgrade] {{mariadb_mysql_client_mysql_upgrade_section}} [mysqladmin] {{mariadb_mysql_client_mysqladmin_section}} [mysqlbinlog] {{mariadb_mysql_client_mysqlbinlog_section}} [mysqlcheck] {{mariadb_mysql_client_mysqlcheck_section}} [mysqldump] {{mariadb_mysql_client_mysqldump_section}} [mysqlimport] {{mariadb_mysql_client_mysqlimport_section}} [mysqlshow] {{mariadb_mysql_client_mysqlshow_section}} [mysqlslap] {{mariadb_mysql_client_mysqlslap_section}}

tokudb.cnf.j2

tokudbとは 大容量対応のストレージエンジン らしいです。 高性能、大容量対応のMySQL/MariaDB向けストレージエンジン「TokuDB」がオープンソース化される | OSDN MagazineMySQL/MariaDB向けのストレージエンジン「TokuDB」を開発する米Tokutekは4月22日、初のオープンソース版となる「TokuDB 7.0」を公開した。MySQLで50GB以上のビックデータの活用を実現できるという。 TokuDBは、マサチューセッツ工科大学(MIT)、ラトガース大学、ニューヨーク州立大学の研究者らが開発したMVCCおよびACID準拠のストレージエンジン。書き込み中https://mag.osdn.jp/13/04/23/170000

ただ、この設定ファイルが何に使われるのか全くわかってません とりあえず必要なさそうなのでそのまま(じゃあ省略しろよとか言わない

[mariadb] {{mariadb_tokudb_mariadb_section}}

roles/mariadb/defaults/

上記を補完するデフォルト値たち

main.yaml

# common mariadb_ver: 10.0 # server mariadb_server_hostname: "{{hostname | default( 'localhost')}}" mariadb_server_port: 3306 mariadb_server_read_only: 0 mariadb_server_auto_commit: 1 mariadb_server_default_storage_engine: InnoDB ## buffer mariadb_server_read_buffer_size: 131072 mariadb_server_sort_buffer_size: 2M mariadb_server_bulk_insert_buffer_size: 838608 mariadb_server_join_buffer_size: 131072 ## cache mariadb_server_query_cache_type: 1 mariadb_server_query_cache_size: 0 mariadb_server_query_cache_limit: 1048576 mariadb_server_query_cache_min_res_unit: 4096 ## charset mariadb_server_character_set_server: utf8 mariadb_server_collation_server: utf8_general_ci ## connection mariadb_server_max_allowed_packet: 1048576 mariadb_server_max_connections: 151 ## file mariadb_server_datadir: /var/lib/mysql mariadb_server_pid: /var/run/mysqlaa.pid mariadb_server_general_log: 0 mariadb_server_general_log_file: '{{mariadb_server_hostname}}.log' ## time mariadb_server_default_time_zone: SYSTEM mariadb_server_connect_timeout: 10 mariadb_server_wait_timeout: 28800 ## other server mariadb_server_section: '' mariadb_mysqld_section: '' mariadb_embedded_section: '' mariadb_mariadb_section: '' mariadb_version_section: '' # client mariadb_client_default_character_set: utf8 ## other client mariadb_client_section: '' # client-mariadb mariadb_client_mariadb_section: '' # mysql-client mariadb_mysql_client_mysql_section: '' mariadb_mysql_client_mysql_upgrade_section: '' mariadb_mysql_client_mysqladmin_section: '' mariadb_mysql_client_mysqlbinlog_section: '' mariadb_mysql_client_mysqlcheck_section: '' mariadb_mysql_client_mysqldump_section: '' mariadb_mysql_client_mysqlimport_section: '' mariadb_mysql_client_mysqlshow_section: '' mariadb_mysql_client_mysqlslap_section: '' # tokudb mariadb_tokudb_mariadb_section: ''

準備ができたので Vagrant を起動します。

$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'chef/centos-7.0'... ==> default: Matching MAC address for NAT networking... ==> default: Checking if box 'chef/centos-7.0' is up to date... ==> default: Setting the name of the VM: maria_default_1438783054971_72492 ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat default: Adapter 2: hostonly ==> default: Forwarding ports... default: 22 => 2222 (adapter 1) ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key default: Warning: Connection timeout. Retrying... ==> default: Machine booted and ready! ==> default: Checking for guest additions in VM... ==> default: Configuring and enabling network interfaces... ==> default: Mounting shared folders... default: /vagrant => /home/user/Tests/maria ==> default: Running provisioner: ansible... PLAY [maria] ****************************************************************** GATHERING FACTS *************************************************************** ok: [192.168.33.11] TASK: [roles/mariadb | set mariadb.repo] ************************************** changed: [192.168.33.11] TASK: [roles/mariadb | install mariadb] *************************************** changed: [192.168.33.11] => (item=MariaDB-server,MariaDB-client) TASK: [roles/mariadb | install MySQL-python] ********************************** changed: [192.168.33.11] TASK: [roles/mariadb | set my.cnf] ******************************************** changed: [192.168.33.11] TASK: [roles/mariadb | set server.cnf] **************************************** changed: [192.168.33.11] TASK: [roles/mariadb | set client.cnf] **************************************** changed: [192.168.33.11] TASK: [roles/mariadb | set mysql-client.cnf] ********************************** changed: [192.168.33.11] TASK: [roles/mariadb | set tokudb.cnf] **************************************** changed: [192.168.33.11] TASK: [roles/mariadb | run mysql-server] ************************************** changed: [192.168.33.11] TASK: [roles/mariadb | copy my.cnf] ******************************************* ok: [192.168.33.11] TASK: [create maria user] ***************************************************** changed: [192.168.33.11] => (item=%) changed: [192.168.33.11] => (item=localhost) TASK: [create mariadb database] *********************************************** changed: [192.168.33.11] PLAY RECAP ******************************************************************** 192.168.33.11 : ok=13 changed=11 unreachable=0 failed=0

こんな感じになるので仮想環境・MariaDBにログインします。

$ vagrant ssh [vagrant@localhost ~]$ mysql -umaria -pmariapass mariadayo Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.0.20-MariaDB MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

できてそう。 じゃあ適当に試します。 全くいい例が思い浮かばないので適当な商品で..

MariaDB [mariadayo]> CREATE TABLE goods -> ( -> id INTEGER PRIMARY KEY, -> name VARCHAR(20), -> category VARCHAR(10) -> ); Query OK, 0 rows affected (0.01 sec) MariaDB [mariadayo]> INSERT INTO goods (id, name, category) VALUES -> (1, 'ペン', '文房具'), -> (2, 'ジュース', '飲み物'), -> (3, 'パン', '食べ物'), -> (4, 'アイス', '食べ物'), -> (5, 'お茶', '飲み物') -> ; Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0 MariaDB [mariadayo]> SELECT count(*), id, name, category -> FROM goods -> GROUP BY category; +----------+----+--------------+-----------+ | count(*) | id | name | category | +----------+----+--------------+-----------+ | 1 | 1 | ペン | 文房具 | | 2 | 3 | パン | 食べ物 | | 2 | 2 | ジュース | 飲み物 | +----------+----+--------------+-----------+ 3 rows in set (0.00 sec)

はい、OKそうですね。 MySQLっぽい動きです (グルーピングのキー以外が select に集約されずに指定されていてもエラーにならないため)

ハマったところ

PIDファイル

サーバの設定項目(server.cnf)に「hostname」「pid-file」を設定するとPIDファイルが見当たらないというエラーが発生してしまいます。

まだ未解決ですが、とりあえず指定しなければ問題なさそうなのでコメントアウトして放置中。

文字コード

デフォルトの文字コードがlatin1になっているようです。

DBを作った後に設定変更して再起動しても自然と変更されないので最初に変えておきましょう。

あまり嬉しくなかったのでroleではUTF8がデフォルトとなるようにしました。

以下を参考にさせていただきました。 ありがとうございました。 MariaDB で日本語を扱う場合の文字コードの設定 | 雪猫ノートhttp://blog.snowcait.info/2014/06/04/mariadb-utf8/

ちなみに文字コード変えるのは以下で。

MariaDB [mariadayo]> alter database mariadayo character set utf8;