某社に飼い殺しにされている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を使ったインストールは本家サイトにあるのを参考にします。 https://mariadb.com/kb/en/mariadb/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サーバの文字コード・チューニング情報・しきい値などの設定を記述します。
設定項目についてはリファレンスを参照してください。 https://mariadb.com/kb/en/mariadb/server-system-variables/#character_set_database
デフォルトの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とは 大容量対応のストレージエンジン らしいです。 http://osdn.jp/magazine/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がデフォルトとなるようにしました。
以下を参考にさせていただきました。 ありがとうございました。 http://blog.snowcait.info/2014/06/04/mariadb-utf8/
ちなみに文字コード変えるのは以下で。
MariaDB [mariadayo]> alter database mariadayo character set utf8;